第2章 初 级 错 误
我们大家曾经都是编程新手,为编写一个最简单的可编译程序常常要花费几个小时的时间。但是,由于经验和水平有限,仍然要犯很多愚蠢的错误。现在,我们都已成为了专业的程序员,不会再犯一些明显的低级错误。然而,却还会犯一些“高级”的错误,这些错误也被称之为“专业错误”。
本章列出了许多程序,以期望帮助大家回顾早期常犯的编程错误,这样也可以让大家重温自己已经忘记的编程体验。
2.1 程序4:典型的初始化问题
一个典型的数学问题就是从1一直加到100。下面这个程序用于完成此任务,但其结果好像是错误的:
1 /************************************************
2 * A program to sum the numbers from 1 to 100 ?????????
*
3 * using a brute force algorithm. ? *
4 ***********************************************/
5 #include <iostream>
6
7 int main()
8 {
9 int sum; // The running sum
10 int count; // The current number
11
12 for (count = 1; count <= 100; ++count)
13 sum += count;
14
15 std::cout <<
16 "The sum of the numbers " <<
17 "between 1 and 100 is " <<
18 sum << '\n';
19 return (0);
20 }
(请参见“提示116”和“答案51”)
花絮
一家电子装配公司面临着失窃的问题,成千上万个电子零件不翼而飞。该公司制定了许多安全措施,但仍然无法阻止零件被盗。大家都在纳闷:这些零件究竟去哪里了呢?
最后,公司的守门人解开了这个迷。当他爬上电线杆更换公司的照明灯时,恰巧看到3个鸟巢。原来,是鸟儿们叨走工厂地板上的零件并使用它们构建自己的巢穴。据估计,这些鸟巢每个价值1万美元。
2.2 程序5:早期错误
每一个初级程序员刚开始都是学习简单的表达式以及如何输入结果。下面这个程序非常简单,但是其中却存在一个问题:
1 /************************************************
2 * A program to answer the question of a five ? ? ? *
3 * year old: ?? ? *
4 * "What is 2 + 2?" ? ??? *
5 ************************************************/
6 #include <iostream>
7
8 int main()
9 {
10 int result; // Result of the addition
11
12 result = 2+2;
13 std::cout << "The answer is " <<
result;
14 return (0);
15 }
(请参见“提示251”和“答案43”)
花絮
一个聪明的程序员曾提出了一个窃取银行存款的好方法。他从每个存款人那里窃取了大约0.5分。当银行结算利息时,其结果往往并不是一个整数。例如,利息有可能是3.2分或8.6分。银行会按惯例对该利息进行四舍五入,所以3.2分就变成了3分,8.6分就变成了9分。这样的结果就是有一半存款人的利息增加了,而另一半存款人的利息减少了。所以最终的利息总额是持平的。
一个骗子程序员改变了这种算法,使这种算法只进行舍位操作。于是3.2分就变成了3分,8.6分就变成了8分。这样就会剩下一些数额不等且少于1分的零钱。该程序员就把这些零钱收集起来并把它们添加到账户列表中最后一个人的账户上。而此前他已经以ZZYMOCK的名字开了一个账户,这个账户是他自己的,而且会排在银行账户列表的底部。
这个骗子程序员非常聪明,他从每个人那里窃取了不到1分的余额,且没有人发现。毕竟,几乎没有人会检查他们利息中小数点之后最后的余额,甚至很少有人曾经检查过自己的利息。
但是这个家伙还是被抓了。他又以ZZYSKI的名字开了一个账户,现在这个账户排在银行账户列表的底部。当他第一次接到传单时,非常惊奇地发现,他被指控在其200美元的账户上却获得38
238.83美元的利息。
2.3 程序6:必须为程序保留“空间”
下面是一个简短的实际程序,它由一个刚刚学会如何编程的人编写。该程序设计用于打印一个简单的答案。但是,事情并没有按照预想的方式进行。
1 /************************************************
2 * Double a number. *
3 ************************************************/
4 #include <iostream>
5
6 int main(void)
7 {
8 int number; // A number to double
9
10 std::cout << "Enter a number:";
11 std::cin >> number;
12
13 std::cout << "Twice" << number <<
"is" <<
14 (number * 2) << '\n';
15 return (0);
16 }
(请参见“提示247”和“答案23”)
花絮
我曾讲授过一段程序设计课程。那时,我对教学了解得不是很多,不知道给学生安排多少家庭作业为好。一次,我被Fort Worth警局的一位警察拦住,就因为我安排的家庭作业太难太难。这不是个故事,而是一件真实的事情。
一天,我正在Fort Worth的大街上赶路,因为红灯而停下来,这时一个警车停在我的身边。我看看警官,他也看了我一会儿,然后用手示意我摇下车窗玻璃。我那时的确有些担心,因为我当时驾驶着本应回收的‘58
Chevy,而且消声器已经失灵3次。
我按照要求摇下车窗玻璃,警官俯下身对我大声说:“Steve,本周您布置的家庭作业太难!”那时,我才知道,我的一个学生为Fort
Worth警局工作。不用说,我后来将学生上交家庭作业的时间延长了一周。
|