用C语言构建高效的嵌入式程序

描述

1、引言

嵌入式工程师在编写C语言程序时,需要注重效率和清晰的思路。本文将通过解析经典问题“猴子选大王”来展示如何用C语言思维方式构建高效、清晰的程序。

2、问题描述

考虑一群猴子,手拉手排成一个圆,从任意一只猴子开始从1开始报数,当遇到要排除的数时该猴子退出圈,从下一只猴子开始继续从1报数,如此反复,最终剩下的猴子为大王。

3、程序构架

数据获取

通过printf和scanf获取猴子的总数、起始位置和要排除的数。注意处理异常情况,确保输入合法性。

 

printf("input total num:");
scanf("%d", &n);
printf("from which num begin:");
scanf("%d", &k);
if(k > n || k == 0) {
    printf("please input the right begin num");
    return 1; 
}
printf("input the out num:");
scanf("%d", &m);
if(m > n || m == 0) { 
    printf("please input the right del num");
    return 2; 
}

 

数据运算

使用循环链表构建“猴子”的圆圈,灵活运用C语言指针操作。注意内存的动态分配和释放。

 

typedef struct node {
    int data;
    struct node *next;
} linklist;


/* 创建循环链表,头节点也存信息 */
linklist *head = (linklist*)malloc(sizeof(linklist));
linklist *p = head;
p->data = 1;
p->next = p;


/* 初始化循环链表 */
for (int i = 2; i <= n; i++) {
    linklist *s = (linklist*)malloc(sizeof(linklist));
    s->data = i;
    s->next = p->next;
    p->next = s;
    p = p->next;
}

 

提高程序运行速率

避免过度使用循环,更多地使用指针操作

 

/* 找到第 k 个节点 */
p = head;
for (int i = 1; i <= k; i++) {
    p = p->next;
}

 

4、逻辑实现

保存初始“猴子”圆圈参数

 

/* 保存节点总数 */
int total = n;
printf("
the out num:");
linklist *q = head;

 

猴子查数

猴子查数是关键,需要找到开始的“猴子”数、删除该“猴子”、将删除的循环链表首尾连接起来。

 

/* 只剩一个节点时停止循环 */
while (total != 1) {
    /* 报数过程,p指向要删除的节点 */
    for (int i = 1; i < m; i++) {
        p = p->next;
    }


    /* 打印要删除的节点序号 */
    printf("[%d] ", p->data);


    /* q 指向 p 节点的前驱 */
    while (q->next != p) {
        q = q->next;
    }


    /* 删除 p 节点 */
    q->next = p->next;


    /* 保存被删除节点指针 */
    linklist *s = p;


    /* p 指向被删除节点的后继 */
    p = p->next;


    /* 释放被删除的节点 */
    free(s);


    /* 节点个数减一 */
    total--;
}


/* 打印最后剩下的节点序号 */
printf("

the last num:[%d] 

", p->data);
free(p);

 

5、结论

通过以上程序实现,展示了用C语言思维方式构建高效、清晰的嵌入式程序的过程。重点在于数据获取、数据运算和指针操作的灵活运用。这个例子虽然简单,但在实际嵌入式开发中,这种思维方式将有助于处理更复杂的问题和提高程序的运行效率。 希望本文能够帮助嵌入式工程师更好地理解和运用C语言,构建出更为优秀的嵌入式系统。

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分