经验总结 (YC)

来源:互联网 发布:兼职美工一个月多少钱 编辑:程序博客网 时间:2024/05/16 05:26
1、编程习惯1(在一个.C文件中编程):
    a.先考虑功能模块划分(需求分析),每个模块大致什么功能,接口类型与功用
    b.再按需求写模块函数声明,变量声明与定义等;或者也可以(需求分析)先给出注释标记,划分出要做的模块区域(代码区域)
    c.在划分好的代码区域里,根据需求分析,填写代码。
    d.代码编写风格:注意在代码字符间留有一定空格,便于代码阅读。
       如:int a = 0;
           char *str = "black sheep wall";
    e.在编写函数时,最好先把函数的返回值,先写好,或先标注好。
       如:int foo()
             {
                return ??;  //或写成exit(0);
             }
2、编程习惯2(关于循环内的判断条件的重复)

以快速排序算法中一趟分割的片段代码为例
int partition(int *p,int low,int high){
  int pivot = p[low];
    while(low<high){
    while(low<high && p[high]>=pivot) --high;//之所以在这里还要加入判断low<high,是因为--high后,有可n=high;
    p[low] = p[high];                        //由此可以总结出一个经验:最外层大循环判断条件(如:while(low<high))判断成立后,
    while(low<high && p[low]<=pivot) ++low;  //如果,大循环内会修改变量值,
    p[high] = p[low];                        //则必须在内部加上同样的判断条件(如:while(low<high && p[high]>=pivot))
  }
  p[low]=pivot;
  return low;
}


    如上代码最外层循环:
    while(low<high)
    判断成立后,进入主循环体,主循环体默认要求所有low<high,但当:
    while(low<high && p[high]>=pivot) --high;
    成立,并执行一次  --high之后,有可能high=low,此时如果只判断p[high]>=pivot,会出现逻辑错误,所以在子循环体中也必须也加上判断条件:low<high。如果不加,编译器显然不会报错,因为语法没错。而如果写完代码,编译通过,运行结果出错;此时,回头在一堆代码中找逻辑错误的话,是一件令人头痛的事,
    所以,总结一下不难发现:如果“主循环”体对某个变量有约束,而“子循环体“对此变量有操作,则子循环体中必须“考虑”重复主循环体的“主判断条件”。这是一个很容易忽视的漏洞,针对具体物理过程,在逻辑上当然可以分析出这一做法的必要性与实际意义,但此总结可以帮助我们快速高效的进行代码写作,避免出现某些因数学逻辑错误而导致的程序错误结果。

    在此不得不提一句:严老的《数据结构》,不愧为经典著作,其严谨的治学态度,带给我们的不仅仅是高质量的代码,更是一种对良好思维的训练与养成。感悟这条经验总结,花了不少时间精力,才有这一点点体会,如果有时间能亲聆她老的教诲,想必将是一大宝贵的经历。

原创粉丝点击