您现在的位置: 中国男护士网 >> 考试频道 >> 计算机等级 >> 二级辅导 >> C语言 >> 辅导 >> 正文    
  C语言程序设计(第3章程序控制语句)3 【注册男护士专用博客】          

C语言程序设计(第3章程序控制语句)3

www.nanhushi.com     佚名   不详 

3.3 条件控制语句
    在程序的三种基本结构中,第二种即为选择结构,其基本特点是:程序的流程由多路分支组成,在程序的一次执行过程中,根据不同的情况,只有一条支路被选中执行,而其他分支上的语句被直接跳过。
    C语言中,提供if语句和switch语句选择结构, if语句用于两者选一的情况,而switch用于多分支选一的情形。
3.3.1 if语句
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 < M I N,则MIN <==C;其流程图见图3 - 2。


    对应图3 - 1和图3 - 2,正是i f语句的两种基本形式,与图3 - 2对应的i f语句的格式为:
    if <表达式> 语句
    当表达式为真时,执行语句,表达式为假时跳过语句。
    与图3 - 1对应的i f语句的格式为:
    if<表达式>
        语句1
    else
        语句2

    当表达式为真时,执行语句1,表达式为假时执行语句2。无论如何,语句1与语句2每次只能有一个被执行。
要注意的是: if或if . . . else,包括后面要讲到的嵌套if,即if...else if...被看成是一条语句,即使其中的语句是包含多条语句的复合语句,仍然如此。

下面是例3 - 5的源程序:
main( )
{
    int a,b,c,min;
    printf(" input a,b,c :");
    scanf("%d %d %d" , &a , &b , &c);
    if(a<b)
    min = a;
    else
    min = b;
    if (c<min)
    min = c;
    printf("The result is %d\n",min);
}
    执行情况如下:
    input a,b,c: 3 5 2
    The result is : 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( )
{
    float x,y,t;
    printf("input x,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);
}
执行结果:
input x,y :43.2 56.7
result : 56.700 43.200

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


    [例3-7] 货物征税问题,价格在1万元以上的征5%,5000元以上1万元以下的征3%,1000元以上5000以下的征2%,1 000元以下的免税,读入货物价格,计算并输出税金。
    分析:读入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( )
{
    float price,tax=0;
    printf("input price:");
    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("the tax=%10.3 f",tax);
}

运行程序:

15000 
the tax=480.000

4. if语句嵌套
    在一个if 语句中可以又出现另一个i f语句,这称为i f语句的嵌套或多重i f语句:
    if <表达式1 >
    if < 表达式11>
       。。。。
    else
        语句2;

[例3-8] 计算函数
        1    x>0
              y= 0 x=0
       -1     x < 0

源程序如下:
main( )
{
    float x,y;
    printf("input x,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是与if x>=0配对,但是C语言规定else总是与离它最近的上一个if 配对,结果,上述算法的流程图变成图3 - 6,完全违背了设计者的初衷。 

    改进的办法是使用复合语句,将上述程序段改写如下:
    y = 0 ;
    if (x > = 0 )
    {
        if (x > 0 )
            y = 1 ;
    }
    else
        y = - 1 ;

3.3.2 switch 语句
    if 语句只能处理从两者间选择之一,当要实现几种可能之一时,就要用if...else if甚至多重的嵌套i f来实现,当分支较多时,程序变得复杂冗长,可读性降低。C语言提供了switch开关语句专门处理多路分支的情形,使程序变得简洁。
    switch语句的一般格式为:
    switch <表达式>
    case 常量表达式1:语句序列1;
        break;
    case 常量表达式2:语句序列2;
        break;
    。。。。
    case 常量表达式n : 语句n ;
        break;
    default: 语句n + 1 ;
    其中常量表达式的值必须是整型,字符型或者枚举类型,各语句序列允许有多条语句,不需要按复合语句处理,若语句序列i为空,则对应的break语句可去掉。
特殊情况下,如果switch表达式的多个值都需要执行相同的语句,可以采用下面的格式:
    switch (i)
    {
        case 1:
        case 2:
        case 3: 语句1;
            break;
        case 4:
        case 5: 语句2;
            break;
        default: 语句3;
    }
    当整型变量i的值为1、2或3时,执行语句1,当i的值为4或5时,执行语句2,否则,执行语句3。

[例3-9] 输入月份,打印1 9 9 9年该月有几天。
程序如下:
#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.%d has %d days \n",month,day);
}

3.3.3 程序应用举例
    [例3-10] 解一元二次方程a x2+ b x + 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-4 a c > 0,有两个不等的实根;
    ② b2-4 a c = 0,有两个相等的实根;
    ③ b2-4 a c < 0,有两个共轭复根。
    用嵌套的i f语句完成。程序如下:
#include <math.h>
#include <stdio.h>
main( )
{
    float a,b,c,s,x1,x2;
    double t;
    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);
        else if (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 = s q r t ( s ) ;
                x1 = -0.5 *(b + t) / a;
                x 2 = - 0 . 5 * ( b - t ) / a ;
                printf("There are two different roots:%f and%f\n" ,x 1 , x 2 ) ;


            }
            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 );
        }
    }
}
运行结果如下:
please input a,b,c : 1 2 3
There are two virtual roots:
-1.000000 + i 1.000000 -1.000000 - i 1.000000

please input a,b,c : 2 5 3
There are two different roots : -1.500000 and -1.000000

please input a,b,c : 0 0 3
No root!

 

文章录入:杜斌    责任编辑:杜斌 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     

    联 系 信 息
    QQ:88236621
    电话:15853773350
    E-Mail:malenurse@163.com
    免费发布招聘信息
    做中国最专业男护士门户网站
    最 新 热 门
    最 新 推 荐
    相 关 文 章
    没有相关文章
    专 题 栏 目