2017-10-19 81 views
0

嗨我正在爲一所學校的項目工作,不能爲我的生活弄清楚如何讓totalJobCost函數工作。其他職能的工作沒有問題,但我不認爲他們是路過的VAR回到主爲totalJobCost搶的totalJobCost輸出0。這裏是我使用的代碼:Paint Job Estimator C++

#include "stdafx.h" 
#include <iostream> 

using namespace std; 

void space(double paintarea, double paintcost, double paintneeded, double totalpaint); 
void cost(double hrs, double hrcost, double spacetopaint); 
void totalJobCost(double allTheirPaintCost, double allTheirWages, double theirTotalJobCost); 


const double AREA_FORMULA = 220.00; 
const double AREAFORMULA_PAINT = 1.00; 
const double AREAFORMULA_HOURS = 8.00; 
const double AREAFORMULAHOURS_WAGES = 35.00; 

int main() 
{ 
    double areaTP; 
    double paintCST = 0; 
    double paintNeeded = 0; 
    double allPaintCost = 0; 
    double hoursNeeded = 0; 
    double hoursWages = 0; 
    double allWages = 0; 
    double allJobCost = 0; 

    cout << "Enter the square footage you need to paint, then press enter" << endl; 
    cin >> areaTP; 

    cout << "Enter the price by gallons of paint you will use, then press enter" << endl; 


    cin >> paintCST; 
    while (paintCST < 10) 
    { 
     cout << "Enter the price by gallons of paint you will use, then press enter. cannot be less than 10 :"; 
     cin >> paintCST; 
    } 

    space(areaTP, paintCST, paintNeeded, allPaintCost); 

    cost(hoursNeeded, hoursWages, areaTP); 


    totalJobCost(allPaintCost, hoursWages, allJobCost); 


    system("Pause"); 

    return 0; 
} 

void space(double paintarea, double paintcost, double paintneeded, double totalpaint) 
{ 

    paintneeded = paintarea/AREA_FORMULA * AREAFORMULA_PAINT; 
    totalpaint = paintneeded * paintcost; 

    cout << "How many gallons of paint you will need: " << paintneeded << endl; 
    cout << "Your total paint cost will be: " << totalpaint << endl; 
} 

void cost(double hrs, double hrcost, double spacetopaint) 
{ 

    hrs = (spacetopaint/AREA_FORMULA) * AREAFORMULA_HOURS; 
    hrcost = hrs * AREAFORMULAHOURS_WAGES; 

    cout << "The number of hours for the job will be: " << hrs << endl; 
    cout << "The total amount of wages will be: " << hrcost << endl; 

} 

void totalJobCost(double totalpaint, double hrcost, double theirTotalJobCost) 
{       
    theirTotalJobCost = totalpaint + hrcost; 

    cout << "The total price of your paint job will be: " << theirTotalJobCost << endl; 
} 

回答

1

您需要聲明您的論點(totalpainthrcost)作爲參考。

當前,函數space()cost()只是在調用時複製totalpainthrcost,更新它們,然後打印它們。但是當函數返回時,存儲在totalpainthrcost中的值將丟失。

爲了解決這個問題,你應該聲明如下這些功能:

void space(double paintarea, double paintcost, double paintneeded, double& totalpaint) 

void cost(double hrs, double& hrcost, double spacetopaint) 

space()cost()它運行現在無論你的變量傳遞中作爲totalpainthrcost將被更新。

+1

謝謝你的工作,但可以請你解釋雙重和作品?它只是說改變這個值無處不在,或者只是改變它運行的函數中的值(即:主) –

+0

它是後者:函數'space()',例如,只會改變'allPaintCost'的值在函數運行在('main()')中。 – frslm

+0

double&只是我下面給出的代碼示例的簡寫,因爲它很常見。它增加了一些安全功能,如不允許重新分配指針。 –

1

這是一個通過價值與通過引用問題。

在C++中,布爾值,字符,整數,浮點數, 陣列,類,包括字符串,列表,字典,套,堆棧, 隊列-和枚舉是值類型,而引用和指針 是參考類型。

CPP reference

您正在使用的變量是雙打(雙精度浮點),所以它們是值類型。當您將值類型變量作爲參數傳遞給函數時,變量的當前值將被複制到您調用的函數的調用堆棧中。一旦進入函數,參數名稱就是您用來訪問複製值的名稱。不管你對這些複製的值做什麼都不會影響你傳遞給函數的原始變量的值。更多地瞭解C/C++的函數範圍和調用堆棧體系結構。

要通過函數調用更改變量的值,需要將引用傳遞到其在內存中的位置。如果在函數的前幾行聲明一個變量,則它在內存中的位置將成爲該函數調用堆棧的一部分,並且您可以在原始函數內調用的任何函數調用中安全地訪問該內存。所以你可以這樣做:

int main() { 
    double variable = 0; 
    function(&variable); 
    cout << variable; 
} 

void function(double* variable_address) { 
    *variable_address = 1.5; 
} 

這涉及到解引用操作符。對不起,如果這是太多的信息,但如果你知道C/C++的底層函數調用和內存體系結構中發生了什麼,通過引用傳遞和通過值傳遞更容易理解。

+0

謝謝,這幫助我更多地理解函數的變量。 –