选择结构与循环结构程序设计.ppt

上传人:博****1 文档编号:570027984 上传时间:2024-08-01 格式:PPT 页数:91 大小:779KB
返回 下载 相关 举报
选择结构与循环结构程序设计.ppt_第1页
第1页 / 共91页
选择结构与循环结构程序设计.ppt_第2页
第2页 / 共91页
选择结构与循环结构程序设计.ppt_第3页
第3页 / 共91页
选择结构与循环结构程序设计.ppt_第4页
第4页 / 共91页
选择结构与循环结构程序设计.ppt_第5页
第5页 / 共91页
点击查看更多>>
资源描述

《选择结构与循环结构程序设计.ppt》由会员分享,可在线阅读,更多相关《选择结构与循环结构程序设计.ppt(91页珍藏版)》请在金锄头文库上搜索。

1、C程序源程序文件1源程序文件2 源程序文件n预处理命令函数n函数1数据声明函数首部函数体数据声明执行语句C程序的结构:程序的结构:掌握掌握C程序的编写必须掌握结构和语句程序的编写必须掌握结构和语句要设计选择结构与循环结构程序,要考要设计选择结构与循环结构程序,要考虑两个方面的问题:一是在虑两个方面的问题:一是在C语言中如何语言中如何来表示条件,二是在来表示条件,二是在C语言中实现选择结语言中实现选择结构用什么语句。构用什么语句。在在C语言中表示条件,一般用关系表达语言中表示条件,一般用关系表达式或逻辑表达式,实现选择结构用式或逻辑表达式,实现选择结构用if语句或语句或switch语句。语句。循

2、环结构有循环结构有for语句、语句、while语句、语句、dowhile语句以及他们的嵌套应用语句以及他们的嵌套应用;一个一个c c程序可以有若干个源程序文件组成程序可以有若干个源程序文件组成一个源文件可以有若干个函数和预处理命令以及全一个源文件可以有若干个函数和预处理命令以及全局变量声明部分组成局变量声明部分组成一个函数有函数首部和函数体组成一个函数有函数首部和函数体组成函数体由数据声明和执行语句组成函数体由数据声明和执行语句组成C C语句分为语句分为5类类控制语句控制语句函数调用语句函数调用语句表达式语句表达式语句空语句空语句复合语句复合语句4.1 概述4.1.1 C语句概述语句概述(1)

3、if( )else (条件语句条件语句)(2)for( ) (循环语句循环语句)(3)while( ) (循环语句循环语句)(4)dowhile( ) (循环语句循环语句)(5)continue (结束本次循环语句结束本次循环语句)(6)break (中止执行中止执行switch或循环语句或循环语句)(7)switch (多分支选择语句多分支选择语句)(8)goto (转向语句转向语句)(9)return (从函数返回语句从函数返回语句) 上面上面9种语句表示形式中的括号种语句表示形式中的括号“( )”表示括号中是一个表示括号中是一个“判断条件判断条件”,“”表示内嵌的语句。例如:表示内嵌的语

4、句。例如:“dowhile( )”的具体语句可以写成:的具体语句可以写成:do y=x;While(xmax,则使,则使max=x。3输出输出max。 “模块化设计模块化设计”就是将比较复杂的任务,分解成若干个子任就是将比较复杂的任务,分解成若干个子任务,每个子任务又分解成若干个小子任务,每个小子任务只完务,每个子任务又分解成若干个小子任务,每个小子任务只完成一项简单的功能。在程序设计时,用一个个小模块来实现这成一项简单的功能。在程序设计时,用一个个小模块来实现这些功能,每个小模块对应一个相对独立的子程序。对程序设计些功能,每个小模块对应一个相对独立的子程序。对程序设计人员来说,编写程序就变得

5、不再困难。同时,同一软件也可以人员来说,编写程序就变得不再困难。同时,同一软件也可以由一组人员同时编写,分别进行调试。这就大大提高了程序开由一组人员同时编写,分别进行调试。这就大大提高了程序开发的效益。发的效益。 “结构化编码结构化编码”指的是使用支持结构化方法的高级语言编写指的是使用支持结构化方法的高级语言编写程序。程序。C语言就是一种支持结构化程序设计的高级语言,它直语言就是一种支持结构化程序设计的高级语言,它直接提供了顺序程序、选择程序和循环程序三种基本结构的语句;接提供了顺序程序、选择程序和循环程序三种基本结构的语句;提供了定义提供了定义“函数函数”的功能,函数相当于独立的子程序。另外

6、,的功能,函数相当于独立的子程序。另外,还提供了丰富的数据类型。这些都为结构化程序设计提供了强还提供了丰富的数据类型。这些都为结构化程序设计提供了强有力的工具。有力的工具。 1、If语句的三种基本形式(1)if (表达式) 语句例: if(xy) printf(“%d”,x);表达式表达式语句语句真(非真(非0)假假(0)4.2 选择结构程序设计4.2.1 if语句语句(2)if(表达式) 语句1 else 语句2例: if (xy) printf(“%d”,x); else printf(“%d”,y); 条件条件 语句句1 语句句2YN(3)if3)if(表达式(表达式1 1)语句)语句1

7、 1 else if( else if(表达式表达式2)2)语句语句2 2 else if( else if(表达式表达式3)3)语句语句3 3 else if( else if(表达式表达式m)m)语句语句m m else else 语句语句n n例如:例如:if (number500) pro=0.15;else if (number300) pro=0.10;else if (number100) pro=0.075;else if (number50) pro=0.05;else pro=0; 对对If语句具体说明:语句具体说明:(1)三种形式的)三种形式的if语句中,在语句中,在if

8、后面都有后面都有“表达式表达式”,一,一般为逻辑表达式或关系表达式。例如:般为逻辑表达式或关系表达式。例如: if(a=b&x=y)printf(“a=b,x=y”);(2)第二、第三种形式的)第二、第三种形式的if语句中,在每个语句中,在每个else前面有一分前面有一分号,整个语句结束处有一分号。例如:号,整个语句结束处有一分号。例如:if(x0) printf(“%f”,x);else printf(“%f”,-x); 这是由于分号是这是由于分号是C语句中不可缺少的部分,这个分号是语句中不可缺少的部分,这个分号是if语句中的内嵌语句所要求的。如果无此分号,则出现语法错语句中的内嵌语句所要求

9、的。如果无此分号,则出现语法错误。但应注意,不要误认为上面是两个语句(误。但应注意,不要误认为上面是两个语句(if语句和语句和else语句),它们都属于同一个语句),它们都属于同一个if语句。语句。else子句不能作为语句子句不能作为语句单独使用,它必须是单独使用,它必须是if语句的一部分,与语句的一部分,与if配对使用。配对使用。(3)在)在if和和else后面可以只含一个内嵌的操作语句(如上后面可以只含一个内嵌的操作语句(如上例),也可以有多个操作语句,此时用花括号例),也可以有多个操作语句,此时用花括号“”将几将几个语句括起来成为一个复合语句。如:个语句括起来成为一个复合语句。如:if(

10、ab)t=a;a=b;b=t;else printf (“%d”,a);注意:在第二行的花括号注意:在第二行的花括号“”外面不需要再加分号。因外面不需要再加分号。因为为内是一个完整的复合语句,不需另附加分号。内是一个完整的复合语句,不需另附加分号。if语句的语句的3种形式的举例(书上自己上机练习)种形式的举例(书上自己上机练习)例例1 1 输入两个实数,按数值由小到大的顺序输出这两个数。输入两个实数,按数值由小到大的顺序输出这两个数。#include#include void main()void main()float float a,b,ta,b,t; ;scanf(scanf(“%f,%

11、f%f,%f”,&a,&b,&a,&b););if(aif(ab)b)t=a;t=a;a=b;a=b;b=t;b=t;printf(printf(“%5.2f,%5.2fn%5.2f,%5.2fn”,a,b);,a,b); ynabT=aA=bB=t例例 输入三个数输入三个数a,b,ca,b,c, ,要求按由小到大的顺序输出。要求按由小到大的顺序输出。If ab 将a和b对换If ac 将a和c对换If bc 将b和c对换abacbca和b交换a和c交换c和b交换yyynn #include #include void main ( ) void main ( ) float a,b,c,t;

12、float a,b,c,t; scanf(“%f,%f,%f”,&a,&b,&c); scanf(“%f,%f,%f”,&a,&b,&c); if(ab)if(ab) t=a;a=b;b=t; t=a;a=b;b=t; if(ac) if(ac) t=a;a=c;c=t; t=a;a=c;c=t;if(bif(bc)c) t=b;b=c;c=t; t=b;b=c;c=t; printf(%5.2f,%5.2f,%5.2fn,a,b,c); printf(%5.2f,%5.2f,%5.2fn,a,b,c); 程序清单如下:程序清单如下: if语句的嵌套在if语句中又包含一个或多个if语句称为if

13、语句的嵌套。形式:If()if() 语句1else 语句2Elseif() 语句3else 语句4内嵌内嵌ifif匹配规则:匹配规则:Else总是与它上面的,最近的,统一复合语句中的,未配对的if语句配对。例:If()if() 语句1elseif() 语句2else 语句3例:If()if() 语句1elseif() 语句2else 语句3当当ifif和和elseelse数目不同时,可以加数目不同时,可以加花括号花括号来确定配对关系。来确定配对关系。 -1 (x0)算法1: 算法1:输入x 输入x若x0,则y=-1 若x0,则y=1 若x=0,则y=0输出y 若x0,则y=1 输出y #inc

14、ludevoid main() int x,y; scanf(“%d”,&x); 程序段 printf(“x=%d,y=%dn”,x,y); 上例中的程序段有四个,请判断哪个是正确的?程序1: 程序2: If(x=0) Y=-1; if(x0) y=1; Else else y=0; If(x=0) y=0; else y=-1; Else y=1;程序3: 程序4: Y=-1; y=0; If(x!=0) if(x=0) If(x0) y=1; if(x0) y=1; Else y=0; Else y=-1;正确正确例例4-3 求一元二次方程求一元二次方程ax2+bx+c=0的解。的解。#i

15、ncludemath.hmain() float a,b,c,x1,x2; if(a=0.0) & (b=0.0) printf(unsolvable!n); else if(a=0.0&b!=0.0) printf(the single root is %fn,-c/b); else if(a!=0.0) double disc; disc=b*b-4*a*c; x1=-b/(2*a); x2=sqrt(fabs(disc)/(2*a); if(disc0.0) printf(complex roots:n real part=%f,imag part=%fn,x1,x2); else pr

16、intf(real root:n root1=%f,root2=%fn,x1+x2,x1-x2); 例例4-4判断一个整数能否被判断一个整数能否被3或或5整除。整除。#include int main( ) int num;printf(Input a number:);scanf(%d,&num);if(num%3=0) if(num%5=0) printf(The number can be divided by 3 and 5!n); else printf(The number can be divided by 3!n); else if(num%5=0) printf(The nu

17、mber can be divided by 5!n); else printf(The number cant be divided by 3 and 5!n);4.2.2 条件运算符和条件表达式条件表达式用来处理语句中判别的表达式的值无论为“真”或“假” 都要向同一个变量赋值执行一个赋值语句的情况。格式: 表达式?表达式表达式 功能: 判断表达式1的值,如果成立就执行表 达式2,否则就执行表达式3使用场合:若在语句中,当被判别的表达式的 值为“真”或“假” 时,都执行一个赋值语 句且向同一个变量赋值时,可以用一个 条件运算符来处理。 例:例: ()() = =; ;当当abab时将时将a

18、a的值赋给的值赋给maxmax,当,当abab时将时将b b的值赋给的值赋给maxmax,可以看到无论可以看到无论abab是否满足,都是向同一个变量赋值。是否满足,都是向同一个变量赋值。 可以用下面的条件运算符来处理:可以用下面的条件运算符来处理: ()?)?;说明:(1).(1).条件运算符的执行顺序:先求解表达式,若为非(真)条件运算符的执行顺序:先求解表达式,若为非(真) 则求解表达式,此时表达式的值就作为整个条件表达式则求解表达式,此时表达式的值就作为整个条件表达式 的值。若表达式的值为(假),则求解表达式,表达的值。若表达式的值为(假),则求解表达式,表达 式的值就是整个条件表达式的

19、值。式的值就是整个条件表达式的值。 (2).(2).条件运算符优先级高于赋值运算符条件运算符优先级高于赋值运算符 ,低于关系运算符,低于关系运算符 和算术运算符。和算术运算符。 (3).(3).条件运算符的结合方向为条件运算符的结合方向为“自右至左自右至左”。 ( (4).“4).“表达式表达式2”2”和和“表达式表达式3”3”不仅可以是数值表达式,还可以不仅可以是数值表达式,还可以 是赋值表达式或函数表达式。是赋值表达式或函数表达式。(5).(5).条件表达式中,表达式的类型可以与表达式和表达条件表达式中,表达式的类型可以与表达式和表达 式的类型不同。式的类型不同。 例例输入一个字符,判别它

20、是否大写字母,如果是,将它输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得转换成小写字母;如果不是,不转换。然后输出最后得到的字符。到的字符。 #include #include void main ( ) void main ( ) char char chch; ; scanf(%cscanf(%c,& ,& chch);); chch= =( (chch=A& =A& chch=Z)?(ch+32):ch;=Z)?(ch+32):ch; printf(%cn,chprintf(%cn,ch);); 如果字符变量ch的值为大写字母,则条件表达式

21、的值为(),即相应的小写字母。如果ch的值不是大写字母,则条件表达式的值为,即不进行转换。 4.2.3 switch语句语句switch语句的格式:switch (表达式) case常量表达式:语句 case常量表达式:语句 case常量表达式:语句 default :语句 例例: :要求按照考试成绩的等级输出百分制分数段,用要求按照考试成绩的等级输出百分制分数段,用switchswitch语句实现:语句实现:switch(gradegrade) case printfprintf();); case printfprintf ();); case printfprintf ();); cas

22、e printfprintf ();); default( printfprintf );); 说明:(1) switch(1) switch后面括弧内的后面括弧内的“表达式表达式”, 标准允许它为任何类型。标准允许它为任何类型。(2) (2) 当表达式的值与某一个当表达式的值与某一个casecase后面的常量表达后面的常量表达式的值相等时,就执行此式的值相等时,就执行此casecase后面的语句,若后面的语句,若所有的所有的casecase中的常量表达式的值都没有与表达中的常量表达式的值都没有与表达式的值匹配的,就执行式的值匹配的,就执行defaultdefault后面的语句。后面的语句。(

23、3) (3) 每一个每一个casecase的常量表达式的值必须互不相同,的常量表达式的值必须互不相同,否则就否则就 会出现互相矛盾的现象(对表达式会出现互相矛盾的现象(对表达式的同一个值,有两种或多种执行方案)。的同一个值,有两种或多种执行方案)。(4) 各个各个case和和default的出现次序不影响执行结的出现次序不影响执行结 果。例如,可以先出现果。例如,可以先出现“default:”,再出,再出现现 “case :”,然后是,然后是“case:”。(5) 执行完一个执行完一个case后面的语句后,流程控制转移后面的语句后,流程控制转移到下一到下一 个个case继续执行。继续执行。“c

24、ase常量表达式常量表达式”只是只是起语句标号作用,并不是在条件判断。在执行起语句标号作用,并不是在条件判断。在执行 switch语句时,根据语句时,根据switch后面表达式的值后面表达式的值 找到匹找到匹配的入口标号,就从此标号开始执行下去,不再进配的入口标号,就从此标号开始执行下去,不再进行判断。行判断。应该在执行一个应该在执行一个case分支后分支后,可以用一个可以用一个 break语句来终止语句来终止switch语句的执行。语句的执行。 (6) 多个可以共用一组执行语句。多个可以共用一组执行语句。 例例5写程序,判断某一年是否闰年。用下图来表示判断闰年的算法。补充:程序综合举例补充:

25、程序综合举例例例 求方程的解。求方程的解。基本的算法:基本的算法: ,不是二次方程。,不是二次方程。 ,有两个相等实根。,有两个相等实根。 ,有两个不等实根。,有两个不等实根。 ,有两个共轭复根。,有两个共轭复根。 #include #include void main ( ) float a,b,c,disc,x1,x2,realpart,imagpart; scanf(%f,%f,%f,&a,&b,&c); printf(the equation ); if(fabs(a)=1e-6)printf(is not a quadraticn); else disc=b*b-4*a*c; if(

26、fabs(disc)1e-6)x1=(-b+sqrt(disc)/(2*a); x2=(-b-sqrt(disc)/(2*a); printf(“has distinct real roots:%8.4f and %8.4fn”,x1,x2); elserealpart=-b/(2*a); imagpart=sqrt(-disc)/(2*a); printf(“ has complex rootsn”); printf(“%8.4f+%8.4fin”,realpart,imagpart); printf(“%8.4f-%8.4fin”,realpart,imagpart); 运行情况: ple

27、ase enter a,b,c: ,The equation has two : . please enter a,b,c: ,2 :. . . please enter a,b,c: 2,6,1The equation has distinct real roots: -0.1771 and -2.8229例例 运输公司对用户计算运费。运输公司对用户计算运费。路程()越远,每公里运费越低。标准如下:路程()越远,每公里运费越低。标准如下: 没有折扣没有折扣 折扣折扣 折扣折扣 折扣折扣 折扣折扣 折扣折扣设每公里每吨货物的基本运费为,货物重为,设每公里每吨货物的基本运费为,货物重为,距离为,

28、折扣为,则总运费的计算公式为:距离为,折扣为,则总运费的计算公式为:* * * *()() 分析折扣变化的规律性:分析折扣变化的规律性:折扣的折扣的“变化点变化点”都是的倍数都是的倍数 在横轴上加一种坐标,在横轴上加一种坐标,c c的值为的值为s/250s/250。c c代表代表250250的倍数。的倍数。 ,无折扣;,无折扣;,折扣;,折扣;,;,;,;,;,;,; ,。,。 4.5 程序举例(续)#include void main ( ) int c,s;float p,w,d,f;scanf(%f,%f,%d,&p,&w,&s);if(s=3000) c=12;else c=s/250

29、;switch(c) case 0:d=0;break; case 1:d=2;break; case 2:case 3:d=5;break; case 4:case 5:case 6:case 7:d=8;break; case 8:case 9:case 10: case 11:d=10;break; case 12:d=15;break; f=p*w*s*(1-d/100.0);printf(freight=%15.4fn,f); 运行情况:please enter price,weight,distance:23,345.7,136.45freight=1081349.64 什么是循环

30、?什么是循环?为什么要使用循环?为什么要使用循环?问题问题1 1:问题问题2:2:求学生平均成绩求学生平均成绩 分数相加后除以课数分数相加后除以课数在许多问题中需要用到循环控制。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。循环分为两种:无休止循环和有终止循环构成有效循环的条件:循环体和循环结束条件4.3 循环结构程序设计循环结构程序设计while语句用来实现“当型”循环结构。一般形式:一般形式: while (while (表达式表达式) ) 语句语句 当表达式为非0值时,执行while语句中的内嵌语句。其特点是:先判断表达式,后执行语句。

31、4.3.1 while语句语句例 求1到100的和#include #include void main()void main() intint i i,sum=0;sum=0; i=1; i=1; while (i=100) while (i=100) sum= sum=sum+isum+i; ; i+; i+; printf(%dnprintf(%dn,sum);sum); 说明:说明:说明:说明:(1)循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现.(2)在循环体中应有使循环趋向于结束的语句。运行结果:运行结果:50505050注意:注意:(1)(1)循环体如果包含

32、一个以上的语句,应该用花括循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现。弧括起来,以复合语句形式出现。 (2)(2)在循环体中应有使循环趋向于结束的语句。如在循环体中应有使循环趋向于结束的语句。如果无此语句,则果无此语句,则i i的值始终不改变,循环永不结的值始终不改变,循环永不结束。束。do-while语句的特点:先执行循环体,然后判断循环条件是否成立。执行过程:执行过程:先执行一次指定的循环体语句,先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零然后判别表达式,当表达式的值为非零(“(“真真”) ) 时,返回重新执行循环体语句,如时,返回重新执行循环体

33、语句,如此反复,直到表达式的值等于此反复,直到表达式的值等于0 0为止,此时为止,此时循环结束循环结束一般形式一般形式: do 循环体语句; while (表达式)例用do.while 求1到100的和#include #include void main()void main() intint i i,sum=0;sum=0; i=1; i=1; do do sum= sum=sum+isum+i; ; i+; i+; while(iwhile(i=100);=100); printf(%dnprintf(%dn,sum)sum); 运行结果:运行结果:50505050补充: while和

34、do-while循环的比较凡是能用while循环处理,都能用dowhile循环处理。dowhile循环结构可以转换成while循环结构。 在一般情况下,用while语句和用do-while语句处理同一问题时,若二者的循环体部分是一样的,它们的结果也一样。但是如果while后面的表达式一开始就为假(0值)时,两种循环的结果是不同的。例 while和do-while循环的比较 (1) #include (1) #include (2) #include (2) #include void main ( ) void main( )void main ( ) void main( ) intint

35、sum=0 sum=0,i; i; intint sum=0 sum=0,i;i; scanf(scanf(“%d%d,&i); &i); scanf(scanf(”%d%d,&i);&i); while (i=10) do while (i=10) do sum= sum=sum+Isum+I; sum=; sum=sum+isum+i; ;i+; i+;i+; i+; while (i=10); while (i=10);printf(printf(“sumsum=%=%dndn ,sum); sum); printf(printf(“sumsum=%=%dndn”,sum,sum); )

36、; 运行结果:运行结果:11 sum=55 sum=55 再运行一次:再运行一次: 1111sum=0sum=0运行结果:运行结果:11 sum=55 sum=55 再运行一次:再运行一次: 1111sum=11sum=11说明:说明:说明:说明:当while后面的表达式的第一次的值为“真”时,两种循环得到的结果相同。否则,二者结果不相同。补补充充:用/41-1/3+1/5-1/7+公式求的近似值,直到某一项的绝对值小于为止。N-SN-S图表示算法图表示算法 运行结果:运行结果: pi= 3.141594例 求pi的近似值 #include #includevoid main() int s;

37、float n,t,pi; t=1;pi=0;n=1.0;s=1; while(fabs(t)1e-6) pi=pi+t;n=n+2;s=-s;t=s/n; pi=pi*4; printf(pi=%10.6fn,pi);4.3.3 for循环语句循环语句C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。一般形式一般形式: for(表达式1;表达式2;表达式3) 语句 for语句的执行过程:语句的执行过程: (1) 先求解表达式1。 (2) 求解表达式2,若其值为真(值为非0),则执 行for

38、语句中指定的内嵌语句,然后执行下 面第(3)步。若为假(值为0),则结束循环, 转到第(5)步。 (3) 求解表达式3。 (4) 转回上面第(2)步骤继续执行。 (5) 循环结束,执行for语句下面的一个语句 for语句的一般形式和执行过程表达式表达式2?执行语句语句成立成立不成立不成立执行for循环之后的语句执行表达式3执行表达式执行表达式1循环初始条件循环初始条件循环控制条件循环控制条件循环体循环体for语句等价于下列语句:语句等价于下列语句:表达式表达式1;while (表达(表达式式2) 语句;语句; 表达式表达式3;1 、for语句的一般形式和执行过程语句的一般形式和执行过程for语

39、句最简单的形式:for(for(循环变量赋初值;循环条件;循环变量增值循环变量赋初值;循环条件;循环变量增值) ) 例如例如: : for(i=1;i=100;i+) sum=sum+i;相当于:相当于: i=1;i=1; while(iwhile(i=100)=100) sum= sum=sum+i;isum+i;i+;+; 用for语句简单、方便。 forfor语句相当灵活,形式变化多样:语句相当灵活,形式变化多样: (1) for语句的一般形式中的“表达式1”可以省略,此时应在for语句之前给循环变量赋初值。注意省略表达式1时,其后的分号不能省略。如 for(;i=100;i+) sum

40、=sum+i; 执行时,跳过“求解表达式1”这一步,其他不变。 for语句的各种形式语句的各种形式(2) 如果表达式2省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式2始终为真。如:for(i=1; ;i+) sum=sum+i; 表达式1是一个赋值表达式,表达式2空缺。它相当于: i=1; while(1) sum=sum+1;i+;(3) 表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。如: for(i=1;i=100;) sum=sum+i;i+; 在上面的for语句中只有表达式1和表达式2,而没有表达式3。i+的操作不放在for语句的表达式3的位置处,而

41、作为循环体的一部分,效果是一样的,都能使循环正常结束。(4) 可以省略表达式1和表达式3,只有表达式2,即只给循环条件。如: for(;i=100;) while(i=100) sum=sum+i; 相当于 sum=sum+i; i+; i+; 在这种情况下,完全等同于while语句。可见for语句比while语句功能强,除了可以给出循环条件外,还可以赋初值,使循环变量自动增值等。(5) 3个表达式都可省略,如: for(; ;) 语句语句相当于 while(1) 语句语句 即不设初值,不判断条件(认为表达式2为真值),循环变量不增值。无终止地执行循环体。(6) 表达式1可以是设置循环变量初值

42、的赋值表达式,也可以是与循环变量无关的其他表达式。如: for (sum=0;i=100;i+) sum=sum+i; 表达式3也可以是与循环控制无关的任意表达式 表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。如: for(sum=0,i=1;i=100;i+) sum=sum+i;或for(i=0,j=100;i=j;i+,j-) k=i+j; 表达式1和表达式3都是逗号表达式,各包含两个赋值表达式,即同时设两个初值,使两个变量增值. 在逗号表达式内按自左至右顺序求解,整个逗号表达式的值为其中最右边的表达式的值。如: for(i=1

43、;i=100;i+,i+) sum=sum+i;相当于 for(i=1;i=100;i=i+2) sum=sum+i;(7) 表达式一般是关系表达式(如i=100)或逻辑表达式 (如ab & xy),但也可以是数值表达式或字符表达 式,只要其值为非零,就执行循环体。 for(i=0;(c=getchar()!=n;i+=c); 在表达式2中先从终端接收一个字符赋给c,然后判断此赋值表达式的值是否不等于n(换行符),如果不等于n,就执行循环体。注意:注意:注意:注意:此for语句的循环体为空语句,把本来要在循环体内处理的内容放在表达式3中,作用是一样的。可见for语句功能强,可以在表达式中完成本

44、来应在循环体内完成的操作。 for( ;(c=getchar()!=n;) printf(%c,c); for语句中只有表达式2,而无表达式1和表达式3。其作用是每读入一个字符后立即输出该字符,直到输入一个“换行”为止。请注意,从终端键盘向计算机输入时,是在按Enter键以后才将一批数据一起送到内存缓冲区中去的。运行情况:运行情况:ComputerComputer ( (输入输入) )Computer (Computer (输出输出) )而不是而不是CcoommppuutteerrCcoommppuutteerr例:用例:用forfor语句计算语句计算s=1+2+3+.+99+100s=1+2

45、+3+.+99+100 void main() int n,s=0; for(n=1;n=100;n+) s=s+n; printf(s=%dn,s); 例例 求Fibonacci数列前40个数。这个数列有如下特点:第1,2两个数为1,1。从第3个数开始,该数是其前面两个数之和。即:F(1)=1 (n=1)F(2)=1 (n=2)F(n)=F(n-1)+F(n-2) (n3) 算法如图所示:#include #include void main()void main() long long intint f1 f1,f2;f2; intint i; i; f1=1;f2=1; f1=1;f2=

46、1; for(ifor(i=1; i=20; i+)=1; i=20; i+) printf(%12ld %12ld printf(%12ld %12ld ,f1f1,f2);f2); if(i%2=0) if(i%2=0) printfprintf(n);n); f1=f1+f2; f1=f1+f2; f2=f2+f1; f2=f2+f1; 运行结果:运行结果: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 31781

47、1 514229 832040 1346269 2178309 3524578 57022887 9227465 14930352 24157817 39088169 63245986 102334155 4.3.4 循环的嵌套循环的嵌套一个循环体内又包含另一个完整的循环结构 称为循环的嵌套。内嵌的循环中还可以嵌套 循环,这就是多层循环。三种循环(while循环、do-while循环和for循 环)可以互相嵌套。下面几种都是合法的形式:(1) while( ) (2) do (3) for(;) while( ) do for(;) while( ); while( ); (4) while(

48、 ) (5) for(;) (6) do do while( ) for(;) while( ) while( ) 补充例题:补充例题:打印如下形式的九九乘法表打印如下形式的九九乘法表.main() int x,y; for(x=1;x=9;x+) for(y=1;y=9;y+) printf(%d*%d=%2d ,x,y,x*y); printf(n); 想一想打成三角形乘法口诀怎么改写程序想一想打成三角形乘法口诀怎么改写程序 例例 打印由数字组成的如下所示金字塔图案打印由数字组成的如下所示金字塔图案 编编程程分分析析:打打印印图图案案一一般般可可由由多多重重循循环环实实现现,外外循循环环用

49、用来来控控制制打打印印的的行行数数,内内循循环环控控制制每每行行的的空空格格数数和和字字符符个个数数。实实现现打打印印上上金金字字塔塔图图案案的的程程序如下:序如下:voidvoid main() main() intint i,k,j; i,k,j; for(i=1;i=9;i+) /* for(i=1;i=9;i+) /* 外循环控制打印行数外循环控制打印行数 * */ / for (k=1;k=10-i;k+) /* for (k=1;k=10-i;k+) /* 每行起始打印位置每行起始打印位置 * */ / printf( ); printf( ); for (j=1;j=2*i-1;

50、j+) /* for (j=1;j=2*i-1;j+) /* 内循环控制打印个数内循环控制打印个数* */ / printf(%c,48+i); printf(%c,48+i); printf(n); /* printf(n); /* 换行换行 * */ / 1 1 222 222 33333 33333 4444444 4444444 555555555 555555555 66666666666 66666666666 7777777777777 7777777777777 888888888888888 888888888888888 9999999999999999 999999999

51、9999999思考与讨论:思考与讨论: 1)程程序序如如果果将将程程序序中中的的数数值值“10”改改 为为“20”,程程序序的的输输出出结结果果有有什什么么不不同同?如果改为?如果改为“5”,输出结果如何?,输出结果如何? 2)能否将语句)能否将语句“printf(%c,48+i);”改为改为“printf(%c,0+i);”? 4.3.5 用break语句和continue语句改变循环状态.break语句可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句 一般形式:一般形式: break;break;注意注意: :break语句不能用于循环语句和switch语句之外的任何其

52、他语句中。 例例:float pi=3.14159;for(r=1;r100) break; printf(r=%f,area=%fn,r,area); 程序的作用是计算程序的作用是计算r=1r=1到到r=10r=10时的圆面积,直到时的圆面积,直到面积面积areaarea大于大于100100为止。从上面的为止。从上面的forfor循环可以看循环可以看到:当到:当area100area100时,执行时,执行breakbreak语句,提前结束语句,提前结束循环,即不再继续执行其余的几次循环循环,即不再继续执行其余的几次循环。continue语句作用为结束本次循环,即跳过循环体中下面尚未执行的语句

53、,接着进行下一次是否执行循环的判定.一般形式:一般形式: continue;continue; continue语句和break语句的区别 continue语句只结束本次循环,而不是终止整个循环的执行。 while(表达式1) if(表达式2) continue; continue语句和break语句的区别 break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。 while(表达式1) if(表达式2) break; 例 把100200之间的不能被3整除的数输出。 #include #include void main()void main() intint n; n; for

54、(n=100;n=200;n+) for (n=100;n=200;n+) if (n%3=0) if (n%3=0)continue;continue; printf(%dprintf(%d ,n);n); 说明:说明:说明:说明:当n能被3整除时,执行continue语句,结束本次循环(即跳过printf函数语句),只有n不能被3整除时才执行printf函数。补充 几种循环的比较(1)三种循环都可以用来处理同一问题,一般情况下它们可以互相代替。 (2)在while循环和do-while循环中,只在while后面的括号内指定循环条件,因此为了使循环能正常结束,应在循环体中包含使循环趋于结束的

55、语句(如i+,或i=i+1等)。for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while循环能完成的,用for循环都能实现。 (3)用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。(4) while循环、dowhile循环和for循环,都可以用break语句跳出循环,用continue语句结束本次循环 。补充 程序综合举例 判断判断m m是否素数。是否素数。算法思想算法思想: :让m被2到除,如果m能被2之中任

56、何一个整数整除,则提前结束循环,此时i必然小于或等于k(即);如果m不能被2k(即)之间的任一整数整除,则在完成最后一次循环后,i还要加1,因此i=k+1,然后才终止循环。在循环之后判别i的值是否大于或等于k+1,若是,则表明未曾被2k之间任一整数整除过,因此输出“是素数”。 例5.7 判断m是否素数。 #include #include #include #include void main() void main() intint m m,i i,k;k; scanf(%dscanf(%d,& &m);km);k= =sqrt(msqrt(m);); for (i=2;i= for (i=

57、2;ik) k) printf(%dprintf(%d is a prime number is a prime numbernn,m);m);else else printf(%dprintf(%d is not a prime number is not a prime numbernn,m);m); 运行结果:运行结果: 17 17 is a prime number 例例 译密码。为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。 思路:思路:可以按以下规律将电文变成密码: 将字母将字母A A变成字母变成字母E E,a a变成变成e e,即变成其后的,即变成其后的第第4 4个字母,个字母,W W变成变成A A,X X变成变成B B,Y Y变成变成C C,Z Z变变成成D D。 例输入一行字符,要求输出其相应的密码include include void main() void main() char c; char c; while(cwhile(c= =getchargetchar()!=()!=n)n) if(cif(c=a & c=A & =a & c=A & c=Z)cZ & cz) c=c-26;Z & cz) c=c-26; printf(%cnprintf(%cn,c);c); 运行结果:运行结果: China! Glmre!

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号