views:

229

answers:

4

Please solve/answer problems to get program to work. I am not fully understanding the passing variables by reference or value and I think that is what is making this so hard. So if you could fix the program. I've been at this for the last 2 days. I have included my full code.

paxdiablo suggested this and I'm trying to do what they said

"One thing that you should do is initialise totalsqrtfeet to zero in your main function. That's because you're just adding the size of each room to it and it starts out with a random value: junk + a + b + c + d is still junk :-)

On top of that, you call getUserData from your main function and then again from doEstimate. And then you call them both again in showReport. That's why it's asking four times. Just call getUserData once. Since it's homework, I'll leave you to figure out where but here's a hint. If you do it in main (nudge, nudge, wink, wink), you'll have to pass he variables into doEstimate as well, not create new variables of the same name within that function and magically expect the compiler to associate them with the originals. "

When I enter test data of 1 room, 110 sqrt feet, 15.00. I get the right number for rooms in the report function but 0 for everything else

 #include <iostream>
#include <cstdlib>
#include <cmath>
#include <iomanip>

using namespace std;

// Function prototypes
void showMenu();
void getUserData(int &, int &, double &);
void doEstimate(int &, int &, double &, int &, double &, int &, double &, double &);
void showReport(int &, int &, double &, int &, double &, int &, double &, double &);

int main()
{
    int choice = 0;
    int calcGallonsOfPaint = 0, rooms = 0, totalsqrtfeet = 0;
    double calcCostOfPaint = 0, costOfPaint = 0;
    int calcHoursOfLabor = 0;
    double calcLaborCost = 0;
    double calcPaintJobCost = 0;

   // 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)
      {

        //User enters information
        getUserData(rooms, totalsqrtfeet, costOfPaint);

        //Information from getUserData is used to make calculations
        doEstimate(rooms, totalsqrtfeet, costOfPaint, calcGallonsOfPaint, calcCostOfPaint, calcHoursOfLabor, calcLaborCost, calcPaintJobCost);

        //Report is generated from user input and calculations
        showReport(rooms, totalsqrtfeet, costOfPaint, calcGallonsOfPaint, calcCostOfPaint, calcHoursOfLabor, calcLaborCost, calcPaintJobCost);

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

//*****************************************************************
// Definition of function showMenu which displays the menu.       *
//*****************************************************************

void showMenu()
{
   cout << "\n\t\tPaint Job Estimator Menu\n\n";
   cout << "1. Get Paint Job Estimate\n";
   cout << "2. Quit the Program\n\n";
   cout << "Enter your choice: ";
}

/*
After the paint job estimate is displayed, the menu should be displayed again. 
The number of rooms must be at least 1, the price of the paint per gallon must be at least $15.00, 
and the area for the wall space of each room must be greater than 10 square feet. 
All input validation must be performed with a loop.
*/

void getUserData(int &rooms, int &totalsqrtfeet, double &costOfPaint)
{
    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 room 1: ";
    cin >> sqrtfeet;

    for (count = 2; 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;
}

void doEstimate(int &rooms, int &totalsqrtfeet, double &costOfPaint, int &calcGallonsOfPaint, double &calcCostOfPaint, int &calcHoursOfLabor, double &calcLaborCost, double &calcPaintJobCost)
{


    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;     


}

void showReport(int &rooms, int &totalsqrtfeet, double &costOfPaint, int &calcGallonsOfPaint, double &calcCostOfPaint, int &calcHoursOfLabor, double &calcLaborCost, double &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  A: 

This is wrong

if (choice == 1)
{
    getUserData();
    doEstimate();
    showReport();
}

Your prototypes are

void getUserData(int &rooms, double &costOfPaint, int &totalsqrtfeet);
void doEstimate(int &calcGallonsOfPaint, double &calcCostOfPaint, int &calcHoursOfLabor, double &calcLaborCost, double &calcPaintJobCost);
void showReport();

You need

int rooms;
double costOfPaint;
int totalsqrtfeet;

getUserData(rooms, costOfPaint, totalsqrtfeet);
Lou Franco
I tried this. I'm not to use global variables. So I have to pass variables by reference or something like that
Razon
These aren't global variables. They are passed by reference. The problem is that this code is too much to learn with. Start smaller -- a main() and one other function. Call the function from main.
Lou Franco
I changed the code. I posted it above. I changed the prototypes and the what you suggested. It's working but it gets suck repeating the getUserData function. I need it to get the information from getUserData and put the variables into doEstimate and run the calculations. Ending with showReport taking all the variables and displaying them.
Razon
It asks 4 times the for input from getUserData before finally showing the results
Razon
+1  A: 

Your problem is here:

getUserData();
doEstimate();
showReport();

These functions all take arguments. You aren't giving them any. The solution is to give them the arguments they need.

They seem to be taking reference arguments that are used as out-parameters. You would call them like this:

void foo(int& out_param) 
{
   out_param = 1;
}

int main() 
{
   int x = 0;      // Create a variable of the appropriate type to pass 
   foo(x);         // Give it as a parameter to foo
   std::cout << x; // x is now 1, so this should print 1

   return 0;
}

I'm not giving a direct solution for your particular problem since this is clearly homework, but that should get you on the right track.

Tyler McHenry
It asks 4 times the for input from getUserData before finally showing the results
Razon
Please help.I finally got it to start working but it keeps repeating getUserData 4 times and then displays results with negative numbers. I use for number of rooms 1, then for sqrt feet in each room i enter 110, for cost of paint I enter 15.00. It ask the same thing over and over again with the results when they come with negative numbers but the it displays for in the results the right number only for number of rooms
Razon
+1  A: 

Not sure if this is related to your problem (you don't really explain what that is), but in function doEstimate you have:

getUserData (double &costOfPaint, int &totalsqrtfeet);

I'm not sure what you are trying to do here, but as written it is a function prototype declaration that does nothing useful. Probably you had some other intention? If you want to call the function you should do it like this, where var1, var2 and var3 are some variables that have to be declared before this call:

getUserData(var1, var2, var3);

Later you have:

calcGallonsOfPaint: 1 * (totalsqrtfeet/110);

This should be a = instead of a :.

sth
It asks 4 times the for input from getUserData before finally showing the results
Razon
+1  A: 

I would suggest stepping through your program using a (source-level) debugger to see what is happening at each line of code. It's an indispensable tool that makes it immensely easier to track down unexpected behavior in your program as well as saving you a lot of time.

Just do a google for a debugger tutorial for the programming environment/IDE you're using. But in general when using any debugger you want to set a breakpoint in your code and then step through each line and see the current state of your program, inspecting variables etc.

Victor T.