【文档说明】C语言程序设计基础课件第5讲循环结构.ppt,共(58)页,564.523 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44510.html
以下为本文档部分文字说明:
循环结构第四章循环结构在人们所需处理的运算任务中,常常需要用到循环结构,所谓循环是指对同一个程序段重复执行若干次。被重复执行的部分(由若干语句组成)称为循环体。循环结构又称重复结构。本章主要内容1while循环语句2do~while循环语句3for循环语句4循环嵌套及注意的问题循环结构问题
输出整数1-10输出整数1-100输出整数1-nprintf(“%d”,1);printf(“%d”,2);……printf(“%d”,n);i=1;printf(“%d”,i);i++;printf(“%d”,i);i++;……printf(“%d”,i);
i++;i=1;while(i<=10){printf(“%d”,i);i++;}循环结构while语句语法:while(表达式){循环体}说明(1)while是关键字。(2)循环体是多条语句,用{}。非0whil
e(表达式)表达式循环体0循环结构while语句非0while(表达式)表达式循环体0i=1;while(i<=10);{printf(“%d”,i);i++;}循环条件改变循环条件思考:如果没有i++,程序如何执行?循环结构10求su
m=∑ii=1sum=0sumsum+1sumsum+2sumsum+3…..sumsum+10sum=sum+?1找循环不变式2考虑问号3循环条件intsum=0,i=1;while(i<=10
){sum=sum+i;i++;}循环结构例1main(){inti=0;while(i<=10){printf(“*”);i++;}}例2main(){inti=1,sum=0;while(i<=100){sum=sum+i;i++;}printf(“sum=%d”,sum);}循环结构例3
一个班有学生50人,统计该班学生语文成绩中高于80分的人数。把统计结果在屏幕上输出。intm=1,n=0;floatx;while(m<=50){printf(“请输入第%d个同学分数:\n”,m);scanf(“%f”,&x);if(x>=
80)n++;/*累加大于80分的人数*/m++;}printf(“大于80分的学生人数为%d个\n“,n);分析:成绩要通过键盘输入,设为x,高于80分的人数为n,总人数为m。从键盘输入5个学生的语文、数学、英
语3门成绩,输出每个学生的总分与平均成绩。循环结构从键盘输入5个学生的语文、数学、英语3门成绩,输出每个学生的总分与平均成绩。intj=1;floata,b,c,sum,aver;while(j<=5){printf(“输入第%d个学生三门成绩\n
”,j);scanf(“%f%f%f“,&a,&b,&c);sum=a+b+c;aver=sum/3;printf(“第%d个学生总分=%f,平均=%f”,j,sum,aver)j++;}循环结构1如何确定循环条
件?题目中有明确的提示!从键盘输入5个学生的2如何确定循环体?重复执行的语句!从键盘输入5个学生的语文、数学、英语3门成绩,输出每个学生的总分与平均成绩。等价于:(1)输入1个学生的语文、数学、英语3门成绩;(2)计
算总分与平均分(3)输出总分与平均成绩。循环结构#include<stdio.h>main(){intn,i=1,sum=1;printf(“pleaseinputn\n”)scanf(“%d”,&n)while(i<=n){sum=sum*i;i++;}printf(“sum=%d”,s
um);}例4以下程序从键盘输入5,结果是多少?循环结构do-while语句语法:do{循环体}while(表达式);注意:1先执行循环体,再判断循环条件,循环至少执行一次。2while()后的分号不能省略。非0while(表达式)循环体0i=1;while
(i<=10){printf(“%d”,i);i++;}dowhile(i<=10);循环结构例1:main(){inti=1;do{printf(“*”);i++;}while(i<=10);}例2:main(){inti=1,s
=0;do{s=s+i;i+=2;}while(i<=100);printf(“s=%d”,s);}循环结构统计某班级中计算机课程中成绩高于95分的学生人数。假定(10人)1算法分析将该班每人计算机课程成绩输入计算机,每输
入一个成绩,就与95进行比较,如果大于95,计数器加1,直到输完10个人成绩为止。最后显示出统计的人数。2数据结构用fs存放输入的数据,用变量j记录输入数据的个数,数据输完成时j=10,用变i统计高于95分学生的人数。当成绩
输完后,输出i累加后的结果。循环结构inti=0,j=1;floatfs;while(j<=10){printf(“输入第%d个数”,j);scanf("%f",&fs);if(fs>95)i++;j++;}printf(“>95分
人为%d“,i);循环结构inti=0,j=1;floatfs;do{printf(“输入第%d个数”,j)scanf("%f",&fs);if(fs>95)i++;j++;}while(j<=10);printf(“95分人为%d“,i);循环结构while和do-whi
lewhile(表达式){循环体}do{循环体}while(表达式);非0while(表达式)表达式循环体0非0while(表达式)循环体0先判断后循环先循环后判断循环结构一般情况两者差不多-进入循环结构执行若
干次后结束循环;极端情况(1)死循环(2)无法进入循环i=100,while(i<10)循环结构for循环语句(功能强)语法:for(表达式1;表达式2;表达式3){循环体}执行过程:1先运算表达式12
再运算表达式2,真执行循环体3再运算表达式3,判断循环条件表达式1循环体表达式3表达式2TF若表达式2为假不执行循环体注意:(1)表达式1在不在循环里?执行几次?(2)先做循环,再运算表达式3!若表达式2为假,表达式3如何运算?(3)循环体包含那些?循环结构whil
e和for表达式1循环体表达式3表达式2TFfor(表达式1;表达式2;表达式3){循环体}while(表达式){循环体}非0while(表达式)表达式循环体0如何用while写for结构?while(?){?}表达式1;while(表达式2){循环体;表达式3;}结论:for语句书写结构更清晰
循环结构while语句while(表达式){循环体}do~while语句do{循环体}while(表达式);for循环语句for(表达式1;表达式2;表达式3){循环体}1.三种循环可用来处理同一问题,一般
情况可互相代替2.dowhile语句至少执行一次循环。3.while与for可能一次也不执行。几种循环的比较循环结构for(表达式1;表达式2;表达式3){循环体}控制循环是否结束改变循环条件二、说明:1、表
达式1可以是逗号表达式,可省略,但其后的分号不能省;2、表达式2也可省略,此时循环为无穷循环;3、表达式3也可省略。sum=0;for(i=1;i<=10;i++)sum=sum+i;intsum=0
,i=1;while(i<=10){sum=sum+i;i++;}sum=0;for(i=1;i<=10;i++){sum=sum+i;i++;}结果是什么?循环结构例4.5统计某班级中计算机课程中考试成绩
高于80分的人数(10人),用for循环语句写该程序。intfs,j,i=0;for(j=1;j<=10;j++){printf(“请输入第%d个学生成绩\n”,j);scanf(“%d”,&fs);if(fs>80)i++
;}printf(“i=%d\n“,i);循环结构例2:说明以下循环语句的循环次数。(1)for(i=0;i<n-1;i++);答:(2)for(i=n;i>=0;i--);答:(3)i=1;while(i<n)++i;
答:(4)i=4;doi--;while(i<0);答:(5)m=5;while(m<5)m+=2;答:(6)for(i=1,j=2;i>j;i++,j--);答:n-1次n+1次n-1次1次0次0次循环结构1求数列s=1+2+3………….n程序段
:s=0;for(i=1;1<=n;i++)s=s+i;算法:循环的条件:i<=n重复做的:s=s+t;t++(加法运算)循环的控制:i++等价t++循环结构2求数列s=1+1/2+1/3………….1/n程序段:s=0;for(i=1;
i<=n;i++)s=s+1.0/i;算法:循环的条件:i<=n重复做的:s=s+t(t是什么?)循环的控制:i++t=1.0/is=s+1.0/i循环结构inti,n;floats=0;printf(“pleaseinputn:“);scanf(“%d
”,&n);for(i=1;i<=n;i++)s=s+1.0/i;printf(“s=%f”,s);循环结构练习:求数列s=1/12+1/22+1/32….1/n2的和intn,i;floats;printf(“inputn:“)
;scanf(“%d”,&n);for(i=1;i<=n;i++)s=s+1.0/(i*i);printf(“s=%f”,s);循环结构3求数列s=1-1/2+1/3-1/4………….1/n程序段:s=0;m=
1for(i=1;i<=n;i++){s=s+1.0/i*m;m=-m;}循环结构练习求数列s=1-1/3+1/5-1/7+1/9…1/(2n-1)的和intn,i=1,m=1;floats=0;printf(“inputn:“);scan
f(“%d”,&n);while(i<=n){s+=m*1.0/(2*i-1);m=-m;i++;}printf(“s=%f”,s);分析:找出通项s=s+1.0/(2*i-1){s+=pow(-1,i+1)/(2*i-1));循环结构4求数列s=1-1/3+1/5…直到最后一项的绝对值<10
-5inti=1,m=1;floats=0,t=1;while(fabs(t)>=1E-5){t=1.0/(2*i-1);s=s+m*t;m=-m;i++;}printf(“s=%f”,s);循环结构练习:求的近似值,精确到10210n1公式为:
2222121116n1算法分析=sqrt(s*6)doubles=0;inti;for(i=1;1.0/(i*i)>=1e-10;i++)s=s+1.0/(i*i);printf("%f\n",sqrt(s*6));循环结构5求数列5
0011n511111611的和。程序inti;floatsum=0;for(i=0;i<=100;i++)sum=sum+1.0/(1+i*5);printf("%f",sum);循环结构6:下面程序是统计从键盘输入的
数字字符1-9的个数,用换行结束循环,请填空。intn=0;charc;c=getchar();while(1){if(2)n++;c=getchar();}printf(“n=%d”,n);c!=„\n‟c>=„1‟&&c<=„9
‟循环结构计算并输出n(包括n)以内能被5或9整除的所有自然数的倒数之和。循环结构longinti,n,t=1;printf(“pleaseinputn:”);scanf(“%d”,&n);for(i=
1;i<=n;i++)t=t*i;printf(“n!=%ld\n”,t);7求n!循环结构longinti,n,t=1,s=0;printf(“pleaseinputn:”);scanf(“%d”,&n);for(i=1;i<=n;i++)if(i%2){t=
t*i;s=s+t;}printf(“s=%ld\n”,s);练习:s=1!+3!+5!........循环结构longinti,n,x,t=1;printf("pleaseinputxandn:");scanf("%d%d",&x,&n);for(i=
1;i<=n;i++)t=t*x;printf("t=%ld\n",t);8求xn循环结构计算并输出给定整数n的所有因子(不包括1与自身)之和。规定n的值不大于1000。循环结构break和continue语句intn=1,s=0;while(n<=10){s=s+n;
break;n++;}printf(“%d”,s);break使流程跳出本层循环体continue跳过本次循环中余尚未执行的语句,接着去执行下一个循环ints=0,n=1;while(n<20){n++;continue;s
=s+n;}printf(“%d”,s);}退出循环体跳过循环体中未执行的语句循环结构break和continue语句例1以下程序输出结果ints=0,n=1;while(n<=10){if(n==4)break;s=s+n;n++;}printf(“%d”,s);例2以下程
序输出结果intn=1;while(n<10){if(n>3)continue;n++;}printf(“%d”,n);6死循环,无输出!循环结构intn=2;while(n<10){if(n<3)continue;if(n==5)break;n++;}p
rintf(“%d”,n);A10B9C5D死循环inta=1,b=1;while(a<50){if(b>=9)break;if(b%3==1)b+=3;a++;}printf(“%d”,a);A2B
3C4D5循环结构输入m,判断m是否是素数算法:除了1和m,不能被其他数整除m%2%3%4%......%(m-1)不是素数||=0=0=0……=0是素数&&!=0!=0!=0……!=0程序:for(i=2;i<m;i++)if(m%i==0)break;if(i==m)printf
(“是素数”);elseprintf(“不是素数”);循环结构循环的嵌套循环体内再包含循环语句while(表达式){循环体}内循环for或dowhile{循环体}for(式1;式2;式3)外循环内循环注
意外循环条件满足时进入内循环;只有当内循环循环完毕后,才会回到外循环.while(表达式){循环体}循环结构程序inti;for(i=1;i<=10;i++)printf(“*”);输出:****************************************************
**********************************************************如要输出如下图形:循环结构********************************************
*************************************************************************************************************************循环结构计算并输出3到n(大于2)之间所有素数的
平方根之和intn,m,ki;doubles=0.0;scanf(“%d”,&n);for(m=3;m<=n;m++){for(i=2;i<=m;i++)if(m%i==0)break;if(i==m)
s+=sqrt(m);}printf(“s=%f”,s);循环结构#include<stdio.h>main(){intt=0,n=1,s=0;while(n<=7)){_1_;s=s+_2_;n++;}printf(“s=%d\n”,s);}t=t*10+3t或t=1/3*(pow(10,n)-
1)计算3+33+333+3333…3333333(7个3)的和,请填空。循环结构习题4计算:1+22+333+4444+……..前7项(p87)intt=0,n=1,s=0;while(n<=7)){t=n*((pow(10,n)-1)/9);s=s+t;n++;}习题
5计算:1+12+123+1234+……..前7项循环结构下面程序的功能是完成用一元人民币换成一分、两分五分的所有兑换方案,请填空。inti1,i2,i5;for(i5=0;i5<=20;i5++){for(
i2=0;i2<=50;i2++){i1=—1—;if(—2—)printf(“%d%d%d”,i5,i2,i1);}}}100-i5*5-i2*2;i1>=0循环结构下面程序是从三个红球、五个白球、六个黑球取出八个球,且中必须有白球,输出
所有可能的方案。请填空。inti,j,k,sum=0;for(i=0;i<=3;i++){for(—1—;j<=5;j++){k=8-i-j;if(—2—){sum++;printf(“%d%d%d\n”,i,j,k);}
}}printf(“%d”,sum);j=1k>=0&&k<=6循环结构intn,a,b,c;for(n=100;n<=999;n++){a=n/100;b=n/10%10;c=n%10;if(a*a*a+b*b*b+c*c*c==n)printf(“%d
”,n);}6.请找出这样一些三位数整数,其本身恰好等于其各位数的立方和,如153=13+53+33循环结构下面程序是求1000以内的完全数(一个数如果恰好等于它的因子之和,则称该数为完全数,如:6=1+2+3,再如:28=1+2+4+7+14
)。inta,i,m;for(a=1;a<=1000;a++){for(—1—;i<=a/2;i++)if(a%i==0)—2—;if(m==a)printf(“%d\n”,a);}m=0,i=1m=m+i循环结构
搜索(穷举求解)中国剩余定理:“有物不知几何,三三数余一,五五数余二,七七数余三,问:物有几何?”。编程求1000以内所有解。intm,count=0;for(m=1;m<=1000;m++)if(m%3=
=1&&m%5==2&&m%7==3){printf(“%5d”,m);count++;if(count%5==0)printf(“\n”);}循环结构例3:“鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁母雏各几何?”(引自张邱建算经,公元五世
纪)分析:设x,y,z分别表示鸡翁,鸡母,鸡雏的数目,则有x:0~20y:0~33z:0~300x+y+z=1005x+3y+z/3=100上述方程属于不定方程,解并不唯一,因此,只能用搜索法对x,y,z的所有组合
情况,测试满足条件的解。循环结构intx,y,z;printf(“CockHenchicken\n”);for(x=0;x<=20;x++)for(y=0;y<=33;y++){z=3*(100-5*x-3*y);if(z>=0&&x+y+z==100)printf(“%8d%8d%8d\n”
,x,y,z);}循环结构搜索求解练习有30个男.女.小孩同在一家小饭馆进餐,共花了50先令,其中每位男宾3先令,每位女宾2先令,每位小孩1先令,问男.女.小孩各多少?(马克思数学手稿)循环结构inti,j,k;for(i=0;i<=16;i++)for(j=0;j<=25;
j++){k=50-3*i-2*j;if(k>=0&&i+j+k==30)printf("%5d%5d%5d",i,j,k);}循环结构#include<stdio.h>main(){inti,j,k;for(i=1;i<=28;i++)for(j=1;j<=28
;j++)for(k=1;k<=28;k++)if(3*i+2*j+k==50&&i+k+j==30)printf("%5d%5d%5d\n",i,j,k);}