C语言基础⑤——分支结构程序设计

//录入一个双精度浮点型变量x,通过一个分支结构,判断x是否不为0,输出相应的y值

一、分支结构

分支结构,又被称之为选择结构。

1、概念

选择结构:根据条件成立与否,选择相应的操作。

2、条件构建

  • 关系表达式:含有关系运算符的表达式(>,<,>=,<=,!=,==);
  • 逻辑表达式:含有逻辑运算符的表达式(&&,||,!),往往是用来构建复杂的复合条件;
if(year % 100 == 0 && year % 4 != 0) //这种既含有关系表达式,又含有逻辑表达式的条件叫做复合条件
  • 常量/变量:值是否非0,取值(0|1);

注意:类似以下写法,是无效的,无意义的。

if(x+y) //编译通过,但是无实际意义,不建议这样写

3、选择结构的形式

1.单分支

语法:

if(条件表达式)
{
    语句1;
}

说明:条件表达式成立,执行语句1,否则跳过该分支结构。单分支条件不满足可以不执行。

举例:

int a = 5;
if(a < 0)
{
    a = -a;
}
printf("a=%d\n",a);
/**
 * 需求:从键盘输入一个字符,如果输入的是英文大写字母,则将它转换成小写字母后输出,否则输出原来输入的字符
 */
#include <stdio.h>

int main()
{
    // 声明一个变量,存放从键盘录入的字符
    char c;

    printf("请输入一个英文字母:\n");
    scanf("%c",&c);

    // 判断
    if(c >= 'A' && c <= 'Z')
   {
        // c = c + 32;
        c += 32;
   }
    printf("输入的字符是:%c\n",c);

    return 0;
    
}

2.双分支

语法:

if(条件表达式)
{
    语句1;
}
else
{
    语句2;
}

说明:条件表达式成立,执行语句1,否则执行语句2.双分支不管条件是否满足,都要执行

举例:

//当且仅当两个除数x和a均不为0时,执行"y = 1.0/x + 1.0/a"
if(x != 0 && a != 0)
{
    y = 1.0/x + 1.0/a;
}
else
{
    y = 10000;
}

3.三目运算符

语法:

条件表达式1 ? 表达式2 : 表达式3;

说明:

?  :条件运算符,主要可以简化双分支为同一变量赋值的操作。

求值过程:先计算表达式1的值,非0,则将表达式2的结果作为条件运算符的最终结果;否则将表达式3的结果作为条件运算符的最终结果

举例:

#include <stdio.h>

int main()
{
    // 需求:输入两个实数,按代数值由 小到大的顺序输出这两个实数。6    
    // 申明变量,存储操作数
    int a,b;
    
    printf("请输入两个数值作为操作数:\n");
    scanf("%d,%d",&a,&b);

    // 校验
    // 方式1
    if(a > b)
    {
       printf("由小到大的顺序是:%d,%d\n",b,a);
    }
    else
    {
       printf("由小到达的顺序是:%d,%d\n",a,b);
    }
    

    // 方式2

    // 创建一个临时变量,用来存放交换信息
    int t = 0;
    if(a > b)
    {
       t = a;
       a = b;
       b = t;
    }   
    printf("由小到大的顺序是:%d,%d\n",a,b);35
}

#include <stdio.h>

int main()
{
   // 需求:输入3个数a,b,c,要求按由小到大的顺序输出这3个数6
   // 申明变量,用来存放操作数
   int a,b,c,tmp;
  
   printf("请输入三个整数:\n");

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

   // 条件判断
   if(a > b)
   {
      tmp = a;
      a = b;
      b = tmp;
   }
   if(a > c)
   {
      tmp = a;
      a = c;
      c = tmp;
   }
   if(b > c) 
   {
      tmp = b;
      b = c;

      c = tmp;
   }

   printf("a,b,c三个数按照由小到大的顺序是:%d,%d,%d\n",a,b,c);  
   return 0;

}

4、多分支

语法:

if(条件1)
{
    语句1;
}
else if(条件2)
{
    语句2;
}
...
else
{
    语句n;
}
#include <stdio.h>
int main()
{
    // 需求:编一程序,要求输入一个x值,输出y值
    // 方式1:嵌套的if..
    int x,y;
    
    printf("请输入一个整数:\n");
    scanf("%d",&x);
    // 条件判断
    if(x < 0)
   {
       y = -1;
   }
    else
   {
       // x >= 0
       if(x == 0)
       {
          y = 0;
       }
       else
       {
          y = 1;
       }
   }
    
    printf("方式1:x=%d,y=%d\n",x,y);
    
    // 方式2:多分支if..else if....else..
    
    // 条件判断
    if(x < 0)
   {
       y = -1;
   }
    else if(x == 0)
   {
       y = 0;
   }
    else
   {
       y = 1;
   }
    
    printf("方式2:x=%d,y=%d\n",x,y);
    
}

举例:

#include <stdio.h>
/**
 * 需求:高校要求粤嵌对实训学生根据实训成绩进行评级
         范围:0 <= score <= 100;
         评级:
               score >= 90 优秀
               score >= 80 良好
               score >= 70 中等
               score >= 60 及格
               score < 60   不及格
 */
int main()
{
    // 声明一个变量,存储成绩
    int score;
 printf("请录入学生成绩:\n");
    scanf("%d",&score);
    // 对score进行合法校验
    if(score >= 0 && score <= 100)
   {
       // 对合法输入的成绩进行评级
       if(score >= 90)
       {
          printf("优秀\n");
       }
       else if(score >= 80)
       {
          printf("良好\n");
       }
       else if(score >= 70)
       {
          printf("中等\n");
       }
       else if(score >= 60)
       {
          printf("及格\n");
       }
       else
       {
          printf("不及格\n");
       }
   }
    else
   {
       printf("成绩录入不合法!\n");
   }
}

5、switch

语法:

switch(表达式) // 不能是布尔型和 浮点型
{
     case 常量表达式1:
         语句体1;
         break;
     case 常量表达式2:
         语句体2;
         break;
     ...
     case 常量表达式n:
         语句体n;
         break;
     default:
         语句体n+1;
         break;// 可以省略
}

说明:

  1. switch后括号内的表达式可以是任何类型的表达式;
  2. 若表达式的值与某个常量表达式的值相等时,执行此case后面的语句;若没有相等的值时,执行 default后面的语句;
  3. 每个case后面的常量表达式的值都必须不相同,否则出现矛盾;
  4. 各个case 和default出现的次序不影响执行结果;
  5. case后面的语句中如果没有break语句,则执行完本case后的语句会接着执行下面的case(case穿 透) ;
  6. 多个case可共用一组语句。

注意

  1. 表达式一般写一个变量,变量的值是一个确定的常量;
  2. 当遇到break或者switch语句的右大括号时,switch语句结束;
  3. 表达式中的数据类型:char,short,int,long,long long,不能是浮点型。 表达式和常量的数据类型要一致(支持隐式转换),比较是否相同。

举例:

/*
 需求:根据成绩进行评级
 score <= 100;
评级:
               90 <= score < 100 优秀 90~99/10 == 9 && 100/10 ==10
               80 <= score < 90   良好 80~89/10 == 8
               70 <= score < 80   中等 70~79/10 == 7
               60 <= score < 70   及格 60~69/10 == 6
               score < 60   不及格
 */
#include <stdio.h>
int main()
{
    int score;// 成绩
    printf("请输入实训成绩:\n");
    scanf("%d",&score);
    if(score >= 0 && score <= 100)
   {
        // 对成绩进行加工
        int l = score / 10;
        switch(l)
       {
            case 10:// 100分
            case 9:// 90~99分
                printf("优秀\n"); // 这里:多个case共用一块代码
                break;            
            case 8:
                printf("良好\n");
                break;
            case 7:
                printf("中等\n");
                break;
            case 6:
                printf("及格\n");
                break;
            default:
                printf("不及格\n");
       }
   }
    else
   {
       printf("成绩录入不合法!\n");
   }
}

举例:

/*
   需求:实现一个简易计算器,要求实现+,-,×,/运算
 */
#include <stdio.h>
int main()
{
    printf("简易计算器 v1.0\n");
    printf("请输入两个操作数:\n");
    double x,y;// 存放计算数
    char ch;// 运算符
    scanf("%lf,%lf",&x,&y);
    scanf("%c",&ch);// 消除上面产生的最后一个回车符
    printf("请输入运算符:(+、-、.*、/)\n");
    scanf("%c",&ch);
    // 计算
    switch(ch)
   {
        case '+':
            printf("%.2lf+%.2lf=%.2lf\n",x,y,x+y);
            break;
        case '-':
            printf("%.2lf-%.2lf=%.2lf\n",x,y,x-y);
            break;
        case '.':
        case '*':
            printf("%.2lf*%.2lf=%.2lf\n",x,y,x*y);
            break;
        case '/':
            if(y == 0)
           {
                printf("除数不能为0\n");
           }
            else
           {
                printf("%.2lf/%.2lf=%.2lf\n",x,y,x/y);
           }
            break;
        default:
            printf("输入错误!");
    }
    
    return 0;
}

switch语句的case穿透:

  1. case穿透:当case后的break被省略;就会直接执行它后面紧跟的case中的语句(不会判断表达式是 否和它后面的case常量是否相同),这样的现象称之为case穿透;
  2. default语句一般放在所有case之后,表明所有的case都不成立时,执行default中的语句;default语 句可以放在switch语句{}内的任意位置。

5、总结:

  • 如果只需要一个判断结果,使用单分支
  • 如果需要两个判断结果,且只能有两个判断结果,使用双分支
  • 如果需要判断N个结果中的某几个,或者所有,使用多分支

二、扩展

1、条件表达式中的运算符优先级(由高到低):

(!)逻辑非 --> 算术运算符(+ - * / %) --> 关系运算符(>,<,>=,<=,!=,==) --> 逻辑运算符(&& ||) --> 赋值运算符(= +=)

2、设置vim中tab字符数

set tabstop=4
set shiftwidth=4
set expandtab

三、作业

  • 输入你的身高和体重,测试你的健康状况。

计算bmi的值

bmi = (体重/身高的平方)

如果bmi 小于18.5,则显示“偏瘦,注意加强营养”

如果bmi 在18.5和23.9之间,则显示“体重指数良好,注意保持”

如果bmi值大于23.9 ,则显示“你有点偏胖,注意锻炼”

  • 代码:
#include <stdio.h>

int main()
{
    double h,w;
    printf("\n请输入你的身高及体重:%lf,%lf\n",h,w);
    scanf("%lf,%lf",&h,&w);

    double bmi;
    bmi = w/(h*h);

    if(bmi < 18.5)
    {
      printf("\n你的bmi为:%lf,偏瘦,注意加强营养\n",bmi);
    }
    else if(bmi >= 18.5 && bmi <23.9)
    {
      printf("\n你的bmi为:%lf,体重指数良好,注意保持\n",bmi);
    }
    else if(bmi >= 23.9)
    {
      printf("\n你的bmi为:%lf,你有点偏胖,注意锻炼\n",bmi);
    }

    return 0;
}
  • 运行效果:

  • 西安市对安装“一户一表”的居民用户按阶梯式累进电价进行计收电费,具体方案是,

月用电量低于50千瓦时部分,电价不调整,仍为0.538元/千瓦时;51~200千瓦时部分, 单价为0.568元/千瓦时;超过200千瓦时部分,电价为0.638元/千瓦时。市区徐某家4月份 的用电量为96千瓦时,其电费计算如下:基本电费部分:96千瓦时×0.538元/千瓦时=51.65元; 超出50千瓦时的调价电费:(96~50)千瓦时×0.03元/千瓦时=1.38元;电费合计 51.65+1.38=53.03元 。

“阶梯式电价”机制可有效地抑制电力浪费现象,引导居民节约用电,合理用电,比纯粹“口号倡 导型” 节约用电更加有效。 编写一个程序根据输入的用电量,计算电费。

  • 代码:
#include <stdio.h>

int main()
{
    double e,x,y;
    scanf("%lf",&e);
    printf("\n请输入您本月用电量:%.2lf\n",e);
    //用电量
    if(e <= 50)
    {
    	y = e * 0.538;
	printf("您本月电费合计为:%.2lf\n",y);
    }
    else if(e > 50 && e <= 200)
    {
	y = 50 * 0.538 + (e-50) * 0.568;	
	printf("您本月电费合计为:%.2lf\n",y);
    }
    else if(e > 200)
    {
	y = 50 * 0.538 + 150 * 0.568 + (e-200) * 0.638;
	printf("您本月电费合计为:%.2lf\n",y);
    }
    return 0;
}
  • 运行效果:

  • 设计一个计算个人所得税的软件

应纳税所得额 = 工资收入金额 - 各项社会保险费 - 起征点(3500元)

应纳税额 = 应纳税所得额 x 税率 - 速算扣除数

通过输入工资总额和社保费用计算应纳税额。

  • 代码:
#include <stdio.h>

int main()
{
    int b;
    double s,y,k;

    scanf("%lf,%d\n",&s,&b);
    printf("\n您的工资收入金额以及社保费用总额为:%.2lf,%d\n",s,b);

    //应纳税所得额不超过3000
    if(y <= 3000)
    {
        y = s - b - 3500;
        k = y * 0.03 - 0;
        if(k <= 0)
        {
            printf("您无需缴纳税额!");
        }
        printf("您的应纳税额为:%.2lf\n",k);
    }
    //应纳税所得额不超过12000
    else if(y > 3000 && y <= 12000)
    {
        y = s - b - 3500;
        k = y * 0.1 - 210;
        printf("您的应纳税额为:%.2lf\n",k);
    }
    //应纳税所得额不超过25000
    else if(y > 12000 && y <= 25000)
    {
        y = s - b - 3500;
        k = y * 0.2 - 1410;
        printf("您的应纳税额为:%.2lf\n",k);
    }
    //应纳税所得额不超过35000
    else if(y > 25000 && y <= 35000)
    {
        y = s - b - 3500;
        k = y * 0.25 - 2660;
        printf("您的应纳税额为:%.2lf\n",k);
    }
    //应纳税所得额不超过55000
    else if(y > 35000 && y <= 55000)
    {
        y = s - b - 3500;
        k = y * 0.3 - 4410;
        printf("您的应纳税额为:%.2lf\n",k);
    }
    //应纳税所得额不超过80000
    else if(y > 55000 && y >= 80000)
    {
        y = s - b - 3500;
        k = y * 0.35 - 7160;
        printf("您的应纳税额为:%.2lf\n",k);
    }
    //应纳税所得额不低于80000
    else if(y > 80000)
    {
        y = s - b - 3500;
        k = y * 0.45 - 15160;
        printf("您的应纳税额为:%.2lf\n",k);
    }
    return 0;
}
  • 运行效果:

  • 设计TVM(地铁自动售票机)机软件。

 输入站数,计算费用,计费规则,6站2元,7-10站3元,11站以上为4元。
 输入钱数,计算找零(找零时优先找回面额大的钞票),找零方式为各种面额张数,可识别面额:
100,50,20,10,5,1
  • 代码:
/**
* 需求:
输入站数,计算费用,计费规则,6站2元,7-10站3元,11站以上为4元;
输入钱数,计算找零(找零时优先找回面额大的钞票),找零方式为各种面额张数,可识别
100,50,20,10,5,1
*/
#include <stdio.h>

int main()
{
    int station = 0;//公交站数
    int money = 0;//钱数
    int a=0,b=0,c=0,d=0,e=0,f=0;//存储100,50,20,10,5,1面额人民币找零的张数
    printf("请输入站数和支付金额:\n");
    scanf("%d,%d",&station,&money);

    //校验乘坐站数对应的支付金额
    if(station > 0 && station <= 6)
    {
        money -= 2;
    }
    else if(station >= 7 && station <= 10)
    {
        money -= 3;
    }
    else if(station >= 11)
    {
        money -= 4;
    }

    //创建一个变量记录找零的总数
    int total_money = money;
    //计算找零时各面额的张数
    a = money / 100; money -= a * 100;
    b = money / 50; money -= b * 50;
    c = money / 20; money -= c * 20;
    d = money / 10; money -= d * 10;
    e = money / 5; money -= e * 5;
    f = money / 1; money -= f * 1;

    printf("\n找回的总金额是:%d,分别是%d张100元,%d张50元,%d张20元,%d张10元,%d张5元,%d张1元\n",total_money,a,b,c,d,e,f);

    return 0;
}

  • 运行效果:

  • 出租车费计算程序,起步公里数3公里,车费8元,超出3公里,每公里1.8元,不足一公里,按照1公 里计算。 如果输入一个钱数,计算最多能做多少公里,该如何实现?

  • 代码:
#include <stdio.h>
#include <math.h>

int main()
{
    double y;//车费
    int x;//公里数

    scanf("%lf",&y);
    printf("\n请输入你所花费的钱数:%.2lf\n",y);

    if(y <= 8)
    {
        printf("您最多能乘坐3公里");
    }
    else
    {
        x = (y - 8) / 1.8 + 3;
        //printf("%d\n",(int)ceil(x));
        printf("\n您最多能乘坐%d公里\n",x);
    }
    return 0;
}
  • 运行效果:

  • 通过键入输入一个年份和月份,输出显示该月有多少天。(考虑润年情况)

 #include <stdio.h>

int main()
{
    int y,m,d;
    printf("请输入当前年份:\n");
    scanf("%d",&y);
    printf("请输入当前月份:\n");
    scanf("%d",&m);

    switch(m)
    {
        //大月
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
                d = 31;
                break;
        //小月
        case 4:
        case 6:
        case 9:
        case 11:
                d = 30;
                break;
        //平润月
        case 2:
                if((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
                {
                    d = 29;
                }
                else
                {
                    d = 28;
                }
                break;
        default:
                printf("无效的月份输入!\n");
                d = -1;
    }
    printf("%d年%d月有%d天\n",y,m,d);
    return 0;
}
                
  • 运行效果:

  • 实现一个简单的计算器,要求根据输入的运算符实现相应的运算。

  • 代码:
/*
   需求:实现一个简易计算器,要求实现+,-,×,/运算
 */
#include <stdio.h>
int main()
{
    printf("简易计算器 v1.0\n");
    printf("请输入两个操作数:\n");
    double x,y;// 存放计算数
    char ch;// 运算符
    scanf("%lf,%lf",&x,&y);
    scanf("%c",&ch);// 消除上面产生的最后一个回车符
    printf("请输入运算符:(+、-、.*、/)\n");
    scanf("%c",&ch);
    // 计算
    switch(ch)
   {
        case '+':
            printf("%.2lf+%.2lf=%.2lf\n",x,y,x+y);
            break;
        case '-':
            printf("%.2lf-%.2lf=%.2lf\n",x,y,x-y);
            break;
        case '.':
        case '*':
            printf("%.2lf*%.2lf=%.2lf\n",x,y,x*y);
            break;
        case '/':
            if(y == 0)
           {
                printf("除数不能为0\n");
           }
            else
           {
                printf("%.2lf/%.2lf=%.2lf\n",x,y,x/y);
           }
            break;
        default:
            printf("输入错误!");
    }
    
    return 0;
}
  • 运行效果:

  • 24
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值