您好,欢迎访问三七文档
第五章循环结构程序设计5.1循环结构的应用场合5.2goto语句5.3while语句5.4do-while语句5.5for语句5.6多重循环5.7几种循环语句的比较5.8转移控制语句5.9循环结构的实例循环结构的应用场合在许多问题中需要用到循环控制。例如,要输入全校学生成绩;求若干个数之和;迭代求根等。几乎所有实用的程序都包含循环。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。因此熟练掌握选择结构和循环结构的概念及使用是程序设计的最基本的要求。(l)用goto语句和if语句构成循环;(2)用while语句;(3)用如do-while语句;(4)用for语句。goto语句以及用goto语句构成循环1.goto语句的一般形式:goto语句标号语句标号用标识符表示,它的命名规则与变量名相同,即由字母、数字和下划线组成,其第一个字符必须为字母或下划线。2.goto语句的一般用途:(1)与if语句一起构成循环结构;(2)从循环体中跳转到循环体外;3.必须限制使用goto,因为滥用goto语句将使程序流程无规律,可读性差。4.goto语句的使用实例:例:用if语句和goto语句构成循环,求∑n100n=1main(){inti,sum=0;i=1;loop:if(i=100){sum=sum+i;i++;gotoloop;}printf(“%d”,sum);}运行结果如下:5050while语句1.while语句的一般形式while(表达式)语句当表达式为非0时,执行while语句中的内嵌语句。2.while语句的执行流程表达式语句非003.例:求∑n100n=1main(){inti,sum=0;i=1;while(i=100){sum=sum+i;i++;}printf(“%d”,sum);}4.注意:(1)循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现。如果不加花括弧,则while语句的范围只到while后面第一个分号处。(2)在循环体中应有使循环趋向于结束的语句。如果无此语句,则i的值始终不改变,循环永不结束。do-while语句1.do-while语句的一般形式为:do循环体语句while(表达式);2.do-while语句的执行流程循环体语句表达式(a)当表达式值为真循环体语句(b)TF3.用do-while语句求∑n100n=1程序如下:main(){inti,sum=0;i=0;do{sum=sum+i;i++;}while(i=100);printf(“%d”,sum);}i=1sum=sum+ii=i+1i≤100i=1sum=sum+ii=i+1直到i100(a)(b)TF4.例:while和do-while循环的比较(1)main(){intsum=0,i;scanf(“%d”,&i);while(i=10);{sum=sum+i;i++;}printf(“sum=%d”,sum);}(2)main(){intsum=0,i;scanf(“%d”,&i);do{sum=sum+i;i++;}while(i=10);printf(“sum=%d”,sum);}for语句for循环语句是C语言中功能最强的循环语句,它有多个变化形式,并且可以很方便的代替其它的循环语句。本单元将详细介绍for循环语句的语法格式、功能及应用实例,还进一步介绍不同循环语句的嵌套使用。1、for语句的一般形式for(表达式1;表达式2;表达式3)语句2、for语句的执行流程求表达式1表达式2语句求表达式3for语句的下一语句真假3、关于for语句的说明(1)for语句的一般形式中的“表达式1”可以省略,注意省略表达式1时,其后的分号不能省略。如for(;i=100;i++)sum=sum+i;执行时,跳过“求解表达式1”这一步,其他不变。(2)如果表达式2省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式2始终为真。例如:for(i=1;;i++)sum=sum+i;它相当于:i=1;while(1){sum=sum+i;i++;}(3)表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。如:for(i=l;i=100;){sum=sum+i;i++;}(4)可以省略表达式1和表达式3,只有表达式2,即只给循环条件。如:for(;i=100;){sum=sum+i;i++;}相当于while(i=100){sum=sum+i;i++;}(5)3个表达式都可省略,如:for(;;)语句相当于while(1)语句即不设初值,不判断条件(认为表达式2为真值),循环变量不增值。无终止地执行循环体。(6)表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。如:for(sum=0;i=100;i++)sum=sum+i;表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。如:for(sum=0,i=1;i=100;i++)sum=sum+i;或for(i=0,j=100;i=j;i++,j--)k=i+j;(7)表达式2一般是关系表达式(如i<=100)或逻辑表达式(如a<b&&x<y),但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体。分析下面两个例子:②for(;(c=getchar())!=‘\n’;)printf(“%c”,c);①for(i=0;(c=getchar())!=‘\n’;i+=c);此for语句的执行过程见图,它的作用是不断输入字符,将它们的ASCII码相加,直到输入一个“换行”符为止。i=0取一个字符=cC≠换行符i=i+cTF多重循环一个循环体内又可包含另一个完整的循环结构,称为循环的嵌套,内嵌的循环中还可以嵌套循环,这就是多层循环for循环、while循环、do-while循环既可以自己嵌套自己,又可以互相嵌套。下面几种情况均为合法的形式(1)while(){…while(){…}}(2)do{…do{…}while();}while();(3)for(;;){for(;;){…}}(4)while(){…do{…}while();….}(5)for(;;){….while(){…}….}(6)do{…for(;;){…}}while();几种循环语句的比较(1)四种循环都可以用来处理同一问题,一般情况下它们可以互相代替。但一般不提倡用goto型循环。(2)while和do-while循环,只在while后面指定循环条件,在循环体中应包含使循环趋于结束的语句(如i++,或i=i+1等)。for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while循环能完成的,用for循环都能实现。(4)while循型、do-while循环和for循环,可以用break语句跳出循环,用continue语句结束本次循环。而对用goto语句和if语句构成的循环,不能用break语句和continue语句进行控制。(3)用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。转移控制语句1、break语句break语句的一般形式为:break;break语句不能用于循环语句和switch语句之外的任何其他语句中。break语句的功能是跳转到本循环语句或switch语句的下一条语句处。2、continue语句一般形式为:continue;其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。循环结构举例1、求pi的近似值#includemath.hmain(){ints;floatn,t,pi;t=1;pi=0;n=1;s=1;while((fabs(t))1e-6){pi=pi+t;n=n+2;s=-s;t=s/n;}pi=pi*4;printf(pi=%10.6\n,pi);}运行结果为:pi=3.141594用π/4=1-1/3+1/5-1/7+···公式求π的值,直到最后一项的绝对值小于10-6为止.2、求fibonacci数列的20个数这个数列有如下特点:第1,2两个数为1,1。从第3个数开始,该数是其前两个数之和。即:F1=1(n=1)F2=1(n=2)Fn=Fn-1+Fn-2(n≥3)程序如下main(){longintf1,f2;inti;f1=1;f2=1;for(i=1;i=10;i++){printf(%12ld%12ld,f1,f2);if(i%2==0)printf(\n);f1=f1+f2;f2=f2+f1;}}3、判断m是否素数#includemath.hmain(){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);}课堂练习1.以下程序的运行结果是。main(){inti;for(i=3;i10;i++){if(i*i/201)break;printf(%d,i);}printf(\n);}A)34567B)34C)345D)3456答案:D解释:注意”/”的结果总是整数,小数舍掉;break结束循环。2.统计从键盘上输入的字符个数,遇到回车时输出这个数字,结束程序。分析:对于循环次数不确定只给出循环结束条件的问题,一般用while语句解决;而在循环次数已经确定的情况下,一般用for语句。答案:#includestdio.hmain(){intcounter=0;while(getchar()!=‘\n’)counter++;printf(“thecharsnumis%d.\n”,counter);}分析:循环次数已知,用for语句;注意循环累加、循环累乘等类似程序的设计。答案:main(){inti,sum=0,t=12;for(i=1;i=10;i++){sum=sum+t;t=t+10;}printf(%d,sum);}3.求级数12+22+32+……前10项之和。4、求分数序列:2/1,3/2,5/3,8/5,13/8,21/13,…,的前20项之和。分析:1)可以用一个变量s保存结果通过s=s+(每一项值)2)用一个变量来保存分子,一个变量来保存分母,则可求出每一项的值3)从第2项起,每个分数的分子是前项的分子与分母之和,分母是前项的分子。答案:#defineN20main(){intn,t;floata=2,b=1,s=0;for(n=1;n=N;n++){s=s+a/b;t=a;a+=b;b=t;}printf(“thetotalis%9.2f\n”,s);}选择题1.循环for(i=0,j=5;++i!=--j;)printf(“%d%d”,i,j);将执行()。A)6次B)3次C)0次D)无限次2.下列程序段执行后s值为()inti=5,s=0;doif(i%2)continue;elses+=i;while(--i);A)15B)9C)6D)以上均不是3.有如下程序voidmain(){inti,sum;for(i=1;i=3;sum++)sum+=i;printf(“%d\n”,sum);}该程序的执行结果是()。A)6B)3C)死循环D)0填空题1.要使以下程序段输出10个整数,请填入一个整数。for(i=0;i=;printf(“%d\n”,i+=2));2.用for循环打印147101316192225,其语句应为:for(i=1;i=9;i++)printf(“%3d”,___);3.用fo
本文标题:C语言(循环结构)
链接地址:https://www.777doc.com/doc-3369215 .html