E-mail:tom_lx@126.com QQ:100756 李祥 E-mail:tom_lx@126.com QQ:100756 欢迎多种方式的学习交流,祝大家学有所成
第五章 选择结构 目录 1 2 3 4 5 6 7 口令验证模块的开发 关系运算符和关系表达式 逻辑运行算符与逻辑表达式 if语句 条件运算符 6 switch语句 7 选择结构程序的编写
知识点要求: 技能要求: 教学要求 1 2 1 2 3 关系运算符、逻辑运算符 if语句、switch语句 掌握if语句的三种形式 掌握选择结构的嵌套
5.1 口令验证模块的开发 任务描述: 任务要求: 编写login函数,实现计算器的密码验证功能。 (1)在进入计算器主菜单前,加入一个输入密码的提示。 (2)根据提示输入一个整数密码。 (3)如果密码输入正确,则允许进入计算器主菜单,如果输入不正确,提示“密码输入错误”,不显示主菜单。 。
5.1 口令验证模块的开发 任务分析: 实现口令验证模块,需要以下几个步骤: (1)输入一个口令。 (2)判断该口令是否正确,如果正确,显示菜单部分,如果不正确,提示不正确。 实现以上步骤,要考虑到下面两个问题: (1)如何判断输入的口令与所预设的口令(比如123)是否匹配。 (2)根据口令的匹配情况给出相应的用户回馈信息。
5.1 口令验证模块的开发 任务实现 编写login函数 void login() {int pw; printf("请输入密码:"); scanf("%d",&pw); if (pw==123 || pw==111) {printf("欢迎使用本系统\n"); displayMenu( ); //调用函数 } else printf("密码不正确,不能使用本系统\n"); return; 在主函数中调用login函数
5.1 口令验证模块的开发 涉及知识点 关系运算符—== 逻辑运算符--|| 选择结构—if…else…
5.2 关系运算符和关系表达式 1.关系运算符 C语言提供6种关系运算符: 用来对两个数值进行比较的比较运算符 ① < (小于) ② <= (小于或等于) ③ > (大于) ④ >= (大于或等于) ⑤ == (等于) ⑥ != (不等于) 优先级相同 (高) 优先级相同 (低)
5.2 关系运算符和关系表达式 2.关系、算术、赋值运算符的优先级 算术运算符 (高) 赋值运算符 (低) 关系运算符
5.2 关系运算符和关系表达式 c>a+b 等效于 c>(a+b) a>b==c 等效于 (a>b)==c
5.2 关系运算符和关系表达式 3.关系表达式 用关系运算符将两个数值或数值表达式连接起来的式子 关系表达式的值是一个逻辑值,即“真”或“假” 在C的逻辑运算中,以“1”代表“真”,以“0”代表“假”
5.3 逻辑运算符和逻辑表达式 1.逻辑运算符: &&(逻辑与) ||(逻辑或) !(逻辑非) 其中: &&和||是双目(元)运算符 &&(逻辑与) ||(逻辑或) !(逻辑非) 其中: &&和||是双目(元)运算符 !是一目(元)运算符
5.3 逻辑运算符和逻辑表达式 逻辑运算的真值表 a b ! a ! b a && b a || b 真 假
5.3 逻辑运算符和逻辑表达式 逻辑运算符的优先次序 ! → && → || (!为三者中最高) 与其他运算符的优先次序 ! (高) ! → && → || (!为三者中最高) 与其他运算符的优先次序 ! (高) 算术运算符 关系运算符 && 和 || 赋值运算符 (低)
5.3 逻辑运算符和逻辑表达式 2.逻辑表达式 用逻辑运算符将关系表达式或其他逻辑量连接起来的式子 逻辑表达式的值应该是逻辑量“真”或“假”。 编译系统在表示逻辑运算结果时,以数值1代表“真”,以0代表“假”;但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。 注意:将一个非零的数值认作为“真”
5.3 逻辑运算符和逻辑表达式 (1) 若a=4,则!a的值为0 (2) 若a=4,b=5,则a && b的值为1 (5) 4 && 0 || 2的值为1
5.3 逻辑运算符和逻辑表达式 注意: 在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。例如: ① a&&b&&c 只有a为真(非0)时,才需要判别b的值,只有a和b都为真的情况下才需要判别c的值。只要a为假,就不必判别b和c(此时整个表达式已确定为假)。如果a为真,b为假,则不判别c,整个表达式运算结果为假。 ② a||b||c 只要a为真(非0),就不必判断b和c;只有a为假,才判别b;a和b都为假才判别c。
5.3 逻辑运算符和逻辑表达式 【例5.1】逻辑运算符的应用。 #include <stdio.h> void main( ) { int x=4,y=5,z,m; z=(x++==5) && (++y); printf("z=%d,x=%d,y=%d\n",z,x,y); m=(x++) || (++y); printf("m=%d,x=%d,y=%d\n",m,x,y); return; }
5.3 逻辑运算符和逻辑表达式 【例5.2】 写出以下各题的逻辑表达式。 (1)判断年龄(age)在13至17岁之内 age>=13 && age<=17 (2)判断(age)年龄小于12或大于65 age<12 || age>65
5.3 逻辑运算符和逻辑表达式 (3)判别某一年是否闰年 闰年的条件是符合下面二者之一: ①能被4整除,但不能被100整除,如2008 ②能被400整除,如2000 (year % 4 == 0 && year 100 !=0) || year % 400 == 0
5.4 if语句 1.if语句的一般形式 关系表达式 逻辑表达式 数值表达式 if (表达式) 语句1 [ else 语句2 ] 方括号内的部分为可选的
5.4 if语句 1.if语句的一般形式 if (表达式) 语句1 [ else 语句2 ] 简单的语句 复合语句 另一个if语句等
5.4 if语句 最常用的3种if语句形式: 1. if (表达式) 语句1 (没有else子句) 2. if (表达式) 语句1 else 语句2 (有else子句) 3. if(表达式1) 语句1 else if(表达式2) 语句2 else if(表达式3) 语句3 ┆ else if(表达式m) 语句m else 语句m+1 (在else部分又嵌套了多层的if语句)
分号不能丢 if(number > 500) cost = 0.15; else if (number > 300) cost = 0.10; else if (number > 100) cost = 0.075; else if (number > 50) cost = 0.05; else cost=0; 等价于 if (number > 500) cost = 0.15; else if (number > 300) cost = 0.10; if (number > 100) cost = 0.075; if (number > 50) cost = 0.05; else cost = 0;
【例5.3 】输入两个实数,按由小到大的顺序输出。 5.4 if语句 【例5.3 】输入两个实数,按由小到大的顺序输出。 解题思路: 通过键盘输入两个数a和b,在输出数据之前,使a中存放小的数,b中存放大的数。当输入的数据为a>b时,需要将a和b的值进行交换。 将两个变量进行交换时,要借助于第三个变量,将其中一个变量的值先保存起来再交换。
5.4 if语句 ★ ● 互换前 A B ● ★ 互换后 A B
5.4 if语句 C ★ ★ ● A B
5.4 if语句 C ★ ★ ● A ● B
5.4 if语句 C ★ ● A ● B ★
5.4 if语句 将a和b的值互换 #include <stdio.h> void main() { float a,b,c; scanf("%f,%f",&a,&b); if(a>b) { c=a; a=b; b=c; } printf("%5.2f,%5.2f\n",a,b); 将a和b的值互换 10-12班 11月6日
5.4 if语句 选择结构,用if语句实现 #include <stdio.h> int main() { float a,b,t; scanf("%f,%f",&a,&b); if(a>b) { t=a; a=b; b=t; } printf("%5.2f,%5.2f\n",a,b); return 0; 选择结构,用if语句实现
5.4 if语句 思考: 输入3个数a,b,c,要求按由小到大的顺序输出。 请同学们自行完成! 解题思路:保证a最小,c最大 if a>b,a和b对换 (a是a、b中的小者) if a>c,a和c对换 (a是三者中最小者) if b>c,b和c对换 (b是三者中次小者) 顺序输出a,b,c 请同学们自行完成!
#include <stdio.h> void 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\n",a,b,c); } 将a和b对换 将a和c对换 将b和c对换
【例5.4】猜数游戏:如果猜对,显示“**正确**”否则显示“**错误**”。 5.4 if语句 【例5.4】猜数游戏:如果猜对,显示“**正确**”否则显示“**错误**”。 解题思路: 通过键盘输入一个整数,用变量guess存放,如果输入的数据与程序中给定的数据magic相等,则输出“**正确**”,否则输出“**错误**”。对于两种不同的情况,可用if语句的双分支形式进行判断处理。
5.4 if语句 #include <stdio.h> void main( ) { int magic=123,guess; printf("请输入数据:\n"); scanf("%d",&guess); if (guess= =magic) printf("**正确**\n"); else printf("**错误**\n"); return; }
5.4 if语句 思考:由计算机产生一个随机数magic,与输 入的数据guess进行比较。 提示:随机数可通过rand( )函数获取,将产生的随机数赋给变量magic,语句如下: magic= rand( );
5.4 if语句 注意: ① 在程序中使用rand( )函数,应该在本文件开头写上下面一行:#include <stdlib.h> ② rand函数产生随机数的取值范围为0~32767 间的一个正整数,如果想缩小取值范围,如0~9之间,可使用以下语句: magic=rand()%10; ③产生a~b之间的一个随机正整数,公式为: rand()%(b-a+1)+a ④要使每次运行时产生的随机数都不一样: #include<time.h> srand(time(0));
5.4 if语句 1.if语句的一般形式 else总是与它上面最近的未配对的if配对 内嵌if 在if语句中又包含一个或多个if语句称为if语句的嵌套 一般形式: if( ) if( ) 语句1 else 语句2 else if( ) 语句3 else 语句4 else总是与它上面最近的未配对的if配对 内嵌if
5.4 if语句 【例5.5】有一函数: 编程序,输入x值,要求输出相应的y值。
解题思路:方法1 scanf("%d",&x); if(x<0) y = -1; if(x==0) y = 0; printf("x=%d,y=%d\n",x,y); 解题思路:方法1 (1) 先后用3个独立的if语句处理: 输入x 若 x < 0, 则y =-1 若 x = 0, 则y = 0 若 x > 0, 则y = 1 输出x和y
错 错 解题方法2:用if的嵌套 if(x<0) if(x>=0) y =-1; if(x>0) y=1; 程序1: 程序2: if(x<0) if(x>=0) y =-1; if(x>0) y=1; else else y=0; if(x==0) y=0; else y=-1; else y=1; 程序3: 程序4: y=-1; y=0; if(x!=0) if(x>=0) if(x>0) y=1; if(x>0) y=1; else y=0; else y=-1; 错 错
5.5 条件运算符 当被判别的表达式值为“真”或“假” 时,都执行一个赋值语句且向同一个变量赋值 如:if (a>b) max=a; else max=b; 条件运算符 max = (a > b) ? a : b; 条件表达式
5.5 条件运算符 条件表达式的一般形式为 表达式1?表达式2: 表达式3 执行顺序: 求解表达式1 若为真,则求解表达式2,此时表达式2的值就作为整个条件表达式的值 若表达式1的值为假,则求解表达式3,表达式3的值为整个条件表达式的值
5.5 条件运算符 【例5.6】求一个整数的绝对值。 解题思路: 由流程图可以看出,这是一个双分支的选择结构,两个分支都执行赋值操作,并且给同一个变量赋值。所以,可以用条件运算符来解决问题。
5.5 条件运算符 #include <stdio.h> void main( ) { int t; printf("请输入t的值:"); scanf("%d",&t); t=t>0?t:-t; printf("t的绝对值是:%d\n",t); return; }
5.5 条件运算符 思考题: 输入一个字符,判别是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。输出最后得到的字符。 要求:可以用if语句来实现,也可以用条件表达式来处理。 请同学们自己完成!
5.5 条件运算符 参考代码: #include <stdio.h> void main() {char ch; scanf("%c",&ch); ch=(ch>='A' && ch<='Z‘)?(ch+32):ch; printf("%c\n",ch); return; }
5.6 switch语句 switch语句用来实现多分支选择结构 学生成绩分类 85分以上为’A’级 70~84分为’B’级 …… 人口统计分类 按年龄分为老、中、青、少、儿童
5.6 switch语句 switch语句的作用是根据表达式的值,使流程跳转到不同的语句 switch语句的一般形式: { case 常量1 :语句1 case 常量2 :语句2 ┇ ┇ ┇ case 常量n :语句n default : 语句n+1 } 整型、字符型数据
5.6 switch语句 Switch语句的执行过程: 先计算表达式的值,然后依次与常量表达式i(i=1,2,……n)的值比较,若表达式的值与某个case语句后的表达式i的值相等,则先执行语句i,再依次执行语句i+1,i+2,……语句n+1。若所有case后的常量表达式的值均不与switch后的表达式的值相等,则执行default后语句。
5.6 switch语句 switch语句的作用是根据表达式的值,使流程跳转到不同的语句 switch语句的一般形式: { case 常量1 :语句1 case 常量2 :语句2 ┇ ┇ ┇ case 常量n :语句n default : 语句n+1 } 不能相同
5.6 switch语句 【例5.7】按照成绩的等级输出百分制分数段,A级为85分以上,B级为70~84分,C级为60~69分 ,D级为 60分以下 。成绩的等级由键盘输入。 解题思路: 多分支选择结构 将学生成绩分为4个等级 用switch语句实现 10-12班 11朋8日
#include <stdio.h> void main() { char grade; scanf("%c",&grade); printf("Your score:"); 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("enter data error!\n"); } 分析: 若输入B,程序的运行结果为?
5.6 switch语句 若想在执行某一分支后跳出switch语句,即终止switch语句的执行,可在每个case语句的后面加上一个break语句来达到此目的。 将上例改成如下形式:
#include <stdio.h> void main() { char grade; scanf("%c",&grade); printf("Your score:"); switch(grade) { case 'A': printf("85~100\n");break; case 'B': printf("70~84\n");break; case 'C': printf("60~69\n");break; case 'D': printf("<60\n");break; default: printf("enter data error!\n"); } 值为A 13-15 11月8日
5.6 switch语句 多个case子句可共用同一组执行语句. scanf("%c",&grade); printf("Your score:"); switch(grade) { case 'A': printf("85~100\n");break; case 'B': printf("70~84\n");break; case 'C': printf(“>60\n");break; case 'D': printf("<60\n");break; default: printf("enter data error!\n"); } 多个case子句可共用同一组执行语句. 若输入A,程序的运行结果为?
5.6 switch语句 思考:运行以下程序4次,分别输入1、2、3、5,观察程序的输出结果。 #include<stdio.h> int main() { int i; scanf("%d",&i); switch(i) {case 1: case 2:printf("i="); case 3: printf("%d\n",i);break; default: printf("ok!\n");} return 0; }
5.6 switch语句 项目完善: 编写计算器中selectMenu()函数,实现输入不同的数字,进入不同的运算,如输入1,进入加法,输入2,进入减法等。(见calswitch.c) 分析: (1)要求用户从键盘上输入一个数字。 (2)按照菜单的提示,输入相应的数字后进入对应的运算。 (3)输入的字母无效时,提示输入错误
5.7 选择结构程序的编写 1. 有一分段函数 : 编写程序,输入x的值,输出y的结果(输出y保留两位小数)。 2.输入三个数,按由小到大的顺序输出。
5.7 选择结构程序的编写 3.编写程序,学生单科成绩按下列标准分等(其中x为每个学生的单科成绩) 成绩 等级英文名称 成绩 等级英文名称 x<60 bad 60<=x<80 middle 80<=x<90 good 90<=x excellent 现输入某个学生的单科成绩,请输出他的等级标准。
重点: 难点: 本章小结 1 2 3 1 2 关系运算符、逻辑运算符、条件运算符 if语句、if的嵌套 If语句的嵌套 Switch语句
本章结束!