版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章循环结构程序设计5.1while循环5.2do-while循环5.3for循环5.4循环结构的嵌套5.5转向语句5.6循环结构程序设计举例
5.1while循环while语句用于构成“当型”循环结构。while语句的一般形式为:
while(表达式)循环体语句while循环结构的执行过程是:首先计算表达式(循环条件)的值,若结果为“真”(非零),则执行循环体语句;然后再次计算表达式的值,重复上述过程,直到表达式的值为“假”(零)时结束循环,流程控制转到循环结构的下一语句。5.1while循环【例5.1】从键盘上输入一个整数n,求n!,利用while语句编程实现。main(){intn,i,s;printf("\nEntern:");
scanf("%d",&n);i=1;s=1; /*给变量i、s赋初值*/
while(i<=n) /*循环继续的条件*/ {s=s*i;
/*进行累乘求积*/
i++; /*乘数增值*/ }
printf("\nn!=%d",s); /*输出计算的结果*/}运行情况如下:Entern:5↙n!=1205.1
while循环使用while循环结构应注意以下几点:while循环结构的特点是“先判断,后执行”。如果表达式的值一开始就为“假”,则循环体一次也不执行。循环体中,如果包含一个以上的语句,则应用花括号括起来,以复合语句的形式出现。循环体内一定要有改变循环继续条件的语句,使得循环趋向于结束,否则循环将无休止的进行下去,即形成“死循环”。为使循环能够正确开始运行,还要做好循环前的准备工作,【例5.2】从键盘上输入30个学生的成绩,对其进行处理:如果成绩及格,则输出“Passed”;否则输出“Failed”。5.1while循环5.1while循环main(){intn=1;/*循环控制变量赋初值*/
floatscore;while(n<=30)/*/循环继续的条件*/{printf("Enterascore:\n");scanf("%f",&score);if(score>=60.0)printf("Passed\n"); elseprintf("Failed\n");n++;/*循环控制变量增值*/}}5.2
do-while循环do-while语句构成的循环结构类似于“直到型”循环,do-while语句的形式为:do
循环体语句while(表达式);do-while循环结构的执行过程:首先执行一次循环体语句,然后计算表达式(循环条件)的值。若结果为“真”(非零),则再次执行循环体,再计算表达式的值,如此重复下去,直到表达式的值为“假”(零)时,循环结束,流程控制转到循环结构的下一语句。5.2do-while循环【例5.3】用do-while循环结构实现例5.1。main(){intn,i,s;
printf("\nEntern:");
scanf("%d",&n);i=1;s=1;do{s=s*i; i++;}while(i<=n);printf("\nn!=%d",s);}5.2do-while循环使用do-while循环结构应注意以下几点:当do-while循环体包含一个以上的语句时应该用花括号括起来,以复合语句形式出现;循环体内也一定要有改变循环条件的语句,使循环趋向于结束。下面的两个程序可以明显的看出while循环和do-while循环的区别。5.2do-while循环当输入1时,两个程序的运行结果是一样的:Thesumis18,i=4当输入5时,第一个程序的运行结果是:Thesumis6,i=6第二个程序的运行结果是:Thesumis0,i=5for语句是功能强大的构成“当型”循环结构的循环语句。它不但可以用于循环次数已知的情况,而且还可以用于循环次数不定的情况。程序形式:for(表达式1;表达式2;表达式3)循环体语句5.3for循环for循环结构的执行过程:首先进行表达式1的运算,然后计算表达式2的值,若结果为真(非零),则执行循环体语句,最后进行表达式3的运算。再次计算表达式2的值,若结果为“真”(非零),再执行循环体语句,最后再进行表达式3的运算。如此循环重复下去,直到计算表达式2的结果为“假”(零)时,循环结束,流程控制转到循环结构的下一语句。【例5.4】用for循环结构实现例5.1。main(){intn,i,s;
printf("\nEntern:");
scanf("%d",&n);for(i=1,s=1;i<=n;i++) s=s*i;printf("\nn!=%d",s);}5.3
for循环使用for循环结构应注意以下几点:用for循环结构也具有“先判断,后执行”的特点。for循环结构相当如下形式的while结构:表达式1;while(表达式2)循环体表达式3;从语法上看,for的三个成分都是表达式,它们之间都以分号“;”隔开。表达式1和表达式3常常是赋值表达式或函数调用,有时也可以是逗号表达式,一般用来实现对循环控制变量初始化和循环控制变量增(减)值。表达式2常常是关系表达式或逻辑表达式,但也可以是其它类型的表达式,它是用来表示循环继续的条件,只要其值为非零,就可执行循环体,否则推出循环。例如:for(i=1,sum=0;i<=100;i++,i++)sum+=i;5.3for循环关键字for的三个表达式允许部分或全部省略,但其中的两个分号不能省略,否则,系统将报错。需要注意:当省略表达式1时,在进入for循环之前应该有给循环控制变量赋初始值的语句;当省略表达式3时,应该在循环体内有修改循环控制变量的值的语句,以保证循环能够正常结束。例如:for(i=1,s=1;i<=n;)
{s=s*i;;
i++;}当表达式2或三个表达式全部省略时,应该在循环体内设置相应的语句来结束循环,否则程序始终认为判断条件成立,循环将无终止地执行下去,即形成了所谓的死循环。如果循环体语句为一语句组,则必须用一对花括号“{}”括起来。5.3for循环由于for循环结构书写形式灵活多样,如果在三个表达式中过多的加入与循环控制无关的内容,容易降低可读性。因此,通常使用一种简单明了的for循环结构形式:for(循环控制变量赋初值;循环条件;循环控制变量增(减)值)循环体语句5.3for循环【例5.5】输入一批非零整数,以0为结束符,输出其中的最大值。#include<stdio.h>main(){intx,max;printf("inputnumbers,lastoneis0:\n");/*输出提示信息*/
scanf("%d",&x);max=x;/*先将第一个数赋值给变量max*/for(;x!=0;){scanf("%d",&x);if(max<x)max=x;/*输入值比变量max大,用当前值替换变量max的值*/}printf("max=%d\n",max);/*输出最大值*/}5.3for循环程序的运行情况如下:inputnumbers,lastoneis0:3↙6↙5↙2↙9↙7↙0↙max=9例3
main(){inta=10,b=5,c=5,d=5;inti=0,j=0,k=0;for(;a>b;++b)i++;while(a>++c)j++;dok++;while(a>d++);printf("%d,%d,%d\n",i,j,k);}运行结果:5,4,65.4循环结构的嵌套下面是几种合法的循环嵌套形式:(1)while()(2)for(;;){{……while()do{{……}}while();……}}(3)while()(4)do{{……for(;;)for(;;){{……}}}}while();5.4循环结构的嵌套【例5.6】编程输出以下形式的乘法九九表。1*1=11*2=21*3=31*4=41*5=51*6=61*7=71*8=81*9=92*1=22*2=42*3=62*4=82*5=102*6=122*7=142*8=162*9=18……9*1=99*2=189*3=279*4=369*5=459*6=549*7=639*8=729*9=81main(){ inti,j; for(i=1;i<=9;i++)/*i作为外循环控制变量控制被乘数变化*/ {printf("\n"); for(j=1;j<=9;j++)/*j作为内循环控制变量控制乘数变化*/
printf("%1d*%1d=%2d",i,j,i*j); }}5.4循环结构的嵌套【例5.7】全班有30个学生,每个学生考8门课。要求分别统计出每个学生各门课的平均成绩。5.4循环结构的嵌套main(){inti,j,score,sum; floataver; j=1; while(j<=30) {sum=0; for(i=1;i<=8;i++)
{printf("EnterNO.%dthescore%d:",j,i); scanf("%d",&score);/*输入第j个学生第i门课程的成绩*/
sum=sum+score;
/*累计第j个学生的总成绩*/ }
aver=sum/8.0;
/*计算第j个学生的平均成绩*/
printf("NO.%daver=%5.2f\n",j,aver);/*输出第j个学生的平均成绩*/
j++; }}5.4循环结构的嵌套使用循环的嵌套结构要注意以几点:外层循环应“完全包含”内层循环,不能发生交叉。例如下面这种形式是不允许的:do{……for(…){……}while(…);}嵌套的循环控制变量一般不应同名,以免造成混乱。5.4循环结构的嵌套嵌套的循环要注意正确使用缩进式书写格式来明确嵌套循环的层次关系,以增加程序的可读性。break语句break语句的功能是使执行从包含它的最内层循环或开关语句中跳出,转到switch结构或该循环结构外的下一语句执行。这将导致包含它的最内层循环(while、for、do-while)或switch语句的终止。break语句的一般形式:break;5.5转向语句
【例5.8】找出100~300之间第一个能17整除的数。
main(){inti;for(i=100;i<=300;i++){if(i%17==0)/*判断是否能被17整除*/{printf("%d\n",i);break;/*找到第一个能被17整除的数,结束整个循环*/}}}5.5转向语句
使用break语句应注意以下几点:break语句只能用于switch结构或循环结构中。在循环结构中应用时,通常与if语句配合使用。在嵌套的循环结构中使用时,break语句只能跳出(或终止)包含它的最内层循环。而不能同时跳出(或终止)多层循环。5.5转向语句
continue语句continue语句的作用是结束本次循环,使得包含它的循环(while、do-while、for)开始下一次重复continue语句的一般形为:continue;【例5.9】把100~200之间不能被7整除的数输出。main(){ intn; for(n=100;n<=200;n++) {if(n%7==0)continue;printf("%d\t",n); }}
5.5转向语句
使用continue语句时要注意以下几点:continue语句只能用于循环结构中。通常也要有if语句配合使用。continue语句和break语句虽然都实现了程序执行方向的无条件转移,但它们的区别是:continue语句只能结束本次循环,而不是终止整个循环的执行;break语句则是立即结束整个循环过程。例如
main(){inti=1;while(i<=15)if(++i%3!=2)continue;elseprintf("%d",i);printf("\n");}运行结果:2581114例如
求10~30间的全部质数
main(){inti,j;for(i=10;i<=30;i++)for(j=2;j<i;j++){if(i%j==0)break;if(j==i-1)printf("%d\t",i);}}5.5转向语句goto语句goto语句为无条件转向语句,功能是:把程序控制转移到标号指定的语句处,使程序从指定的标号处的语句开始继续执行。goto语句的一般形式为:goto标号;……标号:语句;标号是由用户命名的标识符,其后要跟一个冒号。标号的命名规则与变量名相同,其作用是用来表示goto的目标。标号可以用在任何语句前面,但必须与引用它的goto语句在同一个函数中。一般来讲,goto语句的用途有两种:与if语句一起构成循环结构;从循环体中跳到循环体外。5.5转向语句
【例5.10】从键盘上输入10个整数,求其累加和。采用if语句和goto语句构成的循环编程实现。main(){ inti,sum,x;; i=1;sum=0; loop:if(i>10)gotoend;/*loop为标号*/
printf("Enteradata:"); scanf("%d",&x); sum=sum+x; i++; gotoloop; end:printf("sum=%d\n",sum);/*end为标号*/}5.6循环结构程序设计举例计数型循环
5.6循环结构程序设计举例【例5.11】输入10个整数,求出其中的最大值与最小值。main(){ inti; intx,max,min; printf("\npleaseinputthefirstnumber:"); scanf("%d",&x); max=x; min=x; for(i=2;i<=10;i++) {printf("\npleaseinputthenextnumber:");scanf("%d",&x);if(x>max)max=x;elseif(x<min)min=x; } printf("\nmax=%d,min=%d",max,min);}5.6循环结构程序设计举例【例5.12】输入10个整数,输出其中正数的个数及平均值。#include<stdio.h>main(){intsum,i,k,x;printf("\ninput10numbers:");sum=0;k=0;for(i=0;i<10;++i){scanf("%d",&x);if(x<=0)
continue;/*结束本次循环,进行下一次循环判断*/
sum+=x;k++;}5.6循环结构程序设计举例
if(k)/*正数的个数不为0*/
printf("\nnumbers=%d,average=%.4f",k,1.0*sum/k);else
printf("\nnumbersis0");}运行情况如下:input10numbers:1↙8↙3↙-5↙9↙3↙-77↙2↙9↙6↙numbers=7,average=5.42865.6循环结构程序设计举例【例5.13】计算s=1!+2!+3!+…+n!,n由终端输入。#include<stdio.h>main(){inti,j,n;longsum,term;/*定义变量sum、term为长整型变量*/
printf("\ninputn:");scanf("%d",&n);for(sum=0,i=1;i<=n;i++){term=1;j=1;do{term*=j;/*求i的结乘*/}while(++j<=i);sum+=term;/*把i的结乘累加到sum单元中*/}5.6循环结构程序设计举例printf("\nsum=%ld\n",sum);}程序的运行情况如下:inputn:4↙sum=33例
计算1!+2!+3!+……+10!
main(){floatx,y,t,s;s=0;for(x=1;x<=10;x++){y=1;t=1;while(y<=x){t=t*y;y++;}s=s+t;}printf("%10.0f\n",s);}例2
main(){inti,j,k;chars='';for(i=0;i<=5;i++){for(j=1;j<=i;j++)printf("%c",s);for(k=0;k<=5;k++)printf("%c",'*');printf("\n");}}例3
输出以下图案
****************
程序如下main(){inta,b,c;for(a=0;a<=3;a++){for(b=0;b<=2-a;b++)printf("");for(c=0;c<=2*a;c++)printf("*");printf("\n");}}其中a决定了行数若改为:main(){inta,b,c;for(a=0;a<=5;a++){for(b=0;b<=4-a;b++)printf("");for(c=0;c<=2*a;c++)printf("*");printf("\n");}}则输出变成了6行。条件型循环【例5.14】利用格里高利公式求π:=1-+-+…直到最后一项的绝对值小于等于10-6为止。#include"math.h"main(){intsign=1;floatn,pi,t;t=1.0;n=1.0;pi=0.0;do{pi=pi+t;n=n+2;sign=-sign;/*符号转换*/
t=sign/n;}while(fabs(t)>=1e-6);pi=pi*4;
printf("\npi=%10.6f",pi);}运行情况:pi=3.1415945.6循环结构程序设计举例【例5.15】输入一个整数n(n≥3),判断是否为素数。#
include"math.h"main(){ intn,i,flag; printf("\nEnterainteger:"); scanf("%d",&n); i=2; flag=1; while(i<=(int)sqrt(n)&&flag)
if(n%i==0)flag=0;elsei++; if(flag)printf("\n%disprimenumber.",n); elseprintf("\n%disnotprimenumber.",n); }5.6循环结构程序设计举例运行情况:Enterainteger:78↙78isnotprimenumber.再运行:Enterainteger:137↙137isprimenumber.父子俩的年龄:父亲今年30岁,儿子今年6岁,问多少年后父亲年龄是儿子年龄的2倍打印500以内所有能被7或9整除的数。main(){inti=30,j=6;for(;i<500;i++,j++)if(i==2*j)printf("after%dyear,%dis%d*2",i-30,i,j);}main(){inti;for(i=1;i<=500;i++)if(i%7==0||i%9==0)printf("%d\t",i);}goto语句
goto是无条件转向语句,它的形式是:goto语句标号;goto语句可以和if语句一起组成循环,也可以用于跳出循环体
例如:计算1+2+3+……+99+100的值
main(){inti,t=0;i=1;aaa:if(i<=100){t=t+i;i++;gotoaaa;}printf(“%d“,t);}循环的应用一、Fibonacci数列问题1,1,2,3,5,8,13,21,34,55,……归纳分析结果:数列的第三项等于前两项之和。可使用循环解决该问题。程序如下:
main(){inta=1,b=1,c,i;
printf(“%d\t%\t”,a,b);for(i=3;i<=10;i++){c=a+b;a=b;b=c;
printf(“%d\t”,c);if(i%5==0)printf(“\n”);}}练习:编程,将数列延长到前50项:1,2,5,10,21,42,85,170,341,682,……牛的繁殖问题:有一头母牛,它每年年初要生一头小母牛;每头小母牛从第四个年头起,每年年初也要生一头小母牛。按此规律,若无牛死亡,第20年头上共有多少头母牛。main()
{inti;
floatj=1;printf("%10.0f\t",j);
for(i=2;i<=50;i++)
{if(i%2)j=2*j+1;
elsej=2*j;
printf("%10.0f\t",j);
if(i%5==0)printf("\n");
}
}
main(){intx,j,z=1;j=1;printf("%d\t",j);for(x=1;x<20;x++){if(x<=4) {j++;}else{z++;j+=z;}printf("%d\t",j);if(x%4==0)printf("\n");}}搬砖问题36块砖,36人搬,男搬4,女搬3,两个小孩抬一块砖,要求一次全搬完,问男、女、小孩各需要多少人?
main(){intmen,women,children;for(men=1;men<=36/4;men++)for(women=1;women<=36/3;women
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 那曲地区那曲县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 吕梁市汾阳市2025-2026学年第二学期五年级语文期中考试卷(部编版含答案)
- 包头市固阳县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 红十字进社区工作制度
- 纪念馆讲解员工作制度
- 经济运行调度工作制度
- 维稳信息调研工作制度
- 综治中心值班工作制度
- 2025 初中写作运用故事隐喻映射社会现实课件
- 2026年农业种植生物技术创业模式
- 开工第一课-2026年春节复工复产安全教育培训
- 提高跑步速度课件
- 第5课《和大家在一起》(名师课件)
- 2026年河南建筑职业技术学院单招职业技能测试必刷测试卷汇编
- 《做孝顺子女》课件
- 厂房建设与租赁合同标准范例
- 2026蓝色简约风学习成果汇报模板
- 广东烟草专卖局招聘考试真题2025
- 旅游接待业期末测试
- 2026届新高考数学热点精准复习 解三角形
- 2025年玉米深加工分析报告
评论
0/150
提交评论