代码之家  ›  专栏  ›  技术社区  ›  user23760512

所欠所得税的计算不正确

  •  -1
  • user23760512  · 技术社区  · 2 年前

    该程序将通过输入您的收入和婚姻状况来计算您的纳税等级,s表示单身,m表示已婚。
    该程序将提示您输入收入,然后输入婚姻状况。但是,它不计算所欠的所得税,始终显示0.00美元。如有任何帮助,我们将不胜感激。非常感谢你!

    这是我迄今为止的代码:

       int taxBracket (double income, char maritalStatus);
       double calculateTax(double income, int taxBracket);
       int main() {
       double income;
       char maritalStatus;
    
       int taxBracketValue;
       printf("Enter income: ");
       scanf("%le", &income);
       printf("Enter marital status (s for single, m for married): ");
       scanf(" %c", &maritalStatus);
       taxBracketValue = taxBracket(income, maritalStatus);
       if(taxBracketValue == -1) {
       printf("Invalid marital status.\n");
       return 1;
       }
       double tax = calculateTax(income, taxBracketValue);
       printf("Income tax is $%.2f\n", tax);
       return 0;
       }
       int taxBracket(double income, char maritalStatus) {
       if (maritalStatus == 's') {
       if(income < 15000)
       return 0;
       else if (income >= 15000 && income < 50000)
       return 1;
       else if (income >= 50000 && income < 90000)
       return 2;
       else if (income >=90000 && income < 160000)
       return 3;
       else
       return 4;
       }
       else if (maritalStatus == 'm') {
       if (income < 30000)
       return 0;
       else if (income>= 30000 && income < 80000)
       return 1;
       else if (income>= 80000 && income < 140000)
       return 2;
       else if (income >= 140000 && income < 220000)
       return 3;
       else
       return 4;
       }
       return -1; 
       }
       double calculateTax(double income, int taXBracket) {
       double tax = 0.0;
       int taxBracket;
       switch(taxBracket) {
       case 0:
       tax = 0.0;
       break;
       case 1:
       tax = income * 0.10;
       break;
       case 2:
       tax = income * 0.15;
       break;
       case 3:
       tax = income * 0.23;
       break;
       case 4:
       tax = income * 0.33;
       break;
       default:;
       break;
       }
       return tax;
       }
       
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   Allan Wind    2 年前
    1. 当代码格式不好时,很难阅读。

    2. 在里面 calculateTax() 局部变量 taxBracket 未初始化,但您希望使用大写不同的参数。这是您的主要问题,编译器应该为使用未初始化的变量生成警告。

    3. 的包含 scanf() printf() 缺少函数。

    4. 对于小程序,通常可以通过移动来消除原型 main() 到底部。

    5. (不固定)业务规则如 taxbracket() calculatetax() 经常发生变化。它们受益于被表示为数据(表),而不是可能外部化的代码(文件、数据库、web服务等)。在这种情况下,它还消除了所有 income * ... 重复。这 提前返回 -特殊情况下的模式通常会导致代码简洁。

      double calculatetax(double income, int taxbracket) {
          if(taxbracket < 1 || taxbracket > 4)
              return 0;
          const double rates[] = {0.1, 0.15, 0.23, 0.33};
          return income * rates[taxbracket - 1];
      }
      

      您可以重构它,比如说,返回税率,并让调用者通过乘以来确定税额 income :

      double taxrate(int taxbracket) {
          if(taxbracket < 1 || taxbracket > 4)
              return 0;
          const double rates[] = {0.1, 0.15, 0.23, 0.33};
          return rates[taxbracket - 1];
      }
      
    6. 忽略 ; 在里面 default:; 。switch语句的真正威力是在打开 enum .如果你忽略了包罗万象 default 编译器现在可以判断您是否遗漏了一个案例。

    #include <stdio.h>
    
    int taxbracket(double income, char maritalstatus) {
        if (maritalstatus == 's') {
            if(income < 15000)
                return 0;
            else if (income >= 15000 && income < 50000)
                return 1;
            else if (income >= 50000 && income < 90000)
                return 2;
            else if (income >=90000 && income < 160000)
                return 3;
            else
                return 4;
        }
        else if (maritalstatus == 'm') {
            if (income < 30000)
                return 0;
            else if (income>= 30000 && income < 80000)
                return 1;
            else if (income>= 80000 && income < 140000)
                return 2;
            else if (income >= 140000 && income < 220000)
                return 3;
            else
                return 4;
        }
        return -1;
    }
    
    double calculatetax(double income, int taxbracket) {
        double tax = 0.0;
        switch(taxbracket) {
            case 0:
                tax = 0.0;
                break;
            case 1:
                tax = income * 0.10;
                break;
            case 2:
                tax = income * 0.15;
                break;
            case 3:
                tax = income * 0.23;
                break;
            case 4:
                tax = income * 0.33;
                break;
            default:
                break;
        }
        return tax;
    }
    
    int main() {
        double income;
        char maritalstatus;
    
        int taxbracketvalue;
        printf("enter income: ");
        scanf("%le", &income);
        printf("enter marital status (s for single, m for married): ");
        scanf(" %c", &maritalstatus);
        taxbracketvalue = taxbracket(income, maritalstatus);
        if(taxbracketvalue == -1) {
            printf("invalid marital status.\n");
            return 1;
        }
        double tax = calculatetax(income, taxbracketvalue);
        printf("income tax is $%.2f\n", tax);
        return 0;
    }
    

    和示例运行:

    Enter income: 30000
    Enter marital status (s for single, m for married): s
    Income tax is $3000.00