点击这里给我发消息 点击这里给我发消息

C语言基础入门:条件控制语句

添加时间:2013-12-7
    相关阅读: 设计 程序 C语言
副标题#e#
    在程序的三种基本结构中,第二种即为选择结构,其基本特点是:程序的流程由多路分支
组成,在程序的一次执行过程中,根据不同的情况,只有一条支路被选中执行,而其他分支上的语句被直接跳过。
    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。

C语言条件控制语句(图一)


    对应图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。

C语言条件控制语句(图二)


    分析: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

#p#副标题#e#

 

    3.if...elseif语句

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

    语句1
    elseif<表达式2>
    语句2
    elseif<表达式3>
    语句3
    else语句4
    对应的流程图见图3-4。

C语言条件控制语句(图三)


    [例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。

C语言条件控制语句(图四)


    源程序如下:
 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;

 

#p#副标题#e#

    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表达式的多个值都需要执行相同的语句,可以采用下面的格式:

C语言条件控制语句(图五)


 switch(i)
{
case1:
case2:
case3:语句1;
break;
case4:
case5:语句2;
break;
default:语句3;
}

    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<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);
}

    运行结果如下:
    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!

相关C语言基础入门:条件控制语句

咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册