




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章循环控制
用于解决语句的重复执行,以克服一
条语句只能执行一次的限制。
■几种简要的循环结构
■break和continue语句
■for语句的变化形式
■循环嵌套
第六章循环控制
■问题:
、10
求sum=2i
i=l
intsum;
sum=1+2+3+4+5+6+7+8+9+10;
、100
求sum=2i?
i=l
求sum=2i?(n由键盘输入)
i=l
第六章循环控制
■问题:
、10
求sum=2i
i=l
i=1;sum=O;
sum=部分累加和+i(i=l〜〜10)
sum=sum+i;i++;\
......,十行
sum=sum+i;i++;/
goto语句以及用goto语句构成循环
一般形式:goto语句标号;
其中标号是一个有效的标识符,这个标识符加上
一个“:”一起出现在函数内某处,执行goto语
句后,程序将跳转到该标号处并执行其后的语句。
另外标号必须与goto语句同处于一个函数中,但
可以不在一个循环层中。通常goto语句与if条
件语句连用,当满足某一条件时,程序跳到标
号处运行。
例6.1使用goto语句实现求解1〜100累计和
main()“loop:"为语句标号
{intn=l,sum=0;其命名遵循标识符
命名规则。
loop:sum+=n;n++;
goto语句格式:goto
if(n<=100)gotoloop;标号,功能为:使
printf("sum=%d\n'',系统转向标号所在
sum);的语句行执行。
■结构化程序设计方法,主张限制使用
goto语句。因为滥用goto语句,将会导
致程序结构无规律、可读性差。
另外,从功能上说,for语句可完全代
替当型循环语句while,所以该语句也不
是必需的。
for语句
■1.用for语句实现
ftinclude<stdio.h>
main()
inti,sum=0;_^定重旻次装
for(i=1;iv=100;i++)
sum=sum+i;-
printf(”%cT,siim);重复执行的语句
for语句
■for语句格式:
for(初值飞达式;循环继续表达式;循环变化表达式)
一条节反复执行的白句;/
三个独立的表达式
fbr(i=l;i<=10;i++)
sum=sum+i;
for语句
■for语句格式:
for(初值表达式;循环继续表达式;循环变化表达式)
一条要反复执行的语句;
执行流程:
for语句
IJ
Ifbr(i=Li<=10E++)
■sum=sum+i^->
for语句
■从键盘输入100个整数,求其中正数之和。
include<stdio.h>
•重复步骤:
main()
(1输入一个数
inti,sum=0,x;2对正数求和
for(i=0;i<100;i++){
scanf("%cT,&x);•共重复100次
if(x>0)sum=sum+x;
)
printf(”%d”,sum);
for语句
■从键盘输入100个整数,求其中正数的平均数。
ftinclude<stdio.h>
main(){
inti,count=0,x;
floatsum=0;
for(i=0;i<100;i++)
{scanf("%d”,&x);
if(x>0){sum=sum+x;count++;}
)
sum/=count;
printf("%fH,sum);
)
for语句
■用for语句实现10+9+8+7+6+5+4+3+2+1
ttinclude<stdio.h>
main()
(
inti,sum=0;
for(i=10;i>0;i--)
sum=sum+i;
printf(H%dH,sum);
while语句
■while(条件)
重复执行的一条语句复合语句
不满足
后一语句;
二while语句
[■while实现要点
整个循环由i控制,i称循环变量
1i=1;循环变量必须有初值
.while(i<=10)继续循环的条件
.{sum=sum+i;
.循环体j++;循环变量的改变
■
例6.2用while语句求1〜100的累计和
main()
{inti=l,sum=0;/*初始化循环控制变量i和累计器
sum*/
while(i<=100)
{sum+=i;/*实现累加*/
i++;/*循环控制变量i增1*/
printf("sum=%d\n”,sum);
程序运行情况如下:
sum=5050
,循环体如果包括一个以上语句,应该用花括号括起来,
■形成复合语句
while语句
■for语句与while语句比较
main()
{inti,sum=0;
for(i=1;i<=10;i++)while(i<=10)
sum=sum+i;{sum=sum+i;
printf("%d\sum);、i++;)
do-while语句
■用do-while语句实现
do-while语句格式:
do一条要反复执行的语句;
while(条件表达式)
「while是先判别条件,再决定是否循环;
do-while是先至少循环一次,然后再根
据循环的结果决定是否继续循环。
do-while语句
■do-while语句实现流程
do-while语句
■do....while与while的用法有所不同
例:输入一串正数求和,例:输入一串正数求和,
直到数据学好?直到数据为非正数结束。
main()
main()
{intx,sum=0;
{intx,sum=0;scanf(66%d5\&x);
do{while(x>0){
scanf("%d”,&x);sum+=x;
sum+=x;scanf("%d”,&x);
}while(x>0))
printfV'sum=%d'',sum-x);printf(66sum=%d5\sum);
■编写数列求和程序:
1+l/2+1/3+1/4+....+l/n
l/l+l/2+1/3+1/4+....+l/n
main()
{inti,n;floaty=0;
scanf("%d\&n);
for(i=1;i<=n;i++)
y+=1.0/i;
printf(Hn=%dy=%f\nH,n,y);
循环结构的实现
循环实现要点「(1)找出什么要反复执行
(2)重复到何时结束
假定输入x=12345,逆序输出。从低位开始分割
12345%10=5(1)反复执行x%10
12345/10=1234x=x/10
1234%10=4(2)何时结束x==0
1234/10=123scanf(66%d5\&x);
123%10=3
123/10=12while(x>0)
12%10=2{printf(66%d
12/10=1x=x/10;
1%10=1}
1/10—0结束
循环结构的实现
循环实现要点:(1)找出什么要反复执行
(2)重复到何时结束
假定输入x=12345顺序输出,从高位开始分割
12345/10000=1开始如何得至
12345%10000=2345(1)Uloooo
2345/1000=2找输入数据的位数
2345%1000=345d=l;
345/100=3for(i=10;x/i>0;i=i*10)
345%100=45
45/10=4d++;
45%10=5⑵每次循环缩小10倍
5/1=5⑶缩小到。结束
5%1=5
§6.2break和continue语句
例:读入一行字符(不超过io个),给予输出
include〃stdio.h〃有两个条件决定循环的结束
main()main()
{charc;{charc;
inti=0;inti=0;
for(i=0;i<c=getchar();
{c=getchcfor(i=0;i<10&&c!='\n';i++)
if(c==,{putchar(c);两个结束条件合并
putcharc=getchar();
)
continue流程
程序:
fbr(表1;表2;表3)
(语句1;
if(...)continue;
语句2;
)
for后的下一条语句;
for的下一条语句
continue语句例子
ftinclude〃stdio.h〃输入:abc/
main()efgh/
{charc;123/
inti;输出:abcefghl
for(i=0;i<10;i++)/*i>=10是结束条件*/
{c=getchar();
if(c='\n')continue;
putchar(c);/*c二回车也是结束条件*/
)
}问:若把break改成continue,
结果会怎样?
§6.3for语句的变化形式
原形:inti,sum=0;
for(i=l;i<=10;i++)sum=sum+i;
§6.3for语句的变化形式
原形:inti,sum=0;
for(i=1;i<=10;i++)sum=sum+i;
§6.3for语句的变化形式
原形:inti5sum=0;
for(i=1;iv=10;i++)sum=sum+i;
变形1inti=1,sum=0;
for(;i<=10;i++)sum=sum+i;
变形2inti=1,sum=0;
for(;i<=10;){sum=sum+i;i++;}
变形3inti=1,su*=0;
for(;;){if(i>10)break;
无限宿环sum=sum+i;i++}
变形4inti,sum;
for(i=1,sum=0;i<=10;sum+=i,i++);
不管那一种变形,循环变量的初值、判断和变化
表达式仍都存在,只是改变了所处的位置。
不管那一种变形,三个表达式的功能缺一不
可,且执行流程不得改变。
原形:inti,sum=O;
for(i=1;i<=10;i++)sum=sum+i;
§6.4循环嵌套
一循环体中又包含了循环语句称循环嵌套。
例:求S=1!+2!+3!+...+n!
分析:首先要循环n次来累加i!
for(i=l;i<=n;i++)
s=s+i!;
如果存在求阶乘的运算!,计算完成。
for(i=l;i<=n;i++)
(;
t=t*i;
§6.4循环嵌套
例:已知小鸡0.5文钱/只,公鸡2文钱/只,
母鸡3文钱/只,现要求100文钱正好买100只鸡,
请给出所有的组合。
组合问题用计算机解,通常采取“凑”的办法
母鸡可能的只数:0—100hen
公鸡可能的只数:0—100cock
小鸡可能的只数:0—100chick
然后对三种鸡所有的组合方式,排除不等于
100元和100只的那些组合。
R§6.4循环嵌套
main()
■{
■intchick,cock,hen;
for(cock=0;cock<=100;cock++)cock=0->100
for(hen=0;hen<=100;hen++)hen=0^100
for(chick=0;chick<=100;chick++)chick=0
pf(cock+hen+chick==100&&~>100
cock*2+hen*3+chick*0.5==100)
・printf("cock=%dhen=%d
chick=%d\n”,cock,hen,chick);
§6.4循环嵌套
运行结果:
cock=0hen=20chick=80
cock=5hen=17chick=78
cock=10hen=14chick=76
cock=15hen=11chick=74
cock=20hen=8chick=72
cock=25hen=5chick=70
cock=30hen=2chick=68
§6.4循环嵌套
运行过程:
cock二°
"ken=Ochicl^p〜100共101次〕
hen=lchick/〜100共101次:
■hen=100chick=0〜100共101次J次
cock=l
-口hen=0chfek=0〜1Op10
共101次I101、多
~hen二100——chick-0-100共101次J次广万
、r
次
cock=100
hen=0chick=0〜100共101次1101
hen=100chick=0〜100共101次j次J
§6.4循环嵌套
main()
(
intchick,cock,hen;
for(cock=0;cock<=50;cock++)
for(hen=0;hen<=33;hen++)
{chick=100-cock-hen;
if(cock*2+hen*3+chick*0.5==100)
printf("cock=%dhen=%d
chick=%d\nH,cock,hen,chick);
)
§6.4循环嵌套
循环嵌套均是大循环包小循环
绝对不允许循环体交叉!
for()
for()■
{.....{………
—do{do{-
>3.....}while]...,-
/\}while(….)〉
§6.4循环嵌套
main()
(
intchick,cock,hen;
for(cock=0;cock<=50;cock++)
{for(hen=0;hen<=33;hen++)
{chick=100-cock-hen;
if(cock*2+hen*3+chick*0.5==100)
)
§6.4循环嵌套
main()
结论:break只能终止内层循环
intchick,cock,hen,flag=0;
for(cock=0;cock<=50;cock++)
{for(hen=0;hen<=33;hen++)
{chick=100-cock-hen;
if(cock*2+hen*3+chick*0.5==100)
}{flag=1;br
“接力赛”第一棒
if(flag)break]
)printf(......“接力赛”第二棒
例题
求算式】__L+L_-+
612203042_____-〜,“一
置到t第40项的和
main()
{inti,s=l;第i项:l/(i*(i+l))
floaty=0;
符号:s=l
for(i=l;i<=40;i++)
{y=y+s/((float)
s=-s;
}
printf("%f”,y);
例题
求算式】__L+L_-+
612203042_____-〜,“一
置到t第40项的和
main()
{inti,s=-l;第i项:l/(i*(i+l))
floaty=l;
符号:s=l
for(i=2;i<=40;i++)
{y=y+s/((float)
s=-s;
}
printf("%f”,y);
例题
编禾ftinclude<stdio.h>
main()
{inti,j;
printfT〃);第1行先输出5个空格
for(i=l;i<10;i++)printf(〃(%d)〃,i);
putchar('\n');
for(i=l;i<10;i++){i代表行
printf(〃(%d)〃,i);
for(j=l;j<10;j++)j代表列
printf(z/%2d〃,i*j);
putchar('\n');
例题
下歹ll程序求Sn=a+aa+aaa+……+aa...aa(n个己)的值,
sn=2+22+222+2222+22222,其值应为24690。
#include<stdio.h>
Imain()
inta,n,count=lrsn=0,tn=0;
scanf(''%d^d”,&a,&n);
for(count=l;count<=n,count++){
tn=tn*10+a;tn=0*10+2=2
sn=sn+tn;tn=2*10+2=22
}tn=22*10+2=222
printf(''th㊀snis:%d\n”,sn);
)
[程序举例
■l.输入一行字符,统计其中的单词数,单词之间用
格分隔开。
如:输入youareastudent则有4个单词。
智^思路:
M)用空格区分每一个单词;
■)遇到空格,则表示前一个单词结束;(word=0)
(3)遇到一个非空格:若前面一个字符是空格(即
ord=0),则开始一个新单词(word=1,计数加1,;
若前面一个字符是非空格(即word=1),则仍然是同
■^个单词。
wHclude<stdio.h>
main()
■charstring[81];
inti,num=O,word=0;
gets(string);
.for(i=0;string[i]!=i\0,;i++)
if(string[i]=='')word=0;
elseif(word==0){
word++;num++;
u,,
printf(Thereare%dwordsintheline.\nJnum);
程序举例
2.打印以下图案:
$
$$$
eeeeed
e金金e金e金e金e金e金e
wwDwweCL
I$$$$
分析:分上下两部分考虑
对上半部每一行:$数+空格数=列数(n)
行数$数空格数(单边)
.........$.......:11(n-1)/2
$$$|22*2-1=3(n-3)/2
eeeee32*3-1=5(n-5)/2
金让让金金金企
VVVVVVV42*4-1=7(n-7)/2
一般地:2*i-1(n-(2*i-1))/2
分析:
对下半部每一行:$数+空格数=列数(n)
行数空格数(单边)$数
$11n-1*2
$$$22n-2*2
eeeee33n-3*2
■■
e金让e让e金e金e金e金e11n-i*2
$$$
•……$……
■#include<stdio.h>
■main()
intn_blank,n_dollar,i,j,n,m;
scanf("%d”,&n);
m=(n+1)/2;
for(i=1;i<=m;i++){
n_dollar=2*i-1;
n_blank=(n-n__dollar)/2;
for(j=0;j<n_blank;j++)
putcharC
forG=0;j<n_dollar;j++)
putchar($);
putchar(J\n5);
)
for(i=1;i<m;i++){
n_blank=i;
n_dollar=n-2*n_blank;
for(j=0;j<n_blank;j++)
putchar(fi
for(j=0;j<n_dollar;j++)
putcharC$9);
putchar(i\n,);
)
return0;
)
例6.6用公式求TT直到某一项的绝对值小于10-6
#include<math.h>
main()
{Fl,pi=0,n=4,s=l
ints;
当It|
floatn,t,pi;
t=l,pi=0;n=l.0;s=l;pi=pi+t
while(fabs(t)>le-6)
{pi=pi+t;n=n+2
n=n+2;s=-s
s=-s;
t=s/n;t=s/n
pi=pi*4
pi=pi*4;
printf(〃pi=%10.6f\n〃,pi);
■[例6.7]求Fibonacci数列的前40个数。该数列的
生成方法为:F.l,F2=l,Fn=Fnl+Fn2
(n>=3),即从第3个数开始,每个数等于前2
个数之和。
fbri=lto20
输出fl,f2
fl=fl+f2
f2=f2+fl
main()
{longintfl=l,f2=l;/*定义并初始化数列的头2个
数*/
inti=l;/*定义并初始化循环控制变量i*/
fbr(i=l;i<=20;i++)/*1组2个,20组40个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小儿行走困难的临床护理
- 2025建筑合同常用英语句型
- 2025办公室租赁合同协议范本
- 2025集装箱活动房租赁合同范本
- 社会科学考试卷子及答案
- 山西五年级奥数试卷及答案
- 沙河二中考试卷子及答案
- 2025电大合同法精要速记版权威编排
- 2025【期权激励合同(张力律师)】股权期权激励合同
- 浙江国企招聘2025浙江青嘉建设有限公司(国有控股企业)招聘5人笔试参考题库附带答案详解
- 商事仲裁协议合同模板
- 2025-2030中国浆果行业市场发展趋势与前景展望战略研究报告
- 九年级中考2025年安徽中考数学真题汇编 专题19 统计与概率
- 2025-2030中国网络贷款(融资)行业市场发展现状及发展趋势与投资研究报告
- 抖音账号合同协议
- 湖北省武汉市2025届高中毕业生四月调研考试政治试题及答案(武汉四调)
- 儿童生长发育的健康监测与指导
- 铺货协议合同
- 2025至2030年中国分子筛干燥剂市场现状分析及前景预测报告
- 校园安全存在问题及对策
- NY∕T 309-1996 全国耕地类型区、耕地地力等级划分
评论
0/150
提交评论