• 1. 第5章 循环结构程序设计
  • 2. 5.1 问题的提出与程序示例循环结构的特点是: 根据给定条件成立与否来决定是否反复执行某个程序段。 C语言中可以用以下语句来实现循环: ⑴ 用goto语句和 if 语句构成循环; ⑵用while语句; ⑶用do_while语句; ⑷用for语句。
  • 3. 5.2 while语句格式: While (表达式) 循环体 功能:计算表达式的值,当表达式的值为非0(真)时,就反复执行循环体。若表达式的值为假(0) ,则结束循环。 循环体中的语句超过一句时,要使用{ } Ae真假流程图
  • 4. 最常见的循环语句是通过计数控制循环体的执行次数。 int i=0,sum=0; while(i<=20) { sum=sum+i; i++; } printf(“sum=%d”,sum) 另一种是使用用户输入的一个特殊值来结束循环。 char c; c=getchar(); while(c!=‘$’) { putchar(c); c=getchar(); } putchar(‘\n’);
  • 5. 注意循环次数的控制要正确。比如循环控制变量或特殊的条件。如果用循环变量控制,要注意循环变量的初值和控制条件,一定要在循环体中改变循环变量,使得循环能趋于结束,否则会出现死循环。(P99例5.4 ,例5.6) 建议:即便循环体只有一个简单语句,也用花括号括起来。 循环条件中一般是逻辑表达式和关系表达式,也可以是算数表达式(非0为真,0为假)。一般地, 表达式中应含有变量( 循环控制变量 )。while (3)和while (0)虽然从程序设计的角度上说是不合理的,但是合法的。(例5.7) 如果程序出现死循环,编译连接时不会显示错误。运行时可以使用Ctrl+break结束死循环。
  • 6. 例:输出100---999之间所有能被7整除的数,并统计共有几个这样的数.因为要对一批数据中的每一个数判断是否能被7整除,所以要用循环结构。 假设使用x作为循环控制变量,则x初始值为100,当x>999时结束。 在循环体内,需要判断x是否能被7整除,所以要使用分支结构。 如果能整除要输出x,并记录个数,假设用变量n记录能被7整除的数的个数,则n初始值为0 main() { int x=100,n=0; while (x<=999) { if (x%7)==0) { printf("%5d",x); n++; } x++; } }
  • 7. main() { int i,sum ; i=0,sum=0; while(i<=100) { sum=sum+i; i=i+7; } printf("%d",sum); }把0—100所有7的倍数(或所有能被7整除的数)相加.赋初值循环条件循环控制变量发生变化循环体例:阅读以下程序
  • 8. main() { int i=1; while(i<=10) { printf("%d*%d=%d\n",i,i,i*i); i++; } }运行结果: 1*1=1 2*2=4 3*3=9 4*4=16 5*5=25 6*6=36 7*7=49 8*8=64 9*9=81 10*10=100如果把i++和printf语句的次序交换,会出现什么结果?怎么样修改可以使程序结果仍然如右图所示? 例:程序的执行结果是什么
  • 9. While循环是先判断表达式,后执行循环体 循环体有可能一次也不执行 main() { int x=10; while (x==0) { x=x-1; } printf("%d",x); }
  • 10. 5.3 do…while语句格式: do 循环体 while (表达式); 功能:首先执行循环体,然后判断表达式的值,若非0(真),就反复执行循环体,直到表达式的值为0,结束循环. Ae真假流程图
  • 11. 注意:do…while与while的区别是:do…while总是要先进行一遍循环,再进行表达式的判断,因此循环体中的语句至少要执行一次。所以有些程序不能使用do…while语句完成;有些能使用两种语句,但在循环控制上有所不同。 比较例5.2和例5.9,例5.3和例5.10 为了避免编译系统把do…while语句的while当作while语句的开始,do…while循环体中的语句即使只有一句,也需要采用分程序结构,用{ }括起来。
  • 12. 例 用do…while编程求s=1+2+3+…+100main( ) { int s=0,k=1; do { s=s+k; k++; }while(k<=100); printf("s=%d\n",s); }赋初值循环条件循环控制变量发生变化循环体
  • 13. 5.4 for语句格式: For ( 表达式1; 表达式2; 表达式3 ) 循环体 功能 计算表达式1 计算表达式2,判断表达式2是否为真,若为真,执行循环体中的语句,若为假,循环结束,跳到for语句下面的一个语句 计算表达式3 跳转到第②步执行初值循环条件循环控制变量的改变
  • 14. 表达式1表达式2真假流程图循环体语句表达式3
  • 15. 注意for语句完全可以用while代替,但for直观、简单、方便 for用while代替的流程 表达式1; while(表达式2) { 语句; 表达式3; }
  • 16. 可以省略表达式1, 但须保留分号;这时在for之前就得赋值给循环变量; 例: 任意输入两个整数a, b,求main ( ) { int i, j, a, b, sum=0; printf ("please input two number!\n") scanf ("a=%d, b=%d", &a, &b); i=a; j=b; if (a>b) {i=b; j=a;} for (; i<=j; i++) sum=sum+i; printf (" \n sum=%d", sum); }
  • 17. 表达式2一般不可省略,否则为无限循环 例: for (i=1; ; i++) sum=sum+i; 条件永真、永不为0,相当于: while (1) { sum=sum+i; i++; }表达式1、表达式3可以是逗号表达式,以使循环变量值在修改时可以对其它变量赋值。 例: for (sum=0, i=1; i<=100; i++, i++); 等价于 sum=0; for (i=1; i<=100; i=i+2); 表达式3亦可省略,但在循环体中须有语句修改循环变量;以使表达式2在某一时刻为0而正常结束循环。
  • 18. 三个表达式均省略 即for(;;)语句则相当于while(1)语句。 表达式2可以是关系表达式,也可以是数值表达式或字符表达式。只要值0 即执行循环体。 例: For (i=0; c=getchar( )!='\n'; i+=c); 特别,在for语句括号后面如果加分号,表示循环语句为空语句,区别:For(i=1;i<=20;i++); printf(“%3d”,i);For(i=1;i<=20;i++) printf(“%3d”,i);
  • 19. 5.5 多重循环多重循环也叫作循环的嵌套,就是在一个循环体内包含了另一个循环体。 在多重循环中,外层循环与内层循环的循环变量名不能相同,否则会引起循环次数的混乱。 例:(P108 例5.15,例5.16)
  • 20. 5.6 break语句在循环中的应用break语句在循环体中的功能是: 终止包含break语句的最内层循环。从包含它的最内层循环中退出,执行包含它的循环语句的下一条语句。
  • 21. 5.7 continue语句continue语句的功能是: 使包含它的最内层循环立即开始下一轮循环(即本次循环体中continue后面的部分不执行)。 在for语句中,终止本次循环运行,但是要计算表达式3的值。 break与continue的区别: 在循环语句中使用break是使内层循环立即停止循环,执行循环体外的第一条语句,而continue是使本次循环停止执行,执行下一次循环。 break语句可用在switch语句中,而continue语句则不能。
  • 22. 5.8 控制循环的实用方法计数循环和哨兵循环 计数哨兵循环 询问循环 输入验证循环