<sup id="oewps"><pre id="oewps"><sub id="oewps"></sub></pre></sup>
    <div id="oewps"></div>

      <div id="oewps"><ol id="oewps"></ol></div>

      嵌入式工程师,耍起C语言的万能“三板斧?#20445;?/h1>

      发布时间:2019年03月24日 11:03    发布者:xyd2018
      关键词: 嵌入式C语言
      作为嵌入式工程师,写一个效率高效,思路清晰的C语言程序是我们的终极目标,那么,怎么才能写好这样的程序呢?首先,我们要用C语言的思维方式来进行程序的构架构建;其次,要有良好的C语言算法基础,?#28304;?#26469;实现程序的逻辑构架;最后,灵活运用C语言的指针操作。

      虽然看起来以上的说法很抽象,给人如坠雾里的感觉,其实就是用C语言进行遇到问题、分析问题和解决问题的过程。那么,下文将给你介绍如何耍这“三板斧”。

      嵌入式工程师在编写C语言程序的时候,要针?#26434;?#21040;的问题进行程序构架构建。

      比如我们要处理“猴子选大王”的经典问题:一群猴子,手拉手排成一个圆,从?#25105;?#19968;只猴子开始从1开始报数,当遇到要排除的数(预先设定)时该猴子退出该圈,从下一只猴子开始继续从1报数,如此反复,最终剩下的猴子便是猴子的大王。那么,这“三板斧”该如?#38382;?#29992;呢?


      第一板斧,用C语言的思维方式进行程序构架构建
      程序分为三大部分:
      a、数据获取,为了程序的运行,上面的问题要获得猴子的总数,从那只猴子开始和剔除的个数;
      b、数据运算,需要从一堆数据中剔除相应的数据,注意逻辑的正确;
      c、提高程序的运行速率,少用循环多用指针。


      第二板斧,用C语言进行逻辑实现

      a、 数据获取,通过printf和scanf进行?#38382;?#30340;获取。

      /* 读入问题条件 */
      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; }

      同时注意异常时的处理,比如上面两个if语句就是异常情况的判断,每种异常情况?#26434;?#19981;同的返回值,这样便于程序过程的调试和数据的合法性。

      b、 /* 定义链表节点类型 */
      typedef struct node
      {
      int data;
      struct node *next;
      }linklist;
      构建循环链表进行“猴子”的圆圈建设。
      /* 创建循环链表,?#26041;?#28857;也存信息 */
      head = (linklist*) malloc(sizeof(linklist));
      p = head;
      p->data = 1;
      p->next = p;
      /* 初始化循环链表 */
      for (i = 2; i <= n; i++)
      {
      s = (linklist*) malloc(sizeof(linklist));
      s->data = i;
      s->next = p->next;
      p->next = s;
      p = p->next;
      }

      通过该步骤后,head和p(present)都成了一个“猴子圈”的链表。在该链表的构建过程?#34892;?#35201;注意一?#24405;?#28857;:内存的开辟,此时遵守使用多少开辟多少的原则。

      如果一下开辟过多,会引起内存泄露的问题,但是,这个小程序是不会遇到这种问题了。其次是熟悉循环链表的构建方法:链表的尾巴指向链表的头。这个时候?#34892;?#30340;话还会联想到双向链表的情况。

      c、 /* ?#19994;?#31532; k 个节点 */
      p = head;
      for (i = 1; i <= k; i++)
      {
      p = p->next;
      }

      ?#19994;?#20174;第几个位置开始计数。此时,p指向开始的“猴子”。因为采用了链表方法,这个过程只需要关注p指针的next指向即可。

      a、 保存初始的“猴子”圆圈?#38382;?br /> /* 保存节点总数 */
      total = n;
      printf("\nthe out num:");
      q = head;

      为什么要保留这个呢?首先要控制猴子数目,所以保留了全部的数目。其次用q(qurry)来保留剔除猴子前面的链表,并连接剔除猴子后的链表。这样,完成?#25628;?#29615;链表的元素删除。

      b、 猴子查数。
      猴子查数是整个程序的关键,需要完成以下任务:a、?#19994;?#24320;始的“猴子”数;b、删除该“猴子”;c、将删除掉的循环链表首尾连接起来。

      /* 只剩一个节点时停止循环 */
      while (total != 1)
      {
      /* 报数过程,p指向要删除的节点 */
      for (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;
      /* 保存被删除节点指针 */
      s = p;
      /* p 指向被删除节点的后继 */
      p = p->next;
      /* ?#22836;?#34987;删除的节点 */
      free(s);
      /* 节点个数减一 */
      total--;
      }
      /* 打印最后剩下的节点序号 */
      printf("\n\nthe last num:[%d] \n\n", p->data);
      free(p);
      }

      通过以上数据运算,可以完?#19978;?#24212;链表元素的删除,这或许就是C语言程序的魅力所在。


      第三把斧,使用C语言的指针

      比如本程序的链表指针的定义,p,s,q。
      linklist *head, *p, *s, *q;

      我们知道,指针操作不但可以减少数据操作需要的内存,还可以提高程序的运行速度,这在另一方面达到了我们的“第三把斧”的目的。

      指针的优势,或许在本程序中表现的不明显,在大量数据和对操作速度要求比较敏感的情况下会很明显,比如Linux内核中,就会有很好的体现。

      总之,?#26434;?#23884;入式工程师,不但能设计出好的硬件电路,如果也能写出好的软件程序就会让我们的生活更?#29992;?#22909;。工程师们,耍起这“C语言的三把斧”!


      嵌入式技术学习,联系宋老师企鹅号:3524-6590-88   Tel/WX:173--1795--1908
      以下课程可免费试听C语言、电子PCBSTM32、Linux、FPGA、JAVA、安卓?#21462;?br /> 想学习的你和我联系预约就可以免费听课了。



      欢迎分享本文,转载请保留出处:http://www.64440652.com/thread-561682-1-1.html     【打印本页】
      您需要登录后才可以发表评论 登录 | 立即注册

      厂商推荐

      相关文章

      关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
      电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
      回顶部
      11选5出号精准规律
      <sup id="oewps"><pre id="oewps"><sub id="oewps"></sub></pre></sup>
      <div id="oewps"></div>

        <div id="oewps"><ol id="oewps"></ol></div>
        <sup id="oewps"><pre id="oewps"><sub id="oewps"></sub></pre></sup>
        <div id="oewps"></div>

          <div id="oewps"><ol id="oewps"></ol></div>