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

下载本文档

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

文档简介

程序设计基础目

录4.1初识循环结构4.2while语句4.3do…while语句4.4for语句4.4.1for语句的一般形式与执行过程4.4.2for语句的变形4.5循环的嵌套4.6几种循环的比较4.7跳转语句4.7.1用break语句提前终止循环4.7.2用continue语句提前结束本轮循环4.8循环程序综合举例4.1初识循环结构在日常生活中还有许多需要重复处理的问题。例如,输入并计算班级平均成绩的步骤如下:(1)输入全班40名学生的成绩;

(重复40次相同的输入)(2)将40个成绩进行求和;

(重复40次相同的加法运算)(3)之后,总和除以40求得平均成绩。要处理上述的重复问题,理论上可以将步骤1“输入”和步骤2“求和”的程序段重复编写40遍,但实际中显然是不可取的,不只是工作量大、程序冗长,更是难以阅读和维护。实际上,可以采用循环结构来处理需要重复进行的操作。循环结构也称为重复结构。4.1初识循环结构算法具有有穷性,程序的运行需要会结束,从而程序中的循环操作是有终止的,达到一定条件时循环结束。如输入完第40名学生的成绩时就不再继续输入。要构成一个有效的循环,则循环结构中需要有两个重要部分:(1)需要重复执行的程序段,称为循环体;(2)重复执行的条件,即在什么情况下执行重复的操作。C语言中,用来实现循环结构的有3种:while语句、do…while语句和for语句。4.2while语句while语句的一般形式: while(表达式)

循环体0表达式循环体非0图4-1while语句流程图其执行过程:(1)先计算表达式,如果表达式的值为非0,则转到(2),否则结束循环。(2)执行循环体,然后转到(1)。4.2while语句【例4-1】输入学生的Math成绩,求平均成绩并输出。解题分析:要想求平均成绩,首先要求总成绩,设一个变量Ave来累加成绩。另外设一个变量i用来累计已处理成绩的个数。当每个成绩的处理过程是一样的,先输入该成绩,再累加到总成绩中。处理完12个成绩后,循环结束。之后总成绩除以人数即求得平均成绩。/*ch04-01.c*/#include<stdio.h>intmain() {inti=1;floatScore,Ave=0;while(i<=12){scanf("%f",&Score);//输入成绩Ave+=Score;//计算总分i++;

//每执行晚一次循环使i的值增加1}Ave/=12;//计算平均分printf("%f",Ave);return0;}请思考:本例中学生人数是已知的12人,因此循环条件为“i<=12”。若不知道成绩个数,应当如何结束循环呢注意:while语句的特点是先判断条件表达式,后执行循环体。当满足条件时,循环体才能执行,所以称为当型循环。若表达式一开始就为“0”,则循环体一次也不执行。4.3do…while语句do…while语句的一般形式: do

循环体 while(表达式);0表达式循环体非0图4-2do…while语句流程图其执行过程:(1)先执行循环体。(2)计算表达式,如果表达式的值为非0,则转到(1),否则结束循环。4.3do…while语句【例4-2】用do…while语句实现【例4-1】。/*ch04-02.c*/#include<stdio.h>intmain(){inti=1;floatScore,Ave=0;do{scanf("%f",&Score);//输入成绩Ave+=Score;//计算总分i++;//每执行完一次循环使i的值增加1}while(i<=12);Ave/=12;//计算平均分printf("%f",Ave);return0;}4.3do…while语句注意:do不能单独使用,必须与while一起使用。do…while语句的特点是先无条件地执行循环体,后判断循环条件。因此,该语句至少执行一次循环体。一直循环执行,直到不满足条件,所以称为直到型循环。do…while语句中while后面的分号很重要,如果漏掉该分号,会出现语法错误。

4.3do…while语句【例4-3】do…while语句与while语句的比较:求n+…+9+10。/*ch04-03-01.c*/#include<stdio.h>intmain(){inti,Sum=0;printf("pleaseenteri:");scanf("%d",&i);while(i<=10){Sum+=i;//计算总分i++;}printf("sum=%d",Sum);return0;}/*ch04-03-02.c*/#include<stdio.h>intmain(){inti,Sum=0;printf("pleaseenteri:");scanf("%d",&i);do{Sum+=i;//计算总分i++;}while(i<=10);printf("sum=%d",Sum);return0;}4.4.1for语句的一般形式与执行过程for语句的一般形式: for(表达式1;表达式2;表达式3)

循环体非0表达式2表达式10循环体表达式3其中:表达式1设置初始条件,只执行一次。可以为零个、一个或多个变量设置初值。表达式2为循环条件表达式,用来判断是否继续循环。表达式3调整循环变量的值。4.4for语句其执行过程:(1)先计算表达式1。上例中,把变量i赋值为1。(2)计算表达式2,如果其值为非0,则执行循环体,然后进入第(3)步;如果其值为0,则结束循环,转到第(5)步。上例中,当i=1时,表达式i<=10的值为真(非0),故执行循环体中的语句,即将当前变量i的值累加到变量sum中。(3)计算表达式3。上例中,执行i++,使得变量i增加1,即i的值变为2。(4)转回第(2)步,继续执行for语句。上例中,此时i=2,表达式i<=10的值为真(非0),再次执行循环体中的语句。如此重复执行,直到i变为11时,表达式i<=10的值为假(0),不再执行循环体,转到步骤(5)。(5)循环结束,执行for语句之后的下一个语句。上例中,执行printf语句。4.4for语句【例4-4】用for语句求n!的值,n由键盘输入。解题分析:对于阶乘的数学表达式是n!=(n-1)!*n,是一个累乘的结果。定义一个变量Fac存放阶乘值;编写一个循环,每次循环时将i累乘到Fac中。4.4for语句【例4-4】用for语句求n!的值,n由键盘输入。/*ch04-04.c*/#include<stdio.h>intmain(){inti,n;floatFac=1;//阶乘值增加很快,为防止溢出,用float类型变量来存放printf("Inputn:\n");scanf("%d",&n);for(i=1;i<=n;i++){Fac*=i;//计算阶乘}printf("%d!=%10.0f",n,Fac);return0;}请思考:本例中,为防止溢出,定义阶乘值Fac为float类型(大家可以尝试用int类型的变量来存储阶乘值,并计算17!)。如果n的值更大,使得n!超出float类型的值域,应当如何处理?4.4.2for语句的变形1.表达式的省略for语句中的“表达式1”、“表达式2”和“表达式3”都是可以省略的,但分号(;)不能省略。(1)若省略“表达式1”,则表示不在for语句中给循环控制变量赋初值。此时,可以在for语句前面给循环变量赋初值。(2)若省略“表达式2”,即不用表达式2来作为循环条件,则认为表达式2始终为真。此时,若不做其他处理,则成为无限循环;需要终止循环的话,可以在循环体中适当位置设置跳出循环的语句,请查看第4.7节。(3)若省略“表达式3”,则不对循环控制变量进行操作。此时,可以在循环体中加入修改循环控制变量的语句。(4)“表达式1”、“表达式2”和“表达式3”可以同时省略多个,此时,需要根据上述三条进行处理。4.4.2for语句的变形2.for语句中的逗号表达式for语句中的“表达式1”和“表达式3”可以是简单表达式,也可以是逗号表达式,即两个及两个以上的简单表达式组合在一起,中间用逗号“,”运算符间隔。特别是在有多个循环变量参与循环控制的情况下,“表达式1”和“表达式3”为逗号表达式,将使得程序非常清晰。3.循环体为空语句for语句的循环体可以是单条语句;也可以是包含在花括号“{}”中的复合语句;还可以是空语句,表示满足循环条件时什么都不做,一般用于延时处理。4.4.2for语句的变形在使用for语句时,还有一些其他注意事项:(1)for语句执行时,先计算表达式2的值,再确定是否需要执行循环体,与while语句的执行过程相似,只是表达式和循环体放置的位置不同。for语句也会因为条件不满足而一次也不执行循环体。(2)“表达式2”一般是关系表达式(如i<10)或逻辑表达式(如a<b&&c<d),但也可以是数值表达式或字符表达式,只要其值非零,就执行循环体。(3)C99允许在for语句的“表达式1”中定义变量并赋初值。4.5循环的嵌套一个循环体内包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环体称为内循环,外面的循环体称为外循环。如果内循环体中又嵌套循环语句,则构成多重循环。这种嵌套在理论上来说可以是无限的。注意:多重循环执行时,外层循环每执行一次,内层循环执行一个周期。4.5循环的嵌套【例4-6】输出如图所示图形。****************解题分析:该图形有4行,每行由空格和“*”组成,左右对称。每行有相同对称规律,可以用循环控制行。每行输出“*”的个数是所在行的行数*2再减去1,也可以用循环来完成。/*ch04-06.c*/#include<stdio.h>intmain(){inti,j;charc;for(i=1;i<=4;i++)//控制行{for(j=1;j<=4-i;j++)//输出空格printf("");for(j=1;j<=2*i-1;j++)//输出*printf("*");printf("\n");//换行}return0;}4.5循环的嵌套(1)while(){……while(){……}}(2)do{……do{……}while()}while()(3)for(;;){……for(;;){……}}(4)while(){……for(;;){……}}(5)while(){……for(;;){……do{……}while()|}

4.6几种循环的比较C语言中的循环结构有while、do…while和for三种循环语句,下面对它们进行比较:(1)三种循环都可以用来处理同一个问题,一般情况下它们可以相互替代。(2)while循环和do…while循环中,while后面的圆括号“()”内只规定了循环执行的条件,因此需要在循环体中包含使循环趋向于结束的语句(如i++)。For循环中可以在圆括号“()”内的“表达式3”中包含使循环趋于结束的操作。(3)用while和do…while循环时,循环变量初始化的操作应在while和do…while语句之前完成。而for循环可以在圆括号“()”内的“表达式1”中进行循环变量的初始化(4)三种循环都可以用break语句跳出循环,用continue语句结束本次循环(break语句和continue语句见4.7节)4.7跳转语句中断当前程序的执行流程跳转到其他位置继续执行程序的语句,称为跳转语句。常见的跳转语句有break语句、continue语句、goto语句。4.7.1用break语句提前终止循环break语句可以强制终止当前控制结构。break语句的一般形式为: break;除了用在开关语句switch中,break语句还可以用在循环语句中,来强制终止整个循环,截止执行循环语句下面的语句。在循环语句中,break语句一般与if语句配合使用,用if语句设置终止条件,而break语句则执行退出操作。在同一个循环中可以使用多个break语句。4.7.1用break语句提前终止循环【例4-7】从键盘上输入一个大于3的整数,然后判断该数是否为素数。解题分析:从键盘输入整数n,用枚举法测试2~(n-1)之间的数是否是n的因数,只要找到一个因数就可以结束判断。/*ch04-07.c*/#include<stdio.h>intmain(){inti,n;printf("enteraninteger(>3):\n");scanf("%d",&n);for(i=2;i<n;i++){if(n%i==0)//不是素数,终止循环{printf("Thisisnotaprime.\n");break;}}if(i>=n)printf("Thisisaprime.\n");return0;}4.7.2用continue语句提前结束本轮循环有时候并不希望终止整个循环,而是提前结束本次循环但接着执行下一次循环,此时可以用continue语句。continue语句被称为继续语句,仅能用于循环结构中,一般与if语句一起使用。continue语句的一般形式为: continue;4.7.2用continue语句提前结束本轮循环【例4-8】输出10-50之间能被3整除的数。/*ch04-08.c*/#include<stdio.h>intmain(){inti;for(i=10;i<=50;i++){if(i%3!=0)continue;//不能被3整除时提前结束本次循环printf("%4d",i);}return0;}请思考:如果将程序中的continue语句改为break语句,则输出结果会是什么?4.8循环程序综合举例【例4-9】计算π的近似值。公式如下:π/4=1-1/3+1/5-1/7+…,直到最后一项的绝对值小于10-6为止。

4.8循环程序综合举例【例4-9】计算π的近似值。公式如下:π/4=1-1/3+1/5-1/7+…,直到最后一项的绝对值小于10-6为止。/*ch04-09.c*/#include<stdio.h>#include<math.h>intmain(){intsign=1;floatpi=0,k=1,term=1;while(fabs(term)>=1e-6){pi=pi+term;//累加k=k+2;//下一项的分母sign=-sign;//下一项的符号取反term=sign/k;//求出下一项}pi=pi*4;printf("pi=%10.8f\n",pi);return0;}4.8循环程序综合举例【例4-10】用枚举法求10-100之间的所有素数。/*ch04-10.c*/#include<stdio.h>#include<math.h>intmain(){inti,n,m=0;for(n=11;n<=100;n=n+2){for(i=2;i<=sqrt(n);i++){if(n%i==0)break;//不是素数,终止循环}if(i>sqrt(n)){printf("%4d",n);//输出素数m=m+1;//计数素数的个数if(m%10==0)printf("\n");//每行输出10个数}

}printf("\n");return0;}4.8循环程序综合举例【例4-11】鸡兔同笼问题:已知一只鸡有一个头两只脚,一只兔子有一个头四只脚(没有例外),现笼中有30个头,100只脚,求鸡和兔子各多少只。/*ch04-11.c*/#include<stdio.h>intmain(){intChicken,Rabbit,Solved=0;for(Chicken=0;Chicken<=30;Chicken++)//鸡的数量{for(Rabbit=0;Rabbit<=25;Rabbit++)//兔的数量{if(Chicken+Rab

温馨提示

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

评论

0/150

提交评论