第5章_选择_第1页
第5章_选择_第2页
第5章_选择_第3页
第5章_选择_第4页
第5章_选择_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

,第五讲,选择结构程序设计,主要内容,5.1 关系运算符和关系表达式 5.2 逻辑运算符和逻辑表达式 5.3 if语句 5.4 switch语句 5.5 程序举例,5.1 关系运算符和关系表达式,(一).关系运算符及其优先次序 (大于) = (大于或等于) = (等于) != (不等于),说明: 关系运算符的优先级低于算术运算符 关系运算符的优先级高于赋值运算符,5.1 关系运算符和关系表达式,(二).关系表达式 用关系运算符将两个表达式(可以是算术表达式或 关系表达式,逻辑表达式,赋值表达式,字符表达式) 接起来的式子,称关系表达式 例: ab, a+bb+c, (a=3)(b=5), ab)(bb”的值为“真”,表达式的值为1。,C语言中没有专用的逻辑值,1代表真,0代表假,5.2 逻辑运算符和逻辑表达式,(一).逻辑运算符及其优先次序 & (逻辑与) 相当于其他语言中的AND | (逻辑或) 相当于其他语言中的OR ! (逻辑非) 相当于其他语言中的NOT 例:a&b 若a,b为真,则a&b为真。 a|b 若a,b之一为真,则a|b为真。 !a 若a为真,则!a为假。,优先次序: !(非) - &(与) - |(或) 逻辑运算符中的“&”和“|”低于关系运算符,“!”高于算 术运算符,5.2 逻辑运算符和逻辑表达式(续),(二)逻辑表达式 用逻辑运算符将关系表达式或逻辑量连接起来的式子就 是逻辑表达式 逻辑表达式的值应该是一个逻辑量“真”或“假”。,例:设a=4,b=5: !a 的值为0 a&b 的值为1 a|b 的值为1 !a|b 的值为1 4&0|2 的值为1,任何非零的数值被认作“真”,5.2 逻辑运算符和逻辑表达式(续),例:5 3 & 8 4 - !0 自左向右运算,1&0逻辑值为0,83逻辑值为0,4-1值为3,!0逻辑值为1,53逻辑值为1,表达式值为0,在逻辑表达式的求解中,并不是所有的逻辑运算符都要被执行。 (1) a&b &c 只有a为真时,才需要判断b的值,只有a和b都为真时,才需要判断c的值。 (2) a|b|c 只要a为真,就不必判断b和c的值,只有a为假,才判断b。a和b都为假才判断c,5.2 逻辑运算符和逻辑表达式,练习:以下程序片段的执行结果? 例: int a=1, b=2, c=3, d=4, m=2, n=2; (m=ab) ,由于“ab”的值(1d”不被执行,因此n的值仍保持原值2 而不是0。,例: int a=1, b=2, c=3, d=4, m=2, n=2; (m=ab) ,答 (year%4=0&year%100!=0)|year%400=0 案 值为真(1) 是闰年,否则为非闰年。,程序包括: 对数据的描述 指定数据的类型、组织形式,即数据结构。 对操作的描述 即操作步骤,也称算法(algorithm)。 数据是操作的对象,操作的目的是对数据进行加工以 得到期望的结果。,著名计算机科学家沃思(Nikilaus Wirth)提出:,算 法 的 概 念 为解决问题而采取的方法和步骤,称为“算法”。 对同一问题,可有多种算法,尽量采用简单、有效的算法。,保证算法正确 考虑算法的质量,本书所考虑的只限于计算机能执行的算法。,算法必备条件:,详见课本第二章,计算机算法分两类: 数值算法 目的是求数值解。人们对数值运算算法的研究比较深入,对各种数值运算都有比较成熟的算法可供选用。常常把这些算法汇编成册(写成程序形式),或者将这些程序存放在磁盘上,供用户调用。,非数值算法,非数值运算涵盖面很广,常用于事务管理领域。目前,计算机在非数值运算方面的应用远多于在数值运算方面的应用。,非数值运算种类繁多,要求各异,难以规范化,因此只能对一些典型的非数值运算算法(例如排序算法)作比较深入的研究。其他的非数值运算问题,往往需要使用者参考已有的类似算法重新设计解决特定问题的专门算法。 通过对一些典型算法的学习,同学们应学会怎样进行算法设计,包括: 如何提出问题 如何思考问题 如何表示一个算法,算法的特性 一个算法应具有以下特点: 1.有穷性 一个算法应包含有限步操作。并且还应该“在合理的范围 之内”。究竟什么算“合理限度”,并无严格标准,由人们的 常识和需要而定。 2.确定性 算法中的每一个步骤都应当是确定的,而不应当是含糊的、 模棱两可的。,3.有零个或多个输入 所谓输入是指在执行算法时需要从外界取得的必要的信息。 一个算法也可以没有输入。 4.有一个或多个输出 算法的目的是为了求解,“解” 就是输出。没有输出的算法 是没有意义的。 5.有效性 算法中的每一个步骤都应能有效地执行,并得到确定的结 果。,怎样表示一个算法 自然语言表示 传统流程图表示 N-S流程图表示 伪代码表示 计算机语言表示,1 用自然语言表示算法 优点:通俗易懂 缺点:文字冗长, 容易出现“歧义性”。不方便描述包含分 支和循环的算法。 2 用流程图表示算法 是指用一些图框来表示算法中的各种操作。 美国国家标准化协会ANSI(American National Standard Institute)规定了一些常用的流程图符号。,图 2.3,对给定的条件进行判断,根据判断结果决定其后的操作, 单入口,双出口,见图2.4,连接画在不同地方的流程线,避免流程图交叉或过长。数字相同的连接点表示同一个点,见图2.5,图 2.4 菱形框示意图 图 2.5 连接点示意图,传统流程图的构成: 操作框 (起止、I/O、判断、处理、注释) 流程线 (箭头表示执行顺序) 文字说明 传统流程图的优缺点: 优点:直观,逻辑关系明确,易于理解。 缺点:占用篇幅多,表示复杂算法时,费时费力。,3 三种基本结构和改进的流程图 1. 传统流程图的弊端 对流程线的使用无限制,使流程毫无规律。 难以保证算法可靠性和可维护性。 那么,如何表示分支和循环这些非顺序的流程呢? 人们规定出几种基本结构,由这些基本结构顺序排列 组成一个算法,从而保证了算法的质量。,2. 三种基本结构 1966,Bohra和Jacopini提出以下三种结构。 (1) 顺序结构; (2) 选择结构,又称分支结构; (3) 循环结构,又称重复结构,分两类: 当(While)型循环结构 直到(Until)型循环结构,2.4.4 用N-S流程图表示算法 1973年美国学者I.Nassi和B.Shneiderman提出了N-S结构 流程图。 N-S流程图由三种基本结构顺序组合而成,无流程线。,顺序结构,选择结构,*,A或B,可以是一个简单操作,也可以是3个 基本结构之一。,当型循环,直到型循环,程序结构(1): 顺序结构,顺序结构的特点是按照语句出现的先后顺序执行程序,如c语言中的输入输出操作和赋值操作。,B,A,N S 图,传统流程图,一、顺序结构,B,A,程序结构(2): 选择结构程序设计(分支),条件语句( if ) 开关语句 ( switch ),B,N,A,Y,条 件P,分支结构(选择结构),5.3 选择结构,选择结构:从若干个可选操作中选择部分操作来执行 使用关键字 if - else来进行判断,5.3 选择结构:从若干个可选操作中选择部分操作来执行,一.if语句的三种基本形式 . 简单分支(单分支) 格式:if(表达式) 语句; 例: if (xy) printf(“%d”,x);,if(xy),1,0,printf(“%d”,x);,5.3 if语句(续),双分支: 格式:if (表达式) 语句; else 语句 2; 例: if (xy) printf(“%d”,x); else printf(“%d”,y);,5.3 if语句(续),(3)多分支 格式: if(表达式1)语句1 else if(表达式2)语句2 else if(表达式3)语句3 else if(表达式m)语句m else 语句n,if(),1,0,1,0,1,0,if(),if(),语句1,语 句 2,语句 3,语句 4,5.3 if语句(续),例: if (number500)cost=0.15; else if(number300)cost=0.10; else if(number100)cost=0.075; else if(number50)cost=0.05; else cost=0;,练习1: 输入两个整数,按由小到大的顺序输出这两个数。,算法1 输入两个整数a,b 比较两个数的大小 如果ab, 交换a、b的值 输出a、b的值,练习1: 输入两个整数,按由小到大的顺序输出这两个数。,算法2 输入两个整数a,b 比较两个数的大小 如果ab,输出b 、 a的值 否则输出a、b的值,#include “stdio.h“ int main() int a, b, temp; puts(“input two integer:“); scanf(“%d%d“, ,以下程序是否正确,5.3 if语句(续),例5.2 输入三个数a,b,c,要求按由小到大的顺序输出。,if ab 将a和b对换 if ac 将a和c对换 if bc 将b和c对换,5.3 if语句(续),#include void main ( ) float a,b,c,t; scanf(“%f,%f,%f”, ,实现a和b互换示意图:,5.3 if语句(续),二.if语句的嵌套 在if语句中又包含一个或多个if语句称为if语句的嵌套。 形式: if() if() 语句1 else 语句2 else if() 语句3 else 语句4,内嵌if,5.3 if语句(续),匹配规则: Else总是与它上面的,最近的,同一复合语句中的,未配 对的if语句配对。,例: if() if() 语句1 else if() 语句2 else 语句3,例: if() if() 语句1 else if() 语句2 else 语句3,当if和else数目不同时,可以加花括号来确定配对关系。,5.3 if语句(续),-1 (x0) 算法1: 算法2: 输入x 输入x 若x0,则y=1 若x=0,则y=0 输出y 若x0,则y=1 输出y,5.3 if语句(续),#include void main() int x,y; scanf(“%d”, ,5.3 if语句(续),上例中的程序段有四个,请判断哪个是正确的? 程序1: 程序2: if(x=0) y=-1; if(x0) 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(x0) y=1; if(x0) y=1; else y=0; else y=-1;,5.3 条件运算符,格式: 表达式 ? 表达式 表达式 功能: 判断表达式1的值,如果成立就执行表 达式2,否则就执行表达式3 使用场合:若在if语句中,当被判别的表达式的 值为“真”或“假” 时,都执行一个赋值 语句且向同一个变量赋值时,可以用 条件运算符来处理。,5.3 if语句(续),例: if() =; else ; 当ab时,将a的值赋给max,当ab时,将b的值赋给max, 无论ab是否满足,都是向同一个变量max赋值。 可以用下面的条件运算符来处理: ()?;,(1)if后面的通常为关系表达式或逻辑表达式,但也可以是其它表达式,如赋值表达式,甚至也可以是一个变量。 例1:if (a=5) 语句;或 if (b) 语句;均为合法用法,(2)if 后的条件判断表达式一定用圆括号括起来,语句之后一定 要用分号。,使用if语句时注意:,(3)三种形式中,所有语句应为单个语句, 若为一组语句一定用 括起来,组成 复合语句。但需注意 后不可用 “;”号。,例如:if (ab) a+; b+; else a=0;b=10;,5.3 if语句(续),编程练习:输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。 (只使用条件运算符) 算法关键:如何判断大写字母?,编程练习:输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。 (只使用条件运算符),#include void main ( ) char ch; printf(“请输入一个字母:“); scanf(“%c“, ,例:,开始,Very good,输入成绩,结束,定义变量x,x 85,84x70,70x60,good,No pass,pass,T,T,F,F,F,T,以下程序是否正确:,#include “stdio.h“ int main() float grade; printf(“ n input grade: “); scanf(“%f“, ,#include “stdio.h“ void main() float grade; printf(“ n input grade: “); scanf(“%f“, ,#include “stdio.h“ void main() float grade; printf(“ n input grade: “); scanf(“%f“, ,5.4、Switch 语句(开关语句),多路选择 switch语句是多分支选择语句,可用嵌套的if语句处理,但降低了可读性。 当分支数大于三种时,常采用开关语句简化程序设计。,5.4 switch语句,switch语句的格式: (表达式) 常量表达式:语句 常量表达式:语句 常量表达式:语句 :语句 ,5.4 switch语句,例: 要求按照考试成绩的等级输出百分制分数段,用 switch语句实现: () (); (); (); (); (); ,使用switch语句需注意:,1、csae后面的各常量表达式的值不能相同。一般为整型、字符型或枚举型。每个csae后面的常量表达式类型应与switch后括号内表达式类型一致 2、程序执行到switch语句时,先计算表达式的值,再自上而下寻找与该值匹配的csae常量,找到后则执行此csae后的语句。 对后续csae直接执行,不再进行判断,直到遇break语句或 右花括号为止。 3、若 case后面的语句省略不写,则表示它与后续case执行相同的语句。,4、 csae后面的 常量表达式不能用一个区间表示,也不能出现 任何运算符。 例: csae 90=score=100:语句; case 90100:语句;,5、case后面可以有多个语句 。 6、各case和default子句的先后顺序可随意。从执行效率的角度出发,通常将发生频率教高的情况放在前面。 default子句可以省略 7、常量表达式仅起一个语句标号作用。 8、switch语句和 break语句配合才构成真正意义上的分支。 break语句的作用是跳出switch结构。,已知年月日,编程计算该天是这一年的第几天?,算法 1)从键盘中输入年、月、日 2) 判断是否是闰年? 3) 判断年份? 4) 输出天数,#include int main() unsigned int y,m,d,n; int f; printf(“input y.m.d: “); scanf(“%d.%d.%d“, ,switch (m-1) case 11: n+=344+f; break; case 10: n+=304+f;break; case 9: n+=273+f;break; case 8: n+=243+f;break; case 7: n+=212+f;break; case 6: n+=181+f;break; case 5: n+=151+f;break; case 4: n+=120+f;break; case 3: n+=90+f;break; case 2: n+=59+f;break; case 1: n+=31; printf(“n=%dn“,n);,编程设计一个简单的计算器程序,要求根据用户从键盘输入的表达式: 操作数1 运算符op 操作数2 然后,计算表达式的值,指定的运算符为加(+)、减(-)、乘(*)、除(/),计算器程序,#include main() float a,b; char c; printf(“input expression:a+(-,*,/)b n“); scanf(“%f%c%f“, ,switch和else-if的比较,else-if比switch的条件控制更强大一些 else-if可以依照各种逻辑运算的结果进行流程控制 switch只能进行=判断,并且只能是整数判断 switch比else-if更清晰 两者都要尽量避免用得过多、过长,尤其不要嵌套得太多,它们大大增加程序的分支,使逻辑关系显得混乱,不易维护,易出错,例:输入一个字符,判断其是大/小写字母、数字、控制字符还是其他字符。,#include “stdio.h“ main() char c; printf(“input a character: “); c=getchar(); if(c=0 ,例:,5.5 程序举例(续),例5.7 运输公司对用户计算运费。 路程()越远,每公里运费越低。标准如下: 没有折扣 折扣 折扣 折扣 折扣 折扣 设每公里每吨货物的基本运费为,货物重为,距离为, 折扣为,则总运费的计算公式为: *(),5.5 程序举例(续),分析折扣变化的规律性: 折扣的“变化点”都是的倍数 在横轴上加一种坐标,c的值为s/250。c代表的倍数。 ,无折扣; ,折扣; ,; ,; ,; ,。,5.5 程序举例(续),#include void main ( ) int c,s; float p,w,d,f; scanf(“%f,%f,%d“,switch(c) case 0: d=0; break; case 1: d=2; break; case 2: case 3: d=5; break; case 4: case 5: case 6: case 7: d=8; break; case 8: case 9: case 10: case 11: d=10; break; case 12: d=15; break; ,猜数游戏:在系统中随机生成一个数,从键盘中输入一个数,如果于系统生成的随机数一致,则显示“right”, 不一致,显示”wrong”,并显示是大了,还是小了? 请大家列出程序结构,并编程。,伪随机数函数rand(),rand()函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数, 是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列 数很大的时候,就符合正态公布,从而相当于产生了随机数。 用法: #incl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论