对比笔者和老师的code
笔者:
1 // 个人所得税计算器if语句版.cpp: 2 问题描述:https://blog.csdn.net/sxhelijian/article/details/43918271 3 // 4 5 #include "stdafx.h" 6 7 8 int main() 9 { 10 double dSalary, dTax = 0, dNetIncome = 0; 11 printf("请输入您本月的收入总额(元):"); 12 scanf_s("%lf", &dSalary); 13 // 下面求解应缴个人所和税dTax和税后收入dNetIncome 14 15 if (dSalary <= 3500) 16 { 17 dTax = 0; 18 dNetIncome = dSalary; 19 } 20 else 21 { 22 if (dSalary <= 5000) 23 { 24 dTax = (dSalary - 3500) *3.0 / 100 - 0; 25 dNetIncome = dSalary - dTax; 26 } 27 else 28 { 29 if (dSalary <= 8000) 30 { 31 dTax = (dSalary - 3500) *10.0 / 100 - 105; 32 dNetIncome = dSalary - dTax; 33 } 34 else 35 { 36 if (dSalary <= 12500 ) 37 { 38 dTax = (dSalary - 3500) *20.0 / 100 - 555; 39 dNetIncome = dSalary - dTax; 40 } 41 else 42 { 43 if (dSalary <= 38500) 44 { 45 dTax = (dSalary - 3500) *25.0 / 100 - 1005; 46 dNetIncome = dSalary - dTax; 47 } 48 else 49 { 50 if (dSalary <= 58500) 51 { 52 dTax = (dSalary - 3500) *30.0 / 100 - 2755; 53 dNetIncome = dSalary - dTax; 54 } 55 else 56 { 57 if (dSalary <= 83500) 58 { 59 dTax = (dSalary - 3500) *35.0 / 100 - 5505; 60 dNetIncome = dSalary - dTax; 61 } 62 else 63 { 64 dTax = (dSalary - 3500) *45.0 / 100 - 13505; 65 dNetIncome = dSalary - dTax; 66 } 67 } 68 } 69 } 70 } 71 } 72 } 73 74 75 printf("您本月应缴个人所和税 %.2lf 元,税后收入是 %.2lf 元。\n", dTax, dNetIncome); 76 printf("依法纳税,共享繁荣。谢谢使用!\n"); 77 return 0; 78 }
老师:
1 #include <stdio.h> 2 int main ( ) 3 { 4 double dSalary,dTax=0,dNetIncome=0; //请欣符合匈牙利命名法的变量名 5 double dValue; //在模板基础上加一个变量,表示超出起征点的收入 6 double dRate, dOffset; //分别表示税率和速算扣除数 7 printf("请输入您本月的收入总额(元):"); 8 scanf("%lf", &dSalary); 9 // 下面求解应缴个人所和税dTax和税后收入dNetIncome 10 dValue = dSalary - 3500; //在起征点基础上考虑纳税 11 if(dValue <= 0.0) 12 dTax = 0.0; //不需要交税 13 else 14 { 15 if(dValue <= 1500) 16 dRate = 0.03, dOffset = 0.0; //这一组if语句用于得到税率和速算扣除数 17 else if(dValue <= 4500) 18 dRate = 0.1, dOffset = 105.0; 19 else if(dValue <= 9000) 20 dRate = 0.2, dOffset = 555.0; 21 else if(dValue <= 35000) 22 dRate = 0.25, dOffset = 1005.0; 23 else if(dValue <= 55000) 24 dRate = 0.3, dOffset = 2755.0; 25 else if(dValue <= 80000) 26 dRate = 0.35, dOffset = 5505.0; 27 else 28 dRate = 0.45, dOffset = 13505.0; 29 dTax = dValue * dRate - dOffset; //计算所得税,体会将“确定参数”与“计算”分开的好处:思路更明晰,不易在计算公式上犯大错 30 } 31 dNetIncome = dSalary-dTax; //计算税后收入 32 printf("您本月应缴个人所和税 %.2lf 元,税后收入是 %.2lf 元。\n", dTax, dNetIncome); 33 printf("依法纳税,共享繁荣。谢谢使用!\n"); 34 return 0; 35 }
感想:
1.这个问题非常简单,所以笔者的code还算凑合,但是老师的code明显更优(更容易阅读与维护),因为其中体现了“模块化”的编程思维(我感觉这类似 C++的面向对象的思维,即OOP),所以小问题也蕴含着大道理;
2.程序中的bug 基本上可以分成三种:语法错误、运行错误、逻辑错误。其中最棘手的错误是逻辑错误。
但事实上,语法错误中也有一种非常棘手的错误,那就是 编译器不会报错的语法错误,程序规模一大,极其难以排查,如
if( x = 100 ) if(); //单分支
这些错误,有些聪明的编译器(如vs的最新版)也能查出来,但不聪明的就不会提示出来了。要避免这样的错误,只有靠经验与养成良好的编程习惯(convention)。
if( 100 == x ) if(){ } //单分支
=