第4章 顺序和选择结构程序设计.ppt
第4章 顺序和选择结构程序设计,4.1 结构化程序设计 4.2 语句与分程序 4.3 顺序结构程序设计 4.4 选择结构程序设计4.5 switch语句4.6 条件运算符4.7 程序举例,4.1 结构化程序设计,(1) 顺序结构 顺序结构就是一组逐条执行的可执行语句。按照书写顺序,自上而下的执行。(2) 选择结构(分支结构) 选择结构是一种先对给定条件进行判断,并根据判断的结果执行相应命令的结构。,(3) 循环结构 循环结构是指多次重复执行同一组命令的结构。 具有循环结构的程序一般必须指定循环的终止条件,以便对程序的循环进行有效的控制,以免进入无限循环(或称死循环)的状态。,C程序的执行部分由执行语句构成。执行语句的种类 表达式语句 函数调用语句 控制语句 复合语句(或称分程序) 空语句,4.2 语句与分程序,最简单的可执行语句。只要在表达式后面加上分号就可以了。例如:+i;x=y; 有效的表达式语句一般都要有赋值运算, 否则,不做任何赋值运算的表达式大多数是无意义的。,表达式语句,函数调用语句,由函数名、实际参数以及分号构成。例如:printf(welcome);printf是函数名,“welcome”是实际参数。函数名既可以是C语言提供的库函数名,也可以是我们自己定义的函数名。,控制语句,控制语句是用于控制程序流程的语句,控制语句一般指那些改变了顺序结构的语句。 C语言的控制语句 分支语句(if 和 switch) 循环语句(while、do-while、for) 转向语句(break、goto、continue、return)。 熟练掌握控制语句是学会程序设计的基础。,复合语句和分程序结构,复合语句是用 和 把数据说明语句和若干个有序的执行语句组合在一起而构成。其一般格式为 数据说明; 语句; 复合语句在语法上相当于一个简单语句,在程序中可以作为一个独立语句来看待,因此又称为分程序。,空语句,C语言中有一个很特殊的语句,即空语句。空语句,顾名思义,就是什么也不存在的语句,只有一个分号:; 尽管空语句不会有任何命令执行,但仍然是一个有用的语句。常用于循环语句中,使循环体为空。 例如: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 int number:); scanf(%d%d,#include stdio.hvoid 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=0y = -x x0 y是x的绝对值,如果x大于等于0,绝对值就是x自己;否则,绝对值就是取x的负值。这个数学问题用顺序结构是不能解决的,因为要根据x的值的不同,做不同的动作。只有用选择结构才能解决问题。,4.4.2 if形式,if 形式是最简单的条件语句。语法:if (表达式) 语句1;下一条语句; 功能:检测表达式,如果表达式的值为非0(真),则执行语句1,然后执行下一条语句;如果表达式的值为0(假),直接执行下一条语句。,条件表达式,注意:(1) 表达式必须用圆括号括起来,不能省略。(2) 表达式可以使用关系表达式,例如if (x10)表示如果x大于10;也可以使用逻辑运算符连接关系表达式,例如,if (ab) &(b=c);还可以是一般的表达式,甚至是一个常量或一个变量,例如,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请判断下面程序的执行结果,并解释该程序的功能。#include stdio.hvoid 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.6:将输入字符的大写字符转换成小写字符输出,小写字符原样输出。#include stdio.h/*-lowercase-*/void main() int c; c=getchar(); if (c=A ,例4.7 请判断下面程序的执行结果。#include stdio.hvoid main() int a=30,b=20,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; 一条语句;,功能:按表达式的顺序进行判断,最早值为真的表达式将引起执行相应语句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.hvoid main() int score; char grade; printf(“please input score:”);/*请输入分数*/ scanf(%d,4.4.5 嵌套的if语句,修改例4.8,排除不可能的分数。#include stdio.hvoid main() int score; char grade; printf(please input score:); scanf(%d,if (表达式1) 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 语句2 else到底与哪个if结合呢?因为这时有两种可能,这就产生了所谓的二义性。C语言规定:else与离它最近的if 结合。,例4.9 输入一个数,若该数为正整数并且是偶数,打印“是正的偶数”,否则打印“非正整数”。#include “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 常量表达式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语句,若没有与条件表达式相等的常量表达式,则执行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) 条件表达式和常量表达式的数据类型必须一致,常量表达式中不能包含变量。实际上,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; 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可以用复合语句,而且允许省略花括号。(6) switch语句可以嵌套,即在一个switch语句中嵌套另一个switch语句,但是要注意break只能跳出最内层的switch语句。例4.11 用switch完成:根据输入的百分制按五分制的成绩输出。,#include stdio.hvoid main() int score,s,sum; char grade; printf(please input score:); scanf(%d,例4.11 根据输入字符(0到F,用%c接收)显示与该字符所表示的十六进制数相对应的十进制数。(例如输入A,输出10;输入0,输出0。),#include stdio.hvoid 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 string.hvoid 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元,全月应纳税所得额为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 (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+20000*.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.hvoid main() int year,flag; printf(Pleae input a year:); scanf(%d,