【C语言及程序设计】项目1-26-2&3&5:成绩等级 & 分段函数求值switch语句版 & 个人所得税计算器switch语句版

switch语句常用于解决多分支、分段问题,该语句的关键就在于将具体问题中的分段、分支条件转化为常量constant

首先,一定要理解switch语句是如何执行的:

项目1-26-2:成绩等级

 1 /* 成绩等级(switch).cpp:
 2 问题描述:给出一百分制成绩,要求输出成绩等级’A’,’B’,’C’,’D’,’E’。90分以上为’A’,80-89分为’B’,70-79分为’C’,60-69分为’D’,60分以下为’E’。
 3 */
 4
 5 #include "stdafx.h"
 6
 7 int main()
 8 {
 9     int dgrade, dgrade_10;
10
11     printf("Input the number form of the grade.\n");
12     scanf_s("%d", &dgrade);
13
14     //dgrade_10 = dgrade/10;
15
16         switch (dgrade/10)
17         {
18         case 0:
19         case 1:
20         case 2:
21         case 3:
22         case 4:
23         case 5: printf("grade E"); break;
24
25         case 6: printf("grade D"); break;
26
27         case 7: printf("grade C"); break;
28
29         case 8: printf("grade B"); break;
30
31         case 9: printf("grade A"); break;
32
33         case 10: printf("grade A"); break;
34
35         default:printf("invalid value");break;
36         }
37
38     return 0;
39 }

程序中,利用了整型数据运算的特性(舍去小数部分)每一个分数段通过运算转化为一个特定的常数;

项目1-26-3:分段函数求值switch语句版

问题描述

通过运算转化的方案:

 1 #include <stdio.h>
 2 #include <math.h>
 3 int main ( )
 4 {
 5     int x, a;
 6     double y;
 7     scanf("%d", &x);
 8     a = x/2;   //注意是整数相除
 9     if (a<0)
10         a=0;    //这样,x<0时,a值也是0
11     switch(a)
12     {
13     case 0: //即x<2时
14         y=x;
15         break;
16     case 1:
17     case 2://a为1、2,对应x>=2 && x<6时
18         y=x*x+1;
19         break;
20     case 3:
21     case 4://a为3、4,对应x>=6 && x<10时
22         y=sqrt(x+1);
23         break;
24     default://如果走到这一分支,对应的是x>=10的所有情况
25         y=1.0/(x+1);
26     }
27     printf("%f\n", y);
28     return 0;
29 }  

利用逻辑运算的方案(更优):

#include "stdafx.h"
#include <math.h>

int main()
{
    int x, t;
    scanf_s("%d", &x);

    t = (x < 2) + (x < 6) + (x < 10);

    switch (t)
    {
    case 3: printf("%d", x); break;

    case 2: printf("%d", x*x +1); break;

    case 1: printf("%lf", sqrt(x+1)); break;

    case 0: printf("%lf", 1.0/(1+x)); break;

    default:break;
    }

    return 0;
}

很显然第二个方案普适性更高,而第一个方案只适合特殊情形(分段较均匀、有规律)

项目1-26-5:个人所得税计算器switch语句版

问题描述

利用if-else语句转化的方案:

 1 #include <stdio.h>
 2 int main ( )
 3 {
 4     double dSalary,dTax=0,dNetIncome=0; //请欣符合匈牙利命名法的变量名
 5     double dValue;   //在模板基础上加一个变量,表示超出起征点的收入
 6     double dRate, dOffset;  //分别表示税率和速算扣除数
 7     int iStep;       //用于确定交税的“档次”
 8     printf("请输入您本月的收入总额(元):");
 9     scanf("%lf", &dSalary);
10     // 下面求解应缴个人所和税dTax和税后收入dNetIncome
11     dValue = dSalary - 3500;   //在起征点基础上考虑纳税
12     if(dValue <= 0.0)
13         dTax = 0.0;  //不需要交税
14     else
15     {
16         //这一组if语句确定交税的档次
17         if(dValue <= 1500)
18             iStep = 1;
19         else if(dValue <= 4500)
20             iStep = 2;
21         else if(dValue <= 9000)
22             iStep = 3;
23         else if(dValue <= 35000)
24             iStep = 4;
25         else if(dValue <= 55000)
26             iStep = 5;
27         else if(dValue <= 80000)
28             iStep = 6;
29         else
30             iStep = 7;
31
32
33         //根据确定的档次,得到税率和速算扣除数
34         switch(iStep)
35         {
36         case 1:
37             dRate = 0.03, dOffset = 0.0;
38             break;
39         case 2:
40             dRate = 0.1, dOffset = 105.0;
41             break;
42         case 3:
43             dRate = 0.2, dOffset = 555.0;
44             break;
45         case 4:
46             dRate = 0.25, dOffset = 1005.0;
47             break;
48         case 5:
49             dRate = 0.3, dOffset = 2755.0;
50             break;
51         case 6:
52             dRate = 0.35, dOffset = 5505.0;
53             break;
54         case 7:
55             dRate = 0.45, dOffset = 13505.0;
56         }
57         dTax = dValue * dRate - dOffset;  //计算所得税,体会将“确定参数”与“计算”分开的好处:思路更明晰,不易在计算公式上犯大错
58     }
59     dNetIncome = dSalary-dTax;        //计算税后收入
60     printf("您本月应缴个人所和税 %.2lf 元,税后收入是 %.2lf 元。\n", dTax, dNetIncome);
61     printf("依法纳税,共享繁荣。谢谢使用!\n");
62     return 0;
63 }  

利用逻辑运算的方案:

 1 #include "stdafx.h"
 2
 3
 4 int main()
 5 {
 6     double dSalary, dTax = 0, dNetIncome = 0;
 7     printf("请输入您本月的收入总额(元):");
 8     scanf_s("%lf", &dSalary);
 9
10     double dover, tax_rate, quick_deduction;
11     int x;
12
13     dover = (dSalary - 3500)/100;
14
15     x = (dover < 15) + (dover < 45) + (dover < 90) + (dover < 350) + (dover < 550) + (dover < 800);
16
17         if (dSalary <= 3500)
18         {
19             printf("您本月应缴个人所和税 0 元。\n");
20             printf("依法纳税,共享繁荣。谢谢使用!\n");
21             return 0;
22         }
23         else
24         {
25             switch (x)
26             {
27             case 6: tax_rate = 0.03, quick_deduction = 0; break;
28
29             case 5: tax_rate = 0.1, quick_deduction = 105; break;
30
31             case 4: tax_rate = 0.2, quick_deduction = 555; break;
32
33             case 3: tax_rate = 0.25, quick_deduction = 1005; break;
34
35             case 2: tax_rate = 0.3, quick_deduction = 2755; break;
36
37             case 1: tax_rate = 0.35, quick_deduction = 5505; break;
38
39             case 0: tax_rate = 0.45, quick_deduction = 13505; break;
40
41             default:
42                 break;
43             }
44
45             dTax = (dSalary - 3500) * tax_rate - quick_deduction;
46             dNetIncome = dSalary - dTax;
47
48             printf("您本月应缴个人所和税 %.2lf 元,税后收入是 %.2lf 元。\n", dTax, dNetIncome);
49             printf("依法纳税,共享繁荣。谢谢使用!\n");
50         }
51
52     return 0;
53 }

利用if-else 语句转化更为通用,但是要说cleanness,还是逻辑运算转化的方案最优。

=

原文地址:https://www.cnblogs.com/miyazakehime/p/9124239.html

时间: 2024-10-04 13:43:32

【C语言及程序设计】项目1-26-2&3&5:成绩等级 & 分段函数求值switch语句版 & 个人所得税计算器switch语句版的相关文章

第7周 C语言及程序设计提高例程-26 实现线性表基本操作的函数

1.删除指定位置上的数据: 问题及答案: /*删除指定位置上的数据*/ #include<stdio.h> #define SIZE 100 //定义一个字符常量 int deletedate(int[],int,int); //声明一个删除函数 int n=10; //数组中实际有用的数据 int main() { int a[SIZE]={25,45,36,48,89,57,65,25,26,16}; int i,locate; scanf("%d",&loca

C语言零基础项目驱动式学习第一天

引言: 智能手机(Smart Phone)是一种运算能力及功能比传统手机更强的手机.目前的操作系统基本上有以下几种: 1. Symbian Os 众所周知塞班隶属于NOKIA,Symbian开发之初的目标是保证在较低资源的设备上能长时间的运行,这导致了塞班的应用程序开发有着较为陡峭的学习路线,开发成本高,但是程序的运行的效率很高> 2.Android 开源, 联盟,Android凝聚了几乎遍布全球的力量,这是Android形象及声音能够被传到全球移动互联网市场每一个角落的根本原因.不过, 1).

C语言零基础项目驱动式学习第四天

//类型修饰符  数组名[数组元素个数] = {初始化}; //定义数组的时候[]中必须是常量表达式, 不可以是变量; /* int age[5] = {21, 18, 25, 20, 18}; int array[10] = {0};//代表数组中有10个元素, 每个都是0; int array1[8] = {1};//代表数组中有8个元素,第一个是1,其余的为0; int age2[2 + 3] = {0}; */ //定义数组和使用数组的最大区别是, 前面是否有类型修饰符 //使用数组元素

C语言零基础项目驱动式学习第二天

//BOOL 类型是一种非真即假的数据类型,取值只有YES和NO, //BOOL 其实是OC中得数据类型,在C语言中,认为非0即为真. //BOOL 类型规定的存储空间为一个字节. //    BOOL a = YES; //    BOOL b = NO; //    printf("a = %d, b = %d\n", a, b); //    int a = 15, b = 18; //    BOOL c = a > b; //    printf("c = %

C语言零基础项目驱动式学习第三天

一 while循环二do   while循环三 for循环for循环的执行顺序用如下表达式: for(expression1;expression2;expression3)        循环变量初值; 循环条件; 循环变量增量  {                expression4; }       执行的顺序应该是: 1)第一次循环,即初始化循环.      首先执行表达式expression1(一般为初始化语句):再执行expression2(一般为条件判断语句),判断express

iOS开发项目篇—26修改UITabBar的系统设置

IOS开发项目篇—26修改UITabBar的系统设置 一.简单说明 1.在ios6和ios7两种系统中的现实效果 2.要求实现的效果(在ios6和ios7中基本一致) 二.UITabBar的设置和结构 1.尝试调整UITabBar 通过下面的方式,查看UITabBar内部的子控件 查看子控件继承自: 说明:UItabBarButton:继承自UIControl UIButton:继承自UIControl 打印查看每个子控件的内部结构 2.修改系统属性 注意:在ios6系统下 1 // 2 //

WinForm多语言版本实战项目演练

一.课程介绍 关于如何实现"WinForm多语言版本"网上有很多实现技术方案,可以说是"琳琅满目","包罗万象".俗话说的好:一千个读者就有一千个哈姆雷特!如果您工作中恰好也遇到这种开发需求,但是为了一个自上手简单.维护方便.扩展性强的WinForm多语言版本技术方案而感到烦恼的话,那么很高兴恭喜你看到了阿笨的本次分享课程:阿笨结合的是自己在实际工作中遇到真实项目案例,特别的总结并且分享出来给大家,从而避免重复造轮子这种事情. 如果您对本次分享&

R语言基础编程技巧汇编 - 26

1.      监视R语言包更新状态的网站 R语言包的数量已经有近万个,及时关注新发布的包,以及已发布的包的更新状态,非常重要,下列网站提供了这个功能,读者可以经常访问: http://lib.stat.cmu.edu/R/CRAN/web/packages/available_packages_by_date.html 2.      使用命令行参数的R程序示例 以Windows系统为例,按照以下步骤: 1.    把Rscript.exe的路径加入到Path环境变量中,在我的机器上设置如下:

数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚,所以很多需要自己揣摩.这也体现了算法和程序设计语言的特点,算法更侧重本质的描述,而任何编程语言都要照顾到实现的细节以及数据类型等语法方面的需求. 表达式求值: [编码中....] 二.头文件 迷宫求解: 1 //3_2_maze.h 2 /** 3 author:zhaoyu 4 email:[em