2013-10-11 121 views
2

我做了這個程序,根據用戶輸入計算一系列工資的稅額。一切都工作正常,除了我似乎無法找到一種方法,使應用程序忽略最後3個printf的事情,只是打印一個錯誤信息,如果用戶輸入負值。如果用戶輸入負數,我不想顯示最後3個printf,而是希望應用程序只顯示「錯誤:您輸入了負數」或類似的東西。我使用Visual Studio作爲我的編譯器,這是一個C應用程序。幫助PLZ。另外請在我的編程課上輕鬆一下,我們仍然在做非常基本的東西。稅計算器問題

下面是代碼:

#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(); 
} 
+4

只有2確信事情:稅收和CS教授派發稅計算器分配 –

+0

一般情況下,如果你正在做會計與貨幣價值,不要使用'float'甚至'double'。最好使用「長」或「長」,並計算美分或生丁或任何最小單位的貨幣。例如,'float'不能準確存儲$ 0.01。 –

回答

5

你已經證明了你知道如何使用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); 
} 

在最後else if,你真的不需要if聲明,只是else。雖然可以肯定(並且爲了清楚起見),但包括它也沒關係。不過,你絕對不需要** salary >=100000.01)如果salary > 100000已經評估爲true>=將只評估爲true。僅當雙方評估爲true時,&&纔會評估爲true。唯一的辦法可能是真實的,而另一個不真實的是,如果有人輸入一個奇數的薪水(100000.005),但即使輸入了這個薪水,他們仍然需要在這個稅收範圍內。

反正你printf語句是現在包含在if(salary<0) {}else{}塊的else塊,所以如果工資,他們將只打印> = 0

+0

感謝您的回答。我一直在努力研究這個問題一段時間,當你做一些你剛剛得到的重點時忘了其他的東西。無論如何,再次感謝 – user2869498

+0

+1的快速反應,指出負數<0! – mjs

+1

對於'salary == 75.005',同樣的錯誤已經發生。一般來說,你經常重新測試薪水。在每個'else'分支中,你知道前面的條件是錯誤的。例如。如果你在if(salary <= 10000)的'else'分支中,你知道'salary <= 10000'必須爲false,因此'salary> 10000'必須爲true。 – MSalters

0

我覺得你的代碼很容易出錯,而且可以簡化很多:

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; 
} 
1

這不是一個回答你的問題,但它始終是最好讓計算機做的工作的所有在計算中。您的代碼有幾個中間結果,您必須手動計算。爲什麼不讓電腦做到這一點?它還可讓您輕鬆更改費率結構,方法是編輯主要功能,括號和費率,而不必擔心中間結果。在生活中

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); 
+0

不漂亮。我會建議'浮動括號[2] [] = {{100000,0.6},{75000,0.5} ....};和一個for循環。宏的討厭,而不是創建表的最佳方式。 – MSalters

+0

@ MSalters - 重構。 –

+0

看起來好多了。使用'for(auto ptr:rateStructure)',C++會稍微短一些。這種循環的優點是編譯器有一個更好的想法,他們會循環多久,並可以基於此優化。 – MSalters