本章介绍以下内容:
- 关键字: for、 while、do while
- 运算符:<,>,<=,>=,!=,==,+=,*=,-=,/=,%=
- 函数:fabs()
- C语言有三种循环: for、while、do while
- 使用关系运算符构建循环表达式
- 其他运算符
- 循环常用的数组
- 编写有返回值的函数
对于计算机科学而言,一门语言应提供以下三种形式的程序流:
- 执行语句序列
- 如果满足条件就重复执行语句序列(循环)
- 通过测试选择执行哪一个语句序列(分支)
第一种其实就是说,按顺序执行程序。第二种就涉及到循环了,while循环就属于这里。书本在这一章中,将再次讲解while,并且还增加了其他两种循环,分别是for和do while。第三种形式,在下一章才会介绍。
不积跬步无以至千里,不积小流无以成江海。开始今天的内容了。
--------------------------------------------------分割线----------------------------------------------------
书本还是从while循环开始本章的学习。
前面的学习中while已经提及很多次了,为什么书上有一次用while来引入?因为while比较好理解吧 我猜的
下面这个程序,根据用户输入的整数进行求和。(程序利用了scanf()函数的返回值来结束程序)
/*summing.c -- 根据用户输入的整数求和*/
#include <stdio.h>
int main (void)
{
long num;
long sum = 0L;//sum初始化为0
int status;
printf("Please enter an integer to be summed ");
printf("(q to quit):");
status = scanf("%ld",&num);
while(status == 1)
{
sum = sum + num;
printf("Please enter next integer (q to quit):");
status = scanf("%ld",&num);
}
printf("Those integers sum to %ld.\n", sum);
return 0;
}
可以看到程序使用了long类型以储存更大的整数。即使C编译器会将0自动转换成合适的类型,但是为了程序的一致性,书中将sum初始化为0 L()long类型的0,而不是(int类型的0)。
来看看运行结果:
Please enter an integer to be summed (q to quit):123
Please enter next integer (q to quit):456
Please enter next integer (q to quit):789
Please enter next integer (q to quit):q
Those integers sum to 1368.
在这个程序中有两处是之前没提过的,下面我们来分别做出解释。看完解释后,相信会有一个新的理解。
先看while循环,该循环的测试条件是如下表达式:status == 1
==运算符是C的相等运算符,该表达式判断status是否等于1。注意“==”和“=”中“==”才是等号,而“=”是赋值符号。 只要status等于1,while循环就会执行{}中的语句(即将num的值加到sum上),使得sum始终为num的和。当status不为1时,结束循环,然后打印sum的值。
程序中的scanf函数的用法是之前没有提过的,这里利用了scanf的两个特性。
首先用scanf()读取num的一个新值;然后,检查是残废的返回值是否成功获取。scanf()的返回值是成功读取的项的个数(例如 :如果scanf()成功读取一个整数,那么返回值就是1),随后将值赋给status(注意输入的值是num而不是status)。这样既给num赋上了一个新的值,又将status更新,使得while检测status == 1成立,继续进行下一次迭代(执行循环)。如果用户输入的不是数字(例如q),那么scanf()的返回值就不是1,而是0,接下来就是退出循环。
【注】如果scanf()在转换值之前出了问题(例如,检测到文件结尾或硬件问题),会返回一个特殊值EOF(其值通常为-1),这个值也会终止循环。
我心中出现一个疑问,为什么要用这种方法?
用我们之前涉及到的知识,可以把圆括号的内容设为n > 0或者其他的判断方法,但如果使用这样的方法,num就不能获得某些值(比如-1)。还有其它的方法,比如在循环中加入其他的代码,通过询问用户是否继续来判断是否继续执行循环。但这样的方法就会使程序显得有些笨拙。反正怎么都是例子中的方法最好,不然书上也不会写了。。。
这里书上还顺带介绍了伪代码,使用伪代码来表示程序的结构。总结如下:
把sum初始化为0
提示用户输入数据
读取用户输入的数据
当输入的数据为整数时,
输入添加给sum,
提示用户进行输入,
然后读取下一个输入
输入完成后,打印sum的值
伪代码是一种用简单句子表示程序思路的方法,它与计算机语言的形式相对应,有助于设计程序的逻辑。确定逻辑无误后,再把伪代码翻译成编程语言。
【小结】因为while循环是入口条件循环,程序进入循环体之前必须获得输入的数据并且检查status的值,所以,在while前面要有一个scanf()。要让循环继续执行,在循环内需要一个读取数据的语句,如此程序才能获取下一个status的值,所以在while循环结尾就需要一个scanf(),为下一次迭代做好准备。书中提供了一段伪代码,作为while循环的标准格式:
获得第一个用于测试的值
当测试为真是
处理值
获取下一个值
-------------------------------------------------分割线--------------------------------------------------
未完待续。