《循环程序设计》PPT课件.ppt_第1页
《循环程序设计》PPT课件.ppt_第2页
《循环程序设计》PPT课件.ppt_第3页
《循环程序设计》PPT课件.ppt_第4页
《循环程序设计》PPT课件.ppt_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

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

文档简介

第6章 循环程序设计,主讲教师:郑立垠,计算机与通信工程学院 计算机应用技术系,1、理解为什么使用循环结构 2、熟练掌握while循环的使用 3、熟练掌握do-while循环的使用 4、理解while 和 do-while 循环的区别 5、熟练使用for循环 6、理解 break 和 continue 语句的用法 7、熟练使用嵌套循环,本章内容,C 语言中的各种循环,while,do- while,for,需要多次重复执行一个或多个任务的问题考虑使用 循环来解决,循环引例,/计算sum=1+2+10 #include int main( ) int n=1, sum=0 ; /循环初始化 while ( n = 10 ) /循环条件 sum = sum +n; /循环体 n+ ; printf ( “Sum = %d n”, sum ) ; return 0; ,循环引例,/计算sum=1+2+10 /chap6ex3.c #include int main( ) int n=1, sum=0 ; /循环初始化 do sum = sum +n; /循环体 n+ ; while ( n = 10 ) ; /循环条件 printf ( “Sum = %d n”, sum ) ; return 0; ,while 循环,while (表达式) 语句; ,while 循环的一般语法:,s=0; n=1; while (n=10) s=s+n; n=n+1; ,计算表达式的值,当值为真(非0)时,执行循环体语句,一旦条件为假,就停止执行循环体。如果条件在开始时就为假,那么不执行循环体语句直接退出循环。,工作原理,示例,/while循环示例 #include int main () int num=1,result; while (num=10) result=num*10; printf(“%d 10 %d n“,num,result); num+; return 0; ,while 循环示例,while 循环示例,问题描述: 写一个程序,要求它从摄氏温度0 度到250 度,每隔20 度为一项,输出一个摄氏温度与华氏温度的对照表。,while 循环示例,/chap6ex1.c #include int main () int c=0; double f; while (c = 250) f=c * 9 / 5.0 + 32.0; printf(“C = %d, F = %7.2fn“, c, f); c = c + 20; return 0; ,问题描述: 写一个程序,要求它从摄氏温度0 度到250 度,每隔20 度为一项,输出一个摄氏温度与华氏温度的对照表,同时要求对照表中的条目不超过10条。,/chap6ex2.c #include int main () int c=0,count=1; double f; while (c = 250 ,while 循环示例,输出: 1: C = 0, F = 32.00 2: C = 20, F = 68.00 3: C = 40, F = 104.00 4: C = 60, F = 140.00 5: C = 80, F = 176.00 6: C = 100, F = 212.00 7: C = 120, F = 248.00 8: C = 140, F = 284.00 9: C = 160, F = 320.00 10: C = 180, F = 356.00,while 循环,规则1:, while(循环条件) ,循环条件中使用的变量需要经过初始化,n=1; while (n =10) s=s+n; n+; ,while 循环,规则2:,while (n =10) . . . . . . n+; ,while 循环主体中的语句必须修改循环条件的值,否则会形成死循环,while (1),do-while 循环,do 语句; while (表达式);,while 循环的一般语法:,do sum = sum +n; n+ ; while ( n = 10 ) ;,它先执行循环体中的语句,然后再判断条件是否为真,如果为真则继续循环;如果为假,则终止循环。,工作原理,示例,do-while 循环示例,问题描述: 写一个程序,要求它从摄氏温度0 度到250 度,每隔20 度为一项,输出一个摄氏温度与华氏温度的对照表。,do-while 循环示例,/chap6ex5.c #include int main () int c=0; double f; do f=c * 9 / 5.0 + 32.0; printf(“C = %d, F = %7.2fn“, c, f); c = c + 20; while (c = 250); return 0; ,思考,如何计算sum=1+3+5+7+99的累加和? 如何计算sum=2+4+6+8+100的累加和? 如何计算sum=1!+2!+3!+10!的累加和?,嵌套 while 循环,嵌套 while 循环的语法,while(i = 10) . . . while (i = j) . . . . . . . . . ,外循环,内循环,只有在内循环完全结束后,外循环才会进行下一趟。,嵌套 while 循环示例,/chap6ex6.c /计算sum=1!+2!+3!+10!的累加和 #include int main( ) int i=1,j,sum=0; float f ; while( i = 10 ) j = 1; f = 1; while( j = i ) f = f * j; j + ; i + ; sum=sum+f; printf(“Sum=%-8dn“,sum); ,嵌套 while 循环示例,问题描述: 用“*“打印图案。 图案如下所示: *,嵌套 while 循环示例,问题描述: 用“*“打印图案。 图案如下所示: * * * * * *,问题描述: 用“*“打印一个直角三角形图案。 图案如下所示: * * * * * * * * * *,嵌套 while 循环示例,#include int main() int nstars=1,stars; while(nstars = 10) stars=1; while (stars = nstars) printf(“*“); stars+; printf(“n“); nstars+; return 0; ,内层循环控制每行打印*号的个数,外层循环控制打印的行数,输出: * * * * * * * * * *,嵌套 while 循环示例,问题描述: 用“*”打印一个直角三角形图案。 图案如下所示: * * * *,嵌套 while 循环示例,#include int main( ) char ch; int count=0; printf( “Enter characters: “ ); do ch = getchar( ); if( ch=A | ch=a ) count+; while( ch != n ); printf( “Counter of a or A: %dn“ , count ); ,任意输入一行字符,统计字母a和A的个数。,比较 while 和 do-while循环,while(循环条件) 循环体; ,do 循环体; while( 循环条件);,do-while 循环是先执行后判断,所以,即使开始条件为假,循环体也至少会被执行一次。,while循环是先判断后执行,所以,如果条件为假,则循环体一次也不会被执行。,比较 while 和 do-while 循环的工作原理,for( 表达式1 ; 表达式2 ; 表达式3 ) 语句; ,for 循环的一般语法:,for 循环,counter = 0; inum = 1; cnt = 100;,counter = 10; inum 0;,counter +; inum = inum + 1; cnt-;,分号用于分隔 for 循环的 三个表达式,1、计算表达式1的值,通常为循环变量赋初值; 2、计算表达式2的值,即判断循环条件是否为真,若值为真则执行循环体一次, 否则跳出循环; 3、计算表达式3的值,这里通常写更新循环变量的赋值表达式,然后转回第2步重复执行;,工作原理,1,2,3,4,for 循环示例,#include int main() int number,count,factorial=1; printf(“n 请输入任意一个正整数:“); scanf(“%d“, ,循环执行五次,for 循环示例,计算sum=1+2+3+100,#include int main( ) int i=1, sum=0 ; while ( i= 100 ) sum = sum+i; i+ ; printf ( “Sum = %d n”, sum ) ; return 0; ,#include int main( ) int i, sum=0 ; for( i =1 ; i=100 ; i+) sum += i ; printf( “Sum = %d n“, sum ); return 0; ,for 循环示例,任意输入10个数,计算平均值。 #include int main( ) int i ; float x, sum=0 ; printf( “Enter 10 numbers one by one: n“ ); for( i =1 ; i=10 ; i+) scanf( “%f“, ,for 循环的表达式,for 循环中有三个表达式 for 语句中的各个表达式都可以省略 分号分隔符不能省略,for( ; ; ) ; ,可省略,不能省略,省略表达式,int i=1; for( ; i = 100 ; i+) sum+=i; ,相当于省去了为循环变量赋初值,此时应在for语句之前给循环变量赋初值,省略表达式,for(i=1; ; i+) . ,即不判断循环条件,也就是认为表达式2始终为真, 这时应在循环体内设法结束循环,否则将成为死循环,省略表达式,for(i=1;i=100;) sum=sum+i; i+; ,即省去修改循环变量的值,但此时应在循环体内设法结束循环,省略三个表达式,for( ; ; ) printf(“这将一直进行下去“); i = getchar(); if(i = X | i = x) break; ,即不为循环变量赋初值,不设置循环条件(认为表达式2为真值),不修改循环变量的值,无终止地执行循环体。此时应在循环体内设法结束循环,否则会成为死循环,break 语句,break语句可以改变程序的控制流 break语句用于do-while、while、for循环中时,可使程序终止循环而执行循环后面的语句 break语句通常在循环中与条件语句一起使用。若条件值为真,将跳出循环,控制流转向循环后面的语句 如果已执行break语句,就不会执行循环体中位于 break 语句后的语句 在多层循环中,一个break语句只向外跳一层,break 语句,跳出 for 循环 for( ; ; ) printf(“这将一直进行下去“); i = getchar(); if(i = X | i = x) break; ,跳出 while 循环 while(1) if(x = 10) break; ,跳出 do-while 循环 do if (x = 10) break; while (x 15);,break 语句示例,问题描述: 统计从键盘输入的若干个字符中有效字符的个数,以换行符作为输入结束。有效字符是指第一个空格符前面的字符,若输入字符中没有空格符,则有效字符为除了换行符之外的所有字符。,#include int main() int count=0,ch; printf(“n 请输入一行字符:“); while(ch=getchar()!=n) if(ch= ) break; count+; printf(“n 共有 %d 个有效字符。n“,count); return 0; ,break 语句示例,H,0,_,请输入一行字符:Hello world,共有 5 个 有效字符,1,循环执行 5 次,5,continue 语句,continue 语句只能用在循环里 continue 语句的作用是跳过循环体中剩余的语句而执行下一次循环 对于while和do-while循环,continue 语句执行之后的动作是条件判断;对于for循环,随后的动作是变量更新,continue 语句,while() continue; ,while() break; ,跳出整个循环,继续下一次循环,问题描述: 求整数1100的累加值,但要求跳过所有个位为3的数。,#include int main() int i,sum = 0; for(i=1; i=100;i+) if( i % 10 = 3) continue; sum += i; printf(“sum = %d n“,sum); return 0; ,continue 语句示例,循环执行到 i = 101,循环嵌套示例-打印输出九九乘法表,#include int main() int i, j; for (i=1; i=9; i +) for (j=1; j=9; j+) printf(“%d*%d=%dt“,i,j,i*j); printf(“n“); return 0; ,思考:要是想输出下半三角,应如何修改循环?,循环嵌套示例-打印输出九九乘法表,#include int main() int i, j; for (i=1; i=9; i +) for (j=1; j=i; j+) printf(“%d*%d=%dt“,i,j,i*j); printf(“n“); return 0; ,思考:要是想输出上半三角,应如何修改循环?,【例1】 :用*输出如右菱形图案: 问题分析: 由一个上三角形和一个下三角形构成 上三角形共四行,由空格和星号构成, 空格数按行减少,星号数按行增加 外循环控制行数,控制变量i从1变化到4 内循环1控制每行输出的空格,控制变量j从1变化到i,每次输出一个空格 内循环2控制每行输出的星号,控制变量k从1变化到2k-i,每次输出一个星号 下三角形,循环综合示例1,* * * * * * * * * * * * * * * * * * * * * * * * *,循环综合示例1,#include int main() int i,j,k; for(i=1;i=4;i+) for(j=1;j=4-i;j+) printf(“ “); /* printf(“%c“, x20) */ for(k=1;k=2*i-1;k+) printf(“*“); /* printf(“%c“, *) */ printf(“n“); for(i=1;i=3;i+) for(j=1;j=i;j+) printf(“ “); /* printf(“%c“, ) */ for(k=1;k=7-2*i;k+) printf(“*“); /* printf(“%c“, *) */ printf(“n“); ,输出: * * * * * * * * * * * * * * * *,* * * * * * * * *,控制打印的行数,控制每行打印的空格数,控制每行打印的*号数,控制打印的行数,控制每行打印的空格数,控制每行打印的*号数,【例2】:打印输出100至200之间的全部素数。 问题分析: 素数是指只能被1和它本身整除的数。 判断某数是否素数的算法: 对于整数m,分别用2、3、m-1尝试能否整除m,只要m能被小于本身的某个数整除,m就不是素数 设除数为j,从2循环到m-1,循环综合示例2,这是一种穷举算法,循环综合示例2,#include int main () int j,m; printf(“输入一个整数:“); scanf(“%d“, ,判断某一个数是否为素数的程序,循环综合示例2,#include int main() int i,j,n; n=0; printf(“从100到200之间所有的素数为:n“); for(i=100;i=200;i+) j=2; while(i%j!=0) j+; if(i=j) printf(“%4d“,i); n+; if(n%8=0) printf(“n“); printf(“n“); ,从100到200之间所有的素数为: 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199,控制每行输出8个素数,如果第一个能被整除的数等于该数本身,则说明该数为素数,从2到i之间寻找第一个能被整除的数,循环综合示例3,【例3】趣味数学题:有30个人,其中有男人、女人和小孩,在一家饭馆里吃饭共花了50元,每个男人各花3元,每个女人各花2元,每个小孩各花1元,问男人、女人和小孩各有几人? 解题思路:本题有两个约束条件。 总共有30人: x+y+z=30 吃饭共花50元:3x+2y+z=50 即是求解方程组: 方法:按一个约束条件列出所有可行的情况,然后对每个可能解检查它是否满足另一个约束条件 。,循环综合示例3,#include int main() int x,y,z; printf(“Men t Women t Childrenn“); for (x=0; x=30; x+) for (y=0; y=30; y+) for (z=0; z=30; z+) if (x+y+z = 30 ,使用穷举算法,循环综合示例3,#include int main() int x,y,z; printf(“Men t Women t Childrenn“); for (x=0; x=16; x+) for (y=0; y=25; y+) z = 30 - x - y; if (3*x+2*y+z = 50) printf(“%3d t %5d t %8dn“,x,y,z); return 0; ,改进穷举算法,循环综合练习,【练习】用50元钱买了三种水果共100个。西瓜5元一个,苹果1元一个,桔子1元3个,设计一程序输出每种水果各买了几个。 解题思路:两个约束条件。 三种水果共100个: melon+apple+orange=100 三种水果共花50元:5*melon+apple+orange/3=50,循环综合练习,#include int main() int melon, apple, orange; /分别表示西瓜数、苹果数和桔子数 for (melon=1; melon10; +melon) / 可能的西瓜数 for( apple=1; apple 50 - 5 * melon; +apple) /可能的苹果数 orange = 3*(50-5*melon-apple); / 剩下的钱全买了桔子 if(melon+apple+orange = 100) / 三种水果数之和是否为100 printf(“melon:%2d, apple:%2d, orange:%2dn“ ,melon,apple,orange); return 0; ,循环综合示例4,【例4】计算自然常数e的值,精确到小数点后6位 解题思路: 这是个级数计算问题,求n+1项累加和;用循环实现。循环终止的条件是 设fn=1/n!,而n!=(n-1)!*n,第n项可以写成 fn = fn-1 / n 累加和放在e中,可以写成 en = en-1 + fn 设一个计数器n,每循环一次, n 增加1,循环综合示例4,#include int main() double e = 1.0, f = 1.0; int n= 0; do n +; f = f/n; e = e+f; while(f=1.0E-6); printf(“e=%lf(n=%d)n“,e,n); return 0; ,循环综合示例5,【例5】求水仙花数:如果一个三位数的个位数、十位数和百位数的立方和等于该数自身,则称该数为水仙花数。编一程序求出所有的水仙花数。 如: 153 = 13 + 53 + 33 370 = 33 + 73 + 03 371 = 33 + 73 + 13 407 = 43 + 03 + 73,循环综合示例5,解题思路 用穷举法对100999之间的每个数进行验证。 验证公式为: hdn= h3 + d3 + n3 关键:如何分解一个3位数n的百位、十位和个位? 百位 = n / 100 十位 = (n / 10 )% 10 个位 = n % 10 例: 371 h = 371/100 = 3 d = (371/10)%10 = 37 % 10 = 7 n = 371 % 10 = 1,循环综合示例5,/chap5ex11.c #include int main() int n, i, j, k; for(n=100; n=999; n=n+1) i = n/100; / 取出n的百位数 j = (n/10)%10; / 取数n的十位数 k = n%10; / 取出n的个位数 if(n=i*i*i+j*j*j+k*k*k) printf(“%d=%d3+%d3+%d3n“,n,i,j,k); return 0; ,循环综合示例6,【例6】斐波那契数列:一对兔子从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如所有的兔子都不会死,求前24个月中每月的兔子对数。 问题分析: F1 = 1 (最初的一对兔子) F2 = 1 (第2个月,最初的一对兔子长成,但尚未生育) F3 = 2 (最初的兔子开始生育) F4 = 3 (最初的兔子继续生育) F5 = 5 (第一次出生的兔子开始生育) 从而形成了如下数列:1,1,2,3,5,8,13,21,34 此数列的变化规律是:Fn = Fn-1+Fn-2,循环综合示例6,解题思路: 该数列的函数为 算法: 设变量f1、f2、f3,并为f1、f2赋初值1,令f3=f1+f2得到第3项 将f1 f2,f2 f3,再求f3=f1+f2得到第4项 以此类推求第5项、第6项,这是一种递推算法 用采用循环实现,循环综合示例6,#include #define N 24 int main() int i,f1,f2,f3; f1=f2=1; printf(“%8d%8d“,f1,f2); for(i=3; i=N; i+) f3=f1+f2; f1=f2;f2=f3; printf (“%8d“,f3); if(i%8=0) printf (“n“); return 0; ,循环综合示例7,【例7】谁打烂了玻璃:有四个小孩踢皮球,不小心打烂了玻璃,老师问是谁干的。 A说:不是我 B说:是C C说:是D D说:C胡说 现已知3个小孩说的是真话,一个小孩是假话。根据这些信息,编程找出打烂玻璃的孩子。,循环综合示例7,问题分析: 如何求解逻辑问题? 如何根据案例的问题描述给出对应的数学模型?

温馨提示

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

评论

0/150

提交评论