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

下载本文档

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

文档简介

1、目录3.1 结构化程序设计概述结构化程序设计概述3.2 关系运算符与关系表关系运算符与关系表达式达式3.3 逻辑逻辑运算符与逻辑表运算符与逻辑表达式达式3.4 条件运算符与条件表条件运算符与条件表达式达式3.5 if语句语句3.6 switch语句语句教学目标教学目标理解理解C程序的基本结构程序的基本结构理解基本流程控制结构理解基本流程控制结构掌握掌握C语言语句的分类语言语句的分类掌握掌握if语句的多种使用方法语句的多种使用方法掌握掌握switch语句的用法语句的用法会用流程控制语句解决简单问题会用流程控制语句解决简单问题了解程序的错误类型和调试技术了解程序的错误类型和调试技术数据结构:描述数

2、据的类型及组织形式。数据结构:描述数据的类型及组织形式。算法:描述对指定数据的操作方法和步骤。算法:描述对指定数据的操作方法和步骤。 程序程序 数据结构数据结构 算法算法数据结构是程序的核心数据结构是程序的核心算法是程序的灵魂算法是程序的灵魂程序设计的关键是合理组织数据结构和设计算法程序设计的关键是合理组织数据结构和设计算法顺序结构、选择结构、循环结构:顺序结构、选择结构、循环结构: 3种基本结构的特点:种基本结构的特点: 单入口和单出口单入口和单出口 结构中的每个部分都有可能被执行结构中的每个部分都有可能被执行 结构内不应出现永不终止的循环结构内不应出现永不终止的循环结构化程序设计方法:结构

3、化程序设计方法:用用3种基本算法结构设计程序。种基本算法结构设计程序。E.Dijkstra等人于等人于1972年提出年提出公认的具有公认的具有“良好风格良好风格”的程序设计方法的程序设计方法源于软件危机后,对源于软件危机后,对goto语句的争论语句的争论结构化程序设计方法的理论基础:结构化程序设计方法的理论基础:Bohm、Jacopini证明,解决证明,解决任何问题的算法都可表示为顺序结构、选择结构和循环结构的任何问题的算法都可表示为顺序结构、选择结构和循环结构的组合。组合。结构化程序设计方法的优点:结构化程序设计方法的优点:结构清晰,易于理解,易于验证其结构清晰,易于理解,易于验证其正确性,

4、也易于查错和排错。正确性,也易于查错和排错。 C语言的语句完全支持结构化程序设计方法!语言的语句完全支持结构化程序设计方法!一个一个C源程序:源程序:至少由一个源程序文件组成。至少由一个源程序文件组成。一个源程序文件:一个源程序文件:通常由编译预处理命令、数据类型、变量和函通常由编译预处理命令、数据类型、变量和函数的定义所组成。数的定义所组成。一个函数:一个函数:通常由编译预处理命令、数据类型、变量的定义,以通常由编译预处理命令、数据类型、变量的定义,以及若干语句所组成。及若干语句所组成。语句分为:语句分为:说明语句和可执行语句。说明语句和可执行语句。说明语句或声明语句:说明语句或声明语句:指

5、数据类型的定义、变量的定义和函数的定义。指数据类型的定义、变量的定义和函数的定义。说明语句必须置于可执行语句之前,否则编译源程说明语句必须置于可执行语句之前,否则编译源程序时会产生语法错误。序时会产生语法错误。表达式语句:表达式语句:表达式后加一个分号构成。例如:表达式后加一个分号构成。例如: j+=10;函数调用语句:函数调用语句:函数调用后加一个分号构成。例如:函数调用后加一个分号构成。例如: cos(x);空语句:空语句:仅由一个分号构成,不执行任何动作。主要用于指明被仅由一个分号构成,不执行任何动作。主要用于指明被转向的控制点或在特殊情况下做循环体。转向的控制点或在特殊情况下做循环体。

6、复合语句:复合语句:也称也称块语句块语句。用一对花括号把一个或多个语句括起来后构成。用一对花括号把一个或多个语句括起来后构成。看成一个语句,广泛用于控制语句。看成一个语句,广泛用于控制语句。控制语句:控制语句:可能改变程序执行顺序的语句。可能改变程序执行顺序的语句。选择语句:选择语句:if、switch循环语句:循环语句:for、while、dowhile转向语句:转向语句:break、continue、goto、return二元运算符,用来比较两个操作数之间的关系,二元运算符,用来比较两个操作数之间的关系,其优先级比算术运算符低,但比赋值运算符高。共有六个:其优先级比算术运算符低,但比赋值运

7、算符高。共有六个: 字符型、整型、实型、枚举类型以字符型、整型、实型、枚举类型以及指针类型及指针类型左结合性左结合性 、= 、=优先级相同优先级相同=、!=!=优先级相同优先级相同优先级高优先级高 低低初学者常常误将初学者常常误将 = = 当作当作 = 使使用用用关系运算符将操作数连接起来的式子。关系表用关系运算符将操作数连接起来的式子。关系表达式的值为整数达式的值为整数0或或1。关系成立时,结果为。关系成立时,结果为1;否则,结果为;否则,结果为0。(132:值为:值为0。因它等价于。因它等价于(43)2。abc的含义并不是的含义并不是a大于大于b且且b大于大于c。实现逻辑运算,表达复杂条件

8、。实现逻辑运算,表达复杂条件。 ! 逻辑非逻辑非(单目单目) & 逻辑与逻辑与(二目二目) | 逻辑或逻辑或(二目二目)!的优先级最高,高于算术运算符,为右结合性。的优先级最高,高于算术运算符,为右结合性。&的优先级低于的优先级低于!,但高于,但高于|,但两者均比关系运算,但两者均比关系运算符、算术运算符的优先级低。符、算术运算符的优先级低。逻辑运算的操作数不为逻辑运算的操作数不为0时,为逻辑真;而操作数的值为时,为逻辑真;而操作数的值为0时,时,为逻辑假。为逻辑假。当操作数的值为当操作数的值为0时,对该操作数做逻辑非运算的时,对该操作数做逻辑非运算的结果为结果为1;而当操作数

9、为非;而当操作数为非0时,对其做逻辑非运算的结果为时,对其做逻辑非运算的结果为0。例如:例如:!0的值为的值为1,!20的运算结果为的运算结果为0。仅当参加逻辑与的两个操作数的值都为非仅当参加逻辑与的两个操作数的值都为非0时,时,其结果为其结果为1;否则结果为;否则结果为0。例如:。例如:0&1.2为为0, 1&1.2为为1。仅当参加逻辑或的两个操作数的值都为仅当参加逻辑或的两个操作数的值都为0时,其结时,其结果为果为0;否则结果为;否则结果为1。例如:。例如:0|1.2为为1, 0|0为为0。用逻辑运算符连接起来的式子。逻辑运算的数据用逻辑运算符连接起来的式子。逻辑运算的数据

10、类型与关系运算相同,其运算结果用整数表示。当逻辑关系成类型与关系运算相同,其运算结果用整数表示。当逻辑关系成立时,其运算结果为整数立时,其运算结果为整数1;反之,为整数;反之,为整数0。同样,。同样,1或或0可作可作为整数继续参加运算。为整数继续参加运算。a=x&x=b 判断判断x的值是否在区间的值是否在区间a,b(a=b)&(b=c) 判断判断a、b、c三个数是否相等三个数是否相等xb|xa 判断判断x小于小于b或者或者x小于小于ac9 判断变量判断变量c不是数字字符不是数字字符逻辑表达式求值时,若能确定其值,逻辑表达式求值时,若能确定其值,则不必再逐步求值。则不必再逐步求值

11、。设设int a=0,b=2,c=1;a&b+&-c因因a的值为的值为0,则可直接确定整个表达式的值为,则可直接确定整个表达式的值为0,此时不再,此时不再对后续的逻辑与项做计算,即对后续的逻辑与项做计算,即b和和c的值并不会改变。的值并不会改变。a|b-|c+a的值为的值为0,再与,再与b做逻辑或运算,此时结果为做逻辑或运算,此时结果为1,直接确定表,直接确定表达式的值为达式的值为1,其后的运算不再进行。这样,计算结果为,其后的运算不再进行。这样,计算结果为1,a为为0,b为为1,c不变。不变。唯一的三目运算符,其优先级仅高于赋值运算符、唯一的三目运算符,其优先级仅高于赋值运算

12、符、复合赋值运算符和逗号运算符,且为复合赋值运算符和逗号运算符,且为右结合性,右结合性,即是应该将最即是应该将最右边的问号与离它最近的冒号配对。右边的问号与离它最近的冒号配对。 表达式表达式1 ? 表达式表达式2 : 表达式表达式3先求表达式先求表达式1的值,若为的值,若为0,则求出表达式,则求出表达式2的值的值(不不求表达式求表达式3的值的值),并把该值作为运算结果;否则求出表达式,并把该值作为运算结果;否则求出表达式3的值的值(不求表达式不求表达式2的值的值),并把它作为运算结果。,并把它作为运算结果。max=a=b?a:b;printf(%s,ab?a大于大于bn:a小于等于小于等于bn

13、);wx?x+w:xy?x:y 使用右结合性,即可理解为:使用右结合性,即可理解为: (wx)?(x+w):(xy?x:y)选择语句选择语句也称也称分支语句分支语句:根据给定条件,选择执行两个或两个以:根据给定条件,选择执行两个或两个以上分支程序段中的某一个。上分支程序段中的某一个。C语言的选择语句:语言的选择语句:条件语句:条件语句:if。有三种形式,即有三种形式,即、和、和, 这三种形式可单独使用这三种形式可单独使用 如果如果ifif语句(基本型)中又包含一个或多个语句(基本型)中又包含一个或多个ifif语句(基本型语句(基本型),), 则为则为。 开关语句:开关语句:switch问题描述

14、:问题描述:输入三个整数,输出其中的最大数。输入三个整数,输出其中的最大数。问题分析:问题分析:先输入三个整数,分别存入整型变量先输入三个整数,分别存入整型变量a、b、c。后将后将a、b、c中的最大者存入整型变量中的最大者存入整型变量max并输出并输出。求最大值可用条件表达式,也可用求最大值可用条件表达式,也可用。知识聚焦与程序实现知识聚焦与程序实现条件语句就是条件语句就是if语句:根据给定的条件,决定执行两个分支语句:根据给定的条件,决定执行两个分支中的某一个分支。中的某一个分支。有三种形式。有三种形式。程序实现:程序实现: #include int main(void) int a,b,c

15、,max; printf(输入三个整数:); scanf(%d%d%d,&a,&b,&c); max=ab?a:b; max=maxc?max:c; printf(最大数是:%dn,max); return 0;单分支单分支if语句的语句的格式:格式: if(表达式表达式) S表达式是表达式是C语言语言的任何表达式的任何表达式S是一个语句是一个语句执行流程:执行流程: 程序实现:程序实现:#includeint main(void) int a,b,c,max; printf(输入三个整数:); scanf(%d%d%d,&a,&b,&c); m

16、ax=a; if(maxb) max=b; if(maxc) max=c; printf(最大数是:%dn,max); return 0;演示例演示例3.1.1演示例演示例3.1.2演示例演示例3. 2 双分支双分支if语句的语句的格式:格式: if(表达式表达式) S1 else S2执行流程:执行流程: 程序实现:程序实现:#includeint main(void) int a,b,c,max; printf(输入三个整数:); scanf(%d%d%d,&a,&b,&c); if(ab) max=a; else max=b; printf(最大数是:%dn, m

17、axc?max:c); return 0;演示例演示例3. 3演示例演示例3. 4单行书写单行书写多行书写多行书写有缩进有缩进if(ab) max=a; else max=b;if(ab) max=a; else max=b;if(ab) max=a; else max=b;C语言书写形式比较自由:可写在一行,也可写语言书写形式比较自由:可写在一行,也可写在多行。一般为了认读方便,特别是语句较多时,在多行。一般为了认读方便,特别是语句较多时,会分多行书写,还会有缩进,以体现语句结构。会分多行书写,还会有缩进,以体现语句结构。如上面的双分支语句可写成下面如上面的双分支语句可写成下面3种形式:种形

18、式:多分支多分支if语句格式:语句格式: if(表达式表达式1) S1 else if(表达式表达式2) S2 else if . else Sn 程序实现:程序实现:#includeint main(void) int a,b,c,max; printf(输入三个整数输入三个整数:); scanf(%d%d%d,&a,&b,&c); if(ab & ac) max=a; else if(ba & bc) max=b; else max=c; printf(最大数是:最大数是:%dn,max); return 0;演示例演示例3. 5问题描述:问题描述:

19、将键盘输入的百分制成绩转换成五级计分制成绩输将键盘输入的百分制成绩转换成五级计分制成绩输出。五级计分制成绩用字母出。五级计分制成绩用字母A、B、C、D和和E分别表示分别表示10090、8980、7970、6960、590。问题分析:问题分析:确定数据结构。确定数据结构。整型变量整型变量score存输入的百分制成绩存输入的百分制成绩字符变量字符变量grade存五级计分制成绩存五级计分制成绩确定数据处理流程。先从键盘输入一个百分制成绩,再将确定数据处理流程。先从键盘输入一个百分制成绩,再将输入的百分制成绩转换成五级计分制成绩,最后输出五级输入的百分制成绩转换成五级计分制成绩,最后输出五级计分制成绩

20、。计分制成绩。程序实现:程序实现:#includeint main(void) int score; /*保存输入的百分制成绩保存输入的百分制成绩*/ char grade; /*保存五级计分制成绩保存五级计分制成绩*/ printf(输入一个成绩:输入一个成绩:); scanf(%d,&score); if(score100 | score=90) grade=A; /*L1*/ else if(score=80) grade=B; else if(score=70) grade=C; else if(score=60) grade=D; else grade=E; /*L2*/ p

21、rintf(%d分分,等级等级为为%cn, score,grade); return 0; 程序说明:程序说明: 程序的程序的L1行行L2行:使用嵌套的行:使用嵌套的if语句对语句对所列条件按递减顺序判断,可以简化后续所列条件按递减顺序判断,可以简化后续条件的表达。条件的表达。讨论参见教材讨论参见教材P62。 grade变量:不是必要的,但有了它,可变量:不是必要的,但有了它,可简化程序,提高程序的可读性。简化程序,提高程序的可读性。演示例演示例3. 6嵌套的条件语句,嵌套的条件语句,else如何与如何与if配对:配对:为避免二义性,为避免二义性,C语言规定,语言规定,else总是与其前面最近

22、的还没有总是与其前面最近的还没有配对的配对的if进行配对进行配对。语句语句 if(e1) if(e2) S1 else S2上述嵌套的条件语句中上述嵌套的条件语句中else与第二个与第二个if配对。配对。可用一对花括号改变可用一对花括号改变else与第二个与第二个if配对:配对: if(e1) if(e2) S1 else S2if语句的嵌套:语句的嵌套:if语句的内嵌语句又是语句的内嵌语句又是if语句。语句。演示例演示例3. 7问题描述:问题描述:求方程求方程ax2+bx+c=0的根,其中系数的根,其中系数a、b、c从键盘从键盘上输入,上输入,a不为不为0。问题分析:问题分析: 定义浮点变量

23、定义浮点变量a、b、c、delta,分别保存一元二次方程的分别保存一元二次方程的系数和判别式。系数和判别式。 当输入系数当输入系数a、b、c的值后,的值后,若若b2-4ac0,则方程有两个不同的实根;则方程有两个不同的实根;若若b2-4ac=0,则方程有两个相等的实根。则方程有两个相等的实根。程序实现:程序实现:#include#includeint main(void) float a,b,c,delta; printf(输入三个系数:输入三个系数:); scanf(%f%f%f,&a,&b,&c); if(a=0) /*使用复合语句使用复合语句*/ printf(这

24、不是一元二次方程这不是一元二次方程!n); return 1; 当当if语句的条件成立时,若语句的条件成立时,若要执行一系列语句,则应要执行一系列语句,则应将这一系列语句用一对花将这一系列语句用一对花括号括起来变成一个复合括号括起来变成一个复合语句。语句。 delta=b*b-4*a*c; if(delta=0) /*使用复合语句使用复合语句*/ delta=sqrt(delta); if(delta) printf(方程有两个不同的实根:方程有两个不同的实根:%f,%fn, (-b+delta)/2/a,(-b-delta)/2/a); else printf(方程有两个相等的实根:方程有两

25、个相等的实根:%fn, -b/2/a); else printf(方程没有实根方程没有实根!n); return 0;格式:格式: switch(表达式表达式) case 常量表达式常量表达式1:语句序列语句序列1; break; case 常量表达式常量表达式2:语句序列语句序列2; break; case 常量表达式常量表达式n:语句序列语句序列n; break; default:语句序列语句序列 值只能是字符型或整型值只能是字符型或整型可选项可选项default分支可放在开关语句中分支可放在开关语句中的任何位置,通常为开关语句的任何位置,通常为开关语句的最后一个分支。的最后一个分支。应加

26、应加空格空格,否则被认为是语句,否则被认为是语句标号,如标号,如case9,并不出现语并不出现语法错,这类错误较难查找。法错,这类错误较难查找。常量表达式的值必须互不相同常量表达式的值必须互不相同先求先求的值,再依次与的值,再依次与case后面的后面的比较,若与某比较,若与某一常量表达式的值相等,则转去执行该一常量表达式的值相等,则转去执行该case后边的语句序列,一后边的语句序列,一直执行下去,直至遇到直执行下去,直至遇到break语句或开关语句的右花括号为止。语句或开关语句的右花括号为止。否则,若有否则,若有default分支,则执行该分支后边的语句序列,否则什分支,则执行该分支后边的语句

27、序列,否则什么也不执行。么也不执行。开关语句结构清晰,易理解。开关语句结构清晰,易理解。开关语句可用条件语句实现,但反之不然。开关语句可用条件语句实现,但反之不然。原因:开关语句的表达式取值只能是原因:开关语句的表达式取值只能是型或型或,而,而条件语句的表达式取值不限类型。条件语句的表达式取值不限类型。演示例演示例3. 8问题描述:问题描述: 输入一个字符,判断它是元音字母、空白字符还是其它符号。输入一个字符,判断它是元音字母、空白字符还是其它符号。问题分析:问题分析: 本例完全可以使用本例完全可以使用if来编程,但考虑到枚举的情形较多,选用来编程,但考虑到枚举的情形较多,选用另一个选择语句另

28、一个选择语句开关语句来编程,可提高程序的可读性。开关语句来编程,可提高程序的可读性。知识聚焦:知识聚焦:开关语句开关语句#includeint main(void) char c; printf(输入一个字符:输入一个字符:); scanf(%c,&c); switch(c) case a: case A: case e: case E: case i: case I: case o: case O: case u: case U: printf(这是元音字母这是元音字母n); break; case : case n: case t: printf(这是空白符这是空白符n); bre

29、ak; default: printf(这是其他字符这是其他字符n); return 0;问题:请画程序流程图。用问题:请画程序流程图。用if语句改写本例。语句改写本例。将将default分支及其语句前移到第一个分支,如分支及其语句前移到第一个分支,如何修改程序而保持功能不变?何修改程序而保持功能不变?当省略当省略case后面的语句后面的语句序列时,则可实现多个入序列时,则可实现多个入口,执行同一语句序列。口,执行同一语句序列。演示例演示例3. 9只只有多编程,多调试,才能真正提高实际编程能力:有多编程,多调试,才能真正提高实际编程能力:编程出错是普遍现象,即使是经验丰富的程序员,也无法避编程

30、出错是普遍现象,即使是经验丰富的程序员,也无法避免错误。免错误。程序投入使用前,都要经过反复测试,以发现错误并纠正错程序投入使用前,都要经过反复测试,以发现错误并纠正错误。误。程序调试需要在实践中积累经验,掌握技巧。程序调试需要在实践中积累经验,掌握技巧。学会调试程序,是提高实际编程能力的重要保证。学会调试程序,是提高实际编程能力的重要保证。调试:调试:查找并纠正程序错误的过程。查找并纠正程序错误的过程。C语言语言程序错误类型程序错误类型:3类类5种种。编译阶段:编译错误编译阶段:编译错误(error)、编译警告编译警告(warning)连接阶段:链接错误连接阶段:链接错误运行阶段:运行错误和

31、逻辑错误运行阶段:运行错误和逻辑错误编译错编译错误误(error):编译时发现的错误,通常属于语法错误。即编编译时发现的错误,通常属于语法错误。即编写的语句不符合写的语句不符合C+的语法规则。这类错误必须修改,否则无的语法规则。这类错误必须修改,否则无法产生目标程序。法产生目标程序。举例:举例:用了未定义的标识符用了未定义的标识符(如变量名、函数名等如变量名、函数名等);语句后缺少分号或在不该有分号的地方加分号;语句后缺少分号或在不该有分号的地方加分号;括号不配对,包括圆括号、方括号和花括号;括号不配对,包括圆括号、方括号和花括号;用中文的分号、逗号、等号代替英文的分号、逗号、等号等。用中文的

32、分号、逗号、等号代替英文的分号、逗号、等号等。使用库函数,却未包含相应的头文件。使用库函数,却未包含相应的头文件。解决办法:解决办法:根据编译器给出的出错信息根据编译器给出的出错信息(出错行号及出错原因出错行号及出错原因),较易定,较易定位位(在在VC+中用鼠标双击出错信息即可定位中用鼠标双击出错信息即可定位)和解决。和解决。有时所给行号并非真正的出错行,需细看出错行前后的程有时所给行号并非真正的出错行,需细看出错行前后的程序,才能最终确定错误。序,才能最终确定错误。调试策略:调试策略:每次只修改第一个错误,改完后重新编译,直到没有每次只修改第一个错误,改完后重新编译,直到没有编译错误为止。原

33、因:编译错误为止。原因:后面出现的错误可能是由第一个错误引发的连环出错,实后面出现的错误可能是由第一个错误引发的连环出错,实际并没有错误。际并没有错误。不会漏掉任何错误。不会漏掉任何错误。每次只面对一个错误,可以集中精力解决问题。每次只面对一个错误,可以集中精力解决问题。编译警告编译警告(warning):编译时发现的、可能存在的潜在错误,只编译时发现的、可能存在的潜在错误,只是编译系统拿不准,是编译系统拿不准,希望用户把关希望用户把关。若用户置之不理,也可产。若用户置之不理,也可产生目标程序,但必然会将这些潜在错误延伸到运行阶段暴露,生目标程序,但必然会将这些潜在错误延伸到运行阶段暴露,即转化成运行错误或逻辑错误。而确定程序的运行错误和逻辑即转化成运行错误或逻辑错误。而确定程序的运行错误和逻辑错误的出错位置要比确定编译警告的出错位置难得多。错误的出错位置要比确定编译警告的出错位置难得多。举例:举例:变量未初始化就做某种运算。变量未初始化就做某种运算。调试策略:调试策略:将编译警告看成编译错误,认真改正,直到警告全部将编译警告看成编译错误,认真改正,直到警告全部消除为止。消除为止。链接错误:链接错误:当用户程序的目标代码与用户程序调用的库函数的目当用户程序的目标代码与用户程序调用的库函数的目标代码链接生成可

温馨提示

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

评论

0/150

提交评论