1、第4章 顺序和选择结构程序设计,4.1 结构化程序设计 4.2 语句与分程序 4.3 顺序结构程序设计 4.4 选择结构程序设计 4.5 switch语句 4.6 条件运算符 4.7 程序举例,4.1 结构化程序设计,(1) 顺序结构顺序结构就是一组逐条执行的可执行语句。按照书写顺序,自上而下的执行。(2) 选择结构(分支结构)选择结构是一种先对给定条件进行判 断,并根据判断的结果执行相应命令的结 构。,(3) 循环结构循环结构是指多次重复执行同一组 命令的结构。具有循环结构的程序一般必须指定循 环的终止条件,以便对程序的循环进行有 效的控制,以免进入无限循环(或称死循 环)的状态。,C程序的
2、执行部分由执行语句构成。 执行语句的种类表达式语句函数调用语句控制语句复合语句(或称分程序)空语句,4.2 语句与分程序,最简单的可执行语句。只要在表达 式后面加上分号就可以了。 例如: +i; x=y;有效的表达式语句一般都要有赋值 运算, 否则,不做任何赋值运算的表达 式大多数是无意义的。,表达式语句,函数调用语句,由函数名、实际参数以及分号构成。 例如: printf(“welcome“); printf是函数名,“welcome”是实际参数。函 数名既可以是C语言提供的库函数名,也 可以是我们自己定义的函数名。,控制语句,控制语句是用于控制程序流程的语句,控 制语句一般指那些改变了顺序
3、结构的语句。C语言的控制语句分支语句(if 和 switch)循环语句(while、do-while、for)转向语句(break、goto、continue、return)。熟练掌握控制语句是学会程序设计的基础。,复合语句和分程序结构,复合语句是用 和 把数据说明语句和若干个有序的执行语句组合在一起而构成。 其一般格式为 数据说明;语句; 复合语句在语法上相当于一个简单语句,在程序中可以作为一个独立语句来看待,因此又称为分程序。,空语句,C语言中有一个很特殊的语句,即空语句。空语句,顾名思义,就是什么也不存在的语句,只有一个分号: ;尽管空语句不会有任何命令执行,但仍然是一个有用的语句。常用
4、于循环语句中,使循环体为空。例如:for (sum=0,i=0;i=9;i+;sum=sum+i);,4.3 顺序结构程序设计,顺序程序设计的步骤可以归纳为: (1) 用预处理命令包含文件或进行宏定义(不是必须的,根据具体情况); (2) 定义变量(分配内存空间); (3) 为变量赋初值(可以用赋值语句或输入函数); (4) 计算; (5) 输出结果(用输出函数)。,例4.1 编写程序,输入x和y,交换它们的值,并 输出交换前后的数。 #include “ stdio.h“ /*方法一 */ void main() int x,y,temp;printf(“Please input to in
5、t number:“);scanf(“%d%d“, ,#include “ stdio.h“ void main() /*方法二 (注意适用条件)*/ int x,y;printf(“Please input to int number:“);scanf(“%d%d“, ,4.4 选择结构程序设计,4.4.1 问题的提出 4.4.2 if形式 4.4.3 if else 形式 4.4.4 else if 形式 4.4.5 嵌套的if语句,4.4.1 问题的提出,用数学公式可以这样描述:x x=0 y = -x x0y是x的绝对值,如果x大于等于0,绝对值就 是x自己;否则,绝对值就是取x的负值
6、。这个数 学问题用顺序结构是不能解决的,因为要根据x 的值的不同,做不同的动作。只有用选择结构才 能解决问题。,4.4.2 if形式,if 形式是最简单的条件语句。 语法: if (表达式)语句1; 下一条语句;功能:检测表达式,如果表达式的值为非0 (真),则执行语句1,然后执行下一条语句; 如果表达式的值为0(假),直接执行下一条语 句。,条件表达式,注意: (1) 表达式必须用圆括号括起来,不能省略。 (2) 表达式可以使用关系表达式,例如if (x10)表 示如果x大于10;也可以使用逻辑运算符连接关 系表达式,例如,if (ab) &(b=c);还可以是 一般的表达式,甚至是一个常量
7、或一个变量,例 如,if (x)和if (checkstate() 只要x 或checkstate() 的值为非0,表达式即为真。,例4.2使用if形式编写程序:输入x,求出并输出x的绝对值。 #include “ stdio.h“ /*-abs(x)-*/ void main() int x;scanf(“%d“, ,例4.3使用if形式编写程序:若ab将两个数的位置调换;否则,保持不变。 #include “ stdio.h“ /*-swap a and b-*/ void main() int a,b;scanf(“%d%d“, ,例4.4请判断下面程序的执行结果,并解释该程 序的功能。
8、 #include “ stdio.h“ void main() int a=10,b=20,x;x=a;if (ab)x=b;printf(“%dn“,x); ,4.4.3 if else 形式,if else 形式的语法是: if (表达式)语句1; else 语句2; 下一条语句; 功能:检测表达式,如果值为非0(真),则执行语 句1,然后执行下一条语句;如果值为0(假), 执行语句2,再执行下一条语句。,例4.5解决求商的问题。 #include “ stdio.h“ /*-a divided by b-*/ void main() int a,b;scanf(“%d%d“, ,例4.
9、6:将输入字符的大写字符转换成小写字符输出,小写字符原样输出。 #include “stdio.h“ /*-lowercase-*/ void main() int c;c=getchar();if (c=A ,例4.7 请判断下面程序的执行结果。 #include “stdio.h“ void main() int a=30,b=20,x;if (ab) x=a;printf(“%dn“,a);elsex=b;printf(“%dn“,b); ,4.4.4 else if 形式,例如我们要解决这样一个问题:输入一个整 数,根据输入值,输出数的范围属于大于0、小 于0还是等于0。x的范围实际上
10、是三种情况,我们先用if else 解决这个问题:,if (x=0)printf (“ x=0“); else if (x0“);,else if的语法: if (表达式1) 语句1;else if (表达式2) 语句2;else if (表达式3) 语句3; else if (表达式n) 语句n;else 语句n+1;一条语句;,功能:按表达式的顺序进行判断,最早值为 真的表达式将引起执行相应语句i,并且不再继续 判断其它条件,跳转到下一条语句执行。若全部 表达式为假,则执行语句n+1。 if (x0)printf (“ x=0“); else if (x0“);,例4.8根据输入的百分制按
11、五分制的成绩输出。百 分制与五分制之间的关系见下表。百分制 五分制90 100 580 89 460 79 30 59 2,#include “stdio.h“ void main() int score;char grade;printf(“please input score:”);/*请输入分数*/scanf(“%d“, ,4.4.5 嵌套的if语句,修改例4.8,排除不可能的分数。 #include “stdio.h“ void main() int score;char grade;printf(“please input score:“);scanf(“%d“, ,if (表达式1
12、) if (表达式2)语句1; else 语句2;,if (表达式1) & (表达式2) 语句1; if (!表达式1) 语句2 ;,if (表达式1) if (表达式2)语句1;else 语句2; ,if (表达式1) & (表达式2) 语句1; if (表达式1) & (!表达式2) 语句2 ;,if (表达式1) if (表达式2) 语句1; else 语句2else到底与哪个if结合呢?因为这时有两种可能, 这就产生了所谓的二义性。C语言规定:else与离 它最近的if 结合。,例4.9 输入一个数,若该数为正整数并且是偶数,打印“是正的偶数”,否则打印“非正整数”。 #include
13、 “stdio.h” void main() int x;printf(“Please input one integer:“);scanf(“%d“, ,输入一个数,若该数为正整数并且是偶数,打印“是正的偶数”,否则打印“正整数并且是奇数”。 #include “stdio.h” void main() int x;printf(“Please input one integer:“);scanf(“%d“, ,4.5 switch语句,switch语句属于多路分支结构。 switch的常用形式: switch (条件表达式) case 常量表达式1:语句1;break;case 常量表达式
14、2:语句2;break;case 常量表达式3:语句3;break; case 常量表达式n:语句n;break;default 语句n+1; break; ,功能:首先计算条件表达式的值,然 后找到与其相等的常量表达式的case分支 去执行语句,然后退出switch语句,若没 有与条件表达式相等的常量表达式,则执 行default语句后面的语句n+1。default 语 句可省略。若语句i后不含break,继续执 行下一条语句i+1,不用判断常量表达式。,功能:首先计算条件表达式的值,然 后找到与其相等的常量表达式的case分支 去执行语句,然后退出switch语句,若没 有与条件表达式相等
15、的常量表达式,则执 行default语句后面的语句n+1。default 语 句可省略。若语句i后不含break,继续执 行下一条语句i+1,不用判断常量表达式。,注意: (1) case分支中的语句i后面的break语句一般 情况下不要省略,因为没有break语句,程序 不能跳出switch语句,而是执行下一条case语 句后面的语句,直到遇到break才能终止 switch的执行。 switch (s) case +:a=a+b;case - :a=a*b;break;case *:a=a-b;break;case /:a=a/b;break ,(2) 条件表达式和常量表达式的数据类型必须
16、 一致,常量表达式中不能包含变量。实际上, switch语句的重点就在于如何构造条件表达式, 并让它的值正好能够匹配n个常量表达式的值。 (3) 多个case 可以共同使用相同的语句i。 switch (s) case 1:case 2:case 4:case 5: printf(“%d“,x);break; ,(4) 每个常量表达式应不相等,因为它类似于语 句标号的作用,case部分与default的顺序可自由 书写。若每个case后包含break,则顺序不影响 最后的执行结果。反之,则有可能影响执行结果 s=2; switch (s) case 1: printf(“1“);break;c
17、ase 2: printf(“2“);break;case 3: printf(“3“);break; 结果?,switch (s) case 1: printf(“1“);case 2: printf(“2“);case 3: printf(“3“); 结果?,(5) 语句i可以用复合语句,而且允许省略花括号。 (6) switch语句可以嵌套,即在一个switch语句 中嵌套另一个switch语句,但是要注意break只 能跳出最内层的switch语句。例4.11 用switch完成:根据输入的百分制按五 分制的成绩输出。,#include “stdio.h“ void main() in
18、t score,s,sum; char grade;printf(“please input score:“);scanf(“%d“, ,例4.11根据输入字符(0到F,用%c接收)显示与该字符所表示的十六进制数相对应的十进制数。(例如输入A,输出10;输入0,输出0。),#include “stdio.h“ void main() char i;printf(“nplease input 0F :“);scanf(“%c“, ,C语言中提供的唯一的一个三目运算符就是 条件运算符“?:”,它的运算对象有三个。 条件运算符的语法格式是:表达式1 ?表达式2 :表达式3由条件运算符与操作数构成的表
19、达式也可以 称为条件表达式。包括了条件运算符的条件表达式的计算方法 是:首先计算表达式1的值,若表达式1为真,条 件表达式的解取表达式2的值,表达式1为假,条 件表达式的解取表达式3的值。,4.6 条件运算符,例4.12 将输入的字母小写变大写。 #include “stdio.h“ #include “string.h“ void main() char c;puts(“please input one char:“);c=getchar();c=(c=a?(c+A-a):c);putchar(c);putchar(n); ,例4.13 用条件表达式求三个整数中的最大数。 #include
20、“stdio.h“ /* max */ void main() int a,b,c;printf(“Pleae input three int:“);scanf(“%d%d%d“, ,我国的个人所得税税率表:,4.7 程序举例,例4.14 全月应纳税所得额=月收入800。 例如某人月收入1320,减去800元,全月应纳税 所得额为520元,由税率表知,其中500元税率为 5%,另20元的税率为10%,所以此人应纳个人 所得税27元。 void main() double salary,s,tax;printf(“please input your salary one month:“);sca
21、nf(“%lf“,else if (s=20000)tax=(s-5000)*0.20+3000*0.15+1500*0.1+500*0.05;else if (s=40000)tax=(s- 20000)*0.25+15000*0.20+3000*0.15+1500*0.1+500*0.05;else if (s=60000)tax=(s- 40000)*0.3+20000*.25+15000*.20+3000*.15+1500*.1+500*.05;else if (s=80000)tax=(s-60000)*0.35+20000*.3+20000*.25+15000*.20+3000*.15+1500*.1+500*.05;else if (s=100000)tax=(s-80000)*0.40+20000*.35+20000*.3+20000*.25+15000*.20+3000*.15+1500*.1+500*.05;elsetax=(s-100000)*0.45+20000*.40+20000*.35+20000*.3+20000*.25+15000*.20+3000*.15+1500*.1+500*.05;printf(“tax is %10.2fn“,tax); ,