王朝网络
分享
 
 
 

C语言条件控制语句

王朝c/c++·作者佚名  2008-06-01
宽屏版  字体: |||超大  

在程序的三种基本结构中,第二种即为选择结构,其基本特点是:程序的流程由多路分支

组成,在程序的一次执行过程中,根据不同的情况,只有一条支路被选中执行,而其他分支上的语句被直接跳过。

C语言中,提供if语句和switch语句选择结构,if语句用于两者选一的情况,而switch用于多分支选一的情形。

3.3.1if语句

1.if语句的两种基本形式首先,我们看一个例子,由此了解选择结构的意义及设计方法。

[例3-5]输入三个数,找出并打印其最小数。

分析:设三个数为A、B、C,由键盘读入,我们用一个变量MIN来标识最小数,A、B、

C与MIN皆定义为int型变量。

每次比较两个数,首先比较A和B,将小的一个赋给MIN,再把第三个数C与MIN比较,

再将小的一个赋给MIN,则最后MIN即为A、B、C中最小数。

算法如下:

1)输入A、B、C。

2)将A与B中小的一个赋给MIN。

3)将MIN与C中小的一个赋给MIN。

4)输出MIN。

将第2)步细化为:若A<B,则MIN<==A,否则:MIN<==B;其流程图见图3-1。

第3)步细化为:若C<MIN,则MIN<==C;其流程图见图3-2。

对应图3-1和图3-2,正是if语句的两种基本形式,与图3-2对应的if语句的格式为:

if<表达式>语句

当表达式为真时,执行语句,表达式为假时跳过语句。

与图3-1对应的if语句的格式为:

if〈表达式〉

语句1

else

语句2

当表达式为真时,执行语句1,表达式为假时执行语句2。无论如何,语句1与语句2每次只能有一个被执行。

要注重的是:if或if...else,包括后面要讲到的嵌套if,即if...elseif...被看成是一条语句,即使其中的语句是包含多条语句的复合语句,仍然如此。

下面是例3-5的源程序:

main()

{

inta,b,c,min;

PRintf("inputa,b,c:");

scanf("%d%d%d",&a,&b,&c);

if(a<b)

min=a;

else

min=b;

if(c<min)

min=c;

printf("Theresultis%d\n",min);

}

执行情况如下:

RUN

inputa,b,c:3 5 2

Theresultis:2

这里顺便提一下程序书写的缩排问题,所谓缩排,就是下一行与上一行相比,行首向右缩进若字符,如上例的min=a、min=b等。适当的缩排能使程序的结构、层次清楚、一目了然,增加程序的易读性。应该从一开始就养成一个比较好的书写习惯,包括必要的注释、适当的空行以及缩排。

2.复合语句

if语句中,有时需要执行的语句不止一条,这就要用到复合语句。

复合语句,就是用一对花括号括起来的一条或多条语句,形式如下:

{

语句1;

语句2;

.......

语句n;

}

无论包括多少条语句,复合语句从逻辑上讲,被看成是一条语句。

复合语句在分支结构、循环结构中,使用十分广泛。

[例3-6]读入两个数x、y,将大数存入x,小数存入y。

分析:x、y从键盘读入,若x>=y,只需顺序打出,否则,应将x,y中的数进行交换,然后输出。两数交换必须使用一个中间变量t,定义三个浮点数x、y、t。

算法:

1)读入x、y;

2)大数存入x,小数存入y;

3)输出x、y。

第2)步求精:

若x<y,则交换x与y;

再求精,x与y交换;

①t<==x

②x<==y

③y<==t

算法的流程图见图3-3,程序如下:

#include<stdio.h>

main()

{

floatx,y,t;

printf("inputx,y:");

scanf("%f%f",&x,&y);

if(x<y)

{

t=x;

x=y;

y=t;

}

printf("result:%7.3f\t%7.3f\n",x,y);

}

执行结果:

inputx,y:43.256.7

result:56.70043.200

3.if...elseif语句

实际应用中经常面对更多的选择,这时,将if...else扩展一下,就得到if...elseif结构,其一般形式为:

if<表达式1>

语句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-10000);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!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有