第4章 选择结构程序的设计
第四章例题
4.1选择结构和条件判断
【例1】:在【例3.5】的基础上,我们将这个例题改为了用if语句来进行判断“b²-4ac<0”还是“b²-4ac≥0”。
代码如下:
#include <stdio.h>
#include <math.h> //程序中要调用求平方根的函数sqrt
int main ()
{
double a,b,c,disc,x1,x2,p,q; //disc用来存放判别式(b * b-4ac)的值
printf("请输入三个数:\n");
scanf("%lf%lf%lf",&a,&b,&c); //输入双精度浮点型变量的值要用格式声明“%lf”
disc = b*b-4*a*c;
if(disc<0) //若b2-4ac<0
{
printf("该一元二次方程没有实根\n"); //输出“此方程没有实根”
}
else //若b2-4ac≥0
{
p=-b/(2.0*a);
q=sqrt(disc)/(2.0*a);
x1 = p+q;
x2=p-q; //求出方程的两个根
printf("实根是:x1=%7.2f\nx2=%7.2f\n",x1,x2); //输出方程的两个根
}
return 0;
}
输入两种情况
运行结果如下:
情况一
情况二
4.2 用if语句实现选择结构
【例2】:输入两个实数,按由大到小的顺序输出这两个数。
代码如下:
#include <stdio.h>
int main ()
{
float a,b,t;
printf("请输入两个数:\n");
scanf("%f%f",&a,&b);
printf("这两个数是:%f,%f\n",a,b);
if(a>b)
{ //将a和b的值互换
t = a;
a = b;
b = t;
}
printf("%5.2f,%5.2f\n",a,b);
return 0;
}
运行结果如下:
【例4.3】 输入三个数,要求按由小到大的顺序输出。
代码如下:
#include <stdio.h>
int main()
{
int a,b,c,t; /*定义4个基本整型变量a、b、c、t*/
printf("Please input a,b,c:\n"); /*双引号内的普通字符原样输出并换行*/
scanf("%d,%d,%d",&a,&b,&c); /*输入任意3个数*/
if(a>b) /*如果a大于b,借助中间变量t实现a与b值的互换*/
{
t = a;
a = b;
b = t;
}
if(a>c) /*如果a大于c,借助中间变景t实现a与c值的互换*/
{
t = a;
a = c;
c = t;
}
if(b>c) /*如果b大于c,借助中间变量t实现b与c值的互换*/
{
t = b;
b = c;
c = t;
}
printf("The order of the number is:\n");
printf("%d,%d,%d",a,b,c); /*输出函数顺序输出a、b、c的值*/
return 0;
}
运行结果如下:
4.3关系运算符和关系表达式
4.3.1 关系运算符及其优先次序
运算符主要有
1. “<”,(小于)
2. “>”,(大于)
3. “<=”,(小于等于)
4. “>=”,(大于等于)
5. “==”,(等于等于)
6. “!=”。(不等于)
其中,前四种关系运算符的优先级相同,后2种也相同。前四种高于后两种。
4.4 逻辑运算符和逻辑表达式
4.4.1 逻辑运算符及其优先次序
有3种逻辑运算符,与(AND),或(OR),非(NOT)。
与运算符(&&)和或运算符(||)均为双目运算符。具有左结合性。非运算符(!)为单目运算符,具有右结合性。逻辑运算符和其它运算符优先级的关系可表示如下:
“&&”和“||”低于关系运算符,“!”高于算术运算符。
按照运算符的优先顺序可以得出:
a>b && c>d 等价于 (a>b)&&(c>d)
!b==c||d<a 等价于 ((!b)==c)||(d<a)
a+b>c&&x+y<b 等价于 ((a+b)>c)&&((x+y)<b)
逻辑运算的值
逻辑运算的值也为“真”和“假”两种,用“1”和“0 ”来表示。其求值规则如下:
-
与运算(&&)
参与运算的两个量都为真时,结果才为真,否则为假。例如:
5>0 && 4>2
由于5>0为真,4>2也为真,相与的结果也为真。 -
或运算(||)
参与运算的两个量只要有一个为真,结果就为真。 两个量都为假时,结果为假。例如:
5>0||5>8
由于5>0为真,相或的结果也就为真。 -
非运算(!)
参与运算量为真时,结果为假;参与运算量为假时,结果为真。例如:
!(5>0)
的结果为假。
虽然C编译在给出逻辑运算值时,以“1”代表“真”,“0 ”代表“假”。但反过来在判断一个量是为“真”还是为“假”时,以“0”代表“假”,以非“0”的数值作为“真”。例如:
由于5和3均为非“0”因此5&&3的值为“真”,即为1。
又如:
5||0的值为“真”,即为1。
逻辑表达式
逻辑表达式的一般形式为:
表达式 逻辑运算符 表达式
其中的表达式可以又是逻辑表达式,从而组成了嵌套的情形。例如:
(a&&b)&&c
根据逻辑运算符的左结合性,上式也可写为:
a&&b&&c
逻辑表达式的值是式中各种逻辑运算的最后值,以“1”和“0”分别代表“真”和“假”。
以下是逻辑运算的真值表:
4.4.2 逻辑表达式
以下是逻辑运算的真值表:
4.5 条件运算符和条件表达式
【例4.4】输入一个字符,判别它是否为大写字母,如果是,将它转换为小写字母;如果不是,不转换。然后输出最后得到的字符。
#include <stdio.h>
int main ()
{
char ch;
printf("请输入一个字母:\n");
scanf("%c",&ch);
if(ch>='A'&&ch<='Z') //判断语句,用if来判断输入的字母是否在'A'到'Z'之间
{
ch=ch+32; //一个字母的大小写的ASCII代码之间相差32
printf("输出的字母是:%c\n",ch);
}
else
{
printf("输出的字母是:%c\n",ch);
}
return 0;
}
或者是这样:
#include <stdio.h>
int main ()
{
char ch;
printf("请输入一个字母:\n");
scanf("%c",&ch);
ch = (ch>='A'&&ch<='Z')?(ch+32):ch; /*此表达式的意思就是对ch最后会是什么字母进行判断
如果前面的条件成立则输出(ch+32)如果不成立就
输出ch的值*/
printf("最后得到的字母是:%c\n",ch);
return 0;
}
可以看到,条件表达式相当于一个不带关键字if的if语句,用它处理简单的选择结构可使程序简洁。
4.6 选择结构的嵌套
【例4.5】 有一阶跃函数编写一个程序,输入一个x的值,要求输出相应的y值。
代码如下:
#include <stdio.h>
int main ()
{
float x,y;
printf("请输入X的值:\n");
scanf("%f",&x);
if(x<0)
{
y = -1;
}
else
if(x==0)
{
y = 0;
}
else
{
y = 1;
}
printf("最后输出的值是:%f\n",y);
return 0;
}
运行结果如下:
4.7 用switch语句实现多分支选择结构
【例4.6】 要求按照考试成绩的等级输出百分制数段,A等为85分以上,B等为70到84分,C等为60到69分,D等为60分以下。成绩的等级由键盘输入。
代码如下:
#include <stdio.h>
int main ()
{
char grade;
scanf("%c",&grade);
printf("你的成绩:");
switch(grade)
{
case'A':printf("85到100\n");break;
case'B':printf("70到84\n");break;
case'C':printf("60到69\n");break;
case'D':printf("<60\n");break;
default:printf("输入的成绩有误!\n");
}
return 0;
}
运行结果如下:
4.8 选择结构程序综合举例
【例4.7】 写一段程序,判断某一年是否是闰年。
代码如下:
#include <stdio.h>
int main ()
{
int year,leap;
printf("enter year:");
scanf("%d",&year);
if(year%4==0)
{
if(year%100==0)
{
if(year%400==0)
leap=1;
else
leap=0;
}
else
leap=1;
}
else
leap=0;
if(leap)
printf("%d is ",year);
else
printf("%d is not ",year);
printf("a leap year.\n");
return 0;
}
运行结果如下: