2010-07-22 2 views
-3

Можно создать дубликат:
C++ passing variables in from one Function to the Next.C++ Функции и Попутный Переменные

Программа работает, но когда дело доходит до getUserData он запрашивает ту же информацию в 4 раза, а затем отображает полученные результаты с отрицательные числа. Я использовал тестовые номера для количества комнат 1, 110 для ножек sqrt в комнате, 15.00 за стоимость краски.

//Problems with this not working 
    void showMenu(); 
void getUserData(int &, double &, int &); 
void doEstimate(int &, double &, int &, double &, double &); 
void showReport(); 

    int main() 
{ 
int choice; 
//I am not sure why I have to do this but someone suggested to do it and the program complied when I did this int calc ect 

int calcGallonsOfPaint, rooms, totalsqrtfeet; 
double calcCostOfPaint, costOfPaint; 
int calcHoursOfLabor; 
double calcLaborCost; 
double calcPaintJobCost; 

    // Set up numeric output formatting. 
    cout << fixed << showpoint << setprecision(2); 

    do 
    { 
     // Display the menu and get the user's choice. 
     showMenu(); 
     cin >> choice; 

     // Validate the menu selection. 
     while (choice < 1 || choice > 2) 
     { 
     cout << "Please enter 1 or 2: "; 
     cin >> choice; 
     } 

     if (choice == 1) 
     { 
    //for some reason it just keeps repeating the function getUserData 
getUserData(rooms, costOfPaint, totalsqrtfeet); 
doEstimate(calcGallonsOfPaint, calcCostOfPaint, calcHoursOfLabor, calcLaborCost, calcPaintJobCost); 
showReport(); 


    } 
    } while (choice != 2); 
    return 0; 
} 


    void getUserData(int &rooms, double &costOfPaint, int &totalsqrtfeet) 
{ 
int sqrtfeet; 
int count = 0; 

cout << "Please enter the number of rooms to be painted: "; 
cin >> rooms; 

cout << "Please enter square feet of wall space in each room: "; 
cin >> sqrtfeet; 

for (count = 1; count <= rooms; count++) 
    { 
    cout << "Please eneter square feet of wall space in room " << count << ": "; 
    cin >> sqrtfeet; 
    totalsqrtfeet += sqrtfeet; 
    } 

cout << "What is the cost of the paint: "; 
cin >> costOfPaint; 

system("cls"); 
system("pause"); 
} 

void doEstimate(int &calcGallonsOfPaint, double &calcCostOfPaint, int &calcHoursOfLabor, double &calcLaborCost, double &calcPaintJobCost) 
{ 
//I am not sure why I have to do this but someone suggested to do it and the program complied when I did this: puting int rooms ect 
int rooms, totalsqrtfeet; 
double costOfPaint; 

getUserData(rooms, costOfPaint, totalsqrtfeet); 

calcGallonsOfPaint = 1 * (totalsqrtfeet/110); //Calculates the number of whole gallons of paint required. 

calcCostOfPaint = calcGallonsOfPaint * costOfPaint; //Calculates the cost of the paint required. 

calcHoursOfLabor = calcGallonsOfPaint * 6; //Calculates the number of whole hours of labor required. 

calcLaborCost = calcHoursOfLabor * 15.00; //Calculates the labor charges. 

//Calculates the cost of the paint job. This is the sum of the labor charges and the cost of the paint required. 
calcPaintJobCost = calcLaborCost + calcCostOfPaint; 

/*110 square feet of wall space 
one gallon of paint 
six hours of labor 
$15.00 per hour for labor 
*/ 

} 

void showReport() 
{ 

//I am not sure why I have to do this but someone suggested to do it and the program complied when I did this 
int calcGallonsOfPaint, rooms, totalsqrtfeet; 
double calcCostOfPaint, costOfPaint; 
int calcHoursOfLabor; 
double calcLaborCost; 
double calcPaintJobCost; 

getUserData(rooms, costOfPaint, totalsqrtfeet); 
doEstimate(calcGallonsOfPaint, calcCostOfPaint, calcHoursOfLabor, calcLaborCost, calcPaintJobCost); 

cout << "The number of rooms to be painted: " << rooms << endl; 
cout << "The number of whole gallons of paint required: " << calcGallonsOfPaint << endl; 
cout << "The hours of labor required: " << calcHoursOfLabor << endl; 
cout << "The cost of the paint: " << calcCostOfPaint << endl; 
cout << "The labor charges: " << calcLaborCost << endl; 
cout << "The total cost of the paint job: " << calcPaintJobCost << endl; 

system("pause"); 
system("cls"); 
} 
+1

дубликата: http://stackoverflow.com/questions/3305127/c-passing-variables-in-from-one-function-to- следующий . Вместо этого следует изменить исходный вопрос. – Akusete

+0

совершенно. Это либо невежество, либо злоупотребление. Как мы закрываем этот вопрос? –

+0

@ c-urchin: просто позвольте пользователям более высокого уровня это сделать. – BoltClock

ответ

1

Одна вещь, которую вы должны сделать, это инициализирует totalsqrtfeet к нулю в своей основной функции. Это потому, что вы просто добавить размер каждой комнаты к ней и она начинается со случайной величины: junk + a + b + c + d еще junk :-)

Кроме того, вы называете getUserData от вашей основной функции, а затем снова от doEstimate. И затем вы называете их и снова в showReport. Вот почему он спрашивает четыре раза. Просто позвоните getUserData один раз. Поскольку это домашнее задание, я оставлю вас, чтобы выяснить, где, но вот подсказка. Если вы сделаете это в основном (подталкиваете, подталкиваете, подмигиваете, подмигиваете), вам придется передавать его переменные в doEstimate, а не создавать новых переменных с тем же именем внутри этой функции и волшебно ожидать, что компилятор их свяжет с оригиналами.

+0

Можете ли вы просто сказать мне, что это убивает меня ...я застрял на этом в течение последнего дня – Razon

+0

@Razon, если вы хотите получить ответ вместо помощи с домашним заданием, лучше всего вернуться к исходному вопросу и сказать, что вы хотите получить ответ. Вам просто нужно быть готовым к сбою, если ваши преподаватели узнают, что вы скопировали его дословно из Интернета. Большинство людей помогут и помогут вам (а не решить проблему), если вы зададите вопрос о домашнем задании, так как это будет лучше для вас в долгосрочной перспективе. – paxdiablo

+0

Я пытаюсь сделать то, что вы предложили, что здорово, но если вы можете пойти на исходный вопрос и помочь. У меня возникла новая проблема с использованием ваших советов. – Razon

0

Чтобы рискованная, что paxdiablo сказал, вы вызываете getUserData в вашем вложенными в то время как цикл, но я не понимаю, цель вызова getUserData(rooms, costOfPaint, totalsqrtfeet); до doEstimate(...), когда данные не используются и не передаются doEstimate (...), пока вы не вызовете getUserData снова, находясь внутри функции doEstimate(...). Вы должны пройти по стоимости в номере, costOfPaint и totalsqrtfeet переменных в doEstimate(...) или сделать их глобальными, так как у вас есть только один main() функцию в любом случае. Если бы у вас было какое-то решение OO, я бы не рекомендовал делать их глобальными и скорее частью класса.

Кроме того, все эти переменные равны нулю или NULL, если они передаются в doEstimate (...):

calcGallonsOfPaint, calcCostOfPaint, calcHoursOfLabor, calcLaborCost, calcPaintJobCost

Если вы хотите, чтобы выводить их, то вам необходимо передать их по ссылке doEstimate(...), а затем, когда она доберется до cout, тогда она будет достаточно печатать правильные значения. Вот почему он равен нулю.

Суть в том, что вам нужна одна функция для вызова других функций. Это было бы самым простым планом на данный момент, например:

GetDataAndPrint(...) { 

    // Get some data 

    // Do estimate, pass in values by reference 

    // Print Results from calculated values 

    // return 
} 
+1

Мате, если наши технические писатели находят вас, у вас большие проблемы. Caveat - существительное, а не глагол :-) – paxdiablo

Смежные вопросы