C Primer Plus学习_15 第六章 循环

本章介绍以下内容:

  • 关键字: for、  while、do while
  • 运算符:<,>,<=,>=,!=,==,+=,*=,-=,/=,%=
  • 函数:fabs()
  • C语言有三种循环: for、while、do while
  • 使用关系运算符构建循环表达式
  • 其他运算符
  • 循环常用的数组
  • 编写有返回值的函数

对于计算机科学而言,一门语言应提供以下三种形式的程序流:

  1. 执行语句序列
  2. 如果满足条件就重复执行语句序列(循环)
  3. 通过测试选择执行哪一个语句序列(分支)  

第一种其实就是说,按顺序执行程序。第二种就涉及到循环了,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循环的标准格式:

        获得第一个用于测试的值

        当测试为真是

                处理值

                获取下一个值

-------------------------------------------------分割线--------------------------------------------------

未完待续。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值