【文档说明】计算机本科c措辞第六章讲稿[优质课件.ppt,共(55)页,435.000 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-5335.html
以下为本文档部分文字说明:
本章重点for语句do-while语句while语句本章难点break语句和continue语句的区别点循环条件的表示和控制循环的嵌套第六章循环控制第1页,共55页。一、结构化程序的三种基本结构A块B块条件A块B块成立不成立顺序结构分支选择结构第2页,共55
页。条件AB不成立a块当型循环结构条件Aa块不成立直到型循环结构B区别在于:当型循环结构当条件满足时,反复执行a块,直到条件不满足时才停止循环。而直到型是先执行a块操作,再判断条件是否满足,若满足再执行a块,如此反复,直到条件不满足为止。第3页,共55页。循
环结构一般由两部分组成:进入或退出循环的条件:该条件决定是否继续下一轮循环。循环体:为每一轮循环所进行的操作,语法上要求是一个语句序列构成,如示意图中的a块。第4页,共55页。在许多问题中要用到循环控制:输入全校学生成绩求04级C语言的总成绩1+2+3…+1
00……循环是用来求这类重复性操作的结构,几乎所有实用的程序中都包含循环,掌握循环是结构化程序设计最基本的要求。第5页,共55页。一、while语句1、一般形式while(表达式)语句说明:当表达式的值为真时执行循环
体语句特点:先判断表达式,后执行语句。执行过程为:先计算表达式的值,如果为真,则执行循环体语句部分并重新求表达式的值,一直到表达式的值变为0时,才退出整个循环结构。第6页,共55页。在应用while()语句时,要注意以下几点:①while()后面的条件表达式一定要用一对圆括弧括起来。②如
果循环体中的语句多于一条时,应该用大括号括起来,以复合语句形式出现,因为while()语句的作用范围只能是while()后面的第一个语句③在循环体中应有改变循环条件表达式的语句,否则,如果不采用其他方法退出循环,将
成为死循环。④while()语句可以嵌套。第7页,共55页。例1设有程序段intk=10;while(k=0)k=k-1;则下面描述正确的是___________A)while循环执行10次B)循环是无限循环C)循环体语句一次也不执行D)循环体语句执行一次第
8页,共55页。例2:求1+2+…+50main(){intn=1,sum=0;while(n<=50){sum+=n;n++;}printf(“sum=%d\n”,sum);}当循环体由多个语句组成时,必须用左、右花括号括起来,使其形成复合语句。第9
页,共55页。例3利用while语句,计算1+1/2+1/4+…+1/50的值,并显示出来。#include<stdio.h>main(){inti;floatsum=1.0;i=2;while(i<=50){s
um+=1/(float)i;i+=2;}printf(“sum=%f\n”,sum);}第10页,共55页。例4从键盘连续输入字符,直到输入‚回车‛符为止,并分别统计其中算术运算符(+-*/%)的个数。main(){intc_ad
d=0,c_sub=0,c_mul=0,c_div=0,c_mod=0;charch;while(1){ch=getchar();if(ch==„\n‟)break;switch(ch){case„+‟:c_add++;break
;case„-‟:c_sub++;break;case„*‟:c_mul++;break;case„/‟:c_div++;break;case„%‟:c_mod++;break;}}printf(“%d%d%d%d%d”,c_add,a_sub,a_mul,a_di
v,a_mod);}„\n‟为标记值,当提前不知道准确循环的次数,可用标记来控制循环。第11页,共55页。例5键入一个整数,然后按相反顺序输出各位数字。分析:要将一个整数按相反的次序输出各位数字,必须获得该整数的各位数字,由于n%10为n的个位数,用循环
语句来实现。#include<stdio.h>main(){intn,r;/*n用来接受输入的整数,r用来求个位数*/printf(“请输入一个整数:”);scanf(“%d”,&n);putchar(„\n‟);while(
n!=0){r=n%10;printf(“%d”,r);n/=10;}}第12页,共55页。二、do-----while语句1一般形式:do语句while(表达式);2特点1)先执行一次语句,后判断表达式;当表达式的值为真时,反复执行循环体中的语句。3注意点:同while()语句,但还要特
别注意一点,即while()后的分号不能少。4与while()语句的不同点:while()语句是先判断后执行而do…while()语句是先执行后判断。第13页,共55页。例子1以下程序段x=-1;do{x=x*x;}while(!x);A)死循环B)循环执行二次C)循
环执行一次D)有语法错误第14页,共55页。例2求1+2+…+50#include<stdio.h>main(){intn=1,sum=0;do{sum+=n;n++;}while(n<=50);prin
tf(‚sum=%d\n‛,sum);}第15页,共55页。main()main(){intsum=0;{intsum=0;intn;intn;scanf(‚%d‛,&n);scanf(‚%d‛,&n)
;while(n<=10)do{sum+=n;{sum+=n;n++;}n++;}while(n<=10);printf(‚sum=%d\n‛,sum);printf(‚sum=%d\n‛,sum);}}如果从终端输入的值为
11的前提下,请大家分析两个程序的运行结果.例3第16页,共55页。例4若执行下面程序时,输入‚Adescriptor”后按回车,则以下程序的输出结果是_____#include<stdio.h>main(){charc;intv0=0,
v1=0,v2=0;doswitch(c=getchar()){case„a‟:case„A‟:case„e‟:case„E‟:case„i‟:case„I‟:case„o‟:case„O‟:case„
u‟:case„U‟:v1++;default:v0++;v2++;}while(c!=„\n‟);printf(“\nv0=%d,v1=%d,v2=%d”,v0,v1,v2);}v0=7,v1=4,v2=7v0=8,v1=4,v2=8v0=11,v1=4,v2=11v0
=12,v1=4,v2=12第17页,共55页。1、一般形式for(表达式1;表达式2;表达式3)语句表达式2非00求解表达式1语句表达式3三for语句2、它的执行过程:第18页,共55页。则执行以下for语句时,for(i=0;i<3;
i++)printf(“*”);表达式1执行_____次,表达式2执行_____次;表达式3执行_____次。例子1:第19页,共55页。3for语句最简单的应用形式是:for(循环变量赋初值;循环条件;循环变量增值)语句例2求1+2+
…+50#include<stdio.h>main(){intn,sum;for(n=1,sum=0;n<=50;n++)sum+=n;printf(“sum=%d\n”,sum);}for语句最简单的应用形式通常用计数
器来控制循环第20页,共55页。#include<stdio.h>main(){intn,sum=0;for(n=1;n<=50;n++)sum+=n;printf(“sum=%d\n”,sum);}计数器控制的循环的本质在一个由计数器控制的循环
中,需要包括以下内容:1控制变量(循环计数器)的名称2控制变量的初值3用于检测控制变量终值的条件(即循环是否要继续)4循环时,控制变量每一次都会自增或自减(通常是1)第21页,共55页。例子304级计算机专业有4位同学中的一位做了好事,不留名,表扬
信来了之后,院长问这4位是谁做的好事。A说:不是我B说:是CC说:是DD说:他胡说已知3个人说的是真话,一个人说的是假话,现在要根据这些信息,找出做了好事的人。第22页,共55页。#include<stdio.h>voidmain(){intk;chars;for(k=1;k
<=4;k++){s=64+k;if(((s!='A')+(s=='C')+(s=='D')+(s!='D'))==3)printf("thismanis%c“,s);}第23页,共55页。(1)for语句一般形式中的表达式1可
以省略例子4#include<stdio.h>main(){intn=1,sum=0;for(;n<=50;n++)sum=sum+n;printf(“sum=%d\n”,sum);}请大家理解以下几点:第24页,共55页。(2)如果表达式2省略,即不判断条件,
循环无终止地进行下去。此时必须在循环体中有一个if…break语句使循环终止。例子5#include<stdio.h>main(){intn,sum;for(n=1,sum=0;;n++){sum+=n;if(n==50)break;}printf(“sum=%d\n”,sum);}第25页,
共55页。(3)表达式3也可以省略,但此时应在循环体中设法使循环变量的值发生改变,从而使循环条件趋于0。例子6#include<stdio.h>main(){intn,sum;for(n=1,sum=0;n<=50;){sum+=n;n++;}printf(
“sum=%d\n”,sum);}第26页,共55页。(4)表达式1、表达式2、表达式3也可同时省略。例子7/*该程序功能求1~50的总和*/#include<stdio.h>main(){intn,sum=0;_____;for(;;){sum+
=n;__________;__________;}printf(“sum=%d\n”,sum);}第27页,共55页。4for语句的应用方面1)计数循环:在已知最大循环次数的情况下,可使用for语句。例子8#include<s
tdio.h>main()/*程序的功能求10的阶乘*/{longsum=1;intt;for(t=1;t<=10;t++)sum*=t;printf(‚10的阶乘为%ld\n‛,sum);}第28页,共55页。2)查找循环:和if…break语句配合使用,当找到符合条件
的值时,就跳出循环;反之,则继续查找。#include<stdio.h>/*例子9*/main(){inti,a;for(i=1;i<=100;i++){scanf(“%d”,&a);if(a%7==0){printf(
“%d”,a);break;}}if(i>=101)printf(“不存在\n”);}第29页,共55页。3)无限循环:没有循环条件或条件永远为真值的for循环是无限循环。例如在显示功能菜单并等待键盘输入的应用中,或者在单片机控制中等待外部
变量的变化过程中,都可以使用无限循环。此时只有在循环体中判断某个条件为真时,用break语句跳出循环。第30页,共55页。例子10#include<stdio.h>main(){charc;for(c=getchar();;c=getchar()){clrscr();
/*清屏*/puts(“pleaseselectkey:\n”);puts(“1.insertrecord\n”);puts(“2.deleterecord\n”);puts(“3.printrecord\n”);puts(“0.Exit\n”);if(c==„0‟)break;第31页,共
55页。switch(c){case„1‟:insert();break;case„2‟:delete();break;case„3‟:print();break;default:printf(“error\n”);break;}}}第32页
,共55页。4)延时循环:即循环体内不做任何事情,只是使CPU等待一定时间后再执行程序,这在控制两个动作之间的时间间隔上经常使用。#inlcude<stdio.h>/*例子11*/main(){intt;clrscr();puts(“hello,welcomeyou!\
n”);for(t=1;t<=1000;t++);puts(“并祝您能早日掌握C语言\n”);getchar();}第33页,共55页。5循环的嵌套一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。其
中三种循环可以互相嵌套。while(){…do{…}while();…}第34页,共55页。例子1若t,k已定义为int类型,则以下程序段中循环体执行总的次数是?for(t=5;t;t--)for(k=0;k<4;k++)printf(“*”)
;第35页,共55页。循环嵌套的应用1)用来处理数组中元素(如赋值、排序、输出等)例子2#include<stdio.h>main(){ints[2][3],t,k;for(t=0;t<=1;t++)for(k=0;k<=2;k++)scanf(“%d”,&s[t][
k]);for(t=0;t<=1;t++)for(k=0;k<=2;k++)printf(“%5d”,s[t][k]);}第36页,共55页。2)解决数学上的穷举法问题例子3婚礼上的谎言三对情侣参加婚礼,三个新郎为A,B,C三个新娘为X,Y,Z。有人想知道究竟谁和谁结婚
,于是就问新人中的三位,得到如下的提示:A说他将和X结婚;X说她的未婚夫是C;C说他将和Z结婚。这人事后知道他们在开玩笑,说的全是假话。那么,究竟谁与谁结婚呢?第37页,共55页。#include<stdio.h>main(){charA,B,C;for(A=‘X
’;A<=‘Z’;A++)for(B=‘X’;B<=‘Z’;B++)for(C=‘X’;C<=‘Z’;C++)if(A!=‘X’&&C!=‘C’&&C!=‘Z’&&A!=B&&A!=C&&B!=C){printf(‚Awillmarryto%c\n‛,A);printf(‚Bwillmarryt
o%c\n‛,B);printf(‚Cwillmarryto%c\n‛,C);}}第38页,共55页。五、break语句作用:从循环体内跳出循环,接着执行控制语句下面的语句。如例子1#include<stdio.h>#definePI3.14156main(){intr;flo
atarea;for(r=1;r<=10;r++){area=PI*r*r;if(area>100)break;}printf(“%f\n”,area);}第39页,共55页。break语句通常用于以
下两种情况:用于switch语句的语句序列中,作用是退出switch语句。用在循环中,其功能是用来退出循环结构,即当运行到循环体中的break语句时,就立即退出循环。通常和if语句结合使用。第40页,共55页。七、continue语句一般形式:continue作用:结束本次循环,跳过循环体
中下面尚未执行的语句,接着进行下一次是否进行循环的判定main(){intn;for(n=100;n<=200;n++){if(n%3==0)continue;elseprintf(“n=%d\n”,n);}}第41页,共55页
。书中例1用л/4约等于1-1/3+1/5-1/7+1/9+…式,求л的近似值,直到最后一项的绝对值小于10-6为止#include<stdio.h>#include<math.h>main(){ints=1
;floatn=1,t=1,pi=0;while(fabs(t)>1e-6){pi+=t;n+=2;s=s*(-1);t=s/n;}pi*=4;printf(“pi=%10.6f\n”,pi);}第42页,共55页。书中例3判断m是否是素数判断m能被2~sqrt(
m)中的任何一个整数整除,则它不是素数,否则就是素数。#include<stdio.h>#include<math.h>main(){intm,i,k;scanf(“%d”,&m);k=sqrt(m);for(i=2;i<=k;i++)if(m%
i==0)break;if(i>=k+1)printf(“%disaprimenumber\n”,m);elseprintf(“%disnotaprimenumber\n”,m);}第43页,共55页。书中例4译密码,为使电文保密,往往按一定规律将其转换成密码,收报人再按约
定的规律将其译回原文,例如,将字母A变成字母E,a变成字母e,则变成其后的第4个字母,W变成A,X变成B,Y变成C,Z变成D。输入一行字符,要求输出其相应的密码。第44页,共55页。#include<stdio.h>main(){charc;while((c=getchar())!=„
\n‟){if(c>=„a‟&&c<=„z‟||c>=„A‟&&c<=„Z‟){c=c+4;if(c>=„Z‟&&c<=„Z‟+4||c>‟z‟)c=c-26;}printf(“%c”,c);}}第45页,共55页。本章练习1下面程序输出的结果是______#include<stdio.h>mai
n(){intx=3;do{printf(“%d\n”,x-=2);}while(!(--x));}A)输出的是1B)输出的是1和-2C)输出的是3和0D)是死循环第46页,共55页。2设x和y均为int型变量,则执行下面的循环后,y的值为_______for(y=1,x
=1;y<=50;y++){if(x>=10)break;if(x%2==1){x+=5;continue;}x-=3;}A)2B)4C)6D)8第47页,共55页。3下面程序段是从键盘输入的字符中统计数字字符的个数,用换行符结束循环。请填空:intn=0,c;c=
getchar();while(_________){if(_______)n++;c=getchar();}第48页,共55页。4当运行以下程序时,从键盘键入right?<CR>(<CR>代表回车),则下
面程序的运行结果是___________#include<stdio.h>main(){charc;while((c=getchar())!=„?‟)putchar(++c);}第49页,共55页。5执行下面的
程序后,k值是_________k=1;n=263;do{k*=n%10;n/=10;}while(n);6下面程序段的运行结果是____________x=2;do{printf(“*”);x--;}while(!x==0);7鸡兔共有30只,脚共有90个,下面程序段是计算
鸡兔各有多少只,请填空.for(x=1;x<=29;x++)/*x代表鸡的个数y代表兔的个数*/{y=30-x;if(________________)printf(“%d,%d\n”,x,y);}第50页,共55页。8若f
or循环用以下形式表示:for(表达式1;表达式2;表达式3)循环体语句则执行语句for(I=0;I<3;I++)printf(“*”);时,表达式1执行_____次,表达式3执行_____次。第51页,共55页。9下面程序的功能是从键盘输入的10个整数中
,找出第一个能被7整除的数。若找到,打印此数后退出循环;若未找到,打印‚noexist”。请填空。#include<stdio.h>main(){inti,a;for(i=1;i<=10;i++){scanf(“%d”,&a);if(a%7==0){printf(“%d”,
a);________}}if(____________)printf(“notexist\n”);}第52页,共55页。10下述程序片段的循环次数是______,输出结果是_____intx=0,y=0;do{y
++;x*=x;}while(x>0&&y>5);printf(“y=%d,x=%d”,y,x);第53页,共55页。11以下程序的功能是:从键盘上输入若干个学生的成绩,统计并输出最高成绩和最低成绩,当输入负数
时结束输入,请填空。floatx,max,min;scanf(“%f”,&x);max=x;min=x;while(_______){if(x>max)max=x;if(_____)min=x;scanf(“%f”,&x);}printf(“\nmax=%f\nmin=%f\n”,max
,min);}第54页,共55页。12下面程序的输出结果是___________#include<stdio.h>voidmain(){ints=0,k;for(k=7;k>4;k--){switch(k){case1:case4:case7:s++
;break;case2:case3:case6:break;case0:case5:s+=2;break;}}printf(“s=%d”,s);}第55页,共55页。