2010年自考医学类工程心理学复习笔记(第4章)_第1页
2010年自考医学类工程心理学复习笔记(第4章)_第2页
2010年自考医学类工程心理学复习笔记(第4章)_第3页
2010年自考医学类工程心理学复习笔记(第4章)_第4页
2010年自考医学类工程心理学复习笔记(第4章)_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

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

文档简介

1、第四章 选择结构程序设计,天津工业大学计算机科学与软件学院,主讲:孙连坤 ,公告,下周二上课改为上机,地点c210,选择结构程序设计,学习的意义,第3章讨论,本章讨论,第5章讨论,在编制程序时,有时并不能保证程序一定执行某些指令,而是要根据一定的外部条件来判断哪些指令要执行。这就是选择结构。程序总是为解决某个实际问题而设计的,而问题往往包含多个方面,不同的情况需要有不同的处理,所以选择结构在我们的实际应用程序中可以说是无处不在,离开了选择结构很多情况将无法处理,因此,正确掌握选择结构程序设计方法对于我们编写实际应用程序尤为重要。,爱我别走,如果你说你不爱我,学习目标,选择结构程序设计,理解选择

2、结构的含义; 掌握关系运算符、逻辑运算符和条件运算符的用法; 掌握关系运算符、逻辑运算符和条件运算符与其它运算符的优先级关系和结合性; 掌握if、switch语句的使用方法。,选择结构程序设计,学习内容,关系运算符、逻辑运算符、条件运算符,关系运算符,关系表达式,用关系运算符连接起来的式子称为关系表达式。 关系表达式的一般形式为:表达式 关系运算符 表达式,关系运算符与关系表达式,关系表达式的值:是逻辑值“真”或“假”,用1和0表示,例 int a=3,b=2,c=1,d,f; ab (ab)=c b+cb f=abc,/表达式值1,/表达式值1,/表达式值0,/d=1,/f=0,例如: c

3、a + b 等价于: a b != c 等价于: a = b c 等价于: a 2 b | c 等价于:,c (a + b),(a b) != c,a = (b c),a = (b c),(a 2) (c + d),(a b = 2; c = 3; 问:d = a != c = a b c;的值?,答:d 的值为1。 等价于:d = (a != c) = (a b) c);,关系运算符、逻辑运算符、条件运算符,关系运算符的优先级,关系运算注意:,关系运算符与关系表达式,例 5278在C中是允许的, 值为,0,例 a0 结果为 A100 结果为,1,0,例 应避免对实数作相等或不等的判断 如 1

4、.0/3.0*3.0=1.0 结果为 可改写为:fabs(1.0/3.0*3.0-1.0)1e-6,0,例 int i = 1, j = 7, a; a = i + (j % 4 != 0); 则a =,2,关系运算符、逻辑运算符、条件运算符,逻辑运算符,逻辑表达式,用逻辑运算符连接起来的式子称为逻辑表达式。 逻辑表达式的一般形式为:表达式 逻辑运算符 表达式,例:a 10 | x -10、!x b=5; !a a b = 5; 问:c = b 3 的值?,答:c 的值为1。 等价于:c = (b 3) ,关系运算符、逻辑运算符、条件运算符,逻辑运算注意:,逻辑表达式求解时,并非所有的逻辑运算

5、符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。,例 a (m = a b) ,关系运算符、逻辑运算符、条件运算符,例 (a=b)?Y:N (x%2=1)?1:0 (x=0)?x:-x (c=a x0,表达式值为a xy?1:1.5 /xy ,值为1.0; xy ,值为1.5,条件运算符优先于赋值运算符,条件运算符可以嵌套,条件运算符是右结合性,总体上讲,单目运算符都是同等优先级的,具有右结合 性,并且优先级比双目运算符和三目运算符都高。 三目运算符的优先级比双目运算符要低,但高于赋值运 算符和逗号运算符。 逗号运算符的优先级最低,其次是赋值运算符。 只有单目运

6、算符、赋值运算符和条件运算符具有右结合 性,其它运算符都是左结合性。 双目运算符中,算术运算符的优先级最高,逻辑运算符 的优先级最低。,到现在为止,我们已经学习了30多个运算符。掌握它们的优先级关系特别重要。优先级的记忆规则:,关系运算符、逻辑运算符、条件运算符,运算符的优先级和结合性,详细内容见附录c,选择结构程序设计,学习内容,选择结构程序设计,选择结构程序设计,简单if语句形式,格式:if (表达式) 语句;,例如:下面的程序段是输入两个整数,输出其中的大数。 int a, b, max; printf (input two numbers: ); scanf (%d%d, ,选择结构程

7、序设计,例如:下面的程序段同样是输出两个整数中的最大数。 int a, b; printf (input two numbers: ); scanf (%d%d, ,if_else形式,格式: if (表达式) 语句1; else 语句2;,选择结构程序设计,if_else_if形式,格式: if(表达式1) 语句1; else if (表达式2) 语句2; else if (表达式3) 语句3; else 语句n;,选择结构程序设计,例如:下面的程序段是判断输入字符的种类。 char c; printf (Enter a character: ); c = getchar ( ); if (

8、c = 0 ,例:体型判断 按“体指数”对肥胖程度进行划分: 体指数t = w / h2 (体重w单位为公斤,身高h单位为米) 当t 18时,为低体重; 当18 t 25时,为正常体重; 当25 t 27时,为超重体重; 当t 27时,为肥胖。 编程从键盘输入你的身高h和体重w,判断你的体重属于何种类型。,选择结构程序设计,#include main() float h, w, t; printf(Please enter h,w:); scanf(%f, %f, ,选择结构程序设计,选择结构程序设计,if语句注意事项,if语句后面的表达式必须用括号括起来 。,表达式通常是逻辑表达式或关系表达

9、式,但也可以是其它 任何表达式,如赋值表达式等,甚至也可以是一个变量。 只要表达式非零时,表达式的值就为真,否则就是假。,if (a = 5) 语句; /表达式的值永远为非0, 所以其后的语句总是要执行的 if (b) 语句; /等价于if (b != 0) 语句;,选择结构程序设计,在if语句的三种形式中,所有的语句应为单个语句,如果要想在 满足条件时执行一组(多个)语句,则必须把这一组语句用 括 起来组成一个复合语句。但要注意的是在之后不能再加分号。,选择结构程序设计,在简单的if语句中(即只有if,没有else),如果在满足条件时 执行的是多条语句,原则上应用括起来,但如果没用括起 来,

10、尽管不会产生编译错误,但程序的逻辑将出现异常。,运行结果:x4,y2,运行结果:x2,y0,选择结构程序设计,在if语句中,如果表达式是一个判断两个数是否相等的关系表 达式,要当心不要将=写成了赋值运算符=。,运行结果:x = 0,运行结果:x != 0,选择结构程序设计,if语句嵌套,选择结构程序设计,例 输入两数并判断其大小关系,#include void main ( ) int x, y; printf (Enter integer x, y: ); scanf (%d, %d, ,运行结果: Enter integer x, y: 12, 23 XY Enter integer x,

11、 y: 12, 12 X=Y,选择结构程序设计,C语言规定,在缺省 时,else总是和它上面离它最近的未配对的if配对,if_else 配对原则,选择结构程序设计,运行结果:a = 0,运行结果:a = 1,选择结构程序设计,例: if (a=b) if(b=c) printf(“a=b=c”); else printf(“a!=b”);,修改: if (a=b) if(b=c) printf(“a=b=c”); else printf(“a!=b”);,实现if else 正确配对方法:加 ,选择结构程序设计,例:考虑下面程序输出结果: void main( ) int x = 100, a

12、 = 10, b = 20; int v1 = 5, v2 = 0; if (a b) if (b != 15) if (!v1) x=1; else if (v2) x = 10; x = -1; printf (“%d”, x); ,结果:-1,一般三角形,不是三角形,等边,等腰,直角 三角形,等腰 直角,判断三角形的类型 P111112习题5.5,作业,选择结构程序设计,switch ( 表达式) case E1: 语句组 1; break; case E2: 语句组 2; break; . case En: 语句组 n; break; default: 语句组n+1 ; break;

13、,switch语句(开关分支语句),功能: 计算switch表达式的值,与case表达式的值比较,等于Ei时,执行语句组,当执行到break语句时,跳出switch语句,转向执行switch语句的下一条语句。若与所有常量表达式值都不相等,执行语句组n+1,然后再执行switch语句的下一条语句。,选择结构程序设计,switch语句执行流程图,选择结构程序设计,使用switch语句注意事项,switch后面的“表达式”,可以是int、char和枚举 型中的一种,但不可为浮点型。,float a, b = 4.0; scanf (%f, ,选择结构程序设计,switch ( i ) case 1:

14、 b = b + 1; break; / 可加可不加 case 2: b = b - 1; break; ,case后面语句(组)可加 也可以不加 , 但一般不加 。,选择结构程序设计,int a, b = 4; scanf (%d, ,每个case后面“常量表达式”的值,必须各不相同, 否则会出现相互矛盾的现象。,选择结构程序设计,每个case后面必须是“常量表达式”,表达式中 不能包含变量。,例:按成绩分成A、B、C、D、E、F几个等级。 char score; printf (Enter Score: ); scanf (%d, ,选择结构程序设计,case后面的“常量表达式”仅起语句标

15、号作用,并不进行条件判断。系统 一旦找到入口标号,就从此标号开始执行,不再进行标号判断,所以必 须加上break语句,以便结束switch语句。,#include void main ( ) char ch; ch = getchar ( ); switch ( ch ) case Y : printf (Yesn); break; case N : printf (Non); break; case A : printf (Alln); break; default : printf (Yes,No or Alln); ,运行结果: No,/假设输入为:N,#include void mai

16、n ( ) char ch; ch = getch ( ); switch ( ch ) case Y : printf (Yesn); break; case N : printf (Non); case A : printf (Alln); break; default : printf (Yes,No or Alln); ,/假设输入为:N,运行结果: No ALL,选择结构程序设计,多个case子句,可共用同一语句(组)。,例:当a的值是1、2、3时,将b的值加2,当a的值是 4、5、6时,将b的值减2。 int a, b = 4; scanf (%d, ,选择结构程序设计,case子

17、句和default子句如果都带有break子句,那么它们之间 顺序的变化不会影响switch语句的功能。,#include void main ( ) char ch; ch = getch ( ); switch ( ch ) case Y : printf (Yesn); break; case N : printf (Non); break; case A : printf (Alln); break; default : printf (Yes,No or Alln); break; ,#include void main ( ) char ch; ch = getch ( ); sw

18、itch ( ch ) case Y : printf (Yesn); break; default : printf (Yes,No or Alln); break; case N : printf (Non); break; case A : printf (Alln); break; ,选择结构程序设计,case子句和default子句如果有的带有break子句,而有的没有带break子 句,那么它们之间顺序的变化可能会影响输出的结果。,#include void main ( ) char ch; ch = getchar( ); switch ( ch ) case Y : prin

19、tf (Yesn); break; case N : printf (Non); break; case A : printf (Alln); break; default : printf (Yes,No or Alln); ,#include void main ( ) char ch; ch = getchar ( ); switch ( ch ) case Y : printf (Yesn); break; default : printf (Yes,No or Alln); case N : printf (Non); break; case A : printf (Alln); b

20、reak; ,/假设输入为:B,运行结果: Yes,No or All,运行结果: Yes,No or All No,/假设输入为:B,选择结构程序设计,switch语句可以嵌套。,void main ( ) int x = 1, y = 0, a = 0, b = 0; switch ( x ) case 1: switch ( y ) case 0: a+; break; case 1: b+; break; case 2: a+; b+; break; case 3: a+; b+; printf (na = %d, b = %d, a, b); ,运行结果: a = 2,b = 1,它

21、们大大增加程序的分支,使逻辑关系显得混乱,不易维护,易出错。,选择结构程序设计,switch和else-if的比较,else-if比switch的条件控制更强大一些,else-if可以依照各种逻辑运算的结果进行流程控制, switch只能进行=判断,并且只能是整数判断。,switch比else-if更清晰,两者都要尽量避免用得过多、过长,尤其不 要嵌套得太多,选择结构程序设计,学习内容,例1: 输入10个字符,统计其中英文字母、数字字符和 其他字符的个数。,选择结构程序设计举例,程序设计思路: 首先定义三个整形变量用于存储英文字母、数字字符和其 他字符的个数。 字符的输入与输出。 逻辑判断是何

22、种字符。 if-else语句实现,选择结构程序设计举例,#include void main() int i, digit, letter, other; char ch; digit = letter = other = 0; printf(“Enter 10 characters: ); for(i = 1; i = a ,运行结果: input 10 characters: Reold 123? letter=5, digit=3, other=2,选择结构程序设计举例,例2:写一程序,从键盘上输入1年份year(4位十进制数), 判断其是否闰年。,程序设计思路: 如果X能被Y整除,则余

23、数为0,即如果X%Y的值等于0,则 表示X能被Y整除! 首先将是否闰年的标志leap预置为0(非闰年),这样仅当 year为闰年时,将leap置为1即可。这种处理两种状态值的 方法,对优化算法和提高程序可读性非常有效。,闰年的条件是:能被4整除、但不能被100整除;能被400整除。,#include void main ( ) int year, leap = 0; / leap=0:预置为非闰年 printf (Please input the year: ); /提示输入年份 scanf (“%d”, ,运行结果: Please input the year: 2008 2008 is a

24、 leap year.,判断是否为闰年,if ( ( year % 4 = 0 ,选择结构程序设计举例,例3:求ax2+bx+c=0方程的解,程序设计思路: 上式实际上应有以下几种可能。 a0,不是二次方程。 b24ac0,有两个相同的实根。 b24ac0,有两个不等的实根。 b24ac0,有两个共轭的复根。,#include #include void main ( ) float a, b,c,disc,x1,x2,realpart,imagpart; /定义系数a,b,c;disc代表b2-4ac;realpart代表实部,imagpart代表虚部 scanf (“%f,%f,%f”,

25、else, disc=b*b-4*a*c; if(fabs(disc)1e-6) /判断b2-4ac0 x1=(-b+sqrt(disc)/(2*a); /求解两个实根 x2=(-b-sqrt(disc)/(2*a); printf(“has distinct real roots:%8.4f and %8.4fn”,x1,x2); else /b2-4ac0 realpart=-b/(2*a); /求解两个虚根 imagpart=aqrt(-disc)/(2*a); printf(“has complex roots:n”); printf(“%8.4f+%8.4fin”,realpart,

26、imagpart); printf(“%8.4f-%8.4fin”,realpart,imagpart); ,运行结果: 1,2,1 The equation has two equal roots:1.0000 1,2,2 The equation has complex roots: -1.0000+1.0000i -1.0000-1.0000i 2,6,1 The equation has distinct real roots:-0.1771 and -2.8229,例4:查询自动售货机中商品的价格 假设自动售货机出售4种商品,薯片(crisps)、爆米花 (popcorn)、巧克力(

27、chocolate)和可乐(cola),售价分别是每份3.0、2.5、4.0和3.5元。在屏幕上显示以下菜单,用户可以连续查询商品的价格,当查询次数超过5次时,自动退出查询;不到5次时,用户可以选择退出。当用户输入编号14,显示相应商品的价格;输入0,退出查询;输入其他编号,显示价格为0。 1 Select crisps 2 Select popcorn 3 Select chocolate 4 Select cola 0 Exit,选择结构程序设计举例,#include void main() int choice, i; float price; for( i = 1; i = 5; i+

28、) printf(1 Select crisps n); printf(2 Select popcorn n); printf(3 Select chocolate n); printf(4 Select cola n); printf(0 exit n); printf(Enter choice: ); scanf(%d, ,1 Select crisps 2 Select popcorn 3 Select chocolate 4 Select cola 0 Exit Enter choice: 1 price = 3.0 1 Select crisps 2 Select popcorn 3

29、 Select chocolate 4 Select cola 0 Exit Enter choice: 7 price = 0.01 Select crisps 2 Select popcorn 3 Select chocolate 4 Select cola 0 Exit Enter choice: 0 Thanks,选择结构程序设计举例,例5:写一程序,从键盘上输入任意两个数和一运算符(+:加,-:减,*:乘,/:除),计算其运算的结果并输出 。,程序设计思路: 首先输入两个数和一运算符号,然后根据运算符号来做相应的运算,但是在做除法运算时,应判别除数是否为0,如果为0,运算非法,给出提

30、示信息。如果运算符号不是+、-、*、/则同样是非法的,也应给出提示信息。其它情况,输出运算的结果。,#include void main ( ) float a, b; /存放两个数的变量 int tag = 0; /运算合法的标志,0-合法,1-非法 char ch; /运算符变量 float result; /运算结果变量 printf (input two number: ); /提示输入两个数 scanf (%f%f, /输入运算符,switch ( ch ) /根据运算符来进行相关的运算 case +: result = a + b; break; /加法运算 case -: res

31、ult = a - b; break; /减法运算 case *: result = a * b; break; /乘法运算 case /: if (!b) /除法运算,判除数是否为0 printf (divisor is zero!n); /显示除数为0 tag = 1; /置运算非法标志 else /除数非0 result = a / b; /计算商 break; default: printf (illegal arithmetic lablen); /非法的运算符 tag = 1; /置运算非法标志 if (!tag) /运算合法,显示运算结果 printf (%.2f %c %.2f

32、 = %.2fn, a, ch, b, result); ,运行结果: input two number: 20 30 input arithmetic lable(+ - * /): + 20.00 + 30.00 = 50.00,例6:已知某公司员工的保底薪水为500,某月所接工程的利润profit(整数)与利润提成的关系如下所示(计量单位:元)。计算员工的当月薪水。,程序设计思路: 首先要定义一个变量用来存放员工所接工程的利润; 其次提示用户输入员工所接工程的利润,并调用scanf函数接受用户输入 员工所接工程的利润; 然后根据上表的规则,计算该员工当月的提成比率。 最后计算该员工当月的

33、薪水(保底薪水+所接工程的利润*提成比率), 并输出结果。,#include void main ( ) long profit; /所接工程的利润 float ratio; /提成比率 float salary = 500; /薪水,初始值为保底薪水500 printf (Input profit: ); /提示输入所接工程的利润 scanf (%ld, /输出结果 ,运行结果: Input profit: 4000 salary = 1100.00,方法一:使用if_else if语句,0.1默认为double型,不进行强制类型转换将产生警告信息!,#include void main (

34、 ) long profit; /所接工程的利润 float ratio; /提成比率 float salary = 500; /薪水,初始值为保底薪水500 printf (Input profit: ); /提示输入所接工程的利润 scanf (%ld, /输出结果 ,运行结果: Input profit: 4000 salary = 1100.00,方法二:使用if语句,方法三:使用switch语句,算法设计要点: 为使用switch语句,必须将利润profit与提成的关系转换成某些整 数与提成的关系。分析本题可知,提成的变化点都是1000的整数倍 (1000、2000、5000、),如果将利润profit整除1000,则当: profit 1000 对应0、1 1000 profit 2000 对应1、2 2000 profit 5000 对应2、3、4、

温馨提示

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

评论

0/150

提交评论