摘要
第3 章
选择结构程序设计
在顺序结构中,各语句是按排列的先后次序顺序执行的,是无条件的,不必事优选行
任何判断。但在实际生活中,常常有这样的情况: 要根据某个条件是否成立决定是否执
行指定的任务。例如:
. 如果你在家,我去拜访你;(需要判断你是否在家)
. 如果考试不及格,要补考; (需要判断是否及格)
. 周末我们去郊游; (需要判断是否是周末)
. 如果a>b,输出a。(需要判断a 是否大于b)
判断的结果应该是一个逻辑值: “是”或“否”,在计算机语言中用“真”和“假”表示。
例如,当a>b 时,满足“a>b”条件,就称条件“a>b”为真,如果a≤b,不满足“a>b”条件,就
称条件“a>b”为假。
由于程序需要处理的问题往往比较复杂,因此,在大多数程序中都会包含条件判断。
选择结构就是根据指定的条件是否满足,决定执行不同的操作(从给定的两组操作中选
择其一)。
3.1简单的选择结构程序
先通过以下几个程序,初步了解怎样在C 语言程序中用选择结构处理问题。
【例3.1】输入两个实数,按代数值由小到大的顺序输出这两个数。
解题思路: 有两个变量a 和b,若a≤b,则两个变量的值不必改变,若a>b,则把a 和b
的值互换,然后顺序输出a 和b,即可实现题目要求。因此此题的算法是: 做一次比较,然
后决定是否进行值的交换。关于两个变量互换值的方法,已在例2.8 中介绍了。
类似这样简单的问题可以不必先写出算法或画流程图,而直接编写程序。或者说,算
法在编程者的脑子里,相当于在算术运算中对简单的问题可以“心算”而不必在纸上写出
来一样。
编写程序:
#include
int main()
72
{ float a,b,temp;
printf("please enter a and b: ");
scanf("%f,%f",&a,&b);
if(a>b)
{temp=a;a=b;b=temp;}
printf("%7.2f,%7.2f\n",a,b);
return 0;
}
运行结果:
please enter a and b: 3.6,-3.2 ↙
-3.20,3.60
【例3.2】输入a,b,c 三个数,要求按由小到大的顺序输出。
解此题的算法比上一题稍复杂一些。现在先用伪代码写出算法:
begin
if a>b 将a 和b 对换(a 是a,b 中的小者)
if a>c 将a 和c 对换(a 是a,c 中的小者,因此a 是三者中最小者)
if b>c 将b 和c 对换(b 是b,c 中的小者,也是三者中次小者)
输出a,b,c 的值
end
编写程序: 按以上算法编写程序。
#include
int main()
{
float a,b,c,temp;
printf("please enter a,b,c: ");
scanf("%f,%f,%f",&a,&b,&c);
if(a>b)
{temp=a;a=b;b=temp;}//实现a 和b 的互换
if(a>c)
{temp=a;a=c;c=temp;} //实现a 和c 的互换
if(b>c)
{temp=b;b=c;c=temp;} //实现b 和c 的互换
printf("%7.2f,%7.2f,%7.2f\n",a,b,c);
return 0;
}
运行结果:
please enter a,b,c: 33.52,-27.65,100.45 ↙
-27.65, 33.52, 100.45
73
3.2选择结构中的关系运算
3.1 节的程序中,在if 语句括号中式的值为3,按“真”处理。由此可见,表达式的类
型不限于逻辑表达式,可以是任意的数值类型(包括整型、实型、字符型、指针型数据等)。
下面的if 语句也是合法的:
if('a') printf("%d",'a');
执行时输出'a' 的ASCII 码97。
(2) if 语句中有内嵌语句,每个内嵌语句都要以分号结束。例如:
if (x>0)
print ("%f\n",x);
else
printf("%f\n",-x);
行末各有一个分号(;)
分号是C 语句中不可缺少的部分,即使是if 语句中的内嵌语句也不能例外。如果无此分
号,则出现语法错误。读者可以上机试验一下。
(3) 不要误认为上面是两个语句(一个if 语句和一个else 语句)。它们都是属于同
一个if 语句。else 子句不能作为独立语句单独使用,它只能是if 语句的一部分,与if 配对
使用。(
4) 在if 和else 后面可以只含一个内嵌的操作语句(如上例),也可以有多个操作语
句,但应当用花括号({})将几个语句括起来成为一个复合语句。例如:
if (a+b>c && b+c>a && c+a>b)
{
s=0.5.(a+b+c);
area=sqrt(s.(s-a).(s-b).(s-c));
printf("area=%6.2f",area);
}
else
printf("it is not a trilateral");
注意在else 上面一行的右花括号(})外面不需要再加分号。因为{}内是一个完整的
复合语句,不需要另附加分号。
3.4.2if 语句的嵌套
在if 语句中又包含一个或多个if