大家好,我是北工大计算机学院03级的普通学生。作为一名C语言的初学者,我很高兴也很荣幸能把自己学习C的收获和感受与大家分享!
和本文的读者一样,我很早就对programming充满兴趣。上中学后,我一直与QB为伴,常因为亲手实现书上示例没有做到功能而欣喜。刚刚上大学不久,我又遇到了鼎鼎大名的C,三个月学下来,感慨良多,也有些收获。现将它们列在下面,以供大家参考。
依照我的经验,学习一门程序设计语言一般是从模仿教科书示例开始的,继而尝试修改、增补示例程序,然后就可以独立于示例编写简单的程序了。在这个过程中比较重要的一点就是不要被教科书束缚。比如你可以使代码的格式更清晰、更美观,同样的功能可以用不同于示例的方法实现……当然,这是一个循序渐进的过程,不必急于求成,要扎扎实实记住学过的每条C语言规则,在模仿和思辨中养成良好的程序设计习惯。
以下是经验丰富的程序员、《C程序设计教程》和我个人总结的一点经验,希望能够对大家有所帮助:(本文完整示例能够在TC 2.0下正常运行)
I. 关于代码的格式:
1. | 预先输入配对符号和易忘符号,如成对的大括号、双引号、小括号以及分号等 |
2. | 大括号“{” 和“}”各自独占一行并与上一行首字母对齐; |
3. | 左大括号“{”的下一行进行整段缩进,直到遇到右大括号“}”,如果有多对大括号“{”“}”,重复以上规则; |
4. | 在每个左小括号“(”前加一个空格,每个逗号“,”后加一个空格,在实现不同功能的代码块之间加一个空行; |
5. | 控制每一行代码的长度,使其不超过屏幕显示的范围,当某一行即将到达屏幕边界时,按下回车键并缩进至与上一行行首对齐; |
示例:
#include<stdio.h> main () { /*大括号独占一行*/ int icount=0; /*开始整段缩进*/ /*适当的空行用来使代码结构清晰*/ clrscr (); /*清屏函数*/ for (; icount<=10; icount++) { printf (“Value of icount is %d.\n”, icount); } /*小括号前和逗号后的空格使代码不拥挤,更清晰*/ return 0; } |
II. 关于数据类型和变量:
1. | 定义变量时应了解各种数据类型的可表示范围,考查其是否符合对输出结果数据精度的要求; |
2. | 尽量用少而有意义的一组字母、数字和下划线为变量命名,这样既可以减轻输入强度,又可以使代码便于理解,以利出错维护和功能扩展; |
3. | 为区分不同类型的变量,命名时应该在已经确定的变量名前加一个表示该变量类型的小写字母,如“int icount;”,这样当你在后面的代码中看到它时,就知道它是一个用作计数器的整型变量; |
4. | 用作部分和(累加器),部分积(累乘器)的变量最好在定义时就分别初始化为0和1, 如“int isum=0;”; |
III. 关于表达式的表示:
1. | 不要忘记乘号“*”; |
2. | 当一个表达式里的符号(尤其是关系运算符)多得使你无法确定结果时,使用小括号限定运算顺序; |
3. | 使用相等测试运算符“==”时,将常量放在左边,如“if (0==ichoice)” |
IV. 关于一些基本语句:
1. | printf和scanf:不要忘记“f”; |
2. | 试着找一找循环次数与已经存在的变量之间的关系,如果可以,你就能节省一个计数器变量的使用; |
3. | 综合考虑for循环的循环控制变量和循环终止条件,保证程序执行时循环了预定次数,防止死循环; |
4. | 多层for循环嵌套时,注意内层循环的循环控制变量的初始化,即下一次外层循环开始时,内层循环的循环控制变量是否必须回零或被赋值为1等等,如果不必,可以省略循环控制变量的初始化,如“for (; icount<=5; icount++)”,否则坚决不能省略; |
示例:
/*本示例将在屏幕上显示3*3共6个数*/ #include<stdio.h> main () { int iRow=1, iColumn=1; clrscr (); for (; iRow<=3; iRow++) { for (iColumn=1; iColumn<=3; iColumn++) { /*内层循环控制变量必须初始化,读者可以试着去掉iColumn=1看结果*/ printf (“%d\t”, iColumn); /*循环体,显示每行各列的数*/ } printf (“\n”); /*显示一行后换行*/ } return 0; } |
5. | 使用输入标记控制的while循环时,不要忘记在内层接受用户输入; |
示例(部分):
printf (“Enter grade, -1 to end: ”); scanf (“%d”, &igrade); while (igrade!=-1) { isum+=igrade; printf (“Enter grade, -1 to end: ”); scanf (“%d”, &igrade); } |
6. | 不要忘记switch语句中每个case里的break; |
7. | 根据实际情况使用break或continue控制循环,不要习惯性地使用break; |
我推荐大家借鉴上面的经验,也希望大家能够学到良好的程序设计风格,养成良好的程序设计习惯,而不只是满足于完成既定任务。
我在前面提到过,学习程序设计是一个循序渐进的过程。在大家学习完C的基本规则以后(即数据类型、运算符、表达式、基本语句、流程控制等,一般都安排在教科书中函数、数组等章节之前),应该已经形成了一定的程序设计风格,也积累了一些解决实际问题的方法。在接下来的学习中很重要的一点是不要被习惯禁锢,因为后面会出现很多能更高效解决问题的方法,错过它们将是你极大的损失。
函数就是一个很重要的概念。正如很多教科书里提到的,它能够使程序模块化,使主函数结构清晰、各部分分工明确,最起码能够避免多次输入功能相同的一大段语句。我个人认为,从囊括所有语句的“流水账”到“众星捧月”的模块化程序的过渡很重要。在前面的学习中,大家已经习惯把所有的语句按顺序罗列在main函数中,即使学到了函数的调用和返回,形参和实参等等概念也很难用上,有时用上可能还会事倍功半。不过没关系,我们可以先从以前编写的代码下手,把住函数中多次重复的语段择出来定义成新的函数,同时结合教科书上的示例,逐渐习惯函数的调用和返回。以后再编写程序时,可以先在脑中或纸上大概描绘一下程序的模块化结构、各函数的功能、需要的参数等等,编写时直接写出各个函数即可。
其他的概念如指针、链表等理解起来问题不大,但在使用中可能会遇到很多问题,还是要多看多练,看练结合,重在实际操作,注意平时积累。 希望大家能在不断的学习中,能有不断的收获