第4章 选择结构程序设计 二分支选择结构 多分支选择结构 P A B 真 假 k A1 A2 Ai An k=k2 k=k1 k=kn

Slides:



Advertisements
Similar presentations
CSIM, PU C Language Introduction to the C Programming Language 重覆敘述 (for,while,break,continue) 適合重複性的計算或判斷.
Advertisements

10.2.switch语句.
5 选择结构.
第4章 选择结构程序设计 选择结构是计算机科学用来描述自然界和社会生活中分支现象的手段。其特点是:根据所给定选择条件为真(即分支条件成立)与否,而决定从各实际可能的不同操作分支中执行某一分支的相应操作,并且任何情况下恒有“无论分支多寡,必择其一;纵然分支众多,仅选其一”的特性。
四种命题 2 垂直.
選擇 運算式 邏輯運算 if指令 流程圖基本觀念 程式註解 巢狀if指令 switch指令.
第五章 选择结构程序设计 信息管理系.
第4章 选择结构程序设计 在现实生活中,需要进行判断和选择的情况是很多的 如果你在家,我去拜访你 如果考试不及格,要补考
C语言程序设计 第十二章 位运算.
程序设计基础.
C语言程序设计 第五章 选择结构程序设计.
第4章 选择结构程序设计.
高级语言程序设计 主讲人:陈玉华.
C#程序设计基础 $5 流程控制.
第2章 分支结构 P if语句 2.2 switch语句 2.3 用条件运算符转换大小写字母 2.4 程序举例
循环结构又称为重复结构:用来处理需要重复处理的问题,它是程序中一种很重要的结构。
Class 2 流程控制-選擇敘述與迴圈.
第4章 选择结构程序设计 4.1 选择结构和条件判断 4.2 用if语句实现选择结构 4.3关系运算符和关系表达式
第4章 选择结构程序设计 4.1 选择结构和条件判断 4.2 用if语句实现选择结构 4.3关系运算符和关系表达式
C程序设计.
第五章 选择结构程序设计 一、关系运算符和表达式 1、关系运算符 在程序中经常需要比较两个量的大小关系, 以决定程序下一步
第3章 C语言的基本语句 和程序结构设计.
QQ: 李祥 QQ: 欢迎多种方式的学习交流,祝大家学有所成.
走进编程 程序的顺序结构(二).
第4章 选择结构程序设计 4.1 关系表达式和逻辑表达式 关系表达式 1.关系运算符 关系运算符是比较两个操作数大小的符号。
QQ: 李祥 QQ: 欢迎多种方式的学习交流,祝大家学有所成.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
Chap 3 分支结构 3.1 简单的猜数游戏 3.2 四则运算 3.3 查询自动售货机中商品的价格.
C语言 程序设计基础与试验 刘新国、2012年秋.
Chap 3 分支结构 3.1 统计输入的一批字符中各类字符的数量 3.2 查询自动售货机中商品的价格 3.3 分支结构程序设计.
第3章 程序设计初步 第4章 函数与预处理 第5章 数组 第6章 指针 第7章 自定义数据类型
第3章 选择结构与循环结构 王德俊 上海交通大学继续教育学院.
第二章 Java语言基础.
第三章 顺序结构程序设计 主讲教师 贾月乐 电话:
2.1 C语言的数据类型 2.2 常量与变量 2.3 变量赋初值 2.4 各类数值型数据间的混合运算 2.5 C语言的运算符和表达式
第4章 顺序程序设计.
第四章 选择结构程序设计 计算机科学学院.
第4章 PHP流程控制语句.
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
2.6 直角三角形(二).
相似三角形 石家庄市第十中学 刘静会 电话:
第 二 章 数据类型、运算符与表达式.
Main() { Dfas Asdfasf fasdfa } #include <stdio.h> void main( ) {
函数 概述 模块化程序设计 基本思想:将一个大的程序按功能分割成一些小模块, 特点: 开发方法: 自上向下,逐步分解,分而治之
目录 4.1选择结构程序设计的概述 4.2关系运算符和表达式 4.3逻辑运算符和表达式 4.4用if语句实现选择结构程序设计
C语言程序设计 第一章 数据类型, 运算符与表达式 第二章 顺序程序设计 第三章 选择结构程序设计 第四章 循环控制 第五章 数组.
浙江长征职业技术学院—计算机与信息技术系—相方莉制作
C程序设计.
《计算机应用基础》 第9章 程序设计基础(二).
几种基本语句 条件语句 广州市63中 岑光.
第4章 选择结构程序设计 要设计选择结构程序,要考虑两个方面的问题:一是在C语言中如何来表示条件,二是在C语言中实现选择结构用什么语句。
第九节 赋值运算符和赋值表达式.
第四章 选择结构程序设计 计算机科学学院.
学习目标 1、了解基本运算符 2、运算符优先级.
第3章 最简单的C程序设计 3.1 顺序程序设计举例 3.2 数据的表现形式及其运算 3.3 C语句 3.4 数据的输入输出.
本节内容 指针类型.
第五章 逻辑运算和判断选取控制 §5.1 关系运算符和关系表达式
第四章 分支结构的C程序设计 4.1 if语句 4.2 switch语句 4.3 程序举例.
第二章 Java基本语法 讲师:复凡.
目录 12.1 位运算符 12.2 位域(位段) 1.
选择结构又称为分支结构。 在选择结构程序设计中,根据条件的判断情况需要选择不同的语句组执行。 选择结构类型:
多重條件選擇敘述
第三节 数量积 向量积 混合积 一、向量的数量积 二、向量的向量积 三、向量的混合积 四、小结 思考题.
1.2.2条件语句.
C语言基本语句 判断循环.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
本节内容 指针类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
一元一次方程的解法(-).
C语言基础学习 从外行到入门.
Presentation transcript:

第4章 选择结构程序设计 二分支选择结构 多分支选择结构 P A B 真 假 k A1 A2 Ai An k=k2 k=k1 k=kn 第4章 选择结构程序设计 P A B 真 假 二分支选择结构 k A1 A2 Ai An k=k2 k=k1 k=kn k=ki ... 多分支选择结构

§4.1 if 语句 空 语句 表达式 Y N 语句2 语句1 表达式 Y N 4.1.1 if语句的三种形式 1.if(表达式)语句 例:if (x>y) printf("%d",x); 空 语句 表达式 Y N 2.if(表达式)语句 1 else 语句2 语句2 语句1 表达式 Y N 例:if (x>y) printf("%d",x); else printf("%d",y);

N 表达式1 表达式2 语句2 表达式m 语句m 语句n Y …… 语句1 3.if(表达式1) 语句1 else if(表达式2) 语句2 …… else if(表达式m) 语句m else 语句n 例:if (salary>1000) index=0.4; else if (salary>800) index=0.3; else if (salary>600) index=0.2; else if (salary>400) index=0.1; else index=0; N 表达式1 表达式2 语句2 表达式m 语句m 语句n Y …… 语句1

各有一个分号 说明: ⑴ if后面的“表达式”一般为逻辑表达式或关系表达式, 系统对表达式的值进行判断,若为0按“假”处理,若 为非0,按“真”处理。 因此,表达式的类型不限于逻辑表达式,可以是任意的 数值类型(包括整型,实型,字符型,指针型数据)。 如: if(3) printf(“O.K.”); 是合法的。 if('A') printf("%d",'a');是合法的。 如: if (x>0) printf("%f",x); else printf("%f",-x); 各有一个分号 ⑵ 后面两种形式的if语句中,每个else前面有一个分 号,不要错认为是两个语句。

⑶ if 和else后面可以使用复合语句,即用“{}”将n个 语句括起来。 例: if (a+b>c && b+c>a && c+a>b) { s=0.5*(a+b+c); area=sqrt(s*(s-a)*(s-b)*(s-c)); printf("area=%6.2f",area); } else printf("it is not a triangle");

if(a>0) printf("%5.2f\n",a); } 例1.输入一个数,若大于零则输出。 a>0 Y N 输出a 空 main( ) { float a; scanf("%f",&a); if(a>0) printf("%5.2f\n",a); }

if(a>b) { t=a;a=b;b=t; } printf("%5.2f,%5.2f ",a,b); } 例2.输入两个实数,按由小到大次序输出。 方法1: a>b yes no 交换a,b 空 t a b main() { float a,b,t; scanf("%f,%f ",&a,&b); if(a>b) { t=a;a=b;b=t; } printf("%5.2f,%5.2f ",a,b); }

if(a>b) printf("%f,%f\n",b,a); else printf("%f,%f\n",a,b); } 方法2: a>b yes no 输出b,a 输出a,b main() { float a,b; scanf("%f,%f",&a,&b); if(a>b) printf("%f,%f\n",b,a); else printf("%f,%f\n",a,b); }

scanf("%f,%f,%f",&a,&b,&c); if(a>b) { t=a;a=b;b=t;} 例3.输入三个数,按由小到大顺序输出。 t 34 34 a b c 34 12 17 12 17 34 34 main( ) { float a,b,c,t; scanf("%f,%f,%f",&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("%5.2f,%5.2f,%5.2f",a,b,c); }

4.1.2 if语句的嵌套 在 if 语句中又包含一个或多个 if 语句称为 if语句的嵌套。 if ( ) if ( ) 语句1 else 语句2 else if ( ) 语句3 else 语句4 说明:应注意 if 与 else 的对应关系,else总是与它上面最近的 if 配对,若if与 else 的数目不一致,可以加{ }来确定配对关系。 为明确匹配关系,避免匹配错误,强烈建议:将内嵌的if语句,一律用花括号括起来。 内嵌 if 语句 内嵌 if 语句

Y= -1 (X<0) 0 (X=0) 1 (X>0) 例4:有一函数 输入一个X值,输出Y值 main( ) { int x,y; scanf("%d",&x); if(x<=0) if (x= =0) y=0; else y=-1; else y=1; printf("x=%d,y=%d\n",x,y); } x<=0 Y N x= =0 y=0 y=-1 y=1

if (x<0) y= -1; else if (x= =0) y=0; else y=1; y= -1; if (x!=0) if (x>0) y=1; else y=0; y=0; if (x>=0) if (x>0) y=1; else y= -1; { } { }

N s>=90 s>=80 s>=60 Y s>=70 D E A B C 例5 编写程序,根据输入的学生成绩,给出相应的等级。假设等级划分如下: 90~100分 等级为A; 80~89分 等级为B; 70~79分 等级为C; 60~69分 等级为D; 0~59分 等级为E。 N s>=90 s>=80 s>=60 D E Y s>=70 A B C

main() { int s; printf("Enter a score(0-100): "); scanf("%d",&s); printf("score=%d,",s); if (s>=90) printf("grade is A.\n"); else if (s>=80) printf("grade is B.\n"); else if (s>=70) printf("grade is C.\n"); else if (s>=60) printf("grade is D.\n"); else printf("grade is E.\n"); }

4.1.3 由条件运算符构成的选择结构 1. 一般形式:表达式 1 ? 表达式 2 : 表达式 3 2. 执行过程:如果表达式1为真,则条件表达式取表 达式2的值,否则取表达式3的值。 if (a>b) max=a; else max=b; 推广开来,若在if-else语句中,当表达式为“真”和“假”时,都只执行一个赋值语句且给同一个变量赋值时,均可以用简单的条件运算符来处理。 max=(a>b)?a:b;

例6:输入一个字符,判断它是否为大写字母,如果是,将它转换成小写字母,如果不是,不转换。然后输出最后得到的字符。 ch大写? Y N ch=ch+32 ch=ch main( ) { char ch; scanf("%c",&ch); ch=(ch>= 'A '&& ch<= 'Z ')?(ch+32):ch; printf("%c",ch); }

§4.2 switch语句 一.一般形式: switch (表达式) { case 常量表达式1:语句1 case 常量表达式2:语句2    case 常量表达式n:语句n default :语句n+1 } ……

二.说明: (1) switch后面括弧内的“表达式”,可以是任意类型的 表达式。 (2) 当表达式的值与某一个case后面的常量表达式 的 值相等时,就执行此case 后面的语句,若所有的 case 中的常量表达式的值都没有与表达式的值匹 配的,就执行default后面的语句。 (3) 每一个case 的常量表达式的值必须互不相同,否 则就会出现互相矛盾的现象。 (4) 各个case的出现次序不影响执行结果。

(5) 多个case可以供用一组执行语句。如: case 'A ': case 'B ': case 'C ':printf(">60\n"); (6) 执行完一个case 后面的语句后,流程控制转移到 下一个case 继续执行。 “case常量表达式”只是起 语句标号的作用,并不是在该处进行条件判断。

switch(grade) { case 'A': printf("85~100\n"); case 'B': printf("70~84\n"); case 'C': printf("60~69\n"); case 'D': printf("<60\n"); default : printf("error\n"); } break; break; break; break; 若grade='A' , 则输出结果为: 85~100 若grade=' A ' ,则将输出: 85~100 70~84 60~69 <60 error break语句可以使流程跳出switch结构,继续执行switch语句下面的语句

{ case 常量表达式1:语句组1; break; case 常量表达式2:语句组2; break; 三、完整的switch语句形式: switch (表达式) { case 常量表达式1:语句组1; break; case 常量表达式2:语句组2; break;    case 常量表达式n:语句组n; break; [default :语句组; [break;]] } …… 系统一旦找到入口标号,就从此标号开始执行,不再进行标号判断,所以必须加上break语句,以便结束switch语句。

执行过程: switch 表达式 语句组1 语句组2 语句组n 语句组 …... E 1 E 2 En default case

根据score确定分数段t=score/10 例7. 给一百分制成绩,要求输出成绩等级'A','B','C','D','E'。90分以上为'A' ,80-89分为'B',70-79分为'C',60-69分为'D',60分以下为'E'。 根据score确定分数段t=score/10 grade =‘A’ =‘B’ =‘C’ grade=‘E’ =‘D’ 8 7 6 5 4 3 2 1 读入学生成绩score score<0 ||score>100 Y N 输出grade 输入数据有误,结束 109

if ((score>100) ¦¦(score<0)) printf("\ndata error\n"); else switch (t) { case 10: case 9 : grade='A';break; case 8 : grade='B';break; case 7: grade='C';break; main( ) {int score,t; char grade; scanf("%d",&score); if ((score>100) ¦¦(score<0)) printf("\ndata error\n"); else { t=score/10; case 6: grade='D' ; break; case 5: case 4: case 3: case 2: case 1: case 0: grade='E' ; } printf("%d,%c\n",score,grade); } }

if ((score>100) ¦¦(score<0)) printf("\ndata error\n"); else main( ) {int score,t; char grade; scanf("%d",&score); if ((score>100) ¦¦(score<0)) printf("\ndata error\n"); else { t=score/10; switch (t) { case 10: case 9 : grade='A';break; case 8 : grade='B';break; case 7: grade='C';break; case 6: grade='D' ; break; default: grade='E' ; } printf("%d,%c\n",score,grade);

§4.3 程序举例 例1.任给三角形的三边,判断该三角形是等边、等腰、直角或一般。 分析: 用变量a, b, c表示三角形三条边的长 §4.3 程序举例 例1.任给三角形的三边,判断该三角形是等边、等腰、直角或一般。 分析: 用变量a, b, c表示三角形三条边的长 a,b,c 构成三角形? 真 a,b,c相等 存在两边相等 等边三角形 存在两边和的平方等于第三边的平方 直角 三角形 假 一般 不能构成三角形 等腰三角形

#include "math.h" main( ) { int a,b,c; scanf("%d%d%d",&a,&b,&c); if(a+b>c && b+c>a && c+a>b) {if(a= =b&&b= =c) printf(“等边三角形\n"); else if(a= =b ¦¦ b= =c ¦¦ a= =c) printf(“等腰三角形\n"); else if(a*a+b*b= =c*c ¦¦ a*a+c*c= =b*b ¦¦ b*b+c*c= =a*a) printf(“直角三角形\n"); else printf(“一般三角形\n"); } else printf(“输入错误!\n");

例2. 写程序,判断某一年是否闰年。 Y N leap=0 leap=1 leap 输出“闰年” 输出“非闰年” 例2. 写程序,判断某一年是否闰年。 闰年的条件是符合下面二者之一: 1.能被4整除,但不能被100整除; 2.能被400整除。 year被4整除 Y N year被100整除 leap=0 leap=1 year被400整除 leap 输出“闰年” 输出“非闰年”

方法1:if 语句的嵌套 main( ) { int year,leap; scanf("%d",&year); 输出“闰年” 输出“非闰年” main( ) { int year,leap; scanf("%d",&year); if ( year%4= =0 ) if ( year%100= =0) if ( year%400 = =0) leap=1; else leap=0; else leap=1; else leap=0; if (leap) printf("%d is a leap year .\n ",year); else printf("%d is not a leap year .\n ",year); }

else if ( year%100 !=0) leap=1; else if ( year%400 !=0) leap=0; N year被100整除 leap=0 leap=1 year被400整除 leap 输出“闰年” 输出“非闰年” 方法2:if 语句的第三种形式 main( ) { int year,leap; scanf("%d",&year); if ( year%4 !=0 ) leap=0; else if ( year%100 !=0) leap=1; else if ( year%400 !=0) leap=0; else leap=1; if (leap) printf("%d is ",year); else printf("%d is not",year); printf("a leap year .\n"); }

方法3:逻辑表达式关系表达式的应用 符合闰年的条件是下列两者之一: 1、能被4整除,但不能被100整除 2、能被4整除,又能被100整除 year%4==0 && year%100!=0 || year%400==0 main( ) { int year; scanf("%d",&year); if ( year%4==0 &&year%100!=0 || year%400==0 ) printf("%d is a leap year!\n",year); else printf("%d is not a leap year!\n",year); }

例3: 求 方程的解 有以下几种可能: 1. ,不是二次方程。否则 2. ,有两个相等实根。 3. ,有两个不等实根。 4. ,有两个共轭复根。

Y N 输出非二次方程 输出两 个相等 的实根: 输出两个实根: x1,x2 输出两个复根: p+qi, p-qi 计算复数的实部和虚部 实部: 虚部: Y N 输出非二次方程 输出两 个相等 的实根: 输出两个实根: x1,x2 输出两个复根: p+qi, p-qi

#include "math.h" main( ) {float a,b,c,disc,x1,x2,p,q; scanf("%f,%f,%f",&a,&b,&c); disc=b*b-4*a*c; if (fabs(a)<=1e-6) printf("no\n"); else if (fabs(disc)<=1e-6 ) printf("%8.4f\n",-b/(2*a)); else if (disc>1e-6 ) { x1=(-b+sqrt(disc))/(2*a); x2=(-b-sqrt(disc))/(2*a); printf("%8.4f and %8.4f\n",x1,x2);}

else { p=-b/(2*a); q=fabs(sqrt(-disc)/(2*a)); printf("%8.4f+%8.4f i \n", p, q); printf("%8.4f-%8.4f i \n", p, q); }

例4 已知某公司员工的保底薪水为500,某月所接工程的利润profit(整数)与利润提成的关系如下(计量单位:元): 求员工这一个月的工资。

算法设计要点: 为使用switch语句,必须将利润profit与提成的关系,转换成某些整数与提成的关系。 分析本题可知,提成的变化点都是1000的整数倍(1000、2000、5000、……),将利润profit整除1000,引入grade=profit/1000,则当: profit≤1000 grade 对应0、1 1000<profit≤2000 对应1、2 2000<profit≤5000 对应2、3、4、5 5000<profit≤10000 对应5、6、7、8、9、10 10000<profit 对应10、11、12、…… 为解决相邻两个区间的重叠问题,最简单的方法就是:利润profit先减1,然后再整除1000即可 grade= (profit – 1) / 1000;

profit≤1000 grade 对应0 1000<profit≤2000 对应1 2000<profit≤5000 对应2、3、4 5000<profit≤10000 对应5、6、7、8、9 10000<profit 对应10、11、12、…… 程序如下: main() {long profit; int grade; float salary=500; printf("Input profit: "); scanf("%ld", &profit); grade= (profit – 1) / 1000;

switch(grade) { case 0: break; case 1: salary += profit*0.1; break; case 2: case 3: case 4: salary += profit*0.15; break; case 5: case 6: case 7: case 8: case 9: salary += profit*0.2; break; default: salary += profit*0.25; } printf("salary=%.2f\n", salary);