语句1
elseif<表达式2>
语句2
elseif<表达式3>
语句3
else语句4
对应的流程图见图3-4。
[例3-7]货物征税问题,价格在1万元以上的征5%,5000元以上1万元以下的征3%,
1000元以上5000以下的征2%,1000元以下的免税,读入货物价格,计算并输出税金。
分析:读入price,计算tax,这是一个较复杂的分支结构程序设计(应注重避免重复征税)。
假定货物的价格在1万元以上,征税应分段累计,各段采用不同税率进行征收。
算法:若price>=10000
则tax=0.05*(price-10
000);price=10000;
否则,若price>=5000
则tax=0.03*(price-5000)+tax;price=5000;
否则,若price>=1000
则tax=0.02*(price-1000)+tax;price=1000;
程序如下:
#include<stdio.h>
main()
{
floatprice,tax=0;
printf("inputprice:");
scanf("%f",&price);
if(price>=10000.0)
{
tax=0.05*(price-10000)+tax;price=10000;
}
if(price>=5000.0)
{
tax=0.03*(price-5000)+tax;price=5000;
}
if(price>=1000.00)
{
tax=0.02*(price-1000)+tax;
}
printf("thetax=%10.3f",tax);
}
运行程序:
RUN¿
15000¿
thetax=480.000
4.if语句嵌套
在一个if语句中可以又出现另一个if语句,这称为if语句的嵌套或多重if语句:
if<表达式1>
if<表达式11>
......
else
语句2;
[例3-8]计算函数
1x>0
y=0x=0
-1x<0
流程图见图3-5。
源程序如下:
main()
{
floatx,y;
printf("inputx,y:");
scanf("%f",&x);
if(x>=0)
if(x>0)
y=1;
else
y=0;
else
y=-1;
printf("y=%4.0f\n",y);
}
对多重if,最轻易犯的错误是if与else配对错误,
例如,写成如下形式:
y=0;
if(x>=0)
if(x>0)
y=1;
else
y=-1;
从缩排上可以看出,作者希望else是与ifx>=0配对,但是C语言规定else总是与离它最近
的上一个if配对,结果,上述算法的流程图变成图3-6,完全违反了设计者的初衷。
改进的办法是使用复合语句,将上述程序段改写如下:
y=0;
if(x>=0)
{
if(x>0)
y=1;
}
else
y=-1;
3.3.2switch语句
if语句只能处理从两者间选择之一,当要实现几种可能之一时,就要用if...elseif甚至多重的嵌套if来实现,当分支较多时,程序变得复杂冗长,可读性降低。C语言提供了switch开关语句专门处理多路分支的情形,使程序变得简洁。
switch语句的一般格式为:
switch<表达式>
case常量表达式1:语句序列1;
break;
case常量表达式2:语句序列2;
break;
⋯⋯
case常量表达式n:语句n;
break;
default:语句n+1;
其中常量表达式的值必须是整型,字符型或者枚举类型,各语句序列答应有多条语句,不需要按复合语句处理,若语句序列i为空,则对应的break语句可去掉。图3-7是switch语句的流程图。
非凡情况下,假如switch表达式的多个值都需要执行相同的语句,可以采用下面的格式:
switch(i)
{
case1:
case2:
case3:语句1;
break;
case4:
case5:语句2;
break;
default:语句3;
}
当整型变量i的值为1、2或3时,执行语句1,当i的值为4或5时,执行语句2,否则,执行
语句3。
[例3-9]输入月份,打印1999年该月有几天。
程序如下:
#include<stdio.h>
main()
{
int month;
int day;
printf("please input the month number:");
scanf("%d",&month);
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:day=31;
break;
case 4:
case 6:
case 9:
case 11:day=30;
break;
case 2:day=28;
break;
default:day=-1;
}
if day=-1
printf("Invalid month input !\n");
else
printf("1999.%dhas%ddays\n",month,day);
}
3.3.3程序应用举例
[例3-10]解一元二次方程ax2+bx+c=0,a、b、c由键盘输入。
分析:对系数a、b、c考虑以下情形
1)若a=0:
①b<>0,则x=-c/b;
②b=0,则:①c=0,则x无定根;
②c<>0,则x无解。
2)若a<>0;
①b2-4ac>0,有两个不等的实根;
②b2-4ac=0,有两个相等的实根;
③b2-4ac<0,有两个共轭复根。
用嵌套的if语句完成。程序如下:
#include<math.h>
#include<stdio.h>
main()
{
float a,b,c,s,x1,x2;
doublet;
printf("please input a,b,c:");
scanf("%f%f%f",&a,&b,&c);
if(a==0.0)
if(b!=0.0)
printf("the root is:%f\n",-c/b);
elseif(c==0.0)
printf("x is inexactive\n");
else
printf("no root !\n");
else
{
s=b*b-4*a*c;
if(s>=0.0)
if(s>0.0)
{
t=sqrt(s);
x1=-0.5*(b+t)/a;
x2=-0.5*(b-t)/a;
printf("There are two different roots:%fand%f,\xn1",x2);
}
else
printf("There are two equal roots:%f\n",-0.5*b/a);
else
{
t=sqrt(-s);
x1=-0.5*b/a;/*实部*/
x2=abs(0.5*t/a);/*虚部的绝对值*/
printf("There are two virtual roots:");
printf("%f+i%f\t\t%f-i%f\n",x1,x2,x1,x2);
}
}
}
运行结果如下:
RUN
please input a,b,c:123
There are two virtual roots:
-1.000000+i1.000000-1.000000-i1.000000
RNU
pleaseinputa,b,c:253
There are two different roots:-1.500000and-1.000000
RNU
please input a,b,c:003¿
No root!
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |