2014-03-12 115 views
0

我給下面的C++如果聲明或文本文件

Basepay = 800; Job_class = 2; Ed = 3; 
Basepay = 800; Job_class = 3; Ed = 1; 

現在對於這個方案,Job_class和Ed是1-3。如果Job_class爲1,則向支付寶添加10%。如果是2,則將15%加入支付寶。如果是3,則將20%加入支付寶。 對於教育,如果Ed爲1,則向支付寶添加5%,如果是2則添加10%,如果是3則添加15%。

我已經輸入了數據。我的問題是:在if語句中這樣做會更容易嗎,還是通過文本文件更容易?

另外,有人可以給我看一個例子嗎?我通常會做以下

cout << "Please enter a Job Class" 
cin >> Job_class 
if (Job_class == 1) 
    basepay = basepay + basepay*.10; 

這看起來是否正確?

+0

有很多方法可以做到這一點,你的方式很好,如果這是你想要做到這一點。一些可能的方法是:如果語句,切換案例,地圖等 – CoryKramer

+0

我不確定我有你的問題,但是,這看起來很好。 – keyser

+0

小心那些括號/圓括號...... – CoryKramer

回答

0

您可以完全避免if陳述。

Basepay = Basepay + (0.05 * Basepay) 
      + (Job_Class * 0.05 * Basepay) + (Ed * 0.05 * Basepay); 

相當於

​​

這也等於

Basepay += (0.05 * Basepay) * (Job_Class + Ed); 

現在,我不是100%肯定的,如果我的數學是正確的,但我想說的 - 如果有辦法想出一個公式,它通常比if陳述更好。不是像這樣的簡單程序,但是在大型複雜應用程序中,它可能爲您節省大量處理器時間。

+0

「它可以爲您節省大量的處理器時間。」 - >讓它工作,把它做好。如果性能很慢,請找出什麼是緩慢的,並解決這個問題。正確且易於閱讀應該是第一要務。 – crashmstr

+0

如果我是一個巨魔,我會指出,你實際上會節省管道攤位......好東西,我不是一個巨魔。 – bolov

+0

雖然我會如何避免if語句。例如,在一個實例中,Job_class將添加5%的利息。另一方面,根據投入的分類,可能需要增加10%的利息。 – user3404737

1

在這種情況下使用開關會更好。例如

 switch(Job_class) 
    { 
     case 1 : basepay = basepay + basepay *.10; 
       break; 

     case 2 : basepay = basepay + basepay *.15; 
       break; 

     case 3 : basepay = basepay + basepay *.20; 
       break; 
    }  
+0

程序如何知道爲Job_class輸入了什麼? – user3404737

+0

@ user3404737此解決方案僅替換'if'語句,而不是整個代碼。 – Saraph

+0

用戶將輸入Job_Class作爲輸入,同樣可以在開關中使用。 – Dipika

0

如果我理解正確你的問題,你想知道,如果它是更好地從一個文本文件中讀取「作業類」或者提示用戶輸入,是這樣嗎?我認爲這取決於你的應用程序的性質,如果你的應用程序是一個交互式應用程序,提示用戶輸入是最好的方式,但如果你的應用程序不是一個交互式應用程序,那麼我會說你的選擇應該由您的應用將處理的「作業類別」輸入的數量 - 如果您處理的是100個輸入,則輸入它們將是單調乏味的,從文件中讀取這些輸入將是最好的方法。

代碼方面,提示用戶輸入並讀取用戶響應的代碼看起來不錯,但容易出錯,如果用戶輸入無效「作業類別」表示用戶輸入浮點數或者你的代碼行爲的一堆字符將是未定義的。相反的CIN,可以考慮使用函數getline()讀取輸入作爲一個字符串,然後喂字符串istringstream然後提取你正在尋找從istringstream對象

int getJobClass() 
{ 
    int Job_Class; 
    string input; 
    bool inputValid = false; 
    while(!inputValid) 
    { 
     cout << "Please Enter Job Class"; 
     getline(cin, input); 
     istringstream inputParser(input); 
     if (!(inputParser >> Job_Class)) 
     { 
     cout << "Invalid Job Class Input!" <<endl; 
     inputValid = false; 
     } 
     else 
     { 
     inputValid = true; 
     } 
    } 
    return Job_Class; 
} 

一旦上述就位的輸入,計算「基本工資」,你可以做這樣的事情:

float getPayMultiplier(int Job_class) 
{ 
    float multiplier = 1; 
    switch (Job_class) 
    { 
    case 1: 
     multiplier = 0.10; 
     break; 
    case 2: 
     multiplier = 0.15; 
     break; 
    case 3: 
     multiplier = 0.20; 
     break; 
    default: 
     cout << "Invalid Job_Class" << endl; 
     break; 
    } 
    return multiplier; 
} 

float computeBasePay(float pay) 
{ 
    return pay + (pay * getPayMultiplier(getJobClass())); 
} 
0

@ user3404737:你爲什麼想避免if?代碼中的邏輯是有條件的:基本工資(或更確切地說是薪酬乘數)由工作類別決定。鑑於此,您爲什麼要避免使用if條件?

如果你擔心代碼面色差了太多的條件語句,使用switch...case如果您的應用將有「工作類」分類100S(其中,我懷疑你會),那麼我建議你構建一個map<int, float>在您鍵是「作業類」,值是「工資乘數」,這樣您可以在計算基本工資時快速查找,而不是運行100個條件。