if语句的嵌套
在嵌套内的if语句可能又是if-else型的,这将会出现多个if和多个else重叠的情况,这时要特别注意if和else的配对问题。
例如:
if(表达式1)
if(表达式2)*
语句1;
else*
语句2;
其中的else究竟是与哪一个if配对呢?[else*和就近的if*配对]
为了避免这种二义性,C语言规定,else总是与它前面最近的if配对,因此对上述例子应理解为:
if(表达式1)
if(表达式2)
语句1;
else
语句2;
比较以下两题目:哪一个是运用嵌套方法?
【例5.6】
void main()
{
int a,b;
printf("please input A,B: ");
scanf("%d%d",&a,&b);
if(a!=b)
if(a>b) printf("A>B\n");
else printf("A<B\n");
else printf("A=B\n");
}
条件运算符和条件表达式
条件运算符为"?:",他是一个三目运算符,即有三个参与运算的量。
由条件运算符组成的条件表达式的一般形式为:
表达式1?表达式2:表达式3
其求值规则为:如果表达式1的值为真,则以表达式2的值作为条件表达式的值,否则以表达式3 的值作为整个表达式的值。
条件表达式通常用于赋值语句中。
例如条件语句:
if(a>b) max = a;
else max = b;
可用条件表达式写为:
max = (a>b)?a:b;
执行该语句的语义是:如a>b为真,则把a赋予max,否则把b赋予max。
使用条件表达式时,还应注意以下几点:
1)条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。
因此:max=(a>b)?a:b; 可以去掉括号而写为:max=a>b?a:b;
2)条件运算符?和:是一对运算符,不能分开单独使用。
3)条件运算符的结合方向是自右至左。
例如:a>b?a:c>d?c:d 应理解为:a>b?a:(c>d?c:d);
这也就是条件表达式嵌套的情形,即其中的表达式3又是一个条件表达式。
【例5.8】
void main()
{
int a,b,max;
printf("\ninput two numbers: ");
scanf("%d%d",&a,&b);
printf("max=%d",a>b?a:b);
}
补充:输入一个字符,判断它是否是大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。
#include <stdio.h>
void main()
{
char ch;
scanf("%c",&ch);
ch=(ch>='A'&&ch<='Z')?(ch+32):ch;
}
switch语句
【例4.9】
void main()
{
int a;
printf("input integer number: ");
scanf("%d",&a);
switch(a)
{
case 1:printf("Monday\n");break;
case 2:printf("Tuesday\n");break;
case 3:printf("Wednesday\n");break;
case 4:printf("Thursday\n");break;
case 5:printf("Friday\n");break;
case 6:printf("Saturday\n");break;
case 7:printf("Sunday\n");break;
default:printf("error\n");
}
}
在使用switch语句时还应注意以下几点:
1)在case后的各常量表达式的值不能相同,否则会出现错误。
2)在case后,允许有多个语句,可以不用{}括起来。
3)各case和default子句的先后顺序可以变动,而不会影响程序执行结果。
4)default子句可以省略不用。
【例4.11】输入三个整数,输出最大数和最小数。
void main()
{
int a,b,c,max,min;
printf("input three integer numbers: \n");
scanf("%d%d%d",&a,&b,&c);
if(a>b){
max = a;
min = b;
}else{
max = b;
min = a;
}
if(c>max){
max = c;
}
if(c<min){
min= c;
}
printf("max=%d,min=%d",max,min);
}
【例4.12】计算器程序。用户输入运算数和四则运算符,输出计算结果。
double a,b;
char c;
printf("input expression:a+(-,*,/)b\n");
scanf("%lf%c%lf",&a,&c,&b);
switch(c)
{
case '+': printf("%lf\n",a+b);break;
case '-': printf("%lf\n",a-b);break;
case '*': printf("%lf\n",a*b);break;
case '/': printf("%lf\n",a/b);break;
default: printf("input error\n");
}
作业1:输入一个年份,并判断是否为闰年。
#include <stdio.h>
void main()
{
/***************************
*输入一个年份判断是否为闰年*
***************************/
int y;
scanf("%d",&y);
if(y%4==0)
{
if(y%100==0 && y%400!=0){
printf("%d is not a leap year.\n",y);
}
else
{
printf("%d is a leap year.\n",y);
}
}
else
{
printf("%d is not a leap year.\n",y);
}
}
作业2:运输公司对用户计算运费。
路程(s)越远,每公里运费越低。标准如下:
s<250km 没有折扣
250≤s<500 2%折扣
500≤s<1000 5%折扣
1000≤s<2000 8%折扣
2000≤s<3000 10%折扣
3000≤s 15%折扣
设每公里每吨货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费f的计算公式为:
f = p*w*s*(1-d);
void main()
{
f = p*w*s*(1-d);
int s,c;
float p,w,d,f;
scanf("%f,%f,%d",&p,&w,&s);
if(s>=3000)
{
c = 12;
}
else
{
c = s/250;
}
printf("\nc=%d\n",c);
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;
}
f = p*w*s*(1-d/100.0);
printf("freight=%15.4f\n",f);
}