循环结构的程序设计.ppt_第1页
循环结构的程序设计.ppt_第2页
循环结构的程序设计.ppt_第3页
循环结构的程序设计.ppt_第4页
循环结构的程序设计.ppt_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

1、第六章 循环控制(4学时),Loops,第 2 页,6.1 循环的概念,提出问题,?,提问:从键盘上输入10个整数并求和,怎么编程? 回答:在程序中写入10个scanf( )语句。 提问:从键盘上输入500个整数并求和,怎么编程? 回答:这个,嗯? 不会让我写500个.,老师:让我们换一个角度来看待这些问题, 以上问题的实质是:将scanf函数重复执行N遍。 学生:对!好象是这么回事. 老师:我们可以引出一个概念“循环”,简单而言:循环就是不断反复地执行同一段程序。 学生:这就是我们今天要学的新东西?,6.1 循环的基本概念,例:求1+2+3+4+5+6+7+8+9+10 ? sum=1+2+

2、3+4+5+6+7+8+9+10 如果求1+2+3+ +100 呢? 或者求1+2+3+ +n (n为某一任意指定的数)呢 ? 计算机的操作是一步一步执行的,步骤分解原则: 计算机的操作是一步一步执行的,步步分解。,循环三要素,变量赋初值 sum=0; i=1; 循环语句 sum+=i;i+; 循环条件 i=n,循环两概念,反复执行同一段程序,直到满足一定的条件后才停止执行该段程序。 循环变量:在循环中表示循环增量的变量。i 步长语句:在循环语句中循环变量的变化语句。i +,C中循环的实现方法,goto 语句及goto语句构成的循环,1、形式:,goto 语句标号;,3、功能:,4、循环构成:

3、,无条件转到由语句标号指定的语句去执行。,语句标号定义与变量一样。,2、说明:,与 if 语句一起。,main() int i=1, sum=0; loop: if (i=100) sum += i ; i+ ; goto loop; printf(“%d”,sum); ,注意:尽量不用,6.2 用 while 语句设计循环结构,1、形式:,注意:只包含了两个要 初始化应放在while前面. 流程如图:,While (循环条件) 循环语句;,2、功能:,3、框图:,当循环条件表达式值为非0 时执行while中内嵌的循环语句(循环体),例62:sum=1+2+3+n,分解: sum= 0;i=1

4、; sum+=i;i+; sum+=i;i+; sum+=i;i+; 其中 i=n,i=n,Sum+=i; i+;,Sum=0; i=1;,main() int n,i , sum; scanf(“%d”, ,sum=0; i=1;,当 i=100,sum+=i; i+;,while语句-实例,例1:分析程序的运行结果 #include main ( ) int n=0; while ( n3 ) printf (”n is %dn”,n); n+; printf(”Thats all this program does.n”); 结果:程序将不停的打印“n is 0”,直至终止程序 无法正常

5、终止的程序,称为“死循环”。 结论:while语句循环体中,一定要有能够对循环控制条件产生影响的语句。避免出现“死循环”现象。,例2:分析下列程序段 index=1; while ( index 5 ) printf(”Good morning!n”); 分析: 程序段将无限制打印字符串。 因为循环中没有任何语句可以改变循环控制变量index的初值1。,while语句-实例,例3:分析下列程序段 index=1; while( - index 5 ) printf(”Good morning!n”); 分析: 仍有问题,程序改变了index,但方向错了。 在index达到系统能够处理的最大负数

6、时,将会产生下溢而终止程序。 结论: 循环体中必须有能够使循环正常停止的条件。,while语句-实例,例C3_5103.C:从键盘中读入一系列字符,直到输入字母 a 时才停止。,显示ch,成立,不成立,ch=读入一个字符,ch=读入下一个字符,开始,结束,while (ch!=a) ,ch=getchar( );,putchar(ch);,ch = getchar( );,分析:由于不知道要输入的字符数量,只知停止条件是输入字母a,则只能将循环控制条件设为 ch!=a。,程序主体:,while语句-实例,#include main( ) char ch; ch = getchar( ); wh

7、ile ( ch!=a) putchar ( ch ); ch = getchar( ); ,while语句-实例,例C3_5104.C:对输入的行和字符进行计数。 分析:n作为行结束标记的,DOS中有CTRL+Z作为文件结束标记 #define EOF -1 #include main ( ) int c,nl=0,nc=0; while ( ( c = getchar( ) ) != EOF ) + nc; if ( c = n ) + nl; printf(chars=%d, lines=%dn, nc, nl); ,定义文件结束标记 nl行计数器nc字符计数器 进行字符计数 如果找到n

8、,则行计数,while语句-实例,例3:求1到100的之和。 main ( ) int total=0, i=1; while ( i = 100 ) total = total + i; i +; printf(”Total=%dn, total); ,例C3_51041,变形1:while ( i total+=i; +i 变形2:int i=0; while ( +i +i; 判断i 判断i +i; total+=i,while语句-实例,循环嵌套 在循环体中,又包含有循环语句,构成循环嵌套。 例C3_5107.C:输出下三角形乘法九九表。 1 2 3 4 5 6 7 8 9 - 1 2

9、 4 3 6 9 4 8 12 16 5 10 15 20 25 6 12 18 24 30 36 7 14 21 28 35 42 49 8 16 24 32 40 48 56 64 9 18 27 36 45 54 63 72 81 假设:行号为i ,列号为j,i=6 j=5 i*j,(1=i=9),(1=j=i),则:第 i 行中一共要输出 i 个乘积,while语句-实例,#include main ( ) int i=1, j; /* i:行计数器 j:列计数器 */ while ( i = 9 ) /* 控制打印表头 */ printf ( %4d, i+ ); printf (n

10、-n); i=1; while ( i= 9 ) j = 1; /* 列计数器置1 */ while ( j = i ) /* 嵌套的二重循环。输出第i行 */ printf (%4d, i*j ); j +; /* 列计数器+1 */ printf (n); /* 一行输出结束后,输出n */ i +; /* 行计数器+1 */ ,外层循环体执行1次,内层循环要完整执行1次,while语句-实例,while使用注意 1.while (0) . 由于循环的条件表达式恒等于0,循环体永远也不会执行,是编程者的错误。 2.while (1) . 由于循环的条件表达式恒等于1,所以不可能通过循环控制

11、条件来结束循环体的执行,称为“死循环”。 3.为了保证循环正常运行,应该特别注意: 循环控制条件 控制条件的初始状态(初始值) 循环体内部对控制条件的影响,while语句-实例,注 意,4、循环体如果包含一个以上语句,应该用复合语句(语句组) 5、循环语句,最少只执行0次。,6.3 do - while 语句设计循环结构,do 循环语句 while (循环条件);,一般形式:,NS结构图:,流程图:,例题 63 s=1+1/2+1/3+1/i,main() int n,i ; float sum; scanf(“%d”, ,main() int n,i , sum; scanf(“%d”, ,

12、例题 64 s=n!=1*2*3*(n-1)*n,main() int n , i , s; scanf(“%d”, ,main() int n , i , s; scanf(“%d”, ,例65:/4=11/3+1/5+(1)n+1(1/(2*n1),a. 累加变量初值 sum=0 b. 循环做 ( i 从 1 到 n) 若 i 为奇数: sum += 1/当前项值 (2*i1) 否则: sum -= 1/当前项值 (2*i1),sum=0; i=1;,main() int n,i ; float sum; scanf(“%d”,printf(“ =%d”,sum); ,while (i=n

13、),if (i%2) sum +=1/(float)(2*i1); else sum -=1/(float)(2*i1); i+; ,sum=0; i=1;,当 i=n,if (i % 2) sum += 1/ (float)(2*i1) ; else sum -= 1/ (float)(2*i1) ; i+;,读入整数 n,打印 sum,注意,1、do - while先执行一次循环体,即使条件一开始就不成立。 2、一般情况下,while 与 do-while 处理同一问题时,结果相同。,while 与 do while区别,1、结构相反 2、while 中的循环语句最少执行0次。 do-wh

14、ile 中的循环语句最少执行1次。,例69 求10个数中的最大值。,从键盘上输入第一个数,并假定它是最大值存放在变量max中。以后每输入一个数便与max进行比较,若输入的数较大,则最大值是新输入的数,把它存放到max。当全部10个数输入完毕,最大值也确定了,即max中的值。 while 结构:,当 i=10,max=x; i=2;,读入整数x ; if (x max) max=x; i+;,读入整数 x,打印max,main() int x , i , max; scanf(“%d”, ,Do_while结构,直到 i=10,max=x; i=2;,读入x ; if (x max) max=x

15、; i+;,读入整数 x,打印max,main() int x , i , max ; scanf(“%d”, ,6.8 程序举例第一类题:求和类,1、n!=1*2*3*n 2、s=13+5+(1)n+1(2*n1) 3、s=2/1+3/2+5/3+8/5+ (前n项) 4、s=1+1/2!+1/3!+1/n! 5、S=a+aa+aaa+aaa (n个a),例:s=1+1/2!+1/3!+1/n!,1、累加变量初值 sum=0 , X0=1 2、 i 从1 到 n 循环做 求第i项值: Xi = Xi-1/ i 累加:sum += Xi,x=1.0;,main() int n,i,sum;fl

16、oat x; scanf(“%d”, sum= 0;i=1;,while(i=n) x= sum+=x; i+; printf(“sum=%d”,sum); ,x/i;,x=1.0;,x/i;,第二类题:分离各个位(%,/),(1) 求一正整数 x 为几位数。( x=24365 ) (2) 求一正整数 x 各个位之和。 如: x=24365 ,则个位之和sum=2+4+3+6+5 (3) 求倒序数? 如: x=24365,倒序数 re_x=56342 (4) 在3位数中找一个满足下列要求的正整数n:其各位数字的立方和恰好等于它本身。例如,37133+73+13,第二类关键:必须将它的各位数字分

17、拆开(%,/) (1) 个位数字n10。例:37110=1。 (2) 十位数字=(n/10)10。例:371/10=37,3710=7。 (3) 百位数字=(n/10/10)%10。例: (371/10)/10=37/10=3,3%10=3。 即:分离是从低位数字到高位数字的过程,若 x !0 循环做:x%10: 分离出 x 的个位数 x /10 : 求出未被分离的余下的数,例1、求一正整数 x 为几位数。( x=24365 ),i=0;,当 x !=0,y=x%10; x /=10;,main() int x , y ,i ; scanf(“%d”,x); while (x) y=x%10;

18、 x/=10; printf(“%dn”,i); ,i+ ;,i=0;,i+;,读入x,打印位数,sum=0;,main() int x ,y, sum ; scanf(“%d”,x); while (x) y=x%10; x/=10; printf(“%dn”,sum); ,sum +=y ;,例2、求一正整数 x 各个位之和。 如: x=24365 ,则个位之和sum=2+4+3+6+5,当 x !=0,y=x%10; x /=10;,sum += y;,sum=0;,读入x,打印位数,例3:求倒序数? 如: x=24365 倒序数 re_x=56342,re_x =0;,main() i

19、nt x , y, re_x ; scanf(“%d”,x); while (x) y=x%10; x/=10; printf(“%dn”,sum); ,re_s=re_s*10+y;,当 x !=0,y=x%10; x /=10;,re_s=re_s*10+y;,re_x=0;,读入x,打印位数,例6-11 在3位数中找一个满足下列要求的正整数n:其各位数字的立方和恰好等于它本身。例如,37133+73+13,main() int x ,y, sum ; scanf(“%d”,x); while (x) y=x%10; x/=10; printf(“%dn”,sum); ,当 x !=0,y

20、=x%10; x /=10;,sum += y*y*y;,sum=0;,读入x,打印 sum,sum=0;,sum +=y*y*y ;,若x=sum,if (x=sum),6.4 for 语句设计循环结构,1、格式,2、注意 循环体包含两个部分: 循环语句 (先) 步长表达式 (后) 它们之间可任意调整。 初值表达式:赋初值 条件表达式:控制循环 步长表达式:改变循环 变量值,for (初值表达式;条件表达式;步长表达式) 循环语句 ;,for (初值;条件;步长) 循环语句,初值 ; while (条件) 循环语句,For与whie的对应关系:,例:求 sum=1+2+3+n for ( s

21、um=0,i=1 ; i = n ; i + +) sum+=i ;,说 明(P123),1. 表达式1可以省略,此时应在for语句之前给循环变量赋初值 (分号不能省),sum=0; for ( i=1 ; i = n ; i + +) sum+=i ;,2. 若表达式2省略,即不判断循环条件,则循环无终止, 即认为循环条件始终为真 (应避免),for ( i = 1 ; ; i + + ) sum+=i ;,3. 表达式3可以省略,放入循环语句中 (后面),5. 三个表达式都省略(无限循环),for ( ; ; ) ;,for ( sum=0 , i =1 ; i=100 ; i+ ) su

22、m += i ; ,4. 表达式1,3省略,保留表达式2,for ( ;i=100 ; ) sum += i ; i+ ; ,例66:输入一个整数,判断是否为 素数 x=35,main() int x , i ; scanf(“%d”, ,i+,i=k,i=2,a. i 从 2 递增到 k=sqrt(x) 循环做: 若 m整除i ,i非素数,退出循环 b. 若(i=k+1) : 是素数 ;否则:不是素数。,第三类题:求因子类,(1) 输入两个整数,求最大公倍数和最小公约数 (2) 输入一个整数,判断是否为素数 (3) 输入一个整数,求其所有因子之和 (4) 输入一个整数,判断其是否为完数(因子

23、之和=本身),例611:输入两个整数, 求最小公倍数和最大公约数 X=12 y=8,i 从 max(x,y) 递增到 x*y 循环做: 若 i 被 x 和 y第一次同 时整除,i 为 x 和 y最小 公倍数,中断循环,最小公倍数:,i= xy?x:y,当 i=x*y,if (i%x=0 ,最大公约数:,i 从 min(x,y) 递减到 1 循环做: 若 可i第一次同时整除 x 和 y,i 为 x 和 y最大公约 数, 中断循环,i= xy?x:y,当 i=1,if (i%x=0 ,main() int i,x,y; scanf(“%d,%d”, ,最小公倍数:,最大公约数:,main() in

24、t i,x,y; scanf(“%d,%d”, ,6.5 break 和 continue 语句,break,continue,1、使流程跳出 switch 结构 2、从循环体内跳出整个循环体提前结束循环,1、结束本次循环过程:跳过循环体中下面未执行的语句,接着执行下一次循环过程只结束本次循环过程,而不是终止整个循环的执行。 2、一个循环语句包含多个循环过程。,for (r=1; r100 ) break; pintf(“%f”,area ); ,break 和 continue区别:,break 和 continue比较举例:,例: for(i=1;i=10;i+) if(i%5=0) br

25、eak; printf(“%d,”,i); ,例: for(i=1;i=10;i+) if(i%5=0) continue; printf(“%d,”,i); ,1,2,3,4,1,2,3,4,6,7,8,9,演示,6.6 几种循环的比较,1. 四种循环都可处理同一问题,一般情况下可以互相代替(不提倡goto) 2. 循环条件,循环体 while和 do-while:只在while后面指定循环条件,循环体中包含: 反复执行的操作语句 使循环趋于结束的语句(如 i+) for 循环可在(表达式3)中包含使循环趋于结束的操作(甚至将循环体中的操作全部放到表达式3中逗号表达式) 3. 循环变量初始化

26、 while和do-while:在while和do-while之前完成 for:通常在(表达式1)中实现 4. 判断循环 while和for:先判断表达式,后执行语句 do-while:先执行语句,后判断表达式,6.7 循环的嵌套,一个循环体中又包含另一个完整的循环结构,二重循环,三种循环互相嵌套,三种循环互相嵌套(续),(4) while ( ) do while ( ) ,三种循环互相嵌套(续),(5) for ( ; ; ) while ( ) ,(6) do ( ) for ( ; ; ) while ( ) ;,例610:打印1040之间的所有素数,main() int i, k,

27、x; ; k=sqrt(x) ; for ( i=2 ; i=k+1) printf(“%d ”, x) ; ,第五类题:打印图形类,根据用户输入, 打印n行如下图形,方法:所有图形是由行n、列m构成的,a. 读入行数 n,列数m ;,b. 从第1 行递增到第 n 行,b.1 从第1 列递增到第 ?列 循环 打印的空格 b.2 从第1 列递增到第 ?列 循环 打印* b.3 打印回车,算法:,演示:,例:(算法),*,main() int n , i , j; scanf(“%d”,printf(“n”); ,for ( ; ; ), for ( ; ; ) printf(“ ”);,printf(“*”);,i+,i=1,i=n,j+,j=1,j=41-i,每行前面的空格,例:打印图形,n行,每行 2*i-1个 *,*,main() int n , i , j; scanf(“%d”, ,2*i-1个*,j+,j=1,j=41-i,j+,j=1,j=2*i-1,第六类 递归迭代 例6-14用迭代式xn0.5*(xn-1+a/xn-1)求a (a=0)。 (1) 先确定a的平方根的初值x0=0.5*a,迭代计算x1 (2) 若|x1-x0|=eps时表示近似值的精度未达到要求。转(3) (3)

温馨提示

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

评论

0/150

提交评论