




已阅读5页,还剩66页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
4.2.1 while语句 4.2.2 do-while语句 4.2.3 for语句 4.2.4 转移语句 4.2.5 循环的嵌套 4.2.6 循环结构程序设计举例,4.2 循环结构程序设计,循环的概念,当所要解决的问题存在重复执行内容时,应该使用循环结构来实现,具体的设计步骤可归纳如下。,(1)构造循环体。,(2)寻找控制循环的变量。,(3)找出控制循环的3个要素。 循环控制变量的初值。 循环的条件。 使循环趋于结束的部分。,在C语言中可以用以下语句来实现循环: 用while语句; 用do-while语句; 用for语句; 用goto语句和if语句构成循环;,4.2.1 while语句,真(非零),循环体,假(零),1、while 语句的形式: while (表达式) 循环体;,2 、 while 语句 常称为“当型”循环语句。,3、说明:,先判断表达式,后执行语句。,表达式同if语句后的表达式一样,可以是任何类型的表达式。,循环体多于一句时,用一对 括起。,while循环结构常用于循环次数不固定,根据是否满足某个条件决定循环与否的情况。,例:分析下列程序段的循环次数,i=1; while (i=100) putchar(*); i+;,例: 用while语句编程实现:计算1+2+3+4+100,算法:s1.设一个变量sum用于存放最后的结果, 初值为0 s2.设一个循环变量i,初值为1 s3.判断i是否小于等于100,若是执行s4 ; 否则程序结束 s4. sum=sum+i s5. i+ s6. 返回s3,main() int sum=0,i=1; while(i=100) sum=sum+i; i+; printf(“%d”,sum); ,例: 用while语句编程实现:计算1+2+3+4+100,#include “stdio.h“ void main() int x; scanf(“ %d “,例:输入一系列整数,判断其正负号,当输入0时,结束循环。,输入数据,为第一次判断做准备,while(x!=0),判断是否结束, if(x0) printf(“ + “); else printf(“ - “); scanf(“ %d “, ,判断正负号,#include “stdio.h“ void main() char ch;int num=0; ch=getchar();,例: 统计从键盘输入的一行字符的个数(以回车键作为输入结束标记)。,while(ch!=n),判断是否输入结束,num+; ch=getchar(); ,printf(“num=%dn“,num); ,注意,表达式在判断前,必须要有明确的值。,循环体中一般有改变条件表达式的语句。,while (表达式)后面没有分号。,4.2.2 do-while语句,1、 do-while的形式: do 循环体; while (表达式);,2、 do-while语句 常称为“直到型”循环语句。,真(非零),循环体,假(零),3、说明:,先执行语句,后判断表达式。,第一次条件为真时,while,do-while等价;第一次条件为假时,二者不同。,例: 用do-while语句编程实现:计算1+2+3+4+100,算法:s1.设一个变量sum用于存放最后的结果, 初值为0 s2.设一个循环变量i,初值为1 s3. sum=sum+i s4. i+ s5. 判断i是否小于等于100,若是重复执行s3 s5 ; 否则程序结束,main() int sum=0,i=1; do sum=sum+i; i+; while(i=100); printf(“%d”,sum); ,例: 用do-while语句编程实现:计算1+2+3+4+100,do,例:用do-while语句编写程序统计从键盘输入的一行字符的个数(以回车键作为输入结束标记)。,#include “stdio.h“ void main() char ch; int num=0; ch=getchar(); do num+; ch= getchar(); while(ch!=n); printf(“num=%dn“,num); ,注意,在if、while语句中,表达式后面都没有分号,而在do-while语句的表达式后面则必须加分号。,do-while和while语句相互替换时,要注意修改循环控制条件 。,5.3.3 for语句,1、for的形式: for (初始表达式1;条件表达式2;循环表达式3) 循环体 ;,表达式1:用于循环开始前为循环变量设置初始值。,表达式2:控制循环执行的条件,决定循环次数。,表达式3:循环控制变量修改表达式。,循环体语句: 被重复执行的语句。,表达式3,计算表达式1,循环体,零,非零,for的下一条语句,2、执行过程,for(i=1;i=100;i+) sum=sum+i;,例如:,它相当于以下语句: i=1; while (i=100) sum=sum+i; i+; ,表达式1;,while(表达式2),表达式3;,3、 说明,三个表达式都可以是逗号表达式。,三个表达式都是任选项,都可以省略,但要注意省略表达式后,分号间隔符不能省略。,1、for语句中表达式省略的形式 (1)for语句一般形式中的“表达式1”可以省略; 如: sum=0;i=1; for ( ; i=100;i+) sum=sum+i;,1、for语句中表达式省略的形式 (2)表达式2省略,即不判断循环条件,循环无终止地进行下去; 如: for(sum=0,i=1;i+) if(i100) break; sum=sum+i; ,1、for语句中表达式省略的形式 (3)表达式3也可以省略,但此时保证循环能正常结束如: for(sum=0,i=1;i=100;) sum=sum+i; i+; ,(4) 可以省略表达式1和表达式3,只有表达式2,如: i=1; sum=0; for (;i=100;) sum=sum+i; i+; ,1、for语句中表达式省略的形式,i=1;sum=0; while (i=100) sum=sum+i; i+; ,相当于,while (1) 循环体; 即不设初值,不判断条件,循环变量不增值。无终止地执行循环体。,(5)三个表达式都可省略,如 for ( ; ; ) 循环体;,1、for语句中表达式省略的形式,如: sum=0,i=1; for(;) if(i100) break; sum=sum+i; i+; ,相当于,(6)循环体为空语句 对for语句,循环体为空语句的一般形式为: for (表达式1;表达式2;表达式3) ; 如:for(sum=0,i=1;i=100;sum+=i, i+) ;,1、for语句中表达式省略的形式,for语句与while比较,例: for(i=1;i=10,i+) a=a*i; printf(“%d,%d”,a,i); ,表达式1 while(表达式2) 循环语句; 表达式3; ,for(表达式1;表达式2;表达式3) 循环语句;,for语句,while语句,i=1; while(i=100) a=a*i; printf(“%d,%d”,a,i); i+; ,(1)在进入累加前先给累加器赋初值(一般为0); (2)用循环语句实现累加; for(循环变量赋初值;循环条件;循环变量改变规律) (3)循环体语句的设计。 累加器当前值=累加器原值+循环变量当前值 ;,典型例题分析,例: 求累加和1+2+3+1000,基本方法:,属于“累加器”类型问题。,累加器赋初值,求偶数和 2+4+6+100,参考程序:,void main() long int k,s;,s=0;,for(k=1;k=1000;k+) s=s+k;,printf(“ s=%ld “,s); ,累加,思考,(1)给累乘器赋初值,一般为1; (2)用循环语句实现累乘; for(循环变量赋初值;循环条件;循环变量改变规律) (3)循环体设计。 累乘器当前值=累乘器原值*循环变量当前值;,例: 求累乘积。 如:123.100,基本方法:,属于“累乘器”类型问题。,累乘器赋初值,求n!=1 2 3 n,参考程序:,void main() double s=1;,int k;,for(k=1;k=100;k+) s=s*k;,printf(“ s=%lf “,s); ,累乘,思考,例: 判断一个数是否为素数?,一个数x在2,sqrt(x)范围内没有因子,我们就称其为素数(质数),主要编程方法:循环变量终值法、标记变量法,#include “ math.h “ void main() int x,k; scanf(“ %d “,排除法:如果有因子,不再往下判断是否是素数,循环变量终值法,for(k=2;k=sqrt(x);k+) if(x%k=0) break;,if(ksqrt(x) printf(“ %d is a prime “ ,x); else printf(“ %d is not a prime “ ,x); ,在判断范围内无因子,程序正常终止,有因子,程序非正常终止,#include “ math.h “ void main() int x,k,f=1; scanf(“ %d “,排除法:如果有因子,不再往下判断是否是素数,for(k=2;k=sqrt(x);k+) if(x%k=0) f=0;break; ,if(f=1) printf(“ %d is a prime “ ,x); else printf(“ %d is not a prime “ ,x); ,在判断范围内无因子,程序正常终止,有因子,程序非正常终止,标记变量法,4.2.4 转移语句,1、语句形式: goto 语句标号;,例如: goto label; label: .,语句标号用标识符表示,它的定名规则与变量名相同。,一、goto语句,2、语句执行流程: 在程序执行过程中,如果遇到goto语句,则程序执行流程无条件地转向语句标号后的语句继续执行。,3、说明,语句标号仅仅对goto 语句有效,对其它语句不影响。,同一个程序中,不允许有同名标号。,goto语句通常与条件语句配合使用。可用来实现条件转移、构成循环、跳出循环体等功能,例:分析下面程序的运行结果:,#include “stdio.h“ void main() char c; loop:c=getchar(); if(c=n) goto end; putchar(c); goto loop; end:printf(“The endn“); ,程序运行情况为: 123asd 123asdThe end,二、break语句,(1) 语句形式: break;,(2)作用: 结束break所在的 switch语句。 结束当前循环,跳出break所在的循 环结构。,例:求300以内能被17整除的最大的数。,#include “stdio.h“ void main() int x,k; for(x=300;x=1;x-) if(x%17=0) break; printf(“x=%dn“,x); ,找到满足条件的最大数,结束循环,(1)语句形式: continue;,(2)语句作用: 结束本次循环。,三、continue 语句,(3)语句执行流程: continue语句可以结束本次循环,即不再执行循环体中continue 语句之后的语句,转入下一次循环条件的判断与执行。,例: 求300以内能被17整除的所有整数。,#include “stdio.h“ void main() int x,k; for(x=1;x=300;x+) if(x%17!=0) continue; printf(“%dt“,x); ,while(条件) 语句A; break; 语句 B; ,真,语句B,条件,语句A,break,假,结束循环,break语句与continue语句的区别:,至此位置,while(条件) 语句A; continue; 语句 B; ,真,语句B,条件,语句A,continue,假,结束循环,至此位置,#include “stdio.h“ void main() int a, b; for(a=1,b=1; a=10) break; if(b%3=1) b+=3; continue; printf(“%dn“,a); ,例:分析以下程序的运行结果。,程序运行结果: 4,在循环体语句中又包含有另一个完整的循环结构的形式,称为循环的嵌套。如果内循环体中又有嵌套的循环语句,则构成多重循环。,4.2.5 循环的嵌套,嵌套在循环体内的循环体称为内循环,外面的循环称为外循环。,while 、do-while、for三种循环都可以互相嵌套。,真,真,外循环初始条件,内循环初始条件,内循环体,外循环条件,假,内循环条件,假,内循环循环条件,外循环循环条件,循环结束,二重循环嵌套结构执行流程,例:输出图形:,* * * *,编程分析:,采用双重循环,一行一行输出。,每一行输出步骤:一般3步。 1)光标定位,3)每输完一行光标换行(n),2)输出图形。 例如本题:共4行,若行号用k表示,则每一行有2*k-1个*号。,#include “ stdio.h “ void main() int k1,k2; for(k1=1;k1=k1;k2-) putchar( );,for(k2=1;k2=k1*2-1;k2+) putchar(*);,putchar(n);, ,定位,输出,编程方法: “递推法”,例: 裴波那契数列的第1、2项分别为1、1,以后各项的值均是其前两项之和。求前30项菲波那契数。,所谓递推法就是从初值出发,归纳出新值与旧值间的关系,直到求出所需值为止。新值的求出依赖于旧值,不知道旧值,无法推导出新值。数学上递推公式正是这一类问题。,4.2.6 循环结构程序设计举例,f1-第一个数 f2-第二个数 f3-第三个数 f1=1; f2=1; f3=f1+f2;,以后只要改变f1,f2的值,即可求出下一个数. f1=f2;f2=f3; f3=f1+f2;,递推,void main() long f1=1, f2=1, f3; int k;,参考程序:,printf(“ %ldt%ldt “, f1,f2);,for(k=3;k=30;k+) f3=f1+f2; printf(“ %ldt “,f3); f1=f2; f2=f3; ,注意f1、f2、f3、x 的类型,递推,例:输出100以内的素数。 所谓素数是指只能被1和其本身整除的数。 算法分析:我们先用穷举法来对2100之间所有的数进行判断。在判断一个数n是否是素数时,我们对n用2n-1逐个去除,若某次可以整除则说明n不是素数,跳出该层循环。 如果在所有的数都是未除尽的情况下结束循环,则为素数。程序源代码如下:,main() int n,i; for(n=2;n=n) printf(“t%d“,n); ,例:求解百鸡百钱问题。公元钱五世纪,我国古代数学家张丘建在算经一书中提出了“百鸡百钱”问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何? 算法分析:百鸡百钱问题是典型的穷举法问题。我们设x,y,z分别为买的鸡翁,鸡母,鸡雏的个数,则有 x+y+z=100 5*x+3*y+z/3=100 而x,y可能取数的范围为 x:020 y:033 z可以由公式z=100-x-y计算出来。 据此,我们建立一个两重循环,对所有可能的情况进行判别。 程序源代码如下:,#include “stdio.h“ main() int i,j,k; printf(“解百鸡百钱问题n“); for (i=1;i=20;i+) for (j=1;j=33;j+) k=100-(i+j); if (k%3=0 ,习题,k=1;n=263; do k*=n%10; n/=10; while(n); 问最后k的值为多少?,36,习题,2. a=10; b=0; do b+=2; a-=2+b; while(a0); 问最后b的值为多少?循环了多少次?,b=4 循环2次,习题,3. i=1;a=0;s=1; do a=a+s*i; s=-s; i+; while(i=10); printf(“a=%d”,a);,a=0+1-2+3-4+5-6+7-8+9-10,习题,4.运行以下程序,输入right?则下面程序结果为? #include main() char c; while(c=getchar()!=?) putchar(+c); ,sjhiu,习题,5.,5. main() int i,j; for(i=1;i=10;i+) if(i%3=0) continue; printf(“%3d”,i); printf(“n”); ,/*跳过3的倍数*/,习题,6. main() int a=10,y=0; do a+=2;y+=a; printf(“a=%d y=%dn”,a,y); if(y50)break; while(a=14); ,a=12 y=12 a=16
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 值班知识试题及答案
- 家电公司合同签订流程细则
- 家电公司交换机维护办法
- 玩具检验测试题及答案
- 外国汉语考试题及答案
- 食品模型面试题及答案
- 山东幼儿面试题及答案
- 僚机物资测试题及答案
- 工会职位面试题及答案
- 甲方物业面试题及答案
- 完形填空20篇(15空)-牛津译林版七年级英语下学期期末高频易错点专练(带详解)
- 《新媒体营销与运营实战(微课版)》-教学大纲
- 耳鼻喉科规培汇报
- 2025年云南省康旅控股集团有限公司招聘考试笔试试题(含答案)
- 投标项目设备培训方案(3篇)
- 2025年郑州转业士官考试题库
- 一级建造师《公路工程》备考试题及答案
- 预制菜加工培训课件
- 2024年广西公需科目参考答案
- 商品混凝土企业管理ppt课件
- 学校食堂登记表(10个表)全
评论
0/150
提交评论