课外天地 李树青学习天地C语言程序设计 → [推荐]第三课代码讲义:分支语句


  共有9876人关注过本帖树形打印复制链接

主题:[推荐]第三课代码讲义:分支语句

帅哥哟,离线,有人找我吗?
admin
  1楼 博客 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 管理员
等级:管理员 帖子:1939 积分:26594 威望:0 精华:34 注册:2003/12/30 16:34:32
[推荐]第三课代码讲义:分支语句  发帖心情 Post By:2015/10/13 13:07:42 [只看该作者]

1)if
int main()
{
    int grade=95;

    if(grade>=90)
    {
        printf("A");
    }
    return 0;
}

简写:
int main()
{
    int grade=95;

    if(grade>=90)
        printf("A");

    return 0;
}

多条语句不能简写


int main()
{
    int grade=95;

    if(grade>=90)
    {
        printf("A");
    }
    else
    {
        printf("B");
    }

    return 0;
}

int main()
{
    int grade=95;

    if(grade>=90)
        printf("A");
    else
        printf("B");

    return 0;
}

等价于
int main()
{
    int grade=95;

    if(grade>=90)
    {
        printf("A");
    }
    if(grade<90)
    {
        printf("B");
    }

    return 0;
}
但是显然前者较好,因为后者程序一定要进行两次判断,也就是说,即使第一个条件满足了,程序也要进行第二个条件的判断;而前者不会,一旦判断出条件的真假,就没有必要在作其他的判断了。

对于更多的判断可以使用else if语句,如下例为判断成绩的等级,规则为
90——100:A
80——89:B
70——79:C
0——69:D

int main()
{
    int grade=95;

    if(grade>=90 && grade<=100)
        printf("A");

    if(grade>=80 && grade<90)
        printf("B");

    if(grade>=70 && grade<80)
        printf("C");

    if(grade<70 && grade>=0)
        printf("D");

    if(grade<0 || grade>100)
        printf("Error in Grade!");

    return 0;
}


int main()
{
    int grade=195;

    if(grade>=90 && grade<=100)
        printf("A");
    else    if(grade>=80 && grade<90)
        printf("B");

    else if(grade>=70 && grade<80)
        printf("C");

    else if(grade<70 && grade>=0)
        printf("D");

    else if(grade<0 || grade>100)
        printf("Error in Grade!");

    return 0;
}
注意:良好的程序嵌套结构和缩进结构有助于写出正确易读的程序,反之容易产生难以发现的逻辑错误。

int main()
{
    int grade=50;

 if(grade>=60)
  if(grade<=100)
   printf("及格");
 else
  printf("不及格");

    return 0;
}
提示:程序没有语法错误,但是没有输出,原因在于else子句其实和第二个if配套,虽然感觉和第一个if对齐(编译时会忽略所有的程序缩进空格)

正确写法:
int main()
{
    int grade=50;

    if(grade>=60)
    {
        if(grade<=100)
            printf("及格");
    }
    else
        printf("不及格");

    return 0;
}

2)switch语句
int main()
{
    int i=1;
    switch(i)
    {
    case 0:
        printf("A");
        break;
    case 1:
        printf("B");
        break;
    case 2:
        printf("C");
        break;
    default:
        printf("Other!");
        break;
    }

    return 0;
}

注意:如果不使用break,会产生“穿透”效果

和上述的else if多重分支判断语句相比,switch只能判断点的取值,也就是说,不能判断范围,所以上述判断成绩等级的程序不能直接写为:
int main()
{
    int grade=100;
    switch(grade)
    {
    case grade>=90 && grade<=100:
        printf("A");
        break;
    case grade>=80 && grade<90:
        printf("B");
        break;
    case grade>=70 && grade<80:
        printf("C");
        break;
    case grade>=0 && grade<70:
        printf("D");
        break;
    default:
        printf("Error in Grade!");
        break;
    }

    return 0;
}

但是可以巧妙的使用取十位数字来进行判断:
int main()
{
    int grade=85;
    switch(grade/10)
    {
    case 10:
    case 9:
        printf("A");
        break;
    case 8:
        printf("B");
        break;
    case 7:
        printf("C");
        break;
    case 6:
    case 5:
    case 4:
    case 3:
    case 2:
    case 1:
    case 0:
        printf("D");
        break;
    default:
        printf("Error in Grade!");
        break;
    }
    return 0;
}

这个程序有个小小的bug,你能发现吗?

 

 


提示:设置grade为-5看看输出是什么?为什么?


应该重新设计程序:
int main()
{
    int grade=5;
    //check the grade
    if(grade<0 || grade>100)
    {
        printf("Error in Grade!");
        return 0;//exit the program
    }

    //process the valid grade
    switch(grade/10)
    {
    case 10:
    case 9:
        printf("A");
        break;
    case 8:
        printf("B");
        break;
    case 7:
        printf("C");
        break;
    case 6:
    case 5:
    case 4:
    case 3:
    case 2:
    case 1:
    case 0:
        printf("D");
        break;
    default:
        printf("Error in Grade!");
        break;
    }
    return 0;
}

还要注意switch不能判断浮点型数据
int main()
{
    double i=1;
    switch(i)
    {
    case 0:
        System.out.println("A");
        break;
    case 1:
        System.out.println("B");
        break;
    case 2:
        System.out.println("C");
        break;
    default:
        System.out.println("Other!");
        break;
    }
    return 0;
}


程序编译报错:switch quantity not an integer(Java语言为:possible loss of precision)
原因在于浮点型数据的存储值并非是确定的,总是存在精度上的误差,如1.00000000也可以保存为0.99999999,所以,不能直接判断两者是否相等,只能通过相减的差值是否位于一个较小的范围内来判断,所以一般使用else if更为合适

#include <math.h>

int main()
{
    double i=2.0;

    if(fabs(i-0)<0.0001)
        printf("A");
    else if(fabs(i-1)<0.0001)
        printf("B");
    else if(fabs(i-2)<0.0001)
        printf("C");
    else
        printf("Other!");

    return 0;
}


下面的程序输出会怎样?
int main()
{
    double i=1.0;
    if(i==0.999999999999999999999999999999)
    {
        printf("成功!i=%d",i);
    }

}

int main()
{
    double i=1.0;
    if(i==0.999999999999999999999999999999)
    {
        printf("成功!i=%d",i);
    }

}


问题:输出是什么?
int main()
{
    int i=0;
    if(i=1)
    {
        printf("成功!i=%d",i);
    }

}

 

[此贴子已经被作者于2015-10-20 13:04:54编辑过]

 回到顶部