谭浩强《C语言》“挑刺”
谭浩强《C语言》“挑刺”
许多人选择学习的计算机语言时,第一想到了C,C语言是一种令许多人感情至深
的语言,许多人的编程,都离不开一个人和一本书,这就是谭浩强和他写的《C程
序设计语言》。
我手头有一本《C程序设计语言》(后面简称第一版)(图1),10多年前,我的计
算机语言教材就是第一版,这本书是1994年12月第11次印刷的,印数已达到
670000,而随着计算机的普及,这本书的最终印数是270万!对于科技书籍,这的
确是个天文数字。我们的C语言老师的课讲得很生动,那时上机时间非常少,大约
两周能有1小时,最终的考试是笔试,我的成绩不错,考了87分。但后来到单位里
,遇到一个实际问题,怎么编却不能将程序编出来,我有点不服气。一直迷惑于
一个问题:为什么我可以考到高分但却编不出程序来呢?许多学计算机语言的朋
友可能也有类似的困惑。
同样买学习资料,很少人认别的版本的,是对谭浩强先生的C语言对中国程序学习
者影响的一个佐证,谭浩强是中国C语言教育的一个品牌。为什么我们对C语言情
感如此浓厚呢?可能就是源于谭浩强先生的发行量超过270万的第一版《C程序设
计语言》吧。
No.1、从“第一程序”说开去
万丈高楼平地起,什么都有开始,那程序员的第一个程序是什么呢?“Hello
World”程序是第一个,正是贝尔实验室的Brian和C语言之父Dennis的英文版《C
程序设计语言》一书,使程序员之间有了一种默契,一种约定。它就好象婴儿出
生后的第一声啼哭,它不仅是程序员们编第一个程序的约定,也是对各种计算机
语言进行比较的最简便方法。如何让程序将当程序员的第一声在电脑上喊出,并
且是用一种最简单最有效的办法,是考验作为程序员的你的最好的办法,也是初
学者最初的历练。我们可以将两本书中的两个程序比较一下:
C版“第一程序”
例1.1 第一版第一章第4页,“第一程序”和Hello World类似。
main()
{
printf("This is a program\n");
}
建议:
用C语言中下面的经典Hello World程序:
#include
main()
{
printf("hello, world\n");
}
不能说原来的程序是错误的,那Hello World这个小程序究竟要告诉我们什么呢?
除了要从最简单的一个程序开始调试,让它首先在电脑上能运行外;还有就是编
程的潜规则,要同国际接轨!编程需要一种开放的精神,程序其实不是编程者一
个人的事情,它可以用来表达思想,也需要交流的,所以它的外表和潜规则是非
常重要的一部分。
No2. 风格是程序交流的窗口
程序的风格,所关心的是计算机编程的交流问题和美学问题——源程序代码规划
布局的问题,这些工作并不影响程序运行速度、内存的使用及其它程序外观方面
的问题,它影响的仅仅是怎样很容易地理解代码、检查代码、日后很容易地修改
代码等,它也影响到别人如何很轻松地去读、去理解、当你不在时去修改代码。
在第一版中有不少类似下面的代码:
例1.2 第4页程序如下:
main()
{int a,b,sum;
a=123;b=456;
sum=a+b;
printf(“sum is %d\n”,sum);
}
例7.5 第110页
main()
{float add();
float a,b,c;
scanf("%f,%f",&a,&b);
c=add(a,b);
printf("sum is %f",c);
}
float add(x,y) //过时的声明。
float x,y;
{float z;
z=x+y;
return (z);
}
建议:
上面的代码不很规范,建议如下:
#include 〈stdio.h〉
int main()
{
int a, b, c, sum;
a = 123;
b = 456;
sum = a + b;
printf(“sum is %d\n”,sum);
return 0;
}
#include〈stdio.h〉
float add(float, float);
int main()
{
float add();
float a, b, c;
scanf("%f,%f", &a, &b);
c = add(a,b);
printf("sum is %f",c);
return 0;
}
float add(float x, float y)
{
float z;
z=x+y;
return z;
}
我们要编程,首先不假思索想到的变量名是a、b、c,循环时最先想到的是
for (i=1;i<=100;i++),适当的嵌套,合用的名字,清晰的行和总体结构,用全
新的符合标准的形式,将过时描述方法淘汰。
我们用C语言的许多风格不很地道,这是非常需要注意的,选择一些有意义的小题
目,好好煅炼自己。
No.3 函数是编程表达的基本单元
C语言中给我们的另一不好的习惯是将源程序从头到尾都放到main()主函数里
面。这样的结果是当我们遇到长程序时会很麻烦。程序长会带来许多问题:开发
困难,牵涉的情况更复杂,写程序的人更难把握。长程序的阅读和理解也更困难
,这又影响到程序的开发和维护。如果要修改程序,就必须先理解一项改动对整
个程序的影响,防止其破坏了程序的内在一致性。另外,随着程序变大,程序中
也常出现一些相同或类似的代码片段,这使程序变得更长,也增加了程序里不同
部分间的互相联系。
C是70年代初研制开发的语言,那时人们在这方面的认识还比较粗浅,所以只
提供了对计算过程片段的抽象机制,这就是函数机制。函数的作用是使人可以把
一段计算抽象出来,包装起来,使之成为程序中的一个独立实体。
从求素数
例5.8,第77页,判断一个数是否是素数;
# include ‘math.h’
main()
{
int m,i,k;
scanf(“%d”,&m);
k=sqrt(m);
for (i=2;i<=k;i++)
if (m%i==0) break;
if (i>=k) printf(“%d is a prime number\n”,m);
else printf(“%d is not a prime number\n”,m);
}
例5.9,求100到200间的全部素数。
# include ‘math.h’
main()
{
int m,i,k,n=0;
for (m=101;m<=200;m=m+2)
{
if (n%10==0) printf (“\n”);
k=sqrt(m);
for (i=2;i<=k;i++)
if (m%i==0) break;
if (i>=k) {printf(“%d ”,m); n=n+1;}
}
}
建议:
增加函数,专门用来判断某个数是不是素数,函数源程序如下:
int isprime (int n) { /* 判断一个数是否素数 */
int m = 2;
for ( ; m * m <= n; ++m)
if (n % m == 0) return 0; /* 发现因子,不是素数 */
return 1; /* 可能性均考虑过,没有因子,是素数 */
}
上面的两个程序中最核心的部分是一致的,就是我们抽象出的函数,有了函数,
上面的两个程序的主程序将大大缩小。处理复杂问题的基本方式就是设法把它分
解为一些相对简单的部分,分别处理这些部分,然后用各个部分的解去构造整个
问题的解。随着人们对程序设计实践的总结,许多抽象机制被引进了程序语言。
这些机制极为重要,人只有借助于它们才可能把握复杂的计算过程,完成复杂的
程序或软件系统。我们应该抛弃那种从头到尾只有一个程序的形式,从相对小的
程序开始,培养自己的这种抽象意识和抽象能力。
No.4算法是程序的灵魂
算法,又称演算法,正象我们做一道数学题时从原题到结果要经过一定的演算步
骤一样,程序设计过程中的也需要解题步骤,以正确地将问题破解。程序的三种
结构,顺序、分支和循环,巧妙地组合在一起,构成了一幅美妙和程序图景。算
法是程序的基石,不论计算机语言发展方向如何,基本的算法是应该把握的。
求闰年程序
例4.5、59页“编程判断某一年是否为闰年”源程序:
main()
{
int year,leap;
scanf(“%d”,&year);
if (year %4==0)
{if (year%100==0)
{if (year%400==0)
leap=1;
else leap=0;}
else
leap=1;}
else
leap=0;
if (leap)
printf(“%d id”,year);
else
printf(“%d is not”,year);
printf(“a leap year.\n”);
}
建议:
增加算法描述:
设y为被检测的年份,可采取以下步骤:
S1:输入y
S2:若y不能被4整除,则输出y“不是闰年”。然后转到S6。
S3: 若y能被4整除,不能被100整除,则输出y“是闰年”。然后转到S6。
S4: 若y能被100整除,又能被400整除,则输出y“是闰年”,否则输出“不是闰
年”。然后转到S6。
S5: 输出y“不是闰年”
S6: 结束
算法的描述和源程序两部分内容结合到一起来,是一种有效让学习者理解编程的
不错方案。编程是用来解决问题的,每一个不同的问题,都有自己可能的解题正
确步骤方法,这就是算法。虽然程序的算法不很复杂,对于许多编程初学者来讲
,更要关注算法。
总起来说,《C程序设计语言》是对于非专业计算机爱好者学习编程的不错教材,
但它有些思想却显得十分陈旧,也可能给我们造成一些不良的习惯。但俗话说:
尽信书则不如无书。我们也不能太迷信它们,以开放的精神,面对程序学习,因
为多一种角度,就可能少一份偏见。


0 Comments:
发表评论
<< Home