




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 厦门理工学院计算机科学与技术系厦门理工学院高级语言程序设计教学课件厦门理工学院高级语言程序设计教学课件 第第3 3章程序的控制结构章程序的控制结构循环结构(重复结构)循环结构(重复结构)厦门理工学院计算机科学与技术系厦门理工学院计算机科学与技术系2022-5-12022-5-1教师教师: : 施施 华华E-Mail: E-Mail: 厦门理工学院计算机科学与技术系2本章主要内容本章主要内容u3.1 3.1 算法算法u3.2 3.2 语句概述语句概述u3.3 3.3 顺序结构顺序结构u3.5 3.5 循环结构循环结构u3.6 3.6 综合例子综合例子u3.4 3.4 选择结构选择结构 厦门理工
2、学院计算机科学与技术系0 0 循环的必要性循环的必要性int result1,result2,result3;int result4,result5;result1 = 1 * 10;printf(1 10 %d n,result1);result2 = 2 * 10;printf(2 10 %d n,result2);result3 = 3 * 10;printf(3 10 %d n,result3);result4 = 4 * 10;printf(4 10 %d n,result4);result5 = 5 * 10;printf(5 10 %d n,result5); 1 10 102
3、10 203 10 304 10 405 10 50输出结果重复语句 厦门理工学院计算机科学与技术系0 0 循环的必要性循环的必要性1 10 = 102 10 = 203 10 = 304 10 = 405 10 = 500 + 11 + 12 + 1上个数字 + 1.重复 (上个数字 +1) 10 厦门理工学院计算机科学与技术系53.5 3.5 循环结构循环结构 循环结构循环结构又称又称重复结构重复结构,可用来完成重复性、规律,可用来完成重复性、规律性的操作。是结构化程序设计的基本结构之一,它和顺性的操作。是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单
4、序结构、选择结构共同作为各种复杂程序的基本构造单元。元。 循环结构的循环结构的特点特点是:在给定条件成立时,反复执行是:在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。语言主要提供条件,反复执行的程序段称为循环体。语言主要提供了了whilewhile、do-whiledo-while和和forfor三种循环语句,来组成各种不同三种循环语句,来组成各种不同形式的循环结构。形式的循环结构。 厦门理工学院计算机科学与技术系C C 语言中的各种循环语言中的各种循环需要多次重复执行一个或多个任务的
5、问题考虑使用 循环来解决 厦门理工学院计算机科学与技术系7 3.5.1 while 3.5.1 while语句语句whilewhile语句的一般形式为:语句的一般形式为: while (while (表达式表达式) ) 语句语句 其中表达式是循环条件,语句为循环体。其中表达式是循环条件,语句为循环体。 while while语句的语句的语义语义是:计算表达式的值,当值为真是:计算表达式的值,当值为真( (非非0)0)时,时,执行循环体语句。其执行过程如图执行循环体语句。其执行过程如图3-9(a)3-9(a)、(b)(b)所示。所示。 表表达达式式语语句句真真(非非0 )假假(0 )图图3 -
6、9 (a ) wh i l e 语语句句 厦门理工学院计算机科学与技术系#includevoid main () int num=1,result; while (num=10) result=num*10; printf(%d 10 %d n,num,result); num+; while while 循环示例循环示例内存内存numresult1null102输出:1 10 102 10 203 10 304 10 405 10 506 10 607 10 708 10 809 10 9010 10 10011100 厦门理工学院计算机科学与技术系 厦门理工学院计算机科学与技术系10例题例
7、题3-143-14例例3-14 3-14 用用whilewhile语句求语句求n!=1n!=1* *2 2* *3 3* * * *n n的值。的值。分析:这是一个累乘求积的问题,与累加求和类似。引入分析:这是一个累乘求积的问题,与累加求和类似。引入变量变量 facfac和和 i i 分别表示被乘数和乘数,积也用变量分别表示被乘数和乘数,积也用变量 fac fac 表表示,则求示,则求n!=1n!=1* *2 2* *3 3* * * *n n可以转化为对语句:可以转化为对语句: fac=facfac=fac* *i; i;的多次反复运行即可。令的多次反复运行即可。令facfac的初值为的初值
8、为1 1,并让,并让i i从从1 1变化到变化到n n,即可得到即可得到n!n!的值了。的值了。用传统流程图表示算法,如图用传统流程图表示算法,如图3-103-10所示:所示:开开 始始输输 入入 n 值值 i= 1 ,f a c = 1NYf a c = f a c * ii= i+ 1输输 出出 f a c 值值结结 束束图图 3 - 1 0 例例 3 - 1 4 算算 法法 描描 述述i = n#include #include main()main() int i=1, n; int i=1, n; / /* *定义定义i i和和n n变量,并为变量,并为i i赋初值赋初值* */ /
9、 long int fac=1; long int fac=1; printf( printf(“ “Please input n:Please input n:” ”) ; ) ; scanf( scanf(“ “%d%d” ”, &n); , &n); / /* *输入输入n n值值* */ / while(i=n) while(i=n) / /* *先判断后执行,循环先判断后执行,循环n n次。本行为循环控制部分次。本行为循环控制部分* */ / fac=fac fac=fac* *i; i; / /* *做累乘运算做累乘运算* */ / i+; i+; / /* *累乘
10、次数计数器加累乘次数计数器加1 1。本行为循。本行为循环条件的修改语句环条件的修改语句* */ / printf(printf(“ “%ldn%ldn” ”, fac); , fac); 运行情况如下:运行情况如下:Please input n:6Please input n:6720720思考:若把循环体思考:若把循环体中的两个语句中的两个语句: :第第1010和和11 11行对调,对结果行对调,对结果有什么影响?若要有什么影响?若要保持原结果不变,保持原结果不变,应把前面的程序段应把前面的程序段作何修改作何修改? ? 厦门理工学院计算机科学与技术系11说明:说明:(1 1)从上例中可以看出
11、,一个循环的基本组成应该有三大部分:从上例中可以看出,一个循环的基本组成应该有三大部分: 循环的初始化部分循环的初始化部分:建立循环首次执行所必需的条件,包括:建立循环首次执行所必需的条件,包括循环操作中的初值和控制循环的初值两部分。循环操作中的初值和控制循环的初值两部分。 循环控制部分:循环控制部分:其核心为一个条件判断。这个条件一般是关其核心为一个条件判断。这个条件一般是关系表达或逻辑表达式,只要表达式的值为真系表达或逻辑表达式,只要表达式的值为真( (非非0)0)即表示条件成立,即表示条件成立,可继续循环。可继续循环。 循环体部分:循环体部分:循环中要反复执行的操作,同时包括控制循环循环
12、中要反复执行的操作,同时包括控制循环条件的修改语句,以保证循环正常结束,避免出现死循环(若把第条件的修改语句,以保证循环正常结束,避免出现死循环(若把第1 10 0行行i+;i+;去掉,则出现死循环,此时只能按去掉,则出现死循环,此时只能按Ctrl+BreakCtrl+Break组合键终止程组合键终止程序运行)。序运行)。(2 2)注意到初始化部分中第注意到初始化部分中第5 5行:行:long int fac=1 long int fac=1 中的中的fac fac 的若定义为的若定义为整型整型intint,则可能出现数据溢出现象,因为整型,则可能出现数据溢出现象,因为整型intint的取值范
13、围为的取值范围为-327-32768683276732767。当然如果定义为。当然如果定义为long intlong int仍有可能出现数据溢出现象,仍有可能出现数据溢出现象,还可以定义其数据类型为还可以定义其数据类型为float,float,甚至为甚至为 doubledouble。另外,因为。另外,因为facfac充当充当累乘器,一般初始化为累乘器,一般初始化为1 1,而累加器,一般初始化为,而累加器,一般初始化为0 0。 厦门理工学院计算机科学与技术系12说明:说明: (3 3)whilewhile语句的特点是先判断表达式,后执行语句。语句的特点是先判断表达式,后执行语句。即先计算表达式的
14、值,当值为真即先计算表达式的值,当值为真( (非非0)0)时,执行循环体语时,执行循环体语句。因此如果表达式的值一开始就为句。因此如果表达式的值一开始就为“假假”,循环体一次,循环体一次也不执行。也不执行。 (4 4)循环体如果包括有一个以上的语句,则必须用循环体如果包括有一个以上的语句,则必须用 括起来,组成复合语句。括起来,组成复合语句。 请大家在请大家在 例例3-143-14的基础上完成下列各题:的基础上完成下列各题: (1 1)求)求1 1* *3 3* *5 5* *7 7* * * *(2n+1)(2n+1) (2 2)求)求1!+2!+3!+ 1!+2!+3!+ +n! +n!
15、(3 3)求)求1!+3!+5!+ 1!+3!+5!+ +(2n+1)! +(2n+1)! 厦门理工学院计算机科学与技术系13例题例题3-153-15 例例3-15 3-15 角度的余弦值可以利用下面的无穷级数计角度的余弦值可以利用下面的无穷级数计算出来:算出来: cos(x)1-x cos(x)1-x2 2/2!+x/2!+x4 4/4!-x/4!-x6 6/6!+x/6!+x8 8/8!-/8!- 编程序从键盘读取一个角度编程序从键盘读取一个角度x x(单位为弧度)计算(单位为弧度)计算cos(x)cos(x)的近似值,直到最后一项的绝对值小于的近似值,直到最后一项的绝对值小于10-510
16、-5为止。为止。 分析:通过观察,我们可把此级数看成是对若干分析:通过观察,我们可把此级数看成是对若干项的累加求和,其中每一项由符号、分子和分母组成。项的累加求和,其中每一项由符号、分子和分母组成。因此编程的基本思想是:不断求级数的部分和,直到因此编程的基本思想是:不断求级数的部分和,直到后面准备加进去的项的绝对值小于后面准备加进去的项的绝对值小于1e-51e-5为止,否则加为止,否则加进去后计算下一项。进去后计算下一项。#include #include / /* *包含使用数学库函数所对应的头文件包含使用数学库函数所对应的头文件* */ /#include #include main()m
17、ain() float a=1.0,b=1.0,x,term=1.0,s=0.0; float a=1.0,b=1.0,x,term=1.0,s=0.0; / /* *a a、b b、termterm分别代表分子、分母及某一项分别代表分子、分母及某一项* */ / int m=2,sign=1; int m=2,sign=1; / /* *signsign代表符号代表符号* */ / printf(Please input the value of x:); printf(Please input the value of x:); scanf(%f,&x); scanf(%f,&am
18、p;x); / /* *角度角度x x的单位为弧度的单位为弧度* */ / while(fabs(term)=1e-5) while(fabs(term)=1e-5) s=s+term; s=s+term; sign=-sign; sign=-sign; a=a a=a* *x x* *x;x; b=b b=b* *mm* *(m-1);(m-1); term=sign term=sign* *a/b;a/b; m=m+2; m=m+2; printf(cos(%f)=%fn,x,s); printf(cos(%f)=%fn,x,s); 运行结果如下:运行结果如下:Please input t
19、he value of x:0Please input the value of x:0cos(0.000000)=1.000000cos(0.000000)=1.000000Please input the value of x:3.141593Please input the value of x:3.141593cos(3.141593)=-1.000004cos(3.141593)=-1.000004Please input the value of x:1.570796Please input the value of x:1.570796cos(1.570796)=-0.00000
20、0cos(1.570796)=-0.000000 思考:思考:(1)(1)分母分母b b是否可以定义为是否可以定义为intint类型?(类型?(2 2)循环中语句)循环中语句s=s+term;s=s+term;能否移到语句能否移到语句 term=signterm=sign* *a/b;a/b;的后面。的后面。说明:本例的上述解法具有一般性,即适用于类似的级数求和问题。说明:本例的上述解法具有一般性,即适用于类似的级数求和问题。但本例比较特殊:后一项与前一项的比为一个与项数但本例比较特殊:后一项与前一项的比为一个与项数i i有关的数据有关的数据 (-1)(-1)* *x x* *x/(2x/(2
21、* *i-1)/(2i-1)/(2* *i) i),这样在求出前一项的基础上可以很容易地推导出后,这样在求出前一项的基础上可以很容易地推导出后一项。本例的第二种解法代码如下:一项。本例的第二种解法代码如下:#include #include #include #include main()main() float s=0.0, term=1.0, x; float s=0.0, term=1.0, x; int i=1; int i=1; printf(Please input the value of x:); printf(Please input the value of x:); sc
22、anf(%f, &x); scanf(%f, &x); while(fabs(term)=1e-5) while(fabs(term)=1e-5) s+=term; s+=term; term=term term=term* *(-1)(-1)* *x x* *x/(2x/(2* *i-1)/(2i-1)/(2* *i);i); i+; i+; printf(cos(%f)=%fn, x, s); printf(cos(%f)=%fn, x, s); 厦门理工学院计算机科学与技术系14例题例题3-163-16 例例3-16 3-16 将从键盘输入的一串字符(用将从键盘输入的一串
23、字符(用# #结束输入)按结束输入)按如下规则进行转换:如下规则进行转换: (1 1)如果输入的字符为大写字母,则先转换为对应)如果输入的字符为大写字母,则先转换为对应的小写字母。的小写字母。 (2 2)将)将a a转换为转换为c c、b b转换为转换为d d、x x转换为转换为z z、y y转换转换为为a a、z z转换为转换为b b。 (3 3)其他字符不转换。)其他字符不转换。 分析:用语句分析:用语句“if( ch=if( ch= A A & ch=& ch= a a & ch=& ch= z z ) ch=ch+2;) ch=ch+2;” ”可将大写字
24、母转换为其后可将大写字母转换为其后第第2 2个字母;对字母个字母;对字母y y和和z z通过通过“ch=ch+2;ch=ch+2;” ”后,其后,其ASCIIASCII码码已超出小写字母的取值范围,因此必须在此基础上再减已超出小写字母的取值范围,因此必须在此基础上再减去去2626才能得到才能得到a a和和b b 。源程序如下:源程序如下:#include #include main( )/ /abc12345ABc#main( )/ /abc12345ABc# char ch; char ch; printf(Input data:); printf(Input data:); ch=getc
25、har();ch=getchar(); while(ch!=#) while(ch!=#) if (ch=A & ch=A & ch=a & ch=a & chz) ch=ch-26; if (chz) ch=ch-26; / /* *处理对处理对y y 和和z z 加后超范围的情况加后超范围的情况* */ / putchar(ch);putchar(ch); ch=getchar(); ch=getchar(); 运行结果如下:运行结果如下:Input data:UfYrq 2 yLb 3?#Input data:UfYrq 2 yLb 3?#whats 2
26、and 3?whats 2 and 3?说明:说明:(1 1)程序中的第)程序中的第6 6、7 7、1616行可以行可以用用while(ch=getchar( )!=while(ch=getchar( )!= # # ) )来来代替放在原来第代替放在原来第6 6行的位置,其行的位置,其他保持不变。注意上面式子中他保持不变。注意上面式子中chch=getchar( )=getchar( )必须在两边加上圆括必须在两边加上圆括号。号。(2 2)本例属于解密码的问题,)本例属于解密码的问题,即将原来的字符串按照一定的规即将原来的字符串按照一定的规则转换后能够阅读。则转换后能够阅读。 厦门理工学院计算
27、机科学与技术系 (1) (1) 如果如果whilewhile后的表达式的值一开始就为假,循环体后的表达式的值一开始就为假,循环体将一次也不执行。将一次也不执行。 (2) (2) 循环体中的语句可为任意类型的循环体中的语句可为任意类型的C C语句。语句。 (3) (3) 遇到下列情况,退出遇到下列情况,退出whilewhile循环:循环: 表达式为假(为表达式为假(为0 0)。)。 循环体内遇到循环体内遇到breakbreak、returnreturn语句。语句。 厦门理工学院计算机科学与技术系 厦门理工学院计算机科学与技术系173.5.2 do-while3.5.2 do-while语句语句
28、do-while do-while语句的一般形式为语句的一般形式为: : do do 循环体语句循环体语句 while( while(表达式表达式); ); 这个循环与这个循环与whilewhile循环的不同循环的不同在于在于: :它先执行循环中的语句它先执行循环中的语句, ,然后然后再判断表达式是否为真再判断表达式是否为真, , 如果为真如果为真则继续循环;如果为假则继续循环;如果为假, , 则终止循则终止循环。环。因此因此, do-while, do-while循环至少要执循环至少要执行一次循环语句。其执行过程可用行一次循环语句。其执行过程可用图图3-113-11(a a)、)、(b)(b
29、)表示。表示。语语 句句真真 ( 非非 0 )假假 ( 0 )图图 3 -1 1 ( a )d o -w h ile 语语 句句表表 达达 式式 厦门理工学院计算机科学与技术系 厦门理工学院计算机科学与技术系19例题例题3-17 3-17 do-whiledo-while语句求语句求n!=1n!=1* *2 2* *3 3* * * *n n的值。的值。用传统流程图表示算法,见图用传统流程图表示算法,见图3-123-12。源程序如下:源程序如下:#include #include main()main() int i=1,n; int i=1,n; / /* *定义定义i i和和n n变量,并
30、为变量,并为i i赋初值赋初值1 1* */ / long int fac=1; long int fac=1; / /* *因阶乘值取值范围较大,故因阶乘值取值范围较大,故facfac定定义为长整型,并赋初值义为长整型,并赋初值1 1 * */ / printf(Please input n:); printf(Please input n:); scanf(%d, &n); scanf(%d, &n); / /* *输入输入n n值值* */ / do do fac=fac fac=fac* *i; i; / /* *做累乘运算做累乘运算* */ / i+; i+; / /
31、* *累乘次数计数器加累乘次数计数器加1 1 * */ / while(i=n); while(i=n); / /* *先判断后执行,循环先判断后执行,循环n n次次* */ / printf(%ldn, fac); printf(%ldn, fac);开开 始始输输 入入 n 值值 i= 1 ,fa c = 1NYfa c = fa c * ii= i+ 1输输 出出 fa c 值值结结 束束图图 3 -1 2 例例 3 -1 7 算算 法法 描描 述述i = n 厦门理工学院计算机科学与技术系20说明:说明: (1 1)whilewhile后的分号后的分号“;”不能少。不能少。 (2 2)
32、当循环体只有一个语句时,花括当循环体只有一个语句时,花括号号“ ” ”可以省略,但为了避免与可以省略,但为了避免与whilewhile语语句混淆,建议保留。句混淆,建议保留。 (3 3)上述问题既可以用上述问题既可以用whilewhile语句处理,语句处理,也可以用也可以用do-whiledo-while语句处理。并且在两种语句处理。并且在两种语句中其组成循环结构的三个部分相同,语句中其组成循环结构的三个部分相同,得到的结果也相同,可以认为对上述问题得到的结果也相同,可以认为对上述问题whilewhile语句与语句与do-whiledo-while语句是完全等价的。语句是完全等价的。其实其实d
33、o-whiledo-while结构是由一个语句加一个结构是由一个语句加一个whiwhile le结构构成的。见流程图结构构成的。见流程图3-133-13,其中虚线框,其中虚线框部分就是一个部分就是一个whilewhile结构。结构。表表达达式式语语句句真真(非非0)假假(0)图图 3-13 do-while结结构构语语句句 这是不是意味着在任何情况下两者都是等价的?这是不是意味着在任何情况下两者都是等价的?除了下除了下列这种特殊情况之外的其他情况是等价的,即当两种语句在列这种特殊情况之外的其他情况是等价的,即当两种语句在第一次进入循环时条件就不满足的特殊情况下是不等价的。第一次进入循环时条件就
34、不满足的特殊情况下是不等价的。如下列两个程序段是不等价的:如下列两个程序段是不等价的:程序段程序段1:k=11;while(k=10) printf(“k=%d”, k);程序段程序段2:k=11;do printf(“k=%d”, k);while(k=10); 厦门理工学院计算机科学与技术系比较比较 while while 和和 do-whiledo-while循环循环while(循环条件) 循环体;do 循环体; while( 循环条件);do-while 循环是先执行循环是先执行后判断,所以,即使开后判断,所以,即使开始条件为假,循环体也始条件为假,循环体也至少会被执行一次。至少会被执
35、行一次。while循环是先判断循环是先判断后执行,所以,如果后执行,所以,如果条件为假,则循环体条件为假,则循环体一次也不会被执行。一次也不会被执行。q 比较 while 和 do-while 循环的工作原理 厦门理工学院计算机科学与技术系22例题例题3-183-18 例例3-18 3-18 不断输入三角形的三边长,求三角形面不断输入三角形的三边长,求三角形面积积, ,直到用户按直到用户按Y Y 或或y y 键程序结束。键程序结束。 分析:本例中要不断输入多组线段进行处理,这分析:本例中要不断输入多组线段进行处理,这是一个重复操作问题,可考虑使用循环结构。并且可是一个重复操作问题,可考虑使用循
36、环结构。并且可以先让用户输入第一组数据进行处理,然后再由用户以先让用户输入第一组数据进行处理,然后再由用户来决定是否要继续输入下一组数据,因此本题采用来决定是否要继续输入下一组数据,因此本题采用do-do-whilewhile语句来编程。语句来编程。源程序如下:源程序如下:#include #include #include #include #include #include #include #include main( )main( ) double a, b, c, s, area; double a, b, c, s, area; do do printf(Please input
37、a,b,c:); printf(Please input a,b,c:); scanf(%f, %f, %f, &a, &b, &c); scanf(%f, %f, %f, &a, &b, &c); if(a+bc & a+cb & b+ca) if(a+bc & a+cb & b+ca) s=1.0/2 s=1.0/2* *(a+b+c);(a+b+c); area=sqrt(s area=sqrt(s* *(s-a)(s-a)* *(s-b)(s-b)* *(s-c);(s-c); printf(area=%7
38、.2fn, area); printf(area=%7.2fn, area); else printf(it is not a trilateraln else printf(it is not a trilateraln” ”); ); printf( printf(按按Y Y 或或y y 键退出键退出, ,按其它键继续按其它键继续n);n); while(toupper(getch( )!=Y); while(toupper(getch( )!=Y); 运行结果如下:运行结果如下:Please input a,b,c:3,4,5Please input a,b,c:3,4,5area= 6
39、.00area= 6.00按按Y Y 或或y y 键退出键退出, ,按其它键继按其它键继续续 (设按(设按n n 键键, ,继续下列操作)继续下列操作)Please input a,b,c:1,2,3Please input a,b,c:1,2,3it is not a trilateralit is not a trilateral按按Y Y 或或y y 键退出键退出, ,按其它键继按其它键继续续 (设按(设按y y 键,则退出程序)键,则退出程序)思考:思考:while(toupper(getch( )!=while(toupper(getch( )!=Y);Y);中的中的getch( )
40、 getch( ) 若改为若改为getchar( ),getchar( ),运行结果如何运行结果如何? ? 为什么?为什么? 说明:说明: (1 1)toupper(getch( ) toupper(getch( ) 函数调用的作用是将函数调用的作用是将getch( ) getch( ) 函数函数从键盘上获得的字符转化为大写字母。从键盘上获得的字符转化为大写字母。 它的等价为:它的等价为:getch( )!=Y& getch( )!= ygetch( )!=Y& getch( )!= y 。 (2 2)getch( )getch( )、getche( )getche( )和和g
41、etchar( )getchar( )三者虽然都需从键盘三者虽然都需从键盘输入字符,但是输入方式有所不同。输入字符,但是输入方式有所不同。 在在getchar( )getchar( )的原始形式中,输入字符先被放到缓冲队列中,的原始形式中,输入字符先被放到缓冲队列中,直到键入回车键时才返回。直到键入回车键时才返回。 getche( ) getche( ) 函数和函数和getch( )getch( )函数的共同点是每次按键后字符函数的共同点是每次按键后字符被立即送往程序并立即输出相应的结果,不再需要行缓冲。被立即送往程序并立即输出相应的结果,不再需要行缓冲。不同的是在接收字符时,不同的是在接收字
42、符时,getch( )getch( )函数在屏幕上不回显键入的函数在屏幕上不回显键入的字符,而字符,而getche( ) getche( ) 函数向屏幕回显键入的字符。函数向屏幕回显键入的字符。 在交互式程序中,当需要从键盘输入字符时,常用在交互式程序中,当需要从键盘输入字符时,常用getch( ) getch( ) 或或getche( )getche( )来代替来代替getchar( )getchar( )进行字符输入。进行字符输入。 厦门理工学院计算机科学与技术系23 3.5.3 for 3.5.3 for语句语句 在在C C语言中,还提供了更为灵活、更为常用的语言中,还提供了更为灵活、更
43、为常用的forfor语句,不仅可以用于循环次数已经确定的情况,语句,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以取代条件的情况,它完全可以取代 while while 语句。它的语句。它的一般形式为一般形式为: : for for(表达式(表达式1 1;表达式;表达式2 2;表达式;表达式3 3) 语句语句 它的执行过程如下:它的执行过程如下: 先求解表达式先求解表达式1 1。 求解表达式求解表达式2 2,若其值为真(非,若其值为真(非0 0),则执行),则执行fofor r语句中指定的内嵌语句,
44、然后执行第步;若语句中指定的内嵌语句,然后执行第步;若其值为假(其值为假(0 0),则结束循环,执行),则结束循环,执行forfor语句下面语句下面的一个语句。的一个语句。 解表达式解表达式3,3,转回上面第步继续执行。转回上面第步继续执行。 其执行过程可用图其执行过程可用图3-143-14表示。表示。语语句句真真假假图图3-14 for语语句句执执行行过过程程求求解解表表达达式式1表表达达式式2求求解解表表达达式式3for语语句句的的下下一一个个语语句句 从从forfor语句的执行过程可以看出,语句的执行过程可以看出,forfor语句与语句与whilewhile语句是完全等价的,对于语句是完
45、全等价的,对于forfor循环中语句的一般形式,循环中语句的一般形式,就是如下的就是如下的whilewhile循环形式:循环形式: 表达式表达式1 1; whilewhile(表达式(表达式2 2) 语句;语句; 表达式表达式3 3; for for语句最简单的应用形式也是最容易理解的形语句最简单的应用形式也是最容易理解的形式如下:式如下: for for(循环变量赋初值;循环条件;循环变量增值)(循环变量赋初值;循环条件;循环变量增值) 语句语句 #include #include main()main() int i=1, n; int i=1, n; / /* *定义定义i i和和n n
46、变量,并为变量,并为i i赋初值赋初值* */ / long int fac=1; long int fac=1; printf( printf(“ “Please input n:Please input n:” ”) ; ) ; scanf( scanf(“ “%d%d” ”, &n); , &n); / /* *输入输入n n值值* */ / while(i=n) while(i=n) / /* *先判断后执行,循环先判断后执行,循环n n次。本行为循环控制部分次。本行为循环控制部分* */ / fac=fac fac=fac* *i; i; / /* *做累乘运算做累乘
47、运算* */ / i+; i+; / /* *累乘次数计数器加累乘次数计数器加1 1。本行为循。本行为循环条件的修改语句环条件的修改语句* */ / printf(printf(“ “%ldn%ldn” ”, fac); , fac); 厦门理工学院计算机科学与技术系24例题例题3-193-19用用forfor语句求语句求n!=1n!=1* *2 2* *3 3* * * *n n的值的值#include #include main( )main( ) int i, n; int i, n; / /* *定义定义i i和和n n变量变量* */ / long int fac=1; long i
48、nt fac=1; printf( printf(“ “Please input n:Please input n:” ”) ) scanf( scanf(“ “%d%d” ”, &n); , &n); / /* *输入输入n n值值* */ / for(i=1; i=n; i+) for(i=1; i=n; i+) / /* *先判断后执行,循环先判断后执行,循环n n次次* */ / fac=fac fac=fac* *i; i; / /* *做累乘运算做累乘运算* */ / printf(%ldn, fac); printf(%ldn, fac); / /* *以长整型格
49、式输出以长整型格式输出n n的阶乘值的阶乘值* */ / 厦门理工学院计算机科学与技术系25forfor语句的使用说明语句的使用说明(1 1)在)在forfor语句中任何表达式都可以缺省语句中任何表达式都可以缺省, ,但分号但分号“;”不能不能缺省。缺省部分的功能,可以由其他的语句来完成。缺省。缺省部分的功能,可以由其他的语句来完成。 用前面例子的用前面例子的forfor语句:语句: for(fac=1,i=1 for(fac=1,i=1;i=ni=n;i+) fac=faci+) fac=fac* *i i; 为例,说明如下几种等价的缺省形式;为例,说明如下几种等价的缺省形式; 省略了初始化
50、表达式省略了初始化表达式, ,表示在表示在forfor语句中不对循环控语句中不对循环控制变量赋初值。可改写为:制变量赋初值。可改写为: fac=1 fac=1;i=1i=1; for( for(;i=ni=n;i+) fac=faci+) fac=fac* *i i; (2 2)表达式)表达式1 1和表达式和表达式3 3既可以是一个简单表达式也可以既可以是一个简单表达式也可以是逗号表达式。是逗号表达式。for(i=0,j=100for(i=0,j=100;i=100i=100;i+,j-) k=i+ji+,j-) k=i+j; (3 3)表达式)表达式2 2一般是关系表达式或逻辑表达式,但也可
51、一般是关系表达式或逻辑表达式,但也可以是数值表达式或以是数值表达式或 字符表达式,只要其值非零,就执行循环体。字符表达式,只要其值非零,就执行循环体。 例如:例如:for(i=0for(i=0;(c=getchar( )!=(c=getchar( )!= nn ;i+=c)i+=c); 又如:又如:for(for(;(c=getchar( )!=(c=getchar( )!= nn ;) )printf(printf(“ “%c%c” ”,c),c); (4 4)循环体语句可以为空语句,此时也称为空循环。如把)循环体语句可以为空语句,此时也称为空循环。如把上面第(上面第(1 1)点中的)点中的
52、forfor语句改为:语句改为: for(fac=1,i=1 for(fac=1,i=1;i=ni=n;fac=facfac=fac* *i i,i+)i+); 空循环还常用来产生延时,以达到某种特定要求。空循环还常用来产生延时,以达到某种特定要求。如:如:for (t=0;ttime;t+); for (t=0;tn) break if (in) break; / /* *用用breakbreak来强迫退出循环来强迫退出循环* */ / fac=fac fac=fac* *i i; 省略了变量增值表达式,则不对循环控制变量进行操作。省略了变量增值表达式,则不对循环控制变量进行操作。可改写为:
53、可改写为: for(fac=1,i=1 for(fac=1,i=1;i=n i=3) Fn=Fn-1+Fn-2 (n=3) 法一法一:根据斐波纳契数列的规律,可以画出如图:根据斐波纳契数列的规律,可以画出如图3-153-15的求解的求解过程:过程: 这是一种递推算法,应采用循环实现。设变量这是一种递推算法,应采用循环实现。设变量f1 f1、f2f2和和f f,并为,并为f1 f1和和f2f2赋初值赋初值1 1,令,令f=f1+f2f=f1+f2得到第得到第3 3项;将项;将f1f2f1f2, f2ff2f,再求,再求f=f1f=f1+f2+f2得到第得到第4 4项;依此类推求第项;依此类推求第
54、5 5项、第项、第6 6项项,程序流程图如图,程序流程图如图3-3-1616所示。所示。#include #include #include #include main()main() long int f,f1,f2;long int f,f1,f2;int i;int i;clrscr( ); clrscr( ); / /* *清屏函数清屏函数* */ /f1=f2=1;f1=f2=1;printf(%12ld%12ld, f1, f2);printf(%12ld%12ld, f1, f2);for (i=3; i=40; i+)for (i=3; i=40; i+) f=f1+f2; f
55、=f1+f2; f1=f2; f1=f2; f2=f; f2=f; printf(%12ld, f); printf(%12ld, f); if (i%4=0) printf(n) if (i%4=0) printf(n) / /* *控制一行输出控制一行输出4 4个数个数* */ / 厦门理工学院计算机科学与技术系27方法二:方法二:法二:根据斐波纳契数列的规律,还可以画出如图法二:根据斐波纳契数列的规律,还可以画出如图3-173-17的求解过程:的求解过程:源程序如下:源程序如下:#include #include main()main() long int f1, f2; long in
56、t f1, f2; int i; int i; clrscr( ); clrscr( ); f1=f2=1; f1=f2=1; for(i=1; i=20; i+) for(i=1; i=20; i+) / /* * 每循环一次输出每循环一次输出2 2个数,共需循环个数,共需循环2020次次* */ / printf(%12ld %12ld , f1, f2); printf(%12ld %12ld , f1, f2); if (i%2=0) printf(n); if (i%2=0) printf(n); f1=f1+f2; f1=f1+f2; f2=f2+f1; f2=f2+f1; 运行结
57、果为运行结果为: : 1 1 2 3 1 1 2 3 5 8 13 21 5 8 13 21 34 55 89 144 34 55 89 144 233 377 610 987 233 377 610 987 1597 2584 4181 6765 1597 2584 4181 6765 10946 17711 28657 46368 10946 17711 28657 46368 75025 121393 196418 317811 75025 121393 196418 317811 514229 832040 1346269 2178309 514229 832040 1346269 2
58、178309 3524578 5702887 9227465 14930352 3524578 5702887 9227465 14930352 24157817 39088169 63245986 10233415 24157817 39088169 63245986 102334155 5 厦门理工学院计算机科学与技术系 forfor语句注意事项:语句注意事项: (1) (1) 表达式表达式1 1、表达式、表达式2 2、和表达式、和表达式3 3可以是任何类型可以是任何类型的表达式。比方说,这三个表达式都可以是逗号表达式,的表达式。比方说,这三个表达式都可以是逗号表达式,即每个表达式都可由多
59、个表达式组成。即每个表达式都可由多个表达式组成。 厦门理工学院计算机科学与技术系 (2) (2) 表达式表达式1 1、表达式、表达式2 2、和表达式、和表达式3 3都是任都是任选项,可以省掉其中的一个、两个或全部,但选项,可以省掉其中的一个、两个或全部,但其用于间隔的分号是一个也不能省的。其用于间隔的分号是一个也不能省的。 厦门理工学院计算机科学与技术系 (3) (3) 表达式表达式2 2如果为空则相当于表达式如果为空则相当于表达式2 2的值是真的值是真 。 (4) (4) 循环体中的语句可为任意类型的循环体中的语句可为任意类型的C C语句。语句。 (5) for(5) for语句也可以组成多
60、重循环,而且也可以和语句也可以组成多重循环,而且也可以和whilewhile语句和语句和do-whiledo-while语句相互嵌套。语句相互嵌套。 (6) (6) 循环体可以是空语句。循环体可以是空语句。例:计算用户输入的字符数(当输入是回车例:计算用户输入的字符数(当输入是回车符时统计结束符时统计结束) )。 表示循环体为空语表示循环体为空语句,并非表示句,并非表示forfor语语句结束句结束 厦门理工学院计算机科学与技术系31 3.5.4 3.5.4 循环的嵌套循环的嵌套 一个循环体内又包含另一个完整的循环结构,称为循一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套。环的嵌套。内嵌的循环中还可以嵌套。三种循环(三种循环(whi1ewhi1e循环、循环、do-whi1edo-whi1e循环和循环和forfor循环)可以互相嵌套。循环)可以互相嵌套。利用循利用循环的嵌套可以来解决相对比较
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度财务部合同管理流程优化与再造合同
- 二零二五年度公司管理人员股权激励与聘用合同
- 二零二五年度学校食堂劳务承包与智能点餐系统合同
- 二零二五年度消防演练策划与实施服务合同
- 二零二五年度商业办公空间续租服务协议
- 二零二五年度银行与个人投资者定期存款管理协议
- 2025年度琴行音乐教育品牌合作及资源共享转让协议
- 二零二五年度股权投资公司股权转让与投资管理协议
- 痛风病中医调理的市场前景与商机分析
- 社交媒体运营的创意与执行力
- 初中数学新课程标准(2024年版)
- GB/T 19342-2024手动牙刷一般要求和检测方法
- 2024年山东铁投集团招聘笔试参考题库含答案解析
- 8款-组织架构图(可编辑)
- 中国邮政银行“一点一策”方案介绍PPT课件
- 国内外创造性思维培养模式的对比研究综述
- 2022年露天煤矿安全资格证考试题库-上(单选、多选题库)
- 计价格(2002)10号文
- 青果巷历史街区改造案例分析
- 桩身强度自动验算表格Excel
- 《钢铁是怎样炼成的》读书报告
评论
0/150
提交评论