1、第4章 顺序和选择结构程序设计,4.1 结构化程序设计 4.2 语句与分程序 4.3 顺序结构程序设计 4.4 选择结构程序设计 4.5 switch语句 4.6 条件运算符 4.7 程序举例,4.1 结构化程序设计,(1) 顺序结构 顺序结构就是一组逐条执行的可执行语句。按照书写顺序,自上而下的执行。 (2) 选择结构(分支结构) 选择结构是一种先对给定条件进行判 断,并根据判断的结果执行相应命令的结 构。,(3) 循环结构 循环结构是指多次重复执行同一组 命令的结构。 具有循环结构的程序一般必须指定循 环的终止条件,以便对程序的循环进行有 效的控制,以免进入无限循环(或称死循 环)的状态。
2、,C程序的执行部分由执行语句构成。 执行语句的种类 表达式语句 函数调用语句 控制语句 复合语句(或称分程序) 空语句,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(
5、Please input to int 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 x0 y是x的绝对值,如果x大于等于0,绝对值就 是x自己;
6、否则,绝对值就是取x的负值。这个数 学问题用顺序结构是不能解决的,因为要根据x 的值的不同,做不同的动作。只有用选择结构才 能解决问题。,4.4.2 if形式,if 形式是最简单的条件语句。 语法: if (表达式) 语句1; 下一条语句; 功能:检测表达式,如果表达式的值为非0 (真),则执行语句1,然后执行下一条语句; 如果表达式的值为0(假),直接执行下一条语 句。,条件表达式,注意: (1) 表达式必须用圆括号括起来,不能省略。 (2) 表达式可以使用关系表达式,例如if (x10)表 示如果x大于10;也可以使用逻辑运算符连接关 系表达式,例如,if (ab) scanf(%d, ,
7、例4.3使用if形式编写程序:若ab将两个数的位置调换;否则,保持不变。 #include stdio.h /*-swap a and b-*/ void main() int a,b; scanf(%d%d, ,例4.4请判断下面程序的执行结果,并解释该程 序的功能。 #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(真),
8、则执行语 句1,然后执行下一条语句;如果值为0(假), 执行语句2,再执行下一条语句。,例4.5解决求商的问题。 #include stdio.h /*-a divided by b-*/ void main() int a,b; scanf(%d%d, ,例4.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,
9、x; if (ab) x=a; printf(%dn,a); else x=b; printf(%dn,b); ,4.4.4 else if 形式,例如我们要解决这样一个问题:输入一个整 数,根据输入值,输出数的范围属于大于0、小 于0还是等于0。 x的范围实际上是三种情况,我们先用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; 一条语句
10、;,功能:按表达式的顺序进行判断,最早值为 真的表达式将引起执行相应语句i,并且不再继续 判断其它条件,跳转到下一条语句执行。若全部 表达式为假,则执行语句n+1。 if (x0) printf ( x=0); else if (x0);,例4.8 根据输入的百分制按五分制的成绩输出。百 分制与五分制之间的关系见下表。 百分制 五分制 90 100 5 80 89 4 60 79 3 0 59 2,#include stdio.h void main() int score; char grade; printf(“please input score:”);/*请输入分数*/ scanf(%
11、d, ,4.4.5 嵌套的if语句,修改例4.8,排除不可能的分数。 #include stdio.h void main() int score; char grade; printf(please input score:); scanf(%d, ,if (表达式1) if (表达式2) 语句1; else 语句2;,if (表达式1) ,if (表达式1) printf(Please input one integer:); scanf(%d, ,输入一个数,若该数为正整数并且是偶数,打印“是正的偶数”,否则打印“正整数并且是奇数”。 #include “stdio.h” void ma
12、in() int x; printf(Please input one integer:); scanf(%d, ,4.5 switch语句,switch语句属于多路分支结构。 switch的常用形式: switch (条件表达式) case 常量表达式1:语句1;break; case 常量表达式2:语句2;break; case 常量表达式3:语句3;break; case 常量表达式n:语句n;break; default 语句n+1; break; ,功能:首先计算条件表达式的值,然 后找到与其相等的常量表达式的case分支 去执行语句,然后退出switch语句,若没 有与条件表达式相
13、等的常量表达式,则执 行default语句后面的语句n+1。default 语 句可省略。若语句i后不含break,继续执 行下一条语句i+1,不用判断常量表达式。,功能:首先计算条件表达式的值,然 后找到与其相等的常量表达式的case分支 去执行语句,然后退出switch语句,若没 有与条件表达式相等的常量表达式,则执 行default语句后面的语句n+1。default 语 句可省略。若语句i后不含break,继续执 行下一条语句i+1,不用判断常量表达式。,注意: (1) case分支中的语句i后面的break语句一般 情况下不要省略,因为没有break语句,程序 不能跳出switch语
14、句,而是执行下一条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) 条件表达式和常量表达式的数据类型必须 一致,常量表达式中不能包含变量。实际上, switch语句的重点就在于如何构造条件表达式, 并让它的值正好能够匹配n个常量表达式的值。 (3) 多个case 可以共同使用相同的语句i。 switch (s) case 1: case 2: case 4: case 5: printf(%
15、d,x);break; ,(4) 每个常量表达式应不相等,因为它类似于语 句标号的作用,case部分与default的顺序可自由 书写。若每个case后包含break,则顺序不影响 最后的执行结果。反之,则有可能影响执行结果 s=2; switch (s) case 1: printf(1);break; case 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可以用复合语句,而且允许省
16、略花括号。 (6) switch语句可以嵌套,即在一个switch语句 中嵌套另一个switch语句,但是要注意break只 能跳出最内层的switch语句。 例4.11 用switch完成:根据输入的百分制按五 分制的成绩输出。,#include stdio.h void main() int score,s,sum; char grade; printf(please input score:); scanf(%d, ,例4.11 根据输入字符(0到F,用%c接收)显示与该字 符所表示的十六进制数相对应的十进制数。(例 如输入A,输出10;输入0,输出0。),#include stdio.
17、h void main() char i; printf(nplease input 0F :); scanf(%c, ,C语言中提供的唯一的一个三目运算符就是 条件运算符“?:”,它的运算对象有三个。 条件运算符的语法格式是: 表达式1 ?表达式2 :表达式3 由条件运算符与操作数构成的表达式也可以 称为条件表达式。 包括了条件运算符的条件表达式的计算方法 是:首先计算表达式1的值,若表达式1为真,条 件表达式的解取表达式2的值,表达式1为假,条 件表达式的解取表达式3的值。,4.6 条件运算符,例4.12 将输入的字母小写变大写。 #include stdio.h #include str
18、ing.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 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元,全月
19、应纳税 所得额为520元,由税率表知,其中500元税率为 5%,另20元的税率为10%,所以此人应纳个人 所得税27元。 void main() double salary,s,tax; printf(please input your salary one month:); scanf(%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
20、(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; else tax=(s-100000)*0.45+200
21、00*.40+20000*.35+20000*.3 +20000*.25+15000*.20+3000*.15+1500*.1+500*.05; printf(tax is %10.2fn,tax); ,例4.15 编写程序,输入一个用整数表示的年份,输出显示 该年份是否是闰年。 判断一个用整数表示的年份是不是闰年的规则是: 该数满足二个条件之一是闰年: (1) 能被400整除; (2) 能被4整除,但不能被100整除。 根据上述规则,我们可以画一个N-S流程图来解决 该问题。其中用到两个存储单元year和flag,year 存放 整数表示的年份,flag是个标记,其值为1表示是闰年, 其值为0表示不是闰年。,#include stdio.h void main() int year,flag; printf(Pleae input a year:); scanf(%d, ,