Download presentation
Presentation is loading. Please wait.
1
选择结构又称为分支结构。 在选择结构程序设计中,根据条件的判断情况需要选择不同的语句组执行。 选择结构类型: (1)条件选择结构:根据给定的条件表达式进行判断,决定执行某个分支中的程序段。由if语句来实现。 (2)开关选择结构:根据给定的整型表达式的值进行判断,然后决定执行多个分支中的某一个分支。由switch语句来实现。
2
4.1 程序的流程图 4.2 IF语句 4.3 多分支选择语句 4.4 程序综合举例
3
4.1 程序的流程图 传统流程图符号:
4
4.1 程序的流程图 N-S流程图符号:
5
4.1 程序的流程图 【例4.1】求10!的程序。 解题思路: 由于n!=n*(n-1)! 即10!=10*9! 9!=9*8! ……
2!=2*1! 1!=1
6
4.2 if 语句 4.2.1 if语句的三种格式 1.单分支选择结构 一般形式为: if(表达式) { 语句; }
7
4.2 if 语句 【例4.2】求所输入数值的绝对值。 解题思路:
输入数据 解题思路: 首先判断输入数值是否为负数,若为负数,则将取其相反数;否则,正数和零的绝对值是其本身,不予处理。 判断输入数据 ≥0 <0 取相反数 输出结果
8
4.2 if 语句 运行结果如下: Please input a score: -0.01↙ The result is: 0.01
【例4.2】求所输入数值的绝对值。 程序为: #include “stdio.h” main() { float score; printf(“Please input a score:\n”); scanf(“%f”,&score); /*输入数值*/ if (score<0) score=-score; /*若输入数值为负数,则取反*/ printf(“The result is: %3.2f\n”,score); } 运行结果如下: Please input a score: -0.01↙ The result is: 0.01 5.0↙ The result is: 5.00
9
4.2 if 语句 【例4.3】比较所输入的三个数值的大小,按升序输出。 解题思路:
只须让三个数值两两比较三次,在每次比较的过程中,若第一个数值大于第二个数值,则交换彼此的数值,三次比较完成后,三个数值即符合升序要求。
10
Please input three number: 60.1,60,59.9↙
4.2 if 语句 程序代码如下: #include “stdio.h” Void main() { float x,y,z,temp; printf(“Please input three number:\n”); scanf(“%f,%f,%f”,&x,&y,&z); if (x>y) { temp=x; x=y; y=temp; } /*x>y时交换*/ if (x>z) {temp=x; x=z; z=temp; } /*x>z时交换,x为最小数*/ if (y>z) { temp=y; y=z; z=temp; } /*y>z时交换*/ printf(“The sequence is:%3.1f,%3.1f,%3.1f\n”,x,y,z); } 运行结果如下: Please input three number: 60.1,60,59.9↙ The sequence is: 59.9,60.0,60.1
11
4.2 if 语句 2.双分支选择结构 一般形式为: if(表达式) { 语句1;} else { 语句2;}
执行过程是:先求解表达式的值,如果表达式的值为真(非0)执行语句1;否则若表达式的值为假(值为0),就执行语句2。执行过程如图4.5所示。
12
4.2 if 语句 【例4.4】 判断所输入的学生成绩是否及格。 解题思路:
只需要将输入的学生成绩和60作一次比较就可以得出结论:该成绩大于等于60为及格,否则该成绩不及格。
13
4.2 if 语句
14
4.2 if 语句 3.多重选择结构 多重选择结构用于有多种情况需要选择的程序。 一般形式为: if(表达式1) {语句1;}
else if (表达式2) {语句2;} else if (表达式3) {语句3;} … else if (表达式n) {语句n;} else {语句 n+1;}
15
4.2 if 语句 3.多重选择结构
16
4.2 if 语句 【例4.5】 判断所输入的学生成绩的等级,其具体要求如下表: 解题思路:
90~100 80~90 70~80 60~70 0~60 成绩等级 A B C D E 解题思路: 对于输入的学生成绩,可按照上表分为五个等级判断即可。
17
4.2 if 语句
18
4.2 if 语句 4.2.2 if语句的嵌套 if语句中的子语句1或子语句2还可以是if语句,这称为if语句的嵌套。
注意:else总是与前面最近的if配对。 一般形式如下: if(表达式1) if(表达式11) 语句11; else 语句12; else if(表达式2) 语句21; else 语句22;
19
4.2 if 语句 注意区别以下两种if语句结构: (1) if(表达式1) (2) if(表达式1)
语句11; 语句11;} else 语句12; else 语句12; 关键是弄清楚else与if的配对情况 问:第(1)种情况else与哪个if配对? 第(2)种情况else与哪个if配对? 答:第(1)种情况else与第2个if配对 第(2)种情况else与第1个if配对
20
4.2 if 语句 【例4.6】按表输入三个整数a、b、c,分析运行结果。 #include “stdio.h” void main()
{ int a,b,c; int result11=0,result12=0, result21=0,result22=0; scanf(“%d,%d,%d”,&a,&b,&c); if(a>b) /*第(1)种if语句的嵌套*/ if(b>c) result11=a*b*c; else result12=a+b+c; printf(“The result11 is: %d\n”,result11); printf(“The result12 is: %d\n”,result12); if(a>b) /*第(2)种if语句的嵌套*/ { if(b>c)result21=a*b*c;} else result22=a+b+c; printf(“The result21 is: %d\n”,result21); printf(“The result22 is: %d\n”,result22); }
21
4.2 if 语句 本程序的执行结果数据如下所示: 分析一下输入、输出数据的特点。 输入数据 对应的赋值 result11 result12
2,6, a=2;b=6;c= 2,8, a=2;b=8;c= 8,2, a=8;b=2;c= 6,2, a=6;b=2;c= 6,8, a=6;b=8;c= 8,6, a=8;b=6;c= 分析一下输入、输出数据的特点。
22
4.3 多分支选择语句(switch语句) switch语句的一般形式: switch(表达式) {
case 常量表达式1: 语句组1;break; case 常量表达式2: 语句组2;break; ┇ ┇ case 常量表达式n: 语句组n; break; [default: 语句组n+1;] }
23
4.3 多分支选择语句(switch语句) 执行过程:先求解表达式的值,然后与与后面各常量表达式比较,若与表达式i的值相同,则执行相应语句组i(i为1……n)。[若与常量表达式的值都不相同时,执行default后的语句组n+1]。动画演示如下:
24
4.3 多分支选择语句(switch语句) 【例4.7】 根据输入的成绩等级A,B,C,D来对应输出相应的说明:“superexcellence(优秀)”,“excellence(良好)”,“middling(中等)”和“pass(及格)”,其它输入都为“failure(不及格)”。
25
4.3 多分支选择语句(switch语句)
26
4.3 多分支选择语句(switch语句) 相关说明: (1) case后面所有的常量表达式与switch后面表达式的值类型相同。
(2) 语句组可以是多个语句组成的,但不需要用大括号括起来。 (3) 如果case后面没有break语句,程序会继续执行后面case后语句组。 (4) 注意case和常量表达式之间要有空格。 (5) Default子句可以省略,case和default子句的出现次序是任意的。
27
4.3 多分支选择语句(switch语句) 【例4.8】 对于输入的成绩等级A和B,相应输出为“良好”,C和D 对应着“及格”,其它输入都为“不及格”。 程序代码如下: #include “stdio.h” void main() { char grade; printf(“Please input the grade of score:\n”); scanf(“%c”,&grade); printf(“The information of %c is :”,grade); switch(grade) { case ‘A’: case ‘B’: printf(“excellence \n”);break; /*A,B对应“良好”*/ case ‘C’: case ‘D’: printf(“pass \n”);break; /*C,D对应“及格”*/ default: printf(“failure \n”); /*其它为“不及格”*/ }
28
4.3 多分支选择语句(switch语句) 【例4.9】 将下列程序与4.8对比分析,什么情况下会出现相同与不同的情况。 程序代码如下:
#include “stdio.h” void main() { char grade; printf(“Please input the grade of score:\n”); scanf(“%c”,&grade); printf(“The information of %c is :”,grade); switch(grade) { case ‘A’: printf(“superexcellence \n”); case ‘B’: printf(“excellence \n”);break; case ‘C’: printf(“middling \n”); case ‘D’: printf(“pass \n”);break; default : printf(“failure \n”); } 注意:从例4.8和例4.9的区别和联系,重点关注break的用法和作用。
29
4.4 程序综合举例 【例4.11】判断输入的某一年是否是闰年,将结果输出。 提示:符合下列任一条件的年份为闰年,其它年份都不是闰年。
(1)该年份能被4整除,但不能被100整除; (2)该年份能被400整除。 解题思路:判断所输入的年份是否为闰年,只要满足(1)或(2)中的任意一条,该年份便为闰年,否则该年份不是闰年。仔细分析这两个条件,实际上就是三个数的整除问题,即是否能够被4、100、400整除,程序分别用flag1、flag2和flag3来表示。
30
4.4 程序综合举例 程序代码如下: #include “stdio.h” void main() { int year;
int flag1, flag 2, flag 3; printf(“Please input a year:\n “); scanf(“%d”,&year); /*输入年份*/ flag1=((year%4)==0); /*判断年份是否能被4整除*/ flag2=((year%100)==0); /*判断年份是否能被100整除*/ flag3=((year%400)==0); /*判断年份是否能被400整除*/ if((flag1&&(!flag2)||( flag3)) /*判断年份是否为闰年*/ printf(“%d year is a leap year!\n”,year); else printf(“%d year is not a leap year!\n”,year); }
31
4.4 程序综合举例 运行结果如下: Please input a year: 1600↙
1600 year is a leap year! 1902↙ 1902 year is not a leap year!
32
4.4 程序综合举例 【例4.12】输入一个无符号短整数和进制代号(d—十进制、0—八进制、x—十六进制),然后将数进制代号要求输出。
程序代码如下: #include “stdio.h” void main() { unsigned short x; char c; scanf(“%d,%c”,&x,&c); /*输入一个无符号整数和进制代号*/ switch(c) /*判断对应的进制代号*/ { case 'd': printf(“%d\n”,x); /*进制代号为d,输出对应十进制数*/ break; case 'o': printf(“%o\n”,x); /*进制代号为o,输出对应八进制数*/ case 'x': printf(“%x\n”,x); /*进制代号为x,输出对应十六进制数*/ break; default: printf(“Input error!\n”); /*进制代号错误提示*/ } }
33
4.4 程序综合举例 运行结果如下: 6,d↙ 6 6,o↙ 6,x↙ 6,c↙ Input error! 26,d↙ 26 26,o↙
32 26,x↙ 1a
34
4.4 程序综合举例 【例4.13】对于输入的三个数值:x,y和z,判断它们可否构成一个三角形,若它们可以构成一个三角形,则输出该三角形的周长和面积。 解题思路:三角形三条边的边长之间的关系是:“两边之和大于第三边,两边之差小于第三边”可构成三角形。 边长分别为x,y,z的三角形面积: 其中: 演示该程序执行的过程
35
解题思路:根据一元二次方程ax2+bx+c=0的性质,可知:
4.4 程序综合举例 【例4.14】一元二次方程ax2+bx+c=0的求解问题。 解题思路:根据一元二次方程ax2+bx+c=0的性质,可知: (1)当b2-tac=0,该方程有两个相等的实数根 (2)当b2-tac>0,该方程有两个不等的实数根 (3)当 b2-tac<0, 该方程有两个共轭复根 (4) 若a=0,则该方程不是二元一次方程。 演示该程序执行的过程
36
4.4 程序综合举例 【例4.15】编写能实现下列分段函数的程序,要求:输入x,计算并输出函数y的值(保留2位小数):
37
4.4 程序综合举例 程序代码如下: #include “stdio.h” void main() { float x,y;
printf(“Please input x:”); scanf(“%f”,&x); /*输入x的值*/ if(x==8)y=10; /*x=8时的情形*/ else if(x<8)y=x*x+16; /*x<8时的情形*/ else y=9*x+16; /*x>8时的情形*/ printf(“\n When x=%f, the value of y is:%.2f\n”,x,y); }
Similar presentations