160 likes | 340 Views
第 5 讲 分支结构程序设计. 计算机与通信工程学院. 第 5 讲 分支结构程序设计. 本讲主要内容: 一、 if 语句的综合应用 二、 switch 语句的综合应用 三、 goto 语句及其综合应用. 学习目的与要求: —— 熟练掌握 if 语句和 switch 语句的使用方法; —— 了解 goto 语句的作用。 学习重点: if 语句和 switch 语句的使用方法。 学习难点: 分支结构条件及 switch 语句表达式的构造技巧。. 0. 表达式. 非 0. 0. 语句组. 表达式 1. 非 0. 0. 表达式 2.
E N D
第5讲 分支结构程序设计 计算机与通信工程学院
第5讲 分支结构程序设计 本讲主要内容: 一、 if 语句的综合应用 二、 switch 语句的综合应用 三、 goto语句及其综合应用 学习目的与要求: ——熟练掌握if语句和switch语句的使用方法; ——了解goto语句的作用。 学习重点:if语句和switch语句的使用方法。 学习难点:分支结构条件及switch语句表达式的构造技巧。
0 表达式 非0 0 语句组 表达式1 非0 0 表达式2 非0 0 表达式3 非0 0 表达式4 非0 0 表达式 非0 语句组1 语句组2 语句组3 语句组4 语句组5 语句组2 语句组1 if(表达式) {语句组1} else {语句组2} 复习:if语句的三种形式 if(表达式) {语句组} 1.if 语句的一般形式 2.if 语句的简单形式 if(表达式1) {语句组1} else if(表达式2) {语句组2} …… else if(表达式n) {语句组n} else {语句组n+1} 3.if-else if结构 简单if语句逻辑结构 一般if语句的逻辑结构 注意:语句组的含义是 可以包含有多条语句, 但必须使用{ }括起来。 整体上作为一条语句 使用。 if-else if语句的逻辑结构
一、if 语句的的综合应用 例4-3:求一元二次方程ax2+bx+c=0的实根解(设a≠0)。 补充例题:输入任意三个数,按由大到小顺序排列输出。 例4-11:闰年判断程序。 例4-12:学生成绩分等显示程序。学生有数学、英语两门课。按百分制考核。要求输入各门课成绩,按平均成绩分等显示:excellence(优秀):平均成绩≥90; all right(良好):80≤平均成绩<90; middling(中等):70≤平均成绩<80; pass(及格): 60≤平均成绩<70; fail(不及格): 平均成绩<60。 返回
开始 输入a,b,c d=b*b-4*a*c No d≥0 Yes 计算实根x1,x2 输出x1,x2 结束 例4-3 求一元二次方程ax2+bx+c=0的实根解(设a≠0)。 #include "math.h" main() {float a,b,c; float x1,x2,d; printf("Please Input a,b,c: "); scanf("%f,%f,%f",&a,&b,&c); d=b*b-4*a*c; if(d>=0) { x1=(-b+sqrt(d))/(2*a); x2=(-b-sqrt(d))/(2*a); printf("x1=%f,x2=%f",x1,x2); } } 扩充到复数根 例4-3程序流程图 返回
#include "math.h" main() {float a,b,c; float x1,x2,d; printf("Please Input a,b,c: "); scanf("%f,%f,%f",&a,&b,&c); d=b*b-4*a*c; if(d>=0) { x1=(-b+sqrt(d))/(2*a); x2=(-b-sqrt(d))/(2*a); printf("x1=%f,x2=%f",x1,x2); } } float realpart,imagpart; else { realpart=-b/(2*a); imagpart=sqrt(-d)/(2*a); printf("x1=%f+%fi\n",realpart,imagpart); printf("x2=%f-%fi\n",realpart,imagpart); } 返回
开始 输入a,b,c No a<b Yes 交换a与b的值 No a<c Yes 交换a与c的值 No b<c Yes 交换b与c的值 输出a,b,c 结束 补充例题:输入任意三个数,按由大到小顺序排列输出。 解法一:交换变量值法。 解法二:六种排列组合法。 交换两个变量a与b的值的算法实现: t=a; a=b; b=t; a为a,b中最大者 添加中间变量t: main( ) { int a,b,c,t; printf("Please Input a,b,c: "); scanf("%d,%d,%d",&a,&b,&c); if (a<b) {t=a;a=b;b=t;} if (a<c) {t=a;a=c;c=t;} if (b<c) {t=b;b=c;c=t;} printf ("%d,%d,%d",a,b,c); } a为三数中最大者 b为三数中次大者 返回
补充例题:输入任意三个数,按由大到小顺序排列输出。补充例题:输入任意三个数,按由大到小顺序排列输出。 解法二:六种排列组合法。 main() { int a,b,c; printf("Please input a b c:"); scanf("%d%d%d",&a,&b,&c); if (a>=b&&b>=c) printf("%d,%d,%d\n",a,b,c); if (a>=c&&c>=b) printf("%d,%d,%d\n",a,c,b); if (b>=a&&a>=c) printf("%d,%d,%d\n",b,a,c); if (b>=c&&c>=a) printf("%d,%d,%d\n",b,c,a); if (c>=a&&a>=b) printf("%d,%d,%d\n",c,a,b); if (c>=b&&b>=a) printf("%d,%d,%d\n",c,b,a); } 三个数a,b,c,由大到小的 六种顺序排列组合: a≥b≥c a≥c≥b b≥a≥c b≥c≥a c≥a≥b c≥b≥a 翻 译 为 C a>=b&&b>=c a>=c&&c>=b b>=a&&a>=c 语 言 表 达 式 b>=c&&c>=a c>=a&&a>=b c>=b&&b>=a 返回
例4-11:闰年判断程序。 闰年的判别条件:(假设年份变量用year表示) 条件表示为:year%400==0 ⑴ 当year是400的整倍数时为闰年; 综合上述两种情况,得到闰年判别条件的逻辑表达式: ⑵ 当year是4的整倍数,但不是100的整倍数时为闰年。 条件表示为: year%4==0 && year%100 != 0 year%400==0 || year%4==0 && year%100 != 0 main() { int year; printf("Type in a year:\n"); scanf("%d",&year); if (year%400==0||year%4==0&&year%100!=0) printf("%d is a leap year.\n"); else printf("%d is not a leap year.\n"); } 返回
0 表达式1 非0 0 表达式2 非0 0 表达式3 非0 0 表达式4 非0 语句组1 语句组2 语句组3 语句组4 语句组5 例4-12:学生成绩分等显示程序。学生有数学、英语两门课。 按百分制考核。要求输入各门课成绩,按平均成绩分等显示: excellence(优秀):平均成绩≥90; all right(良好):80≤平均成绩<90; middling(中等):70≤平均成绩<80; pass(及格): 60≤平均成绩<70; fail(不及格): 平均成绩<60。 main() {float a,b,ave; printf("Input data a,b: "); scanf("%f,%f",&a,&b); ave=(a+b)/2; if(ave>=90) printf("excellence\n"); else if(ave>=80) printf("all right\n"); else if(ave>=70) printf("middling\n"); else if(ave>=60) printf("pass\n"); else printf("fail\n"); } if(表达式1) {语句组1} else if(表达式2) {语句组2} …… else if(表达式n) {语句组n} else {语句组n+1} 返回
二、switch 语句的综合应用 例4-12:学生成绩分等显示程序。学生有数学、英语两门课。按百分制考核。要求输入各门课成绩,按平均成绩分等显示。 excellence(优秀):平均成绩≥90; all right(良好):80≤平均成绩<90; middling(中等):70≤平均成绩<80; pass(及格): 60≤平均成绩<70; fail(不及格): 平均成绩<60。 补充例题:编写计算器程序。用户输入运算数和四则运 算符,输出计算结果。 返回
例4-12:学生成绩 分等显示程序。 main() {float a,b; int ave; printf("Input data a,b: "); scanf("%f,%f",&a,&b); ave=(a+b)/2; switch(ave/10) {case 10: case 9: printf("excellence\n"); break; case 8: printf("all right\n"); break; case 7: printf("middling\n"); break; case 6: printf("path\n"); break; default: printf("fail\n"); } 采用switch编程时,要注意 精选switch后的表达式: (1)若采用平均值ave 将有101种可能; (2)若采用:ave/10 只有11种结果,再经 过合并后仅剩下5种。 switch语句在开发应用程序 时用途广泛。 返回
补充例题:编写计算器程序。用户输入运算数和四则运补充例题:编写计算器程序。用户输入运算数和四则运 算符,输出计算结果。 #include <stdio.h> main() { int a,b,result=0; char ch; printf("\n\nInput a,b:"); scanf("%d,%d",&a,&b); printf("Input one of(+,-,*,/):"); getchar(); ch=getchar(); switch(ch) { case '+': result=a+b; break; case '-': result=a-b; break; case '*': result=a*b; break; case '/': result=a/b; break; default: printf("operator is wrong!"); } printf("\nresult=%d",result); } 返回
三、goto语句及其综合应用 goto语句是一种无条件转移语句,主要用于控制程序的执行方向,也可以利用它反复地执行同一段程序。一般格式如下: goto 语句标号; 例4-10:输入一批自然数,求其中的偶数和,当输入-1时,结束求和过程。 返回
例4-10:输入一批自然数,求其中的偶数和,当输入-1时,结束求和过程。 main() {int n,sum=0; loop: printf("Input a number: "); scanf("%d",&n); if(n!=-1) { if(n%2==0) sum=sum+n; goto loop; } printf("SUM=%d\n",sum); } 返回
分支结构程序设计-小结 • 分支结构是三大结构之一,分支结构程序设计是C语言编程的重要内容。 • 要根据具体问题具体分析,灵活使用if语句的三种形式。 • 多分支结构编程可以采用if-esle if结构,亦可以采用switch语句结构。注意这两种结构用法上的主要区别:if-esle if是多条件多分支结构,其中的各条件表达式能够表示范围;而switch语句是根据一个表达式的多个结果实现多分支编程,其结构中的表达式通常为整型或字符型。 • 勤思考、多动手、常比较、善积累是提高编程水平的有效途径。 作业:教材4.9, 4.10