1、选择与循环结构,一、if语句(条件语句) 功能:用来判定所给定的条件是否满足,并根据判定的结果决定执行给出的两种操作之一。 if语句的3种形式 条件运算符 二、switch语句 功能:解决“多路选择”的问题。 switch语句的格式 switch语句的使用 三、综合举例,教学要点,四、循环结构程序设计 概 述 goto语句 循环结构 while循环 直到型循环 for循环 循环的嵌套 各种循环的比较 五、break语句和continue语句 六、综合举例,教学要点,if语句的三种形式,1、一般形式 if(表达式) 语句1 else 语句22、常见形式 1)简化形式 if(表达式) 语句块2)阶
2、梯式 嵌套形式 3、例54,例:if (xy) printf(“max=%d”,x);else printf(“max=%d”,y);,例:if(xy) printf(“%d”,x);,1、语句块:当有若干条语句时,必须用括起来。 如:if(ab) 当只有一条语句时,用“;”。 x=1;max=a; 2、表达式: if语句的表达式一般情况下为逻辑表达式或关系表达式。 如:if(a= =b 请区分if(x=1)与if(x= =1)的不同。 3、例51、52:,if语句的使用要点,例5_1 输入两个数,按数值将其按大小顺序输出.,要点:交换两个数据的方法,例5_2 输入三个数按大小顺序输出.,if
3、(表达式1) 语句块1 else if(表达式2) 语句块2 else if(表达式3) 语句块3 else if(表达式4) 语句块4 . else 语句块n,例如: if (score90) printf(“very good”); else if(score80) printf(“good”); else if(score60) printf(“ok”); else printf(“bad”);,if语句的阶梯形式,1、含义:一条if语句中又包含一个或多个if语句称为if语句的嵌套. 2、一般形式: if()if() 语句块1else 语句块2 else if() 语句块3else 语句
4、块4 3、使用要点 4、例53,内嵌if,内嵌if,if语句的嵌套,1、if与else的配对关系:else总是与它上面的最近的if配对。与书写格式的缩进无关。 例如: if()if() 语句块1else 语句块2 这时的else配对的对象为内层的if,而不是外层的if. 2、要实行强行的配对关系可以利用 。 例如: if()if() 语句块1else 语句块2,if嵌套使用要点,例5_3 有一函数:-1 (x0),例5_4:写一程序判定某一年是否为闰年(某年能被4整除但不能被100整除或者能被4整除,又能被400整除)。,例5_4:,if(year%4!=0) leap=0; else if
5、(year%100!=0) leap=1; else if (year%400!=0) leap=0; else leap=1;,1、格式: 表达式1?表达式2:表达式3; 2、功能:判断表达式1的值,如果成立执行表达式2,否则执行表达式3 3、应用:若if语句中,表达式为真和假时都执行一条赋值语句且向同一个变量赋值,可用条件运算符进行处理. 如: 可以写成: if (ab) max=a; max=(ab)?a:b; else max=b; (条件运算符是三目运算符) 4、使用要点 5、例55、56,条件运算符(?:),1.执行顺序:先求表达式1,若为真则求解表达式2,整个表达式的值为表达式2
6、的值;否则求解表达式3,整个表达式的值为表达式3的值。 2.优先级:高于赋值运算符,低于关系运算符和算术运算符。 3.结合性: “自右至左”。 4.表达式13的类型可以不一致. 5.“表达式2”和“表达式3”不仅可以是数值表达式,还可以是赋值表达式或函数表达式。,条件运算符的使用要点,例5_5,输出为:3.000000,例5_6,输出为:33.000000,switch (表达式) case 常量表达式1:语句块1;break;case 常量表达式2:语句块2; break;.case 常量表达式n:语句块n; break;default :语句块n+1,switch语句的格式,1.switc
7、h中的表达式可以是整型或字符型表达式。也可以是枚举类型,新标准的c语言允许为任意类型。 2.每个常量表达式的值必须各不相同,否则将会出现矛盾. 3.依次匹配表达式的值与case后面的常量表达式值,相等时执行该case后面的语句及其后面全部语句,可用break语句强行退出switch语句。 4.各个case出现的先后顺序不影响程序的执行结果. 5.多个case可以共用一组执行语句. 6.例57:,switch语句的使用要点,例5_7:写出下面程序的输出结果.,输入:3,输出:PassFailPoor,例5_8 求x2方程的解。 基本的算法: ,不是二次方程。 b2 ,有两个相等实根。 b2 ,有
8、两个不等实根。 b2 ,有两个共轭复根。,综合举例,例5_9 运输公司对用户计算运费。 路程()越远,每公里运费越低。标准如下: 没有折扣 折扣 折扣 折扣 折扣 折扣 设每公里每吨货物的基本运费为,货物重为, 距离为,折扣为,则总运费的计算公式为:*(),分析折扣变化的规律性: 折扣的“变化点”都是的倍数 在横轴上加一种坐标,c的值为s/250。 c代表250的倍数。 ,无折扣; ,折扣; ,; ,; ,;,。,概 述,什么是循环? 为什么要使用循环?,问题1:,在许多问题中需要用到循环控制。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。,
9、问题2:求学生平均成绩 分数相加后除以课程数,goto 语句,1、作用:无条件转移 2、格式: goto 语句标号(标识符); 例:100 #include 求 n main()n=1 int i,sum=0;i=1; 运行结果为:5050 loop :if (i=100) sum=sum+i;i+;goto loop;printf(“%d”,sum);3、说明:目前goto语句很少使用,过多的使用goto语句会降低程序的可读性。,1、功能:while语句一般完成当型循环。 2、格式: while (表达式p) 循环体 3、执行过程:当表达式P为非零时,反复执行语句S,直到P为假时才停止。,w
10、hile循环,100 例如:求 nn=1 main() int i,sum=0;i=1; while (i=100) sum=sum+i; i+;printf(“%d”,sum); ,要点: 若循环体不止包含一条语句时,应用括起来。 在循环体中应有使循环趋于结束的语句,以避免“死循环”。,1、说明:C中一般用dowhile语句实现直到型循环。 2、格式: do 循环体语句while (表达式p); 3、执行过程:先执行循环体语句,后判定表达式,当表达式的值为“假”时,循环结束。,直到型循环,100 例如:求 nn=1 main() int i,sum=0;i=1;do sum=sum+i;i+
11、; while(i=100);printf(“%d”,sum); ,1、功能:用于循环次数已确定或仅给定循环结束条件的循环,适合于描述一个事物从初始态到终止态的变化过程。 2、格式: for(表达式1;表达式2;表达式3) 循环体; 3、执行过程: (1)求解表达式1(初值); (2)求解表达式2, 为真, 执行循环体;否则执行步骤4; (3)求解表达式3;转步骤2 (4)执行for下面的语句. 4、使用要点,for循环,100 例如:求 nn=1 for(i=1;i=100;i+)sum=sum+i;,for循环执行过程,(1)表达式1可以省略,但在for循环之前应给循环变量赋值. 例如:
12、i=1;for(;i=100;i+) sum=sum+i; (2)表达式3也可以省略,但循环体中应用改变循环变量值的语句. 例如: for(sum=0,i=0;i=100;) sum=sum+i; i+; (3)表达式1和表达式3可同时省略(等同于while循环) 例如: i=1;sum=0;for(;i=100;) sum=sum+i;i+;,for循环使用要点,(4)三个表达式都可以省略,但“;”不能省略。 例如: for(;) sum=sum+i; (5)表达式1和表达式3可以是循环变量的赋初值,也可以是与赋初值根本无关的其他表达式,或者两者兼而有之. 例如: for(sum=0,i=1
13、;i=100;i+)sum=sum+i;for(sum=0,i=1;i=100;sum=sum+i,i+); (6)表达式2一般是关系或逻辑表达式,也可以是其他表达式。例如: for(i=0;(c=getchar()!=n;printf(“%c”,c);,for循环使用要点,若输入:cauc 输出为:cauc 不是输出ccaauucc.,循环的嵌套,1、定义:一个循环体内又包含另一个完整的循环结构 称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。 2、下面几种都是合法的形式:,(1) while( ) (2) do (3) for(;) while( ) do for(;) whi
14、le( ); while( );,循环的嵌套,(4) while( ) (5) for(;) (6) do do while( ) for(;) while( ) while( ),(1)注意while与do_while 循环最后的“;”。 (2)while与do_while执行循环体与判断的顺序不同,当表达式初值为0时结果不同。 (3)各自的应用场合不同。 (4)for语句使用最为灵活,完全可以替代while语句。 (5)各种形式的循环都可以用来处理同一问题,一般情况下它们可以互相替代。,各种循环的比较,break语句,1. 功能:用于从循环体内跳出循环体,即提前结束循环,接着执行循环下面的
15、语句 例:计算r=1到r=10的圆面积,当面积大于100时结束循环。 for(r=1;r100) break;printf(“%f”,area); 2、注意:break只能用在循环语句和switch语句中.,1、功能:结束本次循环,即跳过该语句后面尚未执行的语句,接着进行下一次是否执行循环的判定。 例:把100200之间的不能被3整除的数输出.main() int n;for(n=100;n=200;n+)if (n%3= =0) continue;printf(“%d”,n); 2、continue与break的区别:continue结束本次循环,而break终止本层循环.,continue
16、语句,break语句与continue语句的区别,while(表达式1) if(表达式2) break; ,continue,例6_1 用/4=1-1/3+1/5-1/7+.公式求的近似值,直到某一项的绝对值小于10-6为止.,例6_2 求Fibonacci数列:1,1,2,3,5,8,的前40个数.公式为: F1=1 (n=1) F2=1 (n=2) Fn=Fn-1+Fn-2 (n=3),例6_3 判断m是否为素数 算法为:用2sqrt(m)之间的数除m,如果m能被2sqrt(m)之中的任何一个整数整除则提前结束,若m不能被2sqrt(m)之间的任意整数整除,则表明m是素数.,例6_4 写出下面程序的输出结果,输出结果为x=5,y=4,a=1,例6_5 输入两个正整数,求出它们的最大公约数和最小公倍数. 方法一:,方法二:,例6_6 求出所有的水仙花数.,k=n%10; j=n%100/10; i=n/100;,例6_7 译密码。(课本P128例6.10),