
C第6章循环控制.ppt
54页第第 六六 章章 循循 环环 控控 制制6.1 6.1 概述概述6.2 6.2 gotogoto语句语句6.3 6.3 循环语句循环语句6.4 6.4 循环的嵌套循环的嵌套6.5 break6.5 break和和continuecontinue语句语句6.6 6.6 循环程序举例循环程序举例9/13/20241第6章 循环控制6.1 6.1 概述概述如如:sum=1+2+3+…+100;实际问题实际问题: 一组重复执行的语句一组重复执行的语句则用循环结构解决则用循环结构解决9/13/20242第6章 循环控制C语言用四种形式循环语言用四种形式循环2. while 语句语句3. do …while 语句语句4. for语句语句1. if语句与语句与goto语句语句9/13/20243第6章 循环控制6.2 6.2 gotogoto语句及语句及其其构成构成的的循环循环1. goto语句语句2. 与与if构成循环构成循环.形式形式: goto 标号标号;功能功能: 无条件转向标号处无条件转向标号处标号标号:用标识符命名用标识符命名9/13/20244第6章 循环控制#include
2、使用goto语句的两个用途: 1)可与if语句一起构成循环结构 2)从循环体中跳转到循环体外9/13/20246第6章 循环控制6 6. .3 3 循循环环语语句句1. while语句语句2. do…while语句语句3. for语句语句4. 几种循环的比较几种循环的比较9/13/20247第6章 循环控制1 1. . W W h hi il le e语语 句句 为了使程序的结构化功能强为了使程序的结构化功能强,应尽量少用应尽量少用goto语句1)) 形式形式: while (表达式表达式)语语句句((2)) 执行过程执行过程: 先判断表达式的值若先判断表达式的值若 0.则执行则执行其后面的语句其后面的语句,否则否则while执行完毕执行完毕专门的当型循环语句专门的当型循环语句––while语句语句9/13/20248第6章 循环控制((3)) 流程图流程图:0=0表达式表达式语句语句下一语句下一语句将上述例子用将上述例子用while语句写出语句写出例例6.2 while (i<=100) { sum+ =i;//sum=sum+i i++; }loop:if (i<=100) { sum=sum+i; i++; goto loop; }9/13/20249第6章 循环控制 语句中应有使表达式语句中应有使表达式=0的语句。
的语句 否则会出现无限循环否则会出现无限循环–––"死死"循循环注注: while后面的语句后面的语句一般为复合语句一般为复合语句, 即:加即:加{ }9/13/202410第6章 循环控制2.do …while2.do …while语句语句 一种专门的一种专门的“ 直到型直到型” 循环语句循环语句2)) 执行过程执行过程: 先执行语句先执行语句,再判表达式的值再判表达式的值,若若 0,再执再执行语句行语句,否则结束循环否则结束循环((3)) 流程流程:语句语句表达式表达式 0=0((1)) 形式形式: do语句语句while(表达式表达式); 注,其后有分号注,其后有分号9/13/202411第6章 循环控制void main ( ){ int i, sum=0; i=1; do { sum=sum+i; i++; } while (i<=100); printf("%d",sum);}例例6.3 while语句与语句与do…while语句的区别语句的区别: 当第一次执行时,当第一次执行时, 若表达式若表达式=0时时,则则while语句语句与与do …while有所不同有所不同, do …while 执行一次后面的语句执行一次后面的语句,而而while不执行。
不执行因此,因此,do …while语句又叫做非语句又叫做非0次循环语句见课本次循环语句见课本117页例页例题题6.49/13/202412第6章 循环控制3. for3. for语句语句((1)) 形式形式 首先计算表达式首先计算表达式1,接着执行表达式接着执行表达式2,若表达式若表达式2的值的值 0,则则执行语句执行语句,接着计算表达式接着计算表达式3,再判断表达式再判断表达式2的值的值.依此重复依此重复下去下去,直到表达式直到表达式2的值的值=0(假假)一种形式更为灵活的循环语句一种形式更为灵活的循环语句2))执行过程执行过程for(表达式表达式1; 表达式表达式2; 表达式表达式3)语句语句9/13/202413第6章 循环控制((3)) 流程流程:=0(假假) 0(真真)计算表达式计算表达式1求表达式求表达式2值值语句语句计算表达式计算表达式3结束结束for语句语句9/13/202414第6章 循环控制用用for语句写出上述例子语句写出上述例子for用用while代替的流程代替的流程 表达式表达式1; while(表达式表达式2) { 语句语句 表达式表达式3; }for ( i=1; i<=100; i++) sum+=i;for语句完全可以用语句完全可以用while代替代替,但但for直观、简单、方便直观、简单、方便9/13/202415第6章 循环控制((4)) for语句的几种特例语句的几种特例 可以省略表达式可以省略表达式1, 但须保留分号但须保留分号;这时在这时在for之前就得赋之前就得赋值给循环变量值给循环变量;i=1;for (; i<=100; i++) sum+=i; 表达式表达式2一般不可省略一般不可省略,否则为无限循环否则为无限循环例例: for (i=1; ; i++) sum=sum+i;相当于条件永真、永不为相当于条件永真、永不为09/13/202416第6章 循环控制((count))<-循环次数-循环次数循环体循环体((count))<-(-(count)-)-1((count)=)=0?? 思考:同思考:同FORFOR语句控制的循环的差异语句控制的循环的差异9/13/202417第6章 循环控制 表达式表达式3亦可省略亦可省略,但在循环体中须有语句修改循环变量但在循环体中须有语句修改循环变量;以使表达式以使表达式2在某一时刻为在某一时刻为0而正常结束循环。
而正常结束循环例例: for (sum=0,i=1;i<=100;) { sum=sum+i; i++; }9/13/202418第6章 循环控制 若同时省略表达式若同时省略表达式1,表达式表达式3,则相当于,则相当于while(表达式表达式2)语句相当于相当于 i=1 ;; while (i<=100) { sum+=i; i++; }例例: for (; i<=100;) {sum+=i; i++;}9/13/202419第6章 循环控制 三个表达式均省略三个表达式均省略 即即for(;;)语句则相当于语句则相当于while(1)语句语句.表达式表达式1、表达式、表达式3可以是逗号表达式可以是逗号表达式,以使循环以使循环变量值在修改时可以对其它变量赋值变量值在修改时可以对其它变量赋值如如 for (sum=0,i=1;i<=100;i++,i++)相当于:相当于: sum=0; for (i=1;i<=100;i=i+2)9/13/202420第6章 循环控制 表达式表达式2可以是关系表达式可以是关系表达式,也可以是数值表达式也可以是数值表达式或字符表达式。
只要值或字符表达式只要值 0.即执行循环体即执行循环体.例例: for (i=0; (c=getchar( ))!='\n'; i+=c);9/13/202421第6章 循环控制4.4.几种循环的比较几种循环的比较对于同一问题对于同一问题, 四种循环可相互替代但不提倡用四种循环可相互替代但不提倡用goto.for循环功能强于循环功能强于while, do…while.但若不是明显地给出但若不是明显地给出循环变量初终值循环变量初终值(或修改条件或修改条件),则应用则应用while 或或do …while.以增强程序的结构化和可读性以增强程序的结构化和可读性要防止无限循环要防止无限循环——死循环循环过程中循环过程中,为了结束本次循环或跳出整个循环分别为了结束本次循环或跳出整个循环分别要用到要用到continue和和break语句9/13/202422第6章 循环控制循环结构的要素循环结构的要素1.循环的控制循环的控制a.循环的条件循环的条件: 值可变值可变的的逻辑表达式逻辑表达式至少含有一个至少含有一个变量变量b.循环控制变量循环控制变量:初值初值中间态中间态终值终值c.循环循环(变量变量)的修正的修正(表达式表达式)使得循环控制变量由初值经过中间态到达终值使得循环控制变量由初值经过中间态到达终值9/13/202423第6章 循环控制2.循环的初始化循环的初始化 包括循环过程中的所有变量的初始值的设定包括循环过程中的所有变量的初始值的设定3.循环体循环体循环体内部的处理步骤不变循环体内部的处理步骤不变, ,数据是变化的数据是变化的每次循环中变量的含义是不变的每次循环中变量的含义是不变的9/13/202424第6章 循环控制开开 始始结结 束束 初初 始始 化化 循环的初始状态循环的初始状态 循循 环环 体体 循环的工作部分及修改部分循环的工作部分及修改部分 控制条件控制条件 计数控制计数控制 特征值控制特征值控制 地址边界控制地址边界控制9/13/202425第6章 循环控制循环程序的组成1.设置循环的初始状态.循环计数值,及为循环体正常工作而建立的初始状态等.2.循环体.这是循环工作的主体,由循环的工作部分及循环的修改部分组成.3.循环的控制部分.循环的控制条件是一个关键的 问题.循环控制条件的正确选取是特别重要的问题.要根据具体的情况来选取控制循环的条件.9/13/202426第6章 循环控制6.4 6.4 循环的嵌套循环的嵌套 与其它语言一样与其它语言一样,当循环体中又包含了另一个完整的循当循环体中又包含了另一个完整的循环语句时环语句时–––嵌套。
嵌套 C有三种循环语句有三种循环语句,均可以相互嵌套均可以相互嵌套: while ( ) {… while ( ) {… } }for (; ;){ … while ( ) { } do { } while ( ); …}均为正确的嵌套均为正确的嵌套9/13/202427第6章 循环控制6.5 break6.5 break语句和语句和contiunecontiune语句语句问题问题: 计算圆的面积计算圆的面积 r2, 半径取半径取1, 2, 3, 4…,当面积当面积>100时结束define PI 3.14159main(){… for((r=1; r<=10; r++) {area=PI r r; if (area>100) break;;} printf ("%f", area);}1. break1. break1. break1. break语句语句语句语句9/13/202428第6章 循环控制 从结构化程序要求出发从结构化程序要求出发,用用break,退出循环退出循环,进进入入for语句的下一条语句。
语句的下一条语句注注: break只能用于循环语句和只能用于循环语句和switch语句9/13/202429第6章 循环控制2.2.2.2. continue continue语句语句 main( ) { int n; for (n=100; n<=200; n++) if (n%3!=0) printf("%d", n); }问题问题: 编写程序编写程序,打印打印100~200中不能被中不能被3整除的数整除的数9/13/202430第6章 循环控制main( ){ int n; for (n=100; n<=200; n++) {if (n%3==0) continue; printf ("%d", n); }}continue语句起了结束语句起了结束本次循环的作用本次循环的作用换一种方式换一种方式:9/13/202431第6章 循环控制例例6.4: 求求Fibonacci数例数例: 1, 1, 2, 3, 5, 8, …前前40个数规律规律: F1=1, F2=1 Fn=Fn – 1 + Fn – 2 (n>2)程序要点:程序要点: 每输出每输出4个数时换行。
个数时换行 f1=f1+f2; f2=f2+f1; 交替的结果正好为一序列交替的结果正好为一序列6.6 6.6 程序举例程序举例9/13/202432第6章 循环控制程序如下程序如下: main ( ) { long int f1, f2; int i; f1=1; f2=1; for (i=1; i<=20; i++) { printf(%12ld %12ld ", f1, f2); if (i%2= =0) printf("\n "); f1=f1+f2; f2=f2+f1; }} f1=1, f2=1 for i=1 to 20 输出f1, f2 f1=f1+f2 f2=f2+f19/13/202433第6章 循环控制运行结果为:运行结果为:153423315971094675025514229352457824157817185537725841771112113938320405702887390881692138961041812865719641813462699227465632459863211449876765463683178112178309149303521023341559/13/202434第6章 循环控制 判一个数判一个数m是否为素数的方法是否为素数的方法: 每打印每打印10个数个数,换一次行换一次行。
当用当用2, 3, …的整数去除它时均不能除尽的整数去除它时均不能除尽, 例例6.5. 求求100~200的素数的素数.则为素数则为素数9/13/202435第6章 循环控制程序如下:程序如下:#include
规律规律: 将输入的字母变成其后的第将输入的字母变成其后的第4个字母如,输入如,输入China! 译为译为Glmre!程序要点:程序要点:字符的字符的ASCII码值码值+4;; 若为若为WXYZ或或wxyz 之一,需转换为之一,需转换为ABCD或或abcd之一之一if((c>=‘a’&&c<=‘z’)||(c>=‘A’&&c<=‘Z’)) {c=c+4; if(c>’Z’&&c<=’Z’+4||c>’z’) c=c-26; } 9/13/202438第6章 循环控制程序如下程序如下:#include
9/13/202440第6章 循环控制例:输入若干非0实数,直到输入0时停止,要求输入的实数最多不超过20个,统计其中正数的个数,负数的个数分析:设三个计数变量: n-统计输入的数据总个数(为什么有必要?)posn-统计正数的数目negn-统计负数的数目9/13/202441第6章 循环控制#include
累乘法:累乘变量初值一般为1,每循环一次,累乘变量自乘一个数据,这样当循环结束的时候,累乘变量的值即为这些数据连乘的积9/13/202443第6章 循环控制例例::输入n个100分制成绩(用整型),计算并输出平均成绩,要求输出精确到两位小数 #include 9/13/202450第6章 循环控制#include “stdio.h”void main(){ int x,y,z; printf(“ Cock Hen chicken\n”); for(x=0;x<=20;x++) for(y=0;y<=33;y++) { z=3*(100-5*x-3*y); if(z>=0&&x+y+z==100) printf(“%8d%8d%8d\n”,x,y,z); }} 9/13/202451第6章 循环控制例例. 输入两个自然数a,b,求它们的最大公约数与最小公倍数分析:设a,b的最大公约数为gcd(a,b),可用下式计算gcd(a,b),而最小公倍数=a*b/gcd(a,b)五、数论有关问题五、数论有关问题例如:gcd(24,32) =gcd(32,24) =gcd(24,8) =gcd(8,0)=89/13/202452第6章 循环控制#include “stdio.h” void main() /*两数求最大公约数与最小公倍数*/{ int a,b,t,m; printf(“Input a,b:”); scanf(“%d%d”,&a,&b); if(a<1||b<1) {printf(“Input isn’t correct.\n”); return; } m=a*b; while(b!=0) { t=a%b;a=b;b=t; } printf(“zdgys=%d,zxgbs=%d\n”,a,m/a);}9/13/202453第6章 循环控制习 题•看书(reading) p106——121•思考题(exercise) 6.3、6.5•作业题(problem) 6.7、6.11•上机题一(project) 6.2、6.4、6.8•上机题二(project) 6.1、6.6、6.149/13/202454第6章 循环控制。
