1、1第二部分 模块化程序设计2第二部分 主要内容n第一讲 多分支嵌套结构的实现n第二讲 循环嵌套结构的实现n第三讲 数据文件及应用n第四讲 指针及应用3第一讲多分支嵌套结构的实现4主要内容n回顾程序的三种基本结构回顾程序的三种基本结构n嵌套结构嵌套结构选择嵌套结构选择嵌套结构if语句深入语句深入switch语句语句应用实例应用实例n参考参考 2.2.2 2.3 2.4 5顺序结构顺序结构选择结构选择结构三种基本结构的示意图循环结构循环结构6嵌套结构n自顶向下,逐步细化的分析结果。n三种基本结构中的语句组(顺序语句组、if分支语句组、else分支语句组、循环体语句组)可以包含任意结构的语句,从而形
2、成不同的嵌套结构。n嵌套结构没有特定的结构形式,由分析方法自然形成。7选择嵌套结构if语句深入nif语句的多种结构语句的多种结构nif和和else的匹配原则的匹配原则8if语句的多种结构语句语句1表达式表达式语句语句2真真假假if (条件表达式条件表达式) 语句语句1else 语句语句2n双分支结构双分支结构(复习复习)十字路口或直行或右转弯十字路口或直行或右转弯n单分支结构单分支结构十字路口或直行或停十字路口或直行或停n选择嵌套结构选择嵌套结构多分支结构多分支结构n参考参考2.2.29单分支结构nif(条件) 语句if(m = c) m=m;else m=c ; if(c!=m) m=c;常
3、见错误写法:常见错误写法:语句语句1表达式表达式真真假假示例:示例:若若m与与c相同,相同,m值不值不变,否则变,否则c的值给的值给m正确写法:正确写法:单分支结构示例-求绝对值#include int main(void) int number; printf(Enter a number: ); scanf(%d, &number); if(number 0) number = -number; printf(The absolute value is %d.n, number); return 0;10Enter a number: 10 The absolute value is 10
4、.Enter a number: -300 The absolute value is 300.sample21_02.cpp分析:分析:负数求反,正数跳出负数求反,正数跳出编程实现编程实现11选择嵌套结构n在if语句中又包含一个或多个if语句if语句的嵌套n参考 2.2.212完整嵌套结构 P39if(条件1) if(条件2) 语句1 else 语句2else if(条件3) 语句3 else 语句4表达表达式式1表达表达式式3语句语句4真真 假假表达表达式式2语句语句3语句语句1语句语句2真真 真真 假假假假注:条件多以表达式形式出现表达式形式出现if (x 0) y = 0; else
5、if (x = 15) y = 4 * x / 3; else y = 2.5 * x - 10.5; 13实例1 (多分支)分段计算水费sample21_03.cpp# include int main(void) double x, y; printf(Enter x:); scanf(%lf, &x); if (x 0) y = 0; else if (x = 15) y = 4 * x / 3; else y = 2.5 * x - 10.5; printf(f(%.2f) = %.2fn, x, y); return 0;Enter x: -0.5f(-0.50) = 0.00 En
6、ter x: 9.5f(9.50) = 12.67Enter x: 21.3f(21.30) = 42.75004( )01532.510.515xxyf xxxx写出写出If语句语句完整程序,上机调试!完整程序,上机调试!2种嵌套if语句的比较 y=x+1 x1y= y=x+2 1=x=214if (x 1) y = x + 1; else if (x 2) y = x + 2; else y = x + 3; if (x 2) if (x 1) y = x + 1; else y = x + 2;else y = x + 3; x2 x1y=x+1y=x+2真真 假假真真 y=x+3假假假
7、假 x1 x2y=x+1y=x+2真真 假假真真 y=x+3编程比较结果!编程比较结果!15不对称嵌套结构示例:求实足年龄 sample21_04.cpp age=sysY-bthY; if(sysMbthM) age=age-1; else if(sysM=bthM) if (sysDbthD) age=age-1;n年龄年龄=当前年份当前年份-生日年份生日年份n如果如果生日月份还没到年龄生日月份还没到年龄减一岁减一岁n否则否则如果生日月份已到但如果生日月份已到但生日还没到年龄减一岁生日还没到年龄减一岁age=sysY-bthY; if(sysMbthM) age=age-1; else i
8、f(sysM=bthM)&(sysDbthD)age=age-1;用复杂条件表示用复杂条件表示 :16else 和 if 的匹配if(表达式表达式1)if(表达式表达式2) 语句语句1else 语句语句2 elseif(表达式表达式3) 语句语句3 else 语句语句4 if(表达式表达式1)if(表达式表达式2) 语句语句1 elseif(表达式表达式3) 语句语句3 else 语句语句4 else 与最靠近它的、没有与别的与最靠近它的、没有与别的 else 匹配过的匹配过的 if 匹配匹配if(表达式表达式1)if(表达式表达式2) 语句语句1 elseif(表达式表达式3) 语句语句3
9、else 语句语句4 17改变else 和 if 的配对改写下列改写下列 if 语句,使语句,使 else 和第和第1个个 if 配对。配对。 if (x 2) if (x 1) y = x + 1; else y = x + 2;if (x 2) if (x 1) y = x + 1; else y = x + 2;if (x 2) if (x 1) y = x + 1; else;else y = x + 2;18多分支结构if (表达式1) 语句1else if (表达式2) 语句2else if (表达式n-1) 语句n-1else 语句n假假表达式表达式1表达式表达式2语句语句1语句
10、语句2语句语句n-1语句语句n真真表达式表达式n-1真真假假真真假假假假#include void main(void) char cLevel; int fScore; printf(请输入成绩:请输入成绩:); scanf(%d,&fScore); /*输入成绩输入成绩*/ if(fScore100|fScore 89) /*分数分数fScore=90*/ cLevel=A; else if (fScore 79) /*分数分数90fScore=80*/ cLevel=B; else if (fScore 69) /*分数分数80fScore=70*/cLevel=C; else if (
11、fScore 59) /*分数分数70fScore=60*/ cLevel=D; else cLevel=E; /*分数分数fScore60*/ printf(该成绩的等级为:该成绩的等级为:%cn,cLevel);实例: 输入百分制成绩,按A、B、C、D、E输出相应等级。#include main( ) int fScore; char cLevel; printf(请输入成绩:请输入成绩:); scanf(%d,&fScore); while(fScore 100| fScore 0) printf(n输入有误,请重输。输入有误,请重输。); scanf(%d,& fScore); swi
12、tch(fScore /10) case 10: case 9: cLevel =A;break; case 8: cLevel =B;break; case 7: cLevel =C;break; case 6: cLevel =D;break; case 5: case 4: case 3: case 2: case 1: case 0: cLevel =E; printf(成绩是成绩是%d,相应等级是,相应等级是%c。, fScore, cLevel);#include void main(void) char cLevel; int fScore; printf(请输入成绩:请输入成绩
13、:); scanf(%d,&fScore); if(fScore100|fScore 89) cLevel=A; else if (fScore 79) cLevel=B; else if (fScore 69) cLevel=C; else if (fScore 59) cLevel=D; else cLevel=E; printf(该成绩等级:该成绩等级:%cn,cLevel);default :cLevel =E;21switch(表达式表达式) case 常量表达式常量表达式1:语句段:语句段1; break; case 常量表达式常量表达式2:语句段:语句段2 ; break; .
14、case 常量表达式常量表达式n:语句段:语句段n ; break; default : 语句段语句段n+1 ; 表达式的值表达式的值=常量表达式常量表达式 2 的值的值表表达达式式语句段语句段1语句段语句段2语句段语句段n语句段语句段n+1表达式的值表达式的值=常量表达式常量表达式 1 的值的值表达式的值表达式的值=常量表达式常量表达式 n 的值的值其他其他breakbreakbreakbreakswitch(fScore /10) case 10: case 9: cLevel =A;break; case 8: cLevel =B;break; case 7: cLevel =C;bre
15、ak; case 6: cLevel =D;break; default :cLevel =E;22switch语句 处理多分支选择问题,处理多分支选择问题,3种情况种情况1、在、在switch语句的每个语句段中都使用语句的每个语句段中都使用break语句,但不使用语句,但不使用default switch(表达式表达式) case 常量表达式常量表达式1:语句段:语句段1; break; case 常量表达式常量表达式2:语句段:语句段2 ; break; . case 常量表达式常量表达式n:语句段:语句段n ; break; default : 语句段语句段n+1 ;n2、在、在swit
16、ch语句的每个语句的每个语句段中都语句段中都使用使用break语语句,并使用句,并使用default#include main( ) int fScore; char cLevel; printf(请输入学生成绩:请输入学生成绩:); scanf(%d,&fScore); while(fScore 100| fScore 0) printf(n输入有误,请重输。输入有误,请重输。); scanf(%d,& fScore); switch(fScore /10) case 10: case 9: cLevel =A;break; case 8: cLevel =B;break; case 7:
17、cLevel =C;break; case 6: cLevel =D;break; case 5: case 4: case 3: case 2: case 1: case 0: cLevel =E; printf(成绩是成绩是%d,相应等级是,相应等级是%c。, fScore, cLevel);default :cLevel =E; 例例2-5计算器程序。计算器程序。问题描述:任意输入两个数,根据问题描述:任意输入两个数,根据用户选择的功能菜单,求出它们的用户选择的功能菜单,求出它们的和、差、积、除的结果。和、差、积、除的结果。 #include void main(void) double
18、 dLOper,dROper,dResult;/* 存放左右操作数存放左右操作数 */ int nFun;/* 存放运算符存放运算符 */ printf( -n);/* 构造功能菜单构造功能菜单 */ printf( 加法运算加法运算-1n); printf( 减法运算减法运算-2n); printf( 除法运算除法运算-3n); printf( 乘法运算乘法运算-4n); printf( -n); printf( 请输入功能选择:请输入功能选择: ); scanf(%d,&nFun); if(nFun4|nFun1) printf( 输入错误!输入错误!n); else printf( 请输
19、入两个操作数:请输入两个操作数: ); scanf(%lf%lf,&dLOper,&dROper);/* 输入左右操作数和运算符输入左右操作数和运算符 */ switch(nFun) case 1: dResult=dLOper+dROper; break; /* 加法加法 */ case 2: dResult=dLOper-dROper; break; /* 减法减法 */ case 3: if(0.0=dROper) printf( 右操作数不能为右操作数不能为0n); return; /* 除法除法 */ else dResult=dLOper/dROper; break; defaul
20、t: dResult=dLOper*dROper; /* 乘法乘法 */ printf( 计算结果为:计算结果为:%8.3lfn,dResult); /* 输出结果输出结果 */263、在switch中不使用breakswitch(表达式表达式) case 常量表达式常量表达式1:语句段:语句段1; case 常量表达式常量表达式2:语句段:语句段2; . case 常量表达式常量表达式n:语句段:语句段n; default : 语句段语句段n+1;27switch(表达式表达式) case 常量表达式常量表达式1:语句段:语句段1; case 常量表达式常量表达式2:语句段:语句段2; .
21、case 常量表达式常量表达式n:语句段:语句段n; default : 语句段语句段n+1;表达式的值表达式的值=常量表达式常量表达式 2 的值的值表表达达式式语句段语句段1语句段语句段2语句段语句段n语句段语句段n+1表达式表达式的值的值= =常量表达式常量表达式 1 的值的值表达式的值表达式的值=常量表达式常量表达式 n 的值的值其他其他fScore89cLevel =?switch(fScore /10) case 10: case 9: cLevel =A; case 8: cLevel =B; case 7: cLevel =C; case 6: cLevel =D; defaul
22、t :cLevel =E; 求某年某月某日是该年的第几天sample21_14.cpp / y年,年,m月,月,d日日 / days计算的天数计算的天数 days=d; switch(m-1) case 12:days+=31; case 11:days+=30; case 10:days+=31; case 9:days+=30; case 8:days+=31; case 7:days+=31; case 6:days+=30; case 5:days+=31; case 4:days+=30; case 3:days+=31; case 2:days+=isLeap(y)?29:28;
23、case 1:days+=31; 28复合赋值运算符 P53days+=31days=days+31n在在“=”前加上某些运算符前加上某些运算符复合赋值运算符nC语言可以构成复合运算符的有:+ - * / % & | n详见P53:表3-1双目复合运算符n常用:+= -= *= 等自增,自减运算n单目运算符所构成的复合赋值运算+ 自增1- 自减1如:i+ 参与运算后,i+1+i i+1后,参与运算i- 参与运算后,i-1-i i-1后,参与运算int x=0,y=0,i=1;x=i+;y=+i;printf(x=%d,y=%d,i=%d,x,y,i);x=1,y=3,i=3条件表达式 P39n
24、一般形式:一般形式:表达式表达式1 ? 表达式表达式2 : 表达式表达式3n值:若值:若“表达式表达式1 ”的值为真,则以的值为真,则以“表达式表达式2”为该条为该条件表达式的值;否则以件表达式的值;否则以“表达式表达式3”为该条件表达式的值为该条件表达式的值。n通常用于赋值语句中,如:通常用于赋值语句中,如:days+= isLeap(y)?29:28; if(ab) max=a;else max=b max=(ab)?a:b;32Is函数构造n判断函数,返回判断函数,返回1或或0表示表示真真或或假假n调用时通常表示一个调用时通常表示一个条件,运用条件,运用if语句再作语句再作进一步处理。进
25、一步处理。n判奇数判奇数int isOdd(int m)n判偶数判偶数int isEven(int m)n判闰年判闰年int isLeap(int year) 33判奇数int isOdd(int m) if(m%2=1) return 1; else return 0;int isOdd(int m) return m%2;34判偶数int isEven(int m) if(m%2=0) return 1; else return 0;int isEven(int m) return !(m%2);35判闰年int isLeap(int year) return (year%4=0&year
26、%100!=0)|year%400=0); 完整程序:求完整程序:求2010年年3月月20日是日是2010年的第几天年的第几天#includeint isLeap(int year);void main()int y,m,d,days; y=2010,m=3,d=20; days=d; switch(m-1) case 12:days+=31; case 11:days+=30; case 10:days+=31; case 9:days+=30; case 8:days+=31; case 7:days+=31; case 6:days+=30; case 5:days+=31; case
27、4:days+=30; case 3:days+=31; case 2:days+=isLeap(y)?29:28; case 1:days+=31; printf(days=%d,days);int isLeap(int year) return ( year%4=0&year%100!=0 | year%400=0 );运行过程运行过程days=20m-1=22010%4!=0且且2010%400!=0返回返回0days=20+28=48days=48+31days=79改为通用程序,从键盘输入年、月、日!改为通用程序,从键盘输入年、月、日!37实例1假设自动售货机出售假设自动售货机出售4
28、种商品,薯片种商品,薯片(crisps)、爆、爆米花米花(popcorn)、巧克力、巧克力(chocolate)和可乐和可乐(cola),售价分别是每份,售价分别是每份3.0、2.5、4.0和和3.5元元。在屏幕上显示以下菜单当用户输入编号。在屏幕上显示以下菜单当用户输入编号14,显示相应商品的价格;输入显示相应商品的价格;输入0,退出查询;输入,退出查询;输入其他编号,显示价格为其他编号,显示价格为0。1 Select crisps2 Select popcorn 3 Select chocolate4 Select cola 0 Exit上机编程,调试实现!上机编程,调试实现!38#inc
29、lude int main(void) int choice; double price; printf(1 Select crisps n); printf(2 Select popcorn n); printf(3 Select chocolate n); printf(4 Select cola n); printf(0 exit n); printf(Enter choice: ); scanf(%d, &choice); if(choice = 0) return 0; switch (choice) case 1: price=3.0; break; case 2: price=2
30、.5; break; case 3: price=4.0; break; case 4: price=3.5; break; default: price=0.0; break; printf(price = %0.1fn, price); 1 Select crisps2 Select popcorn 3 Select chocolate4 Select cola 0 ExitEnter choice: 1price = 3.01 Select crisps2 Select popcorn 3 Select chocolate4 Select cola 0 ExitEnter choice:
31、 7price = 0.01 Select crisps2 Select popcorn 3 Select chocolate4 Select cola 0 ExitEnter choice: 0Thanks39实践n使用使用switch语句实现个人所得税的计算。语句实现个人所得税的计算。n2011.9.1日起执行日起执行7级超额累进税率:扣除级超额累进税率:扣除3500元。元。 全月应纳税所得额全月应纳税所得额 税率税率 速算扣除数速算扣除数(元元) 全月应纳税额全月应纳税额80000元元 45% 13505 40输入n个数,调用int isEven(int m)函数函数求偶数之和sample21_11.cpp#includeint isEven(int m);int main() int i,n,x,sum;printf(input n:);scanf(%d,&n);sum=0; for(i=1;i=n;i+) printf(input number no.%d:,i); scanf(%d,&x); if(isEven(x) sum+=x; printf(sum=%d,sum);return 0;int isEven(int m) return !(m%2);如果是求奇数,如何修改程序?