第五章总结

5.2.1for语句的基本语法
for语句的一般形式为:
for(表达式1;表达式2;表达式3)
循环体语句;
for语句的执行过程如下:
①首先计算表达式1。
②判断表达式2,若其值为真(非0),则执行循环体语句,然后
执行第③步;若值为假(0),结束循环,转到第⑤步执行。
③计算表达式3。
④返回第②步继续执行。
⑤循环结束,继续执行for语句的下一条语句。
大部分情况下,循环体语句为一复合语句。
for语句的执行流程如图5.2所示。
注意,表达式1只是在进人循环之前计算一次。表达式2、循环
体语句和表达式3将重复执行。
根据for语句格式的特点,其实际应用可以有多种形式。
1.可以应用于计数型的循环
循环体语句;
说明:循环变量赋初值是一个赋值语句,用于给循环变量赋初值;循环条件是一个关系
表达式,决定何时终止循环(即确定循环的终值):循环变量增量决定循环变量在完成一次循
环后如何变化。三部分之间以“;”隔开。
【例5.3】输人一个正整数n,求
n∑i的值。
i=1
分析:
本题目是一个反复求和的过程,在数学上可以表示为sum=1+2+3+……十n。这种
有规律的表达方式,可以利用计数型循环得到解决。
首先抽象出需要反复执行的部分:
sum sum+i
sum用于存放累加和,其初值为0。该语句重复n次,同时i从1变到n,就实现了从1
累加到n。计数型循环的结构如下:
①循环变量赋初值:i=1。
②循环条件:i<=n。
③循环变量增量:i十+。
④循环体语句:sum=sum+i。
#include <stdio.h>
int main()
(int i,n,sum;
scanf("%d",8.n);
/调用scanf函数输入n×/
sum =0;
/置累加和sum的初值为0关/
for(i=l;i<=n;i计+)/关循环执行n次头/长
sumsum +i;
/累加器,累加i的值关/
printf("由1到%d的和是:%d\n”,n,sum);/关输出累加和关/
return 0;
运行结果:
100
由1到100的和是:5050
【例5.4】输人一个正整数n,求n!。
分析:
本题目是一个连乘的重复过程,在数学上可以表示为n!=1×2×3×……×n。这种有
规律的表达方式,同样可以利用计数型循环得到解决。
首先抽象出需要反复执行的部分:
factorial=factorial×i
factorial用于保存累乘积,其初值为1(注意不能为0)。该语句重复n次,同时i从1变
到n,就实现了从1累乘到n。计数型循环的结构如下:
①循环变量赋初值;1=1。
②循环条件:i<=n。
③循环变量增量:++。
④循环体语句:factorial=factorial关i。
include <stdio.h>
int main(void)
{int i,n;
double factorial;
/变量factorial中存放阶乘的值
/
printf(“输入n的值:”);
/输入提示
/
scanf("%d",&.n):
factorial 1;
/置阶乘factorial的初值为1/
for(i=1;i<=n;i++)
/循环执行n次,计算n!/
factorial=factorial×i;
/累乘器
/
printf("%d!=%.0f八n",n,factorial);
/%.0f指定输出时不要小数部分
return 0;
运行结果:
输入n的值:10
10!=3628800
循环体语句sum=sum+i;放到表达式3中,与i计十构成一个逗号表达式,此时循环
体语句实际为一个空语句“;”(单独一个“;”称为空语句)。
例5.2使用while语句实现,本例采用for语句实现。要求前n项的和,意味着循环n
次、每次累加一项。设i为循环变量,表示循环的次数,使用变量sum存放累加和,则实现累
加的伪循环代码如下:
for(i=1:i<=n;i++)
sum=sum+第i项;
用变量item表示第i项,则有
item=flag1.0/denominator
考虑到每个累加项的符号交替变化,上面计算item的表达式中,用变量flag表示每一
项的符号,其初始值为l,对应第一项为正,每次循环执行flag=一flag,实现正负交替变化;
变量denominator表示每一项的分母,初始值为l,对应第一项的分母为l,每次循环分母递
增3,即执行denominator=denominator+3。则上面的伪循环代码可以用下面的程序段
实现:
for(i=1;i<=n;i++)
item=flagl.0/denominator;
sum=sum+item;
flag=-flag;
denominator=denominator+3:
注意:item=flag1.o/denominator不能写成item=flag/denominator,由于该分式的
分子分母都是整型数据,相除以后的结果仍是整数,当分母denominator不等于时,item
的值是0
说明:
(1)for语句中表达式2“(ch=getchar()!=n”是一个关系表达式,运算符!=的左侧
是赋值表达式。运算时,先计算赋值表达式ch=getchar(),把输入的字符赋给变量ch,同时
该表达式的值就是变量ch的值;然后再和八n比较。用一个表达式实现了输人和比较两种
运算。
(2)表达式“(ch=getchar())!=\n”和“ch=getchar()!=八n”不等价。因为赋值运算
符=的优先级低于关系运算符!=,所以不能省略(ch=getchar()!=\n中的括号。
(3)从本例可以看出,循环的次数是由输入的字符是否为八’来控制的,与变量i的计
数次数无关。若省略计数变量i,即for语句中只有表达式2,没有表达式1和表达式35.3
使用while语句实现循环结构
在C语言中,使用while语句完成不定次数的循环。如果满足循环条件,则反复执行
环体语句,当循环条件不满足时退出循环
5.3.1 while语句的基本语法
while语句在使用时,总是先要判断一个条件,所以可以用

while语句实现“当型”循环。while语句的一般形式如下:
表达式
while(表达式)

循环体;
循环体
while语句的执行流程如图5.3所示
第1步:计算表达式的值,若表达式的值为“真”,则执行第
2步;若表达式的值为“假”,则转到第4步
while的下一条语句
第2步:执行循环体语句。
第3步:返回第1步。
第4步:结束循环,执行while语句的下一条语句。
注意,while语句的特点是先判断循环条件,后执行循环体
(2)循环体为一条完整的f语句,若有多条语句时,必须使用复合语句的形式。
使用while语句时,应注意以下几点:
①while后面的括号“()”不可省略。
②语句中的表达式可以是任意类型的表达式,若表达式的值为非,则表示循环条件为
“真”,执行循环体语句;若表达式的值为,则表示循环条件为“假”,不执行循环体语句,结束
循环,执行循环结构的下一条语句。如果表达式的值一开始就为“假”(0),则循环体一次也
不执行,直接执行循环体后面的语句。

循环体语句可以是复合语句,即当循环体由多条语句构成时,必须用一对大括号将
这些语句括起来,形成复合语句。

为使循环能正常结束,循环体中应对表达式进行修正,使表达式的值趋近于“假”,避
免出现死循环。
说明:在例5.3、例5.13及本例中,分别使用for循环语句、while循环语句及do一while
循环语句求解了同一个问题,表明这3种循环结构具有通用性。那么在遇到循环问题时,应
该使用3种循环结构中的哪一种呢?通常情况下,这3种语句是通用的,但在使用上各有特
色,略有区别。
一般来说,如果题目中给出了循环次数,首选for循环语句;如果循环次数不明确,需要
通过其他条件控制循环,通常选用while循环语句;如果需要先执行语句,然后再根据条件
判断是否继续执行循环体,则do一while循环语句最合适。
使用do一while语句时,应注意以下几点:
①在do之后不能有语句结束符“;”,因为该语句还没有结束
②在while(表达式)之后必须有语句结束符“;”,表示do一while语句到此结束。
③在循环体中必须有改变循环条件的语句,否则会出现死循环。
5.5改变循环结构的跳转语句
在前面介绍的3种循环语句,即for循环语句、while循环语句及do一while循环语句
中,控制循环是通过循环达到设定的次数或者循环的判断条件为“假”时结束循环,这种循环
控制方式在实际的程序设计中是不够的。许多时候当循环结构中出现多个循环条件时,要
求当某个条件满足时会立即结束循环,或者循环结构中根据条件会跳过某些语句继续循环,
这就要在循环结构中配合使用break语句和continue语句。
5.5.1 break语句
break语句用在循环语句和switch语句中。在switch语句中的用法第4章已经介绍,
这里介绍其在循环语句中的用法。
break语句的一般形式如下:
5.5.2 continue语句
continue语句的作用是跳过循环体中continue后面的语句,继续下一次循环。continue
语句只能用在循环语句中,常与f语句一起使用。
continue语句的一般形式如下:
5.5.3goto语句
除了前面介绍的3种循环控制语句,即for循环语句、while循环语句及do一while循环
语句之外,在C语言中,还有一种可以实现循环控制的语句,即goto语句。
goto语句的一般形式如下:
goto语句标号;
说明:语句标号是一个有效的标识符,使用时在语句标号的后面跟一个“:”出现在函数
中某语句的前面。程序执行到goo语句时,会控制跳转到该语句标号处,达到控制循环的
目的。
5.6
循环嵌套
当一个循环的循环体内又包含了另一个完整的循环结构时,称为循环的嵌套或者是二
重循环。根据问题的需要,可以构成三重及以上的循环嵌套结构,但一般情况下最多使用到
三重循环
使用for语句、while语句及do一while语句相互嵌套,构成的嵌套结构有以下几种。
(1)for语句中嵌套for语句
for()
(2)for语句中嵌套while语句

for()
for()
外循环
{…
{…}
内循环
while)
}
{…}
内循环
外循环
(3)while语句中嵌套while语句
}
while (
(4)do一while语句中嵌套for语句
do
while()
{…
…}
内循环
外循环
for()
{…》内循环
外循环

5.7
典型算法举例
在解决实际问题的过程中,经常要用到一些典型的算法,熟悉并掌握这些算法,对提高
程序设计的技能与技巧很有帮助。本节介绍常用的递推法、迭代法及穷举法
5.7.1
递推法
【例5.29】猴子吃桃问题:猴子第一天摘下若干个桃子,吃了一半,还觉得不过瘾,又多吃
了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天
剩下的一半零一个。到第十天早上时,只剩下一个桃子了。问第一天共摘了多少桃子。
分析:设前一天的桃子数用d1表示,后一天的桃子数用d2表示,则根据题意有d1=(d2
+1)×2。
现已知第十天只剩下一个桃子,可根据上面的式子计算出第九天的数量为(1+1)×2=
4。即已知第十天,可计算第九天的数量;再根据第九天的数量计算出第八天的数量,…,最
后倒推出第一天的数量。
5.7.2
迭代法
【例5.31】用牛顿迭代法求方程2×3一4×2十3×一6=0在1.0附近的根。
分析:牛顿迭代法又称为牛顿切线法,其原理如图5.5所示。
设方程f(x)=0有一个根x。先任意设定与根x接
y
近的值x作为方程的近似根,由x求出{(x),过(x,
(x)点作f(x)的切线与x轴交于x1,则此切线的斜率为
f(x0)=f(x0)/(x、-x1)
即有
x1=x0-f(x0)/f(x0)
迭代公式
显然,x1比x更接近x*。继续过点(x,1(x))作1(x)
的切线与x轴交于x2,……。当求得的x与x-两点之间
的距离小于给定的最大误差时,便认为x就是方程(x)一0
的近似解了。
5.7.3
穷举法
【例5.32】搬砖问题:36块砖,36人搬。男搬4、女搬3、两个小孩拾一砖,要求一次全搬
完,问男、女、小孩各若干?
分析:设男的数目用变量men表示,女的数目用变量women表示,小孩的数目用变量
child表示,则根据题意可以确定:men的取值在09之间,women的取值在0I2之间,
child的人数为36一men一women。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值