2016-04-15 26 views
0

我得到的錯誤未初始化的局部變量calculateTax使用,我試圖用int來定義它,它不工作,我擔心,如果我添加像int calculateTax = 0它將覆蓋函數我爲變量創建。未初始化的本地變量calculateTax使用

我是一個總的小白,當涉及到編程,所以我希望有一些明顯的我失蹤,任何幫助將非常感激

這裏是代碼:

//Gross pay calculation 
    //additional tax rate calculation 
    #include <iostream> 
    #include <iomanip> 
    using namespace std; 

    //Setting global contants 
    const double PAY_RATE = 22.55; 
    const double BASE_HOURS = 40.0; 
    const double OT_MULTIPLIER = 1.5; 

    //Prototype functions 
    double getBasePay (double); 
    double getOvertimePay(double); 
    double getCalculateTax(double); 

    int taxRate; 


    int main() 
    { 
     double hours, 
     basePay, 
     overtime = 0.0, 
     taxRate, 
     taxOwed, 
     calculateTax, 
     totalPay; 


     //Input hours worked 
     cout << "How many hours did you work? "; 
     cin >> hours; 

     //Input Tax rate 
     cout << "What is the percent of your tax rate? "; 
     cin >> taxRate; 

     //get base pay 
     basePay = getBasePay(hours); 

     //Get OT if applicable 

     if (hours > BASE_HOURS) 
      overtime = getOvertimePay(hours); 

     //calculate total pay 
     totalPay = basePay + overtime; 

     //calculate Tax rate 
    taxOwed = calculateTax; 

    // Setting output format 
    cout << setprecision(2) << fixed << showpoint; 

    //Display calculated pay 
    cout << "Base pay: $" << basePay << endl 
     << "Overtime pay: $" << overtime << endl 
     << "Total pay: $" << totalPay << endl 
     << "Taxes owed: $" << taxOwed << endl; 

    //Adding Pause before creating functions 
    char c; 
    cout << "Press any key to end program: "; 
    cin >> c; 
    return 0; 
} 

//############################################# 
// Get base pay function accepts hours worked # 
// and returns pay for non OT hours   # 
//############################################# 

double getBasePay(double hoursWorked) 
{ 
    double basePay; 

    // determine base pay 
    if (hoursWorked > BASE_HOURS) 
     basePay = BASE_HOURS * PAY_RATE; 
    else 
     basePay = hoursWorked * PAY_RATE; 

    return basePay; 
} 

//############################################## 
// The get overtime function accepts hours  # 
//then returns the OT pay if applicable  # 
//############################################## 

double getOvertimePay(double hoursWorked) 

{ 
    double overtimePay; 

    //Determine OT pay 
    if (hoursWorked > BASE_HOURS) 
    { 
     overtimePay = (hoursWorked - BASE_HOURS) * 
      PAY_RATE * OT_MULTIPLIER; 
    } 
    else 
     overtimePay = 0.0; 

    return overtimePay; 
} 
//########################################## 
//this taxes function calculates tax owed # 
// based on the total pay regardless of OT # 
//########################################## 

double getCalculateTax(double totalPay) 
{ 
    double calculateTax; 

    calculateTax = (taxRate/100) * totalPay; 

    return calculateTax; 
} 
+2

'主()'定義了'雙calculateTax'(即未初始化),並沒有按'taxOwed = calculateTax'前分配給它。這是*未定義的行爲*。 'main()'的變量和'getCalculateTax'中的同名變量之間沒有關係。從'main()'頂部的變量列表中刪除'calculateTax',一旦你知道'totalPay',你可以說'double calculateTax = getCalculateTax(totalPay);'所以它立即被初始化。 –

回答

1

你有一個明確的情況下undefinded Behavior。您在您的main()中使用單位變量calculateTax。如果一個變量沒有被初始化,它將存儲位於存儲變量的內存空間的原始位。那些位將被解釋爲你聲明變量的類型,例如double你的情況。你可能很幸運,這個內存塊只包含0,所以你的變量將保持0的值,但是如果有一個比特設置爲1,你的變量將保存一個完全不同的值。瞭解?

因此,您可以做的最好的事情就是在聲明它們後直接初始化所有變量。 所以不是

double hours, 
    basePay, 
    overtime = 0.0, 
    ... ; 

請你幫個忙,並寫這樣的

double hours = 0; 
double basePay = 0; 
double overtime = 0.0; 
    ... 

所以,讓我們面對的實際問題,在你的代碼。不初始化一個變量實際上並不是那麼糟糕,但是使用一個未初始化的變量是。你寫了一個漂亮的小函數來計算稅收,爲什麼你不使用它? getCalculateTax永遠不會被調用。

因此,而不是分配你可能想要做這樣的事情未初始化變量:

taxOwed = getCalculateTax(totalPay); 

這應該做的工作;)

+0

謝謝!我能夠啓動並運行。 – Ben

1

calculateTax的應採取2個參數:

double getCalculateTax(double totalPay, double taxRate) 
{ 
    double calculateTax; 

    calculateTax = (taxRate/100) * totalPay; 

    return calculateTax; 
} 

所以,電話是:

taxOwed = calculateTax(totalPay, taxRate); 

從通話

//  if (hours > BASE_HOURS) // getOvertimePay() already checks if hours>base 
      overtime = getOvertimePay(hours); 

刪除if這應該是它。

注意:儘量避免每行聲明多個變量。聲明他們在何時何地,你需要他們:

double overtime = getOvertimePay(hours); 
double totalPay = basePay + overtime; 
double taxOwed = calculateTax(...); 

,並可以清理你的函數一點:

double getBasePay(double hoursWorked) { 
    return (hoursWorked > BASE_HOURS ? BASE_HOURS : hoursWorked) * PAY_RATE; 
    // return min(BASE_HOURS, hoursWorked)*PAY_RATE 
} 

double getOvertimePay(double hoursWorked) { 
    return (hoursWorked > BASE_HOURS ? hoursWorked - BASE_HOURS : 0) * 
      PAY_RATE * OT_MULTIPLIER; 
} 

double getCalculateTax(double totalPay, double taxRate) { 
    return (taxRate/100) * totalPay; // are you sure about that "/100"? usually doubles [0..1] are used for percentages 
}