《C语言程序设计:第5章 循环结构程序设计 (3)》由会员分享,可在线阅读,更多相关《C语言程序设计:第5章 循环结构程序设计 (3)(32页珍藏版)》请在金锄头文库上搜索。
1、1第第5 5章循环结构程序设计章循环结构程序设计 5.1 5.1 循环结构解决的问题循环结构解决的问题 5.2 while5.2 while语句语句 5.3 do-while5.3 do-while语句语句 5.4 for5.4 for语句语句 5.5 5.5 循环语句的比较循环语句的比较 5.6 5.6 循环嵌套循环嵌套 5.7 5.7 改变循环的执行流程改变循环的执行流程 5.8 goto 5.8 goto语句语句 5.9 5.9 循环结构程序综合举例循环结构程序综合举例5.15.15.15.1循环结构解决的问题循环结构解决的问题循环结构解决的问题循环结构解决的问题 程序设计解决实际问题的
2、过程中经常会碰到许多程序设计解决实际问题的过程中经常会碰到许多具有规律具有规律性的重复运算处理性的重复运算处理的问题,在处理这类问题时需要把程序中的的问题,在处理这类问题时需要把程序中的某些语句反复执行多次。下面是具有这种特征的一些例子:某些语句反复执行多次。下面是具有这种特征的一些例子: 向计算机系统输入向计算机系统输入100100个学生的档案,重复进行个学生的档案,重复进行100100次输入次输入操作。操作。 为全班为全班3030个学生分别计算其个学生分别计算其5 5门课的平均成绩,重复进行门课的平均成绩,重复进行3030次求平均数的算术运算。次求平均数的算术运算。 求求1 + 2 + 3
3、 + 1 + 2 + 3 + + 100 + 100的和,重复进行的和,重复进行100100次加法操作。次加法操作。 检查检查100100名毕业生是否具有获得学位证书的资格,重复进名毕业生是否具有获得学位证书的资格,重复进行行100100次判断操作。次判断操作。 C C语言提供标准的三种循环控制语句:语言提供标准的三种循环控制语句:whilewhile语句、语句、do- do- while while语句和语句和forfor语句。语句。5.25.25.25.2 whilewhilewhilewhile语句语句语句语句whilewhile循环语句的一般形式如下:循环语句的一般形式如下:while
4、(while(表达式表达式) ) 语句语句 使用使用whilewhile语句时应该注意以下几点:语句时应该注意以下几点:(1) (1) 循环体只能包含一条语句,当循环体需要多条语句组成时,使用复合语循环体只能包含一条语句,当循环体需要多条语句组成时,使用复合语句。句。(2) (2) 循环通常在重复循环通常在重复有限的次数有限的次数后结束,因此循环体中应该包含使循环继续后结束,因此循环体中应该包含使循环继续条件最终变为条件最终变为“假假”的语句。如果循环继续条件永远为的语句。如果循环继续条件永远为“真真”的情况,则循环无法结束,称的情况,则循环无法结束,称为为“死循环死循环”。(3) (3) 由
5、于由于whilewhile语句执行过程是先判断条件,再执行循环体,因此语句执行过程是先判断条件,再执行循环体,因此循环体有循环体有 可能一次都不执行可能一次都不执行。例例5-15-1:编程求:编程求1 + 2 + 3 + 1 + 2 + 3 + + 100 + 100的值,使用的值,使用whilewhile语句。语句。首先抓住循环规律然后画流程图流程图思路:1.初始化2.判断循环继续条件3.未结束,做本次循环4.为下次循环做好准备工作 #include #include int main() int main() int i, sum; int i, sum; sum=0; / sum=0;
6、/和的初始值为和的初始值为0 0 i=1; i=1; while(i=100) while(i=100) sum=sum+i; / sum=sum+i; /累加运算累加运算 i=i+1; /i=i+1; /累加项加累加项加1 1,准备下次加法,准备下次加法 printf(1+2+3+.+100 = %dn,sum); printf(1+2+3+.+100 = %dn,sum); return 0; return 0; 1+2+3+.+100 = 50501+2+3+.+100 = 5050例例5-25-2:编写程序,从键盘输入多个字符,输入的字符是回车时:编写程序,从键盘输入多个字符,输入的字
7、符是回车时表示字符输入结束,统计并输出其中数字字符的个数。表示字符输入结束,统计并输出其中数字字符的个数。 #include #include int main() int main() int count; int count; char ch; char ch; count=0; count=0; ch=getchar(); ch=getchar(); /输入第一个字符输入第一个字符 while(ch!=n)while(ch!=n) if(ch=0 & ch=0 & ch=9) count+; count+; ch=getchar(); /ch=getchar(); /输入下一个字符输入下
8、一个字符 printf(number of digit: %dn, count); printf(number of digit: %dn, count); return 0; return 0; ABC123,456XYZ7.ABC123,456XYZ7. number of digit: 7number of digit: 75.35.35.35.3 do-whiledo-whiledo-whiledo-while语句语句语句语句do-whiledo-while循环语句的一般形式如下:循环语句的一般形式如下:dodo 语句语句 while(while(表达式表达式););使用使用do-wh
9、iledo-while语句时,需要注意以下问题:语句时,需要注意以下问题:(1) (1) 循环体需要多条语句组成时,使用复合语句。循环体需要多条语句组成时,使用复合语句。(2) (2) 由于由于do-whiledo-while语句执行过程是先执行循环体,再判断循语句执行过程是先执行循环体,再判断循环条件,因此循环体环条件,因此循环体至少会执行一次至少会执行一次。例例5-35-3:编程求:编程求1 + 2 + 3 + 1 + 2 + 3 + + 100 + 100的值,使用的值,使用do-whiledo-while语句。语句。 #include #include int main() int m
10、ain() int i=1, sum=0; int i=1, sum=0; do do sum=sum+i; sum=sum+i; i+; i+; while(i=100); while(i=100); printf(1+2+3+.+100 = %dn,sum); printf(1+2+3+.+100 = %dn,sum); return 0; return 0; 1+2+3+.+100 = 50501+2+3+.+100 = 50505.45.45.45.4 forforforfor语句语句语句语句forfor循环语句的一般形式如下:循环语句的一般形式如下:for(for(表达式表达式1;
11、1; 表达式表达式2; 2; 表达式表达式3)3) 语句语句 使用使用forfor语句时,需要注意以下问题:语句时,需要注意以下问题:(1) (1) 循环体需要多条语句组成时,使用复合语句。循环体需要多条语句组成时,使用复合语句。(2) for(2) for循环语句括号中的三个表达式之间用分号隔开,循环语句括号中的三个表达式之间用分号隔开,表达式表达式1 1只执行一次,只执行一次,一般用来进行整个循环开始之前的一般用来进行整个循环开始之前的初始化初始化工作,常见的用法是初始化循环控工作,常见的用法是初始化循环控制变量;制变量;表达式表达式2 2的值决定循环是否继续执行,是的值决定循环是否继续执
12、行,是循环控制条件循环控制条件;表达式表达式3 3在在循环体每次执行后都计算一次,常见的用法是循环体每次执行后都计算一次,常见的用法是修改循环控制变量修改循环控制变量的值。的值。(3) for(3) for语句执行过程是先判断循环条件,再执行循环体,因此循环体有可语句执行过程是先判断循环条件,再执行循环体,因此循环体有可能一次也不执行。能一次也不执行。(4) for(4) for语句中的三个表达式都可以省略,但是作为分隔符的分号是不能省语句中的三个表达式都可以省略,但是作为分隔符的分号是不能省略的。略的。省略表达式省略表达式1 1时,对应的初始化工作可以放在循环语句前面完成;时,对应的初始化工
13、作可以放在循环语句前面完成;省略表达式省略表达式3 3时,相应的工作可以放在循环体的最后完成;时,相应的工作可以放在循环体的最后完成;省略表达式省略表达式2 2时,时,forfor循环语句的循环条件默认为非循环语句的循环条件默认为非0 0,即循环条件永远为真。,即循环条件永远为真。例例5-35-3:编程求:编程求1 + 2 + 3 + 1 + 2 + 3 + + 100 + 100的值,使用的值,使用forfor语句。语句。 #include #include int main() int main() int i, sum=0; int i, sum=0; for(i=1;i=100;i+)
14、 for(i=1;i=100;i+) sum=sum+i; sum=sum+i; printf(1+2+3+.+100 = %dn,sum); printf(1+2+3+.+100 = %dn,sum); return 0; return 0; 1+2+3+.+100 = 50501+2+3+.+100 = 50505.5 5.5 5.5 5.5 循环语句的比较循环语句的比较循环语句的比较循环语句的比较whilewhile循环和循环和forfor循环的循环继续条件检查是在循环体执行之前进行的,循环的循环继续条件检查是在循环体执行之前进行的,称为前置检测循环,循环体执行次数最少为称为前置检测循环
15、,循环体执行次数最少为0 0次;次;do-whiledo-while循环的循环继续条件检查是在循环体执行之后进行的,称为循环的循环继续条件检查是在循环体执行之后进行的,称为后置检测循环,循环体执行次数最少为后置检测循环,循环体执行次数最少为1 1次。次。forfor语句最为灵活。语句最为灵活。在一定条件下,三者可以相互取代。在一定条件下,三者可以相互取代。基于代码易读性考虑,编写程序处理循环结构时,选择哪一种基于代码易读性考虑,编写程序处理循环结构时,选择哪一种循环语句没有严格规定,几个常用的规则如下:循环语句没有严格规定,几个常用的规则如下:如果循环次数已经知道的情况使用如果循环次数已经知道
16、的情况使用forfor语句;语句;循环次数不确定的情况使用循环次数不确定的情况使用whilewhile语句;语句;如果需要在检查循环继续条件之前执行循环体,则使用如果需要在检查循环继续条件之前执行循环体,则使用do-do-whilewhile语句。语句。5.6 5.6 5.6 5.6 循环嵌套循环嵌套循环嵌套循环嵌套一个循环语句的循环体内包含另一个完整的循环语句,称为一个循环语句的循环体内包含另一个完整的循环语句,称为循环的嵌套。循环的嵌套可以有很多层,一个循环的内嵌一循环的嵌套。循环的嵌套可以有很多层,一个循环的内嵌一层循环叫双层循环嵌套,简称双重循环。在循环嵌套的内层层循环叫双层循环嵌套,
17、简称双重循环。在循环嵌套的内层循环中再内嵌一层或多层循环语句可以形成多重循环。循环中再内嵌一层或多层循环语句可以形成多重循环。(1) while()(1) while() . . While() While() . . (2) while()(2) while() . . do do . . while(); while(); (3) while()(3) while() . .for(;)for(;) . . (4) do(4) do . . while() while() . while();while();(5) do(5) do . . do do . while(); while()
18、;while();while();(6) do(6) do . . for(;) for(;) . . while();while();(7) for(;)(7) for(;) . . while() while() . . (8) for(;)(8) for(;) . . do do . . while(); while(); (9) for(;)(9) for(;) . . for(;) for(;) . . ( (补充)补充)嵌套结构规则嵌套结构规则 外循环外循环内循环内循环交叉循环交叉循环外循环外循环入口入口内循环出口内循环出口内循环出口内循环出口外循环出口外循环出口共 46 页 第
19、1616 页例例5-55-5:编写程序输出九九乘法表。:编写程序输出九九乘法表。思路分析:九九乘法表由思路分析:九九乘法表由9 9行构成,第行构成,第1 1行有行有1 1个乘法等式,第个乘法等式,第2 2行有行有2 2个个乘法等式,依此类推。解决这类问题时,可以采用逐步分析的方法,乘法等式,依此类推。解决这类问题时,可以采用逐步分析的方法,分析思路如下:分析思路如下:(1) (1) 首先考虑如何需要输出首先考虑如何需要输出9 9行数据。可以设计如下的循环结构,该循行数据。可以设计如下的循环结构,该循环用于控制行的输出,每循环执行循环体一次,就输出一行。环用于控制行的输出,每循环执行循环体一次,
20、就输出一行。for(i=1; i=9; i+)for(i=1; i=9; i+) 输出第输出第i i行行; ; (2) (2) 然后考虑如果输出第然后考虑如果输出第i i行。根据分析,第行。根据分析,第i i行由行由i i个乘法等式和一个个乘法等式和一个换行字符组成,因此可以设计一个循环结构输出换行字符组成,因此可以设计一个循环结构输出i i个乘法等式,然后再个乘法等式,然后再输出一个换行。输出一个换行。(3) (3) 最后将上述分析的循环结构进行嵌套,可以得到程序的整体结构。最后将上述分析的循环结构进行嵌套,可以得到程序的整体结构。 #include #include int main()
21、int main() int i, j; int i, j; for(i=1; i=9; i+) for(i=1; i=9; i+) for(j=1; j=i; j+) for(j=1; j=i; j+) printf(%d*%d=%2d , i,j,i*j); printf(%d*%d=%2d , i,j,i*j); printf(n); printf(n); return 0; return 0; 1*1= 11*1= 12*1= 2 2*2= 42*1= 2 2*2= 43*1= 3 3*2= 6 3*3= 93*1= 3 3*2= 6 3*3= 94*1= 4 4*2= 8 4*3=1
22、2 4*4=164*1= 4 4*2= 8 4*3=12 4*4=165*1= 5 5*2=10 5*3=15 5*4=20 5*5=255*1= 5 5*2=10 5*3=15 5*4=20 5*5=256*1= 6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=366*1= 6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=367*1= 7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=497*1= 7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=498*1= 8 8*2=16 8*3=2
23、4 8*4=32 8*5=40 8*6=48 8*7=56 8*8=648*1= 8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=649*1= 9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=819*1= 9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=815.75.75.75.7改变循环的执行流程改变循环的执行流程改变循环的执行流程改变循环的执行流程 无论哪种循环语句,正常执行情况下都是由无论哪种循环语句,正常执行情况下都
24、是由“循环条件循环条件”来决定是否结束循环的执行。来决定是否结束循环的执行。 但在实际程序设计中有时需要根据循环执行情况的变化但在实际程序设计中有时需要根据循环执行情况的变化而而“提前提前”结束结束循环执行或跳过本次循环的剩余语句进入下循环执行或跳过本次循环的剩余语句进入下一次循环的情况。一次循环的情况。 C C语言使用语言使用breakbreak语句和语句和continuecontinue语句解决这些问题。语句解决这些问题。1. break1. break语句语句 break break语句可以应用循环语句中,用于语句可以应用循环语句中,用于跳出循环体跳出循环体。下面对。下面对breakbr
25、eak语语句的使用进行详细说明:句的使用进行详细说明:(1) (1) 一般形式:一般形式:break;break;(2) break(2) break语句只能用于语句只能用于switchswitch、whilewhile、do-whiledo-while和和forfor语句中。语句中。(3) break(3) break语句的作用是结束语句的作用是结束“直接包含直接包含”它的循环它的循环或或switchswitch语句语句的执的执行,即它只能跳出包含它的一层语句结构。行,即它只能跳出包含它的一层语句结构。 当当breakbreak出现循环语句的嵌套结构时,只能跳出包含它的最内层循出现循环语句的
26、嵌套结构时,只能跳出包含它的最内层循环;当环;当breakbreak出现在循环语句与出现在循环语句与switchswitch语句的嵌套结构时,同样只能跳语句的嵌套结构时,同样只能跳出包含它的最内层的出包含它的最内层的switchswitch语句或循环语句。语句或循环语句。for for 循环结构中的循环结构中的breakbreak结构结构表达式2表达式1语句1表达式3零零非零非零break语句2是是否否共 46 页 第 2121 页例例5-65-6:输入一个正整数判断并输出它是否是素数。:输入一个正整数判断并输出它是否是素数。思路分析:素数也称为质数,其数学定义为:一个大于思路分析:素数也称为
27、质数,其数学定义为:一个大于1 1的正整的正整数,除了数,除了1 1和它本身外,不能被整除以其他正整数。和它本身外,不能被整除以其他正整数。 根据定义,该问题可以采用穷举法进行实现,即对于正整根据定义,该问题可以采用穷举法进行实现,即对于正整数数n n,从,从2 2开始到开始到n n依次尝试每个数是否能够被依次尝试每个数是否能够被n n整除,如果存整除,如果存在能够这样的数,则在能够这样的数,则n n不是素数;如果不存在这样的数,则不是素数;如果不存在这样的数,则n n是是素数。素数。 进一步分析可以知道,在找到第一个可以整除的数后,无进一步分析可以知道,在找到第一个可以整除的数后,无需继续检
28、查,直接结束循环即可。需继续检查,直接结束循环即可。 #include #include #include #include int main() int main() int i, n, is_prime, k; int i, n, is_prime, k; printf(Input a number(1): ); printf(Input a number(1): ); scanf(%d, &n); scanf(%d, &n); is_prime = 1; / is_prime = 1; /假设假设n n是素数是素数 k = sqrt(n); /k = sqrt(n); /计算计算n n的
29、平方根的平方根 for(i=2; i=k; i+)for(i=2; i1): 171): 17 17 is prime number17 is prime number2. continue2. continue语句语句 有时并不希望终止整个循环的执行,而只是有时并不希望终止整个循环的执行,而只是提前结束本次循提前结束本次循环环迭代,进入下一次循环迭代。这时可以使用迭代,进入下一次循环迭代。这时可以使用continuecontinue语句,语句,其使用方法如下:其使用方法如下:(1) (1) 一般形式:一般形式:continue;continue;(2) continue(2) continu
30、e语句只能用于语句只能用于whilewhile、do-whiledo-while和和forfor语句中。语句中。(3) continue(3) continue语句的作用是结束循环体的本次执行,即语句的作用是结束循环体的本次执行,即跳过循跳过循环体中环体中continuecontinue语句之后的其它语句语句之后的其它语句,转去判定循环条件转去判定循环条件,决,决定能否继续执行循环。定能否继续执行循环。 用于用于whilewhile和和do-whiledo-while语句中时,跳过循环体中语句中时,跳过循环体中continuecontinue语语句之后的其它语句后,直接判断循环条件是否成立;而
31、用于句之后的其它语句后,直接判断循环条件是否成立;而用于forfor语句中时,跳过循环体中语句中时,跳过循环体中continuecontinue语句之后的其它语句后,先语句之后的其它语句后,先执行表达式执行表达式3 3,然后再去判断循环条件是否成立。,然后再去判断循环条件是否成立。forfor循环结构中的循环结构中的continuecontinue结构结构表达式2表达式1语句1表达式3零零非零非零continue语句2是是否否共 46 页 第 2525 页例例5-75-7:统计在:统计在100100到到10001000之间不能被之间不能被7 7整除的整数的个数。整除的整数的个数。思路分析:解决
32、该问题需要对指定范围中的每一个整数进行检思路分析:解决该问题需要对指定范围中的每一个整数进行检查,如果不能被查,如果不能被7 7整除,就进行计数加整除,就进行计数加1 1;若能被;若能被7 7整除,则不加整除,则不加1 1。 #include #include int main() int main() int i, count; int i, count; count = 0; / count = 0; /计数初始为计数初始为0 0 for(i=100; i=1000; i+) for(i=100; i=1000; i+) if(i%7 = 0) if(i%7 = 0) continue;
33、/ continue; /如果整除如果整除7 7,跳过计数语句,继续检查下,跳过计数语句,继续检查下 / /一个数一个数 count = count+1; / count = count+1; /计数加计数加1 1 printf(count=%dn, count); printf(count=%dn, count); return 0; return 0; count=773count=7733. goto3. goto语句语句 gotogoto语句也称为无条件转移语句,其一般格式如下:语句也称为无条件转移语句,其一般格式如下: goto goto 语句标号语句标号; ;如:如: label:
34、 i+;label: i+;loop: while(x7)loop: while(x7) C C语言不限制程序中使用标号的次数,但各标号不得重名。语言不限制程序中使用标号的次数,但各标号不得重名。gotogoto语语句的语义是改变程序流向,转去执行语句标号所标识的语句。句的语义是改变程序流向,转去执行语句标号所标识的语句。 goto goto语句通常与条件语句配合使用,可用来实现条件转移、构成语句通常与条件语句配合使用,可用来实现条件转移、构成循环和跳出循环体等功能。循环和跳出循环体等功能。 但是,在结构化程序设计中但是,在结构化程序设计中一般不主张使用一般不主张使用gotogoto语句语句,
35、以免造成,以免造成程序流程的混乱,使理解和调试程序都产生困难。程序流程的混乱,使理解和调试程序都产生困难。5.9 5.9 5.9 5.9 循环结构程序综合举例循环结构程序综合举例循环结构程序综合举例循环结构程序综合举例分析:求前分析:求前n 项和,要循环项和,要循环n次,每次累加次,每次累加1项。除第项。除第1项外,项外,每次循环分母都递增每次循环分母都递增2,符号交替变化。符号交替变化。#include main() int i, n, t=1, flag=1; double sum=0, item; scanf(%d, &n); for(i=1; i=n; i+) item = flag
36、* 1.0 / t; /* 计算第计算第i项的值项的值 */ sum = sum + item; /* 累加第累加第i项的值项的值 */ flag = -flag; /*改变符号,为下次循环做准备改变符号,为下次循环做准备*/ t=t+2; /*分母递增分母递增2,为下次循环做准备,为下次循环做准备*/ printf(sum=%fn,sum); 例例例例5-95-95-95-9输入一个正数输入一个正数n,计算,计算1-1/3+1/5-1/7+的前的前n项之和。项之和。运行结果运行结果: 输入输入:5 sum=0.834921教材课后习题教材课后习题4 4、5 5、6 6 、 7 7课后习题课后习题本章结束本章结束