2017-10-19 2 views
0

Salut Je travaille sur un projet pour l'école et ne peux pas pour la vie de moi comprendre comment faire fonctionner la fonction totalJobCost. Les autres fonctions fonctionnent sans problème, mais je ne pense pas qu'ils passent le var Retour à saisir pour totalJobCost pour les sorties totalJobCost 0. Voici le code que j'utilise:Peinture 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; 
} 

Répondre

1

Vous devez déclarez vos arguments (totalpaint et hrcost) comme références.

Actuellement, les fonctions space() et cost() font juste des copies de totalpaint et hrcost quand elles sont appelées, les mettent à jour, puis les impriment. Mais lorsque les fonctions reviennent, les valeurs stockées dans totalpaint et hrcost sont perdues.

Pour résoudre ce problème, vous devez déclarer ces fonctions comme suit:

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

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

Maintenant, quelle que soit variable que vous passez comme totalpaint ou hrcost sera mis à jour lorsque space() ou cost() fonctionne sur elle.

+1

Merci qui a fonctionné mais pourriez-vous s'il vous plaît expliquer comment le double & fonctionne? est-ce juste dire changer cette valeur partout ou juste changer la valeur dans la fonction dans laquelle il s'exécute (ie: main) –

+0

C'est le dernier: Fonction 'space()', par exemple, changera simplement la valeur de 'allPaintCost' dans le fonctionne dans ('main()'). – frslm

+0

double & est juste un raccourci pour l'exemple de code que j'ai donné ci-dessous, car il est assez commun. Il ajoute des fonctions de sécurité, comme ne pas permettre la réaffectation du pointeur. –

1

Il s'agit d'un passage de valeur par rapport à un problème de passage par référence.

En C++, les booléens, les caractères, les nombres entiers, nombres à virgule flottante, tableaux, des classes, y compris des chaînes, des listes, des dictionnaires, des jeux, des piles, files d'attente et les énumérations sont des types de valeur, tandis que les références et pointeurs sont des types de référence.

CPP reference

Les variables que vous utilisez sont doubles (double virgule flottante de précision), de sorte qu'ils sont des types de valeur. Lorsque vous passez des variables de type valeur à des fonctions en tant que paramètres, la valeur actuelle des variables est copiée dans la pile appelante de la fonction que vous avez appelée. Une fois à l'intérieur de la fonction, les noms des paramètres ne sont que des noms que vous utilisez pour accéder aux valeurs copiées. Quoi que vous fassiez pour ces valeurs copiées n'affectera pas la valeur des variables d'origine que vous avez passées à la fonction. Lire sur la portée de la fonction et l'architecture de la pile d'appel de C/C++ pour en savoir plus.

Pour modifier la valeur d'une variable à travers les appels de fonction, vous devez transmettre une référence à son emplacement en mémoire. Si vous déclarez une variable dans les premières lignes d'une fonction, son emplacement en mémoire fera partie de la pile d'appels de cette fonction, et vous pourrez accéder en toute sécurité à cette mémoire dans tous les appels de fonction appelés dans la fonction d'origine. Donc, vous pouvez le faire:

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

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

Ceci implique l'opérateur de déréférencement. Désolé si c'est trop d'informations, mais passez par référence et passez par la valeur sont plus faciles à comprendre si vous savez ce qui se passe dans l'appel de fonction sous-jacente et l'architecture de mémoire de C/C++.

+0

Merci, cela m'a aidé à comprendre les variables à travers les fonctions un peu plus. –