Paint Job Estimator C++
Paint Job Estimator C++
嗨,我正在为学校做一个项目,我一辈子都想不出如何让totalJobCost函数发挥作用。其他函数工作起来没有问题,但我不认为它们会将var传递回main,以便在totalJobCost输出0时获取。这是我正在使用的代码:
#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;
}
您需要将参数(totalpaint
和hrcost
)声明为引用。
目前,函数space()
和cost()
只是在调用时复制totalpaint
和hrcost
,更新它们,然后打印它们。但是当函数返回时,存储在totalpaint
和hrcost
中的值将丢失。
要解决这个问题,您应该如下声明这些函数:
void space(double paintarea, double paintcost, double paintneeded, double& totalpaint)
void cost(double hrs, double& hrcost, double spacetopaint)
现在,当space()
或cost()
对您传递的totalpaint
或hrcost
变量进行操作时,它将被更新
这是一个按值传递与按引用传递的问题。
在C++中,布尔值、字符、整数、浮点数、,数组、类——包括字符串、列表、字典、集合、堆栈,队列和枚举是值类型,而引用和指针是引用类型。
CPP参考
您使用的变量是双精度(双精度浮点),因此它们是值类型。将值类型变量作为参数传递给函数时,变量的当前值将复制到所调用函数的调用堆栈中。一旦进入函数,参数名称就只是用于访问复制值的名称。对这些复制的值所做的任何操作都不会影响传递给函数的原始变量的值。阅读C/C++的函数范围和调用堆栈架构以了解更多信息。
要在函数调用之间更改变量的值,需要传递对其在内存中位置的引用。如果在函数的前几行声明一个变量,它在内存中的位置将是该函数调用堆栈的一部分,并且可以在原始函数中调用的任何函数调用中安全地访问该内存。所以你可以这样做:
int main() {
double variable = 0;
function(&variable);
cout << variable;
}
void function(double* variable_address) {
*variable_address = 1.5;
}
这涉及到取消引用运算符。如果这是太多的信息,很抱歉,但如果你知道C/C++的底层函数调用和内存架构中发生了什么,那么通过引用传递和通过值传递更容易理解。