C语言程序设计课件:循环结构_第1页
C语言程序设计课件:循环结构_第2页
C语言程序设计课件:循环结构_第3页
C语言程序设计课件:循环结构_第4页
C语言程序设计课件:循环结构_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言程序设计

循环结构 6.1while循环 6.2do-while循环 6.3for循环 6.4循环结构嵌套 6.5转向语句 6.5.1break语句 6.5.2continue语句 6.5.3goto语句 6.5.4return语句 6.6应用举例

while语句的一般形式为:while(表达式)语句;while语句的语义是:计算表达式的值,当值为真(非0)时,执行循环体语句,然后在判断表达式,直到表达式为假(0)时结束循环。6.1while循环 使用while语句应注意以下几点:(1)while语句中的表达式一般是关系表达式或逻辑表达式,只要表达式的值为真(非0)即可继续循环。使用while语句应注意以下几点:(2)循环体如包括有一个以上的语句,则必须用{}括起来,组成复合语句。(3)应注意循环条件的选择以避免死循环。如:inta,n=0;while(a=1)printf("%d",n++);例6-2利用辗转相除法求解两个整数的最大公约数。问题的方法如下:①令m为两个整数中的较大者,n为两个整数中的较小者;②

用m除以n,令r为m除以n的余数;③若r不等于0,则令m等于n,n等于r,返回步骤②继续;若r等于0,则n中的数值就是两个整数的最大公约数。#include<stdio.h>voidmain(){intm,n,r,temp;

printf("输入整数m:");

scanf("%d",&m);

printf("输入整数n:");

scanf("%d",&n);

if(m<n) {temp=m;

m=n;

n=temp;}

r=m%n

;while(r!=0) {m=n;n=r;r=m%n;}printf("最大公约数为%d",n); }6.2do-while循环do-while语句的一般形式为:do语句;

while(表达式);

先执行循环体语句一次,再判别表达式的值,若为真(非0)则继续循环,否则终止循环,do-while语句还应注意以下几点:①在if语句,while语句中,表达式后面都不能加分号,而在do-while语句的表达式后面则必须加分号。②do-while语句也可以组成多重循环,而且也可以和while语句相互嵌套。③在do和while之间的循环体由多个语句组成时,也必须用{}括起来组成一个复合语句。④do-while和while语句相互替换时,要注意修改循环控制条件。6.2

do-while循环#include<stdio.h>voidmain(){intnumber,digit;printf(″Inputaninteger\n″);scanf(″%d″,&number);do{digit=number%10;printf(″%d″,digit);number/=10;}while(number);printf(″\n″);}例6-4输入一个正整数,然后按反向输出。如输入87654,则输出为45678。运行结果:Inputaninteger87654456786.3for循环for语句的基本形式如下:for(<表达式e1>;<表达式e2>;<表达式e3>)

<语句s>;6.3for循环

6.3for循环例6-6for语句实现找出一个整数的所有因子。#include<stdio.h>voidmain(){inti=1,x;scanf("%d",&x);for(;i<=x;){if(x%i==0)printf("%3d",i);i++;}}6.3for循环在使用for语句中要注意以下几点:(1)for语句中的各表达式都可省略,但分号间隔符不能少。(2)在循环变量已赋初值时,可省去表达式1。如果省去表达式2或表达式3则将造成无限循环,这时应在循环体内设法结束循环。下面是几种不同的表示方法:①表达式1和表达式3是逗号表达式,如:intsum,i;for(sum=0,i=1;i<=100;i++,i++)sum+=i;其中sum=0和循环控制变量无关。

②省略表达式1和表达式3,如:intsum=0,i=1;for(;i<=100;){sum+=i;i+=2;}③三个表达式全部省略,如:intsum=0,i=1;for(;;){sum+=i;i+=2;if(i>100)break;}④省略循环体,把循环体变成空语句,原来的工作放到循环头中完成,如inti,sum=0;for(i=1;i<=100;sum+=i,i+=2);这时应注意,原循环体中的语句一定要放在控制变量增值之前,否则就会出错。6.3for循环(3)循环体可以是空语句。例6-7循环体是空的for语句。#include"stdio.h"voidmain(){intn=0;printf("inputastring:\n");for(;getchar()!='\n';n++);printf("%d",n);}6.4循环结构嵌套(1)while(){

…while()

{…}

}(2)do{

do

{…}while()

}while();(3)while(){

do

{…}while();

}(4)for(;;){

for(;;)

{…}

}(5)for(;;){

while(;;)

{…}

}(4)for(;;){

for(;;)

{…}

}

(6)do{

for(;;)

{…}

}while();6.4循环结构嵌套例6-8求出用数字0至9可以组成多少个没有重复的两位偶数。

#include<stdio.h>voidmain(){intn,i,k;for(i=1;i<=9;i++){for(k=0;k<=8;k+=2)if(k!=i)printf(″n=%4d″,10*i+k);printf(″\n″);}}例6-9全班有29个学生,每个学生考6门课。要求分别统计出每个学生的平均成绩。

main(){inti,j,score,sum;floataver;j=1;while(j<=29)

{sum=0;for(i=1;i<=6;i++){printf(“EnterNO.%dthescore%d:”,j,i);scanf(“%d”,&score);sum=sum+score;}aver=sum/6.0;printf(“NO.%daver=%5.2f\n”,j,aver);j++;}}使用循环的嵌套结构要注意以下几点:

(1)外层循环应“完全包含”内层循环,不能发生交叉。

例如,下面这种形式是不允许的。do

{…

for{…}{…}

}while(…);

(2)嵌套的循环控制变量一般不应同名,以免造成混乱。

例如:

for(i…){

for(i…)

{…}

}(3)嵌套的循环要注意正确使用缩进式书写格式来明确嵌套循环的层次关系,以增加程序的可读性。6.5转向语句6.5.1break语句break语句只能用在switch语句或循环语句中,其作用是跳出switch语句或跳出本层循环,转去执行后面的程序。由于break语句的转移方向是明确的,所以不需要语句标号与之配合。break语句的一般形式为:break;使用break语句可以使循环语句有多个出口,在一些场合下使编程更加灵活、方便。例6-10输出50以内的素数。素数是只能被1和本身整除的数。可用穷举法来判断一个数是否是素数。

方法一:#include<stdio.h>voidmain(){intn,i;for(n=2;n<=50;n++){for(i=2;i<n;i++)if(n%i==0)break;if(i>=n)printf("%4d",n);}}6.5.2continue语句continue语句是截断循环体中的部分语句,使其不执行。作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。continue语句只能用在循环体中。一般格式是:continue;结束本次循环,即不再执行循环体continue语句之后的语句,转入下一次循环条件的判断与执行。本语句只结束本层本次的循环,并不跳出循环。可以用break语句跳出循环,用continue语句结束本次循环。例6-11输出100至200之间不能被5整除的数。#include<stdio.h>voidmain(){intn;for(n=100;n<=200;n++){if(n%5==0)continue;printf("%d",n);}}6.5.3goto语句goto语句也称为无条件转移语句。其一般格式如下:goto语句标号;其中语句标号是按标识符规定书写的符号,放在某一语句行的前面,标号后加冒号(:)。语句标号起标识语句的作用,与goto语句配合使用。如:label:i++;loop:while(x<5);6.5.4return语句return语句的一般形式是:return[(表达式)];方括号的意思是里面的内容可以省略。因而return语句有两种使用形式:return;和return(表达式);表达式可以括起来,也可以不括,下面的几种使用形式都是合法的:return;return0;return(i);return(a>b?a:b);return语句主要用在函数中,用来结束函数的执行,把控制转向函数调用点。若在主函数main中,则结束程序的运行。(1)有多个return语句的函数:floatmax(floatx,floaty){if(x>y)returnx;elsereturny;}(2)无return语句的函数:voidnext(charc){putchar(c+1);}6.6循环结构应用举例1.递推法这类问题具有的共同特点是:前后项存在一定的关系,即后项可由前项推导出。主要指有通项公式的各类级数、数列等。递推法的思路是:后项可由前项导出;找出了前后项关系后,就可应用循环结构实现算法。关键是找前后项关系。例6-13求1-2+3-4+5-...-100的和。①设定项号,定义变量,找前后项关系,这是关键的一步。项号n=1,2,3,4,5,...sum=1-2+3-4+5-...–100前后项关系为n=n+1,比较简单。生成的数n有正负号,且有规律:奇数为正,偶数为负,可用if语句判别;这里定义一个变量s帮助判别。②构造循环结构求解这类题目,循环体总要执行多次,采用dowhile循环结构。do{n=n+1;s=-s;sum=sum+s*n;}while(n<100);③设置变量初值

设置变量初值是保证正确计算出第一项值。十分明显,各变量的初值为:n=0;sum=0;s=-1;④静态检查跟踪三步左右,如果结果是正确的,一般情况下,可断定算法是正确的。语句

第一步

第二步

第三步n=n+1;

1 2 3s=-s 1 -1 1sum=sum+s*n; 1 -1 2通过上述分析,确定了数据,定义了有关变量和类型,完成了算法设计。程序如下:#include<stdio.h>voidmain(){ intsum=0,n=0,s=-1;do { n++;s=-s;sum+=s*n; }while(n<100); printf("1-2+3-4+...-100=%d\n",sum);}例6-13求1-2+3-4+5-...-100的和。2.迭代法下列问题具有的共同特点是:已知迭代公式和误差公式,可直接应用循环结构,按迭代公式计算一个新根,并与前一个根比较,直到满足误差为止。例如求a1/2

的近似值:

迭代公式:xn+1=(xn+a/xn)/2

误差公式:|xn+1-xn|<=EPS例6-15求a1/2的近似值。定义原根x0表示xn,新根x1表示xn+1,其类型取double。先以求21/2根为实例,按迭代法循环计算三次,观察根值的变化趋势。a为2,定义一个新根x1=a/2,其初值为1.0,循环按迭代公式计算一个新根:语句

第一次第二次

第三次x0=x1;

1.0 1.5 1.417x1=(x0+a/x0)/2;

1.5 1.417 1.414从上面x1的各次计算值可以看出:x1值一步一步逼近21/2的根值。求解这类问题,一般都采用do…while循环结构实现。例6-15求a1/2的近似值。程序如下:#include<stdio.h>#include<math.h>#defineEPS1e-8voidmain(){floata;doublex0,x1;printf("读入一个实数:");scanf("%f",&a);if(a<0){printf("错误:输入的实数小于0\n");exit(1);}x1=a/2;/*选定初值*/

do {x0=x1;/*前一次根值*/ x1=(x0+a/x0)/2 }while(fabs(x1-x0)>EPS);printf("迭代法sqrt(%f)=%0.8f\n",a,x1);printf("调库函数sqrt(%f)=%0.8f\n",a,sqrt(a));

}3.枚举法本类问题具有的共同特点是:不能用方程求解,只能一一列举各种情况,从多种可能中选取满足要求的一个(或一组)解。当然,也可能得出无解的结论。例6-16百鸡问题:鸡翁一,值钱五、鸡母一,值钱三、鸡雏三,值钱一,百钱买百鸡,问鸡翁、鸡母、鸡雏各几个?分析:设鸡翁、鸡母、鸡雏的数量分别为cocks、hens、chicks,则可得如下模型:5*cocks+3*hens+chicks/3.0=100cocks+hens+chicks=100cocks、hens、chicks都应为正整数,且它们的取值范围应分别为:cocks:0~20(假如100元全买cocks,最多20只)hens:0~33(假如100元全买hens,最多33只)chicks:0~100(假如全买chicks,最多100只)本题的枚举过程如下。首先从0开始,列举cocks的各个可能值for(cocks=0;cocks<20;++cocks){S1:找满足两个方程的解的hens、chicksS2:输出一组解}下面进一步用枚举法来表现S1:for(hens=0;hens<33;++hens){S1.1找满足方程的一个chicksS1.2输出一组解}列举的每个cocks与每个hens都可以按下式求出一个chickschicks=100-cocks-hens因此,只要该chicks满足另一个方程

5*cocks+3*hens+chicks/3.0=100可以得到一组满足题意的cocks、hens和chick

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论