# Beginner C++ hassles

1. Apr 8, 2015

### Lord Anoobis

1. The problem statement, all variables and given/known data
A kilogram is 1000 grams. Write a program that will read the weight of a package of butter in grams and output the weight in kilograms, as well as the number of packages of butter needed to yield 1 kilogram of butter. Your program should allow the user to repeat this calculation as often as the user wishes.

2. Relevant equations

3. The attempt at a solution
/*Converts a package of butter from grams to kilograms and
calculates the number of packages needed to make up at least 1 kilogram*/

#include <iostream>
using namespace std;
int main()
{
const float kilo = 1000; //grams per kg
float total_weight = 0, weight_g, weight_kg;
int packages = 0;
cout << "Enter the weight of the package of butter in grams: ";
cin >> weight_g;
cout.setf(ios::fixed);
cout.precision(3);

while (weight_g != 0)
{
weight_kg = weight_g/kilo; // convert to kg
cout << endl << "The weight of the package in kilograms is: "
<< weight_kg << "kg" << endl;

while (total_weight < 1000) // counting the packages required
{
total_weight = total_weight + weight_g;
packages++;
}

cout << "For at least 1 kilogram of butter you need "
<< packages << " packages." << endl;
cout << "Enter another package weight to continue or enter 0 to "
<< "end the program." << endl << endl
<< "Package weight: ";
cin >> weight_g;
}

return 0;
}

The program works in all aspects but one, crucial too. The number of packages required is correct for the first figure entered, but carries over for any other value. So it stays, for example, 5 packages for 200g. I'm sure I'm missing something simple here but I just don't see it. The compiler used is Codeblocks. Please assist.

2. Apr 8, 2015

### milesyoung

Disregarding possible optimizations , consider what value 'total_weight' has as you iterate - does it ever get reset?

You can use [ code ][ /code] tags (without the spaces) to make your code more legible.

3. Apr 8, 2015

### Lord Anoobis

It seems that total_weight is using the same initial value on each pass. I can't see why the new value is used for the conversion but gets tossed for the number of packages though. I get the feeling it has to do with the second while loop, right?

4. Apr 8, 2015

### cpscdave

Yes and no. Try this. On a piece of paper set up all your variables and walk through the code updating the variables by hand. Do only what the code tells you to do. Might point out your problem.

Or alternatively

When facing a coding bug try and ask yourself when does the bug happen and when does it not happen?
In your case you say it works for the first time but not the subsequent times.
So what does your code do on the first run that it doesn't on the next time through?? (Hint you actually have at least 2 of these errors but one is being masked by the current issue you're having )

5. Apr 8, 2015

### milesyoung

After you've calculated the first package count, then 'total_weight' might, for instance, have the value 1005. As you encounter the while loop a second time, 'total_weight < 1000' evaluates to false, and you'll never enter the loop again, i.e. 'packages' will always have the value of the first count.

You're talking about 'weight_g'? It does change, but since you effectively disable the second while loop, it makes no difference.

6. Apr 8, 2015

### Lord Anoobis

Damn. Talk about being in plain sight. Reinitializing total_weight and packages solves the problem. Is there a simpler way of going about this program as a whole
?

7. Apr 8, 2015

### Lord Anoobis

Checking it on paper certainly did make things clearer. The packages counter issue is quite well hidden behind the other. I'll be sure to do the paper check more often in future.

8. Apr 8, 2015

### Lord Anoobis

Whoops. Dunno what happened there. Time to hit the deck I think.

9. Apr 8, 2015

### cpscdave

Glad you got what I was trying to get at :D

To answer your questions yes there are couple other ways you can solve this problem.

Is there a way you can figure out the number of packages required using only math? Think how you would solve this problem yourself :)

Also you could write the over all program flow using a do/while loop as opposed to a while loop.

I usually tell people there are 3 basic looping types
For loops (when you want to run the loop an known number of times)
do while loops (when you want to run the loop at least one time and until a condition is met)
while loops (when you want to run the loop until a condition is met)

This seems to fit the 1 time and until condition is met.