Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 税务计算器问题_C++_C - Fatal编程技术网

C++ 税务计算器问题

C++ 税务计算器问题,c++,c,C++,C,我制作了这个程序,根据用户输入计算一系列工资的税收。一切正常,除了我似乎找不到一种方法让应用程序忽略最后3个printf,并且在用户输入负值时只打印一条错误消息。如果用户输入负数,我不想显示最后3个printf,而是希望应用程序只显示“错误:您输入了负数”或类似的内容。我使用visual studio作为编译器,这是一个C应用程序。请帮忙。另外,请对我放轻松,这是我的编程课,我们仍然在做非常基本的东西 代码如下: #include <stdio.h> #include <std

我制作了这个程序,根据用户输入计算一系列工资的税收。一切正常,除了我似乎找不到一种方法让应用程序忽略最后3个printf,并且在用户输入负值时只打印一条错误消息。如果用户输入负数,我不想显示最后3个printf,而是希望应用程序只显示“错误:您输入了负数”或类似的内容。我使用visual studio作为编译器,这是一个C应用程序。请帮忙。另外,请对我放轻松,这是我的编程课,我们仍然在做非常基本的东西

代码如下:

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

int main(void)
{

    float salary, tax = 0;
    printf("\n\n\tEnter the salary ammount per year: \t\t$");
    scanf("%f", &salary);

    if (salary <= 10000){
        tax=0;
    } 
    else if (salary > 10000 && salary <= 40000){
        tax = (salary - 10000)*0.2;
    } else if (salary > 40000 && salary <= 50000){
        tax = 6000 + (salary - 40000)*0.3 ;
    } else if (salary > 50000 && salary <= 75000){
        tax = 9000 + (salary - 50000)*0.4;
    } else if (salary > 75000.01 && salary <= 100000){
        tax = 19000  + (salary - 75000)*0.5;
    } else if (salary > 100000 && salary >=100000.01){
        tax = 31500 + (salary - 100000)*0.6;
    }



    printf("\nSalary per year:\t\t $ %.2f\n\n", salary);
    printf("Tax ammount per year:\t\t $ %.2f\n\n", tax);
    printf("Salary after tax:\t\t $ %.2f\n", salary-tax);


    getchar();getchar();
} 
#包括
#包括
内部主(空)
{
浮动工资,税=0;
printf(“\n\n\t请输入每年的工资金额:\t\t$”;
scanf(“%f”和工资);
如果(工资10000和40000和50000和75000.01和100000和>=100000.01){
税金=31500+(工资-100000)*0.6;
}
printf(“\n每年工资:\t\t$%.2f\n\n”,工资);
printf(“每年纳税金额:\t\t$%.2f\n\n”,税);
printf(“税后工资:\t\t$%.2f\n”,工资税);
getchar();getchar();
} 

您已经演示了如何使用
if
语句检查
int
是否在给定范围内。只需对输出应用相同的逻辑。负数是
<0

例如:

if(salary < 0) {
    //print error
} else {

    if (salary <= 10000) {
        tax=0;
    } else if (salary > 10000 && salary <= 40000) {
        tax = (salary - 10000)*0.2;
    } else if (salary > 40000 && salary <= 50000) {
        tax = 6000 + (salary - 40000)*0.3 ;
    } else if (salary > 50000 && salary <= 75000) {
        tax = 9000 + (salary - 50000)*0.4;
    } else if (salary > 75000/*.01*/ && salary <= 100000) {
        tax = 19000  + (salary - 75000)*0.5;
    } else /*if (salary > 100000 && salary >=100000.01)*/ {
        tax = 31500 + (salary - 100000)*0.6;
    }

    printf("\nSalary per year:\t\t $ %.2f\n\n", salary);
    printf("Tax ammount per year:\t\t $ %.2f\n\n", tax);
    printf("Salary after tax:\t\t $ %.2f\n", salary-tax);
}
if(工资<0){
//打印错误
}否则{
如果(工资10000和40000和50000和75000/*.01*/&&100000和>=100000.01)*/{
税金=31500+(工资-100000)*0.6;
}
printf(“\n每年工资:\t\t$%.2f\n\n”,工资);
printf(“每年纳税金额:\t\t$%.2f\n\n”,税);
printf(“税后工资:\t\t$%.2f\n”,工资税);
}
在最后一个
else if
语句中,实际上不需要
if
语句,只需要
else
。虽然可以肯定(为了清楚起见),但也可以将其包括在内。但是,您肯定不需要
**salary>=100000.01)
如果
salary>100000
已经评估为
true
,则
=
将只评估为
true
。只有当双方的计算结果均为
true
时,
&&
才会计算为
true
。一个为真,另一个为假的唯一方法是,如果有人输入了奇数工资(100000.005),但即使输入了该工资,他们仍然需要在该纳税等级中


无论如何,您的
printf
语句现在包含在
if(salary的
else
块中,我认为您的代码容易出错,可以简化很多:

if (salary <= 10000){
    tax=0;
} else if (salary <= 40000){
    tax = (salary - 10000)*0.2;
} else if (salary <= 50000){
    tax = 6000 + (salary - 40000)*0.3 ;
} else if (salary <= 75000){
    tax = 9000 + (salary - 50000)*0.4;
} else if (salary <= 100000){
    tax = 19000  + (salary - 75000)*0.5;
} else {
    tax = 31500 + (salary - 100000)*0.6;
}

if(工资这不是你问题的答案,但最好让计算机完成计算中的所有工作。你的代码中有一些中间结果,你必须手工计算。为什么不让计算机来做呢?它还可以让你通过编辑关键功能、括号和费率来轻松更改费率结构,不必担心中间结果

float tax = 0;
struct {
   float basis;
   float rate;
} *ptr, rateStructure[] = 
// list these from high to low brackets
{
 {100000,0.6},
 { 75000,0.5},
 { 50000,0.4},
 { 40000,0.3},
 { 10000,0.2},
 {     0,0.1}
};

ptr = rateStructure;
do {
  float bracket = salary - ptr->basis; 
  if (bracket > 0) {
      tax += bracket * ptr->rate; 
      salary -= bracket; 
  }
  ptr++;
} while (salary);

生活中只有两件事是确定无疑的:税收和分配税务计算器。一般来说,如果你用货币价值进行会计核算,不要使用
float
甚至
double
。最好使用
long
long
计算美分或厘米或任何最小的货币单位例如,
float
无法准确存储$0.01。谢谢你的回答。我已经做了一段时间了,你知道当你做某件事的时候,你是如何变得如此专注,以至于忘记了其他事情。无论如何,再次感谢你的快速响应。
salary==75.005
也出现了同样的错误。总的来说,你是错的在每个
else
分支中,你都知道前面的条件是错误的。例如,如果你在
else
分支中的
if(salary Not pretty)。我建议使用`浮动括号[2][={{100000,0.6},{75000,0.5}因为宏是讨厌的,不是创建表的最好方法。@ MalSale-重构。看起来好多了。C++会更短一点,用<代码>(AutoPTR:RATESTREST)
。这种循环的优点是编译器对循环的时间有更好的了解,并可以在此基础上进行优化。
auto
功能仅在C++11中可用。如果你有它,那就太酷了。我被IAR EWARM困住了,而IAR EWARM没有。