【C语言】05-选择结构程序设计
选择结构程序设计
⊙选择结构是三种基本结构之一,其作用是,根据指定的条件所满足的情况转而执行相应的操作。
⊙C语言用关系表达式和逻辑表达式通过if语句实现双分支选择,用switch语句实现多分支选择。
关系运算符和关系表达式
⊙“关系运算”即“比较运算,是对两个值进行比较,比较的结果是得到真假两种值。
一、关系运算符及其优先次序
1.C语言提供6种关系运算符
⊙种类:< <= == >= > !=
⊙结合方向:自左向右
⊙优先级别:
二、关系表达式
1.用关系运算符将两个表达式连接起来的式子
⊙a>b , (a+b)>(b+c) , 5==3
2.关系表达式的值:是逻辑值“真”或“假”,用1和0表示
3.关系运算几点注意:
4.关系运算中应该注意
逻辑运算符和逻辑表达式
用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。
一、逻辑运算符:C语言提供3种逻辑运算符
注:
二、逻辑运算真值表:三、逻辑运算符的优先次序:
!(非) , &&(与), ||(或)
优先次序:高(2) (11) (12)低
结合方向:从右向左 从左向右 从左向右
四、逻辑表达式
1.C语言中, 运算量: 0表示“假”,运算结果: 0表示“假”,
非0表示“真”, 1表示“真”,
2.逻辑运算中的注意点:
⊙短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在 必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。
五、复杂逻辑条件的表述
判断某一年year是否为闰年
if语句
一、If语句的三种形式
1.形式一:
⊙格式:if (表达式) 语句
⊙执行过程:
2.形式二:
⊙格式:if (表达式)
语句1
else
语句2
⊙执行过程:
3.形式三:
⊙格式:if (表达式1) 语句1
else if (表达式2) 语句2
else if (表达式3) 语句3
……
else if (表达式m) 语句m
else 语句n
⊙执行过程:
4.几点说明:
⊙if后面的表达式类型任意
if(a = =b&&x= =y) printf(“a=b,x=y”);
if(3) printf(“OK”);
if(‘a’) printf(“%d”,a);
⊙if 后面的语句可以是复合语句,必须要加{ }
例1:输入两个数并判断两数是否相等
例2:判断输入字符种类
例3:输入两个实数,按由小到大的次序输出两数
例4:输入三个数,按由小到大的次序输出
二、If 语句的嵌套
⊙If语句中又包含一个或多个if语句称为if语句的嵌套。
⊙实际上只要将前述if语句的形式1和2中的内嵌语句用一个if语句代替,即 成为if语句的嵌套。
⊙嵌套的if语句还可以嵌套另一个if语句,形成多重嵌套。
1. 一般形式:
2.if 嵌套的几种变形
注:else 总是与前面最近的if 配对
例:输入两个数并判断其大小关系
2.if ~ else 配对原则:缺省{ }时,else总是和它上面离它最近的未配对的if 配对。
例 :考虑下面程序的输出结果
main()
{ int x=100,a=10,b=20;
int v1=5,v2=0;
if(a<b)
if(b!=15)
if(!v1) x=1;
else
if(v2) x=10;
x= -1;
printf(“%d”,x);
}
运行结果:-1
条件运算符
if语句中,当表达式为“真”和“假”时,都只执行一个赋值语句给同一个变量赋值时,可以用条件运算符处理。
注:条件运算符是 C 语言中唯一的三目运算符
-
条件运算符练习
2.条件运算符几点说明:
⊙条件运算符可嵌套
⊙优先级: 13
⊙结合方向:自右向左
⊙表达式1?表达式2:表达式3 类型可以不同,表达式值取表达式2和表达式3中较高的类型
嵌套:x>0?1:(x<0?-1:0)
例:输入一个字母,大写转小写,然后输出字母
#include <stdio.h>
void main()
{ char ch;
scanf("%c",&ch);
ch=(ch>=‘A’ && ch<=‘Z’)? (ch+32) : ch;
printf(“%c“,ch);
}
运行:输入:A ; 输出:B
switch语句(多分支选择语句)
一、一般形式:
二、执行过程:
三、switch几点说明
1.C1,C2,…Cn是常量表达式,且值必须互不相同
2.常量表达式起语句标号作用,必须用break跳出
3.case后可包含多个可执行语句,且不必加{ }
4.switch可嵌套
5.多个case可共用一组执行语句
例:switch嵌套
#include <stdio.h>
void main( )
{ int x=1,y=0,a=0,b=0;
switch(x)
{ case 1:
switch(y)
{ case 0: a++; break;
case 1: b++; break;
}
case 2: a++;b++; break;
case 3: a++;b++;
}
printf(“\na=%d,b=%d”,a,b);
}
运行结果:a=2,b=1
程序举例
例1. 判断某一年是否闰年
①
#include <stdio.h>
void main()
{ int year,leap;
scanf(“Enter year:%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”);
}
②
#include <stdio.h>
void main()
{ int year,leap;
scanf(“Enter year:%d”,&year);
if(year%4!=0)
leap=0;
else if(year%100!=0)
leap=1;
else if(year%400!=0)
leap=0;
else leap=1;
if(leap) printf(“%d is”,year);
else printf(“%d is not”,year);
printf(“a leap year.\n”);
}
③使用逻辑表达式
#include <stdio.h>
void main()
{ int year,leap;
scanf(“Enter year:%d”,&year);
if((year%4==0&&year%100!=0)||(year%400==0))
leap=1;
else leap=0;
if(leap) printf(“%d is”,year);
else printf(“%d is not”,year);
printf(“a leap year.\n”);
}
例2. 根据输入的字母输出相应的字符串
运行结果:
例3. 求ax2+bx+c=0方程的解
#include <stdio.h>
#include<math.h>
void main()
{ float a,b,c,d,disc,x1,x2,realpart,imagpart;
scanf(“%f,%f,%f”,&a,&b,&c);
printf(“The equation”);
if(fabs(a)<=1e-6) printf(“is not a quadratie”);
else {disc=b*b-4*a*c;
if(fabs(disc)<=1e-6)
printf(“has two equal roots:%8.4f\n”,-b/(2*a));
else if(disc>1e-6)
{x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
printf(“has has distinct real roots:%8.4f and %8.4f\n”,x1,x2);}
else { realpart=-b/(2*a); imagpart=sqrt(-disc)/(2*a);
printf(“has complex roots:\n”);
printf(“%8.4f + %8.4fi\n”,realpart,imagpart);
printf(“%8.4f + %8.4fi\n”,realpart,imagpart);
} } }
例4.计算运费:
#include <stdio.h>
void main()
{ int c,s;
float p,w,d,f;
scanf(“%f,%f,%d”,&p,&w,&s);
if(s>=3000) c=12;
else c=s/250;
switch(c)
{ case 0: d=0;break;
case 1: d=2;break;
case 2:
case 3: d=5;break;
case 4:
case 5:
case 6:
case 7: d=8;break;
case 8:
case 9:
case 10:
case 11: d=10;break;
case 12: d=15;break;
}
f=p*w*s*(1-d/100.0);
printf(“freight=%15.4f”,f);
}
引致:教材
C程序设计 (第二版)
谭浩强 编著 清华大学出版社
内容:提供更好的学习资源