学习笔记---if和switch的使用方法和要点

41 篇文章 0 订阅
26 篇文章 0 订阅

注:这两个语句的基础应用十分简单,所以这里不过多阐述


if选择结构


当满足条件时,执行一个语句块。当不满足条件时,执行另一个语句块。


示例代码:

#include <stdio.h>
#include <stdlib.h>
/*
这个程序用来测试简单的if语句。
*/
int main()
{
    int a,b,c;
    scanf("%d %d",&a,&b);
    if(a>b)
        {
            c=a;
        }
    else
        {
            c=b;
        }
    printf("max=%d\n",c);
    return 0;
}
结果:




解析:当a>b成立时,执行if下的c=a;。当a>b不成立,执行else下的c=b;达到使c获得ab中较大的一方的值的目的。



if结构中的注意点:


一:else总是和离得最近的,还未配对的if配对(当没有加大括号的情况下)。


代码示例:

#include <stdio.h>
#include <stdlib.h>
/*
这个程序用来测试else的配对机制。
*/
int main()
{
    int a=0,b=0,c=0,d=0;
    scanf("%d %d %d",&a,&b,&d);
    /*
    以下代码希望达成使c等于ab中的最大值,并只有当这个最大值大于d时,才将这个值赋予c。
    */
    if(a>b)
        if(a>d)
            c=a;
    else//注意,这里的else十分有问题。
        if(b>d)
            c=b;

    printf("max=%d\n",c);
    return 0;
}
结果:



解析:

1.输入a=1,b=5,d=4。按照这个程序原本希望达成的效果。理应输出max=5。但这里的结果却是max=0,即c没有被赋值

2.看语句中的else,我们发现,根据else的配对原则,这个else会和离得最近的,并且尚未配对的if(a>d)配对,而非与if(a>b)配对即这部分代码实际上等价于以下代码

            
    if(a>b)
    {
        if(a>d)
        {
            c=a;
        }
        else
        {
            if(b>d)
            {
                c=b;
            }
        }
    } 


二:if判断后的空语句:


诸如以下语句,因为失误,或者其他原因,在if(a>b)后直接接上了一个分号。


 if(a>b);
        c=a;
 else
        c=b;
    

结果程序会判定:当a>b时,执行一个空语句,然后结束整个if结构。然后执行c=a;(也就是说,不管a>b是否成立,c=a都会被执行,因为这条语句在程序的判断中不在if结构中)

另外,因为整个if结构已经结束了,所以下方的else将找不到可以配对的if。所以编译时便会报错。


switch选择结构

switch结构为:当用于判断的整型或字符型与某个case中的值相等时,执行其下的语句。如果与所有case都不相等,执行default下的语句。


代码示例1:

#include <stdio.h>
#include <stdlib.h>
/*
这个程序用来测试else的配对机制。
*/
int main()
{
    int a=80;

    switch(a)
    {
    case 100:
        printf("满分");
    case 90:
        printf("还行");
    default:
        printf("努力");
    }


    return 0;
}
结果:




代码示例2:

#include <stdio.h>
#include <stdlib.h>
/*
这个程序用来测试else的配对机制。
*/
int main()
{
    int a=100;

    switch(a)
    {
    case 100:
        printf("满分");
    case 90:
        printf("还行");
    default:
        printf("努力");
    }


    return 0;
}

结果:


解析:

1.可以看到,示例1中:a=80无法与任何case匹配,所以输出了default中的内容。而示例2中:a=100与第一个case匹配输出“满分”之后还输出了以下所有case中以及default中的内容


为了明确switch语句的机制,这里放上两张示意图:






如上图所示:if语句在执行完语句1或语句2之后,将直接结束选择结构而switch语句在执行完语句1或2之后,将跳过剩下的语句3到语句n的判断条件,直接执行其中的语句


这里引出一种常和各种选择、循环结构共用的语句:break;

break语句常用于跳出switch选择结构和for、while循环结构。


具体的使用十分简单,所以直接放出代码:

#include <stdio.h>
#include <stdlib.h>
/*
这个程序用来测试else的配对机制。
*/
int main()
{
    int a=100;

    switch(a)
    {
    case 100:
        printf("满分\n");
        break;//执行完输出语句之后,执行break语句跳出整个分支选择结构
    case 90:
        printf("还行\n");
        break;
    default:
        printf("努力\n");
        break;//这里的break实际上可以省略
    }
    printf("end");

    return 0;
}

结果:



解析:

1.加入了break语句之后,输出完“满分”之后直接直接跳过了switch语句剩下的部分。


注:用于switch判断的变量(如上面代码中的a)必须为整型或字符型的数据!

因为switch做的是等值判断,而浮点型数据因存储方式带来的必然误差导致我们无法用他们来进行精确的等值判断


使用switch解决实际问题


示例代码1:

#include <stdio.h>
#include <stdlib.h>
/*
这个程序用于Switch的应用


每公里每吨货物的基本运费为p,货物重为w,距离为s,折扣为d,求运费f。
d随s的增长增长,以下switch语句用于确定折扣。
*/
int main()
{
    int s,c;
    float f,p,w,d;
    printf("please enter p,w,s:");
    scanf("%f%f%d",&p,&w,&s);
    c=s\250;
    if(c>=12)
        {
            c=12;
        }
    switch(c)
    {
    case 1:
        d=2;break;
    case 2:
    case 3:
        d=5;break;
    case 4:
    case 5:
    case 6:
    case 7:
        d=8;break;
    case 8:
    case 9:
    case 10:
    case 11:
        d=10;break;
    case 12:
        d=15;break;
    }
    f=p*w*s*(1-d/100.0);
    printf("freight=%.2f\n",f);


    return 0;
}

结果:


解析:

1.当switch选择结构的变量过大,并有规律时(如示例1)可以通过将变量除以一个数来缩小

2.当switch选择结构需要用浮点型做变量时,也可以通过1的方法获得一个整型数来用于选择

3.示例1中通过对break;的灵活应用,精简了大量代码。


示例代码2:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/*
对于一个分段函数:
当x<2时y=x;
当2<=x<6时y=x*x;
当6<=x<10时y=sqrt(x+1);
当x>=10时y=1/(x+1);
使用switch结构解题有特殊的技巧。
*/
int main()
{
    printf("start:please input x:");
    int t;
    float x,y;
    scanf("%f",&x);
    t=(x<2)+(x<6)+(x<10);//利用假为0,真为1的性质。
    switch(t)
    {
    case 0:y=1/(x+1);break;//为0时,相当于三个判断都为假,即x>=10;
    case 1:y=sqrt(x+1);break;//为1时,相当于三个判断只有一个为真,即只有x<10成立,所以6<=x<10;
    case 2:y=x*x;break;//为2时,相当于三个判断只有x<2为假,所以2<=x<6;
    case 3:y=x;//为3时,相当于三个判断全成立,所以x<2;
    }

    printf("y=%f\n",y);
    printf("end");
    return 0;
}

结果:



解析:

1.当碰到如示例2中的多层选择结构时,利用C中真为1,假为0,并可用于整型运算的规则。可以精简大量代码,并以此把看似只能用if结构解决的问题用switch解决。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值