I may be over-complicating this...
I'm currently in an online highschool course that is teaching me the basics of programming in java. My current assignment is:
Quote:
Create a Java program that will:
1. Ask the user to input an amount of money as an integer value. Example: 123
2. Display the coins necessary to make up the amount entered by the user.
For example, if the user enters the integer value 123, your program
should output:
toonies = 0
loonies = 1
quarters = 0
dimes = 2
nickles = 0
pennies = 3
I've written up a small portion of what I think the code should look like but I believe that I'm over-complicating what I've written so-far. If anyone has a few minutes to look over the below code and possibly suggest an easier way to complete this assignment it would be very much appreciated.
(I'm allowed to get help on these questions as long as I write the code myself.)
Code :
import java.io.*; //tells Java input will be used
class Assignment4Question3
{
public static void main (String[] args) throws IOException
{
InputStreamReader inStream = new InputStreamReader (System.in);
BufferedReader userInput = new BufferedReader (inStream);
String inputData; //Creates a string variable called 'inputData'.
System.out.println ("Enter an amount of money as an interger. (Example: 123 = $1.23):");
inputData = userInput.readLine ( ); //Places input into inputData string variable.
int pennies = 0;
int nickles = 0;
int dimes = 0;
int quarters = 0;
int loonies = 0;
int toonies = 0;
int intInputData = Integer.parseInt(inputData);
pennies = (intInputData % 10);
if (pennies >= 5)
{
nickles = 1;
pennies = (pennies - 5);
dimes = ((((intInputData % 100) - (pennies)) - 5) / 10);
if (dimes == 3)
{
nickles = (nickles + 1);
dimes = (dimes - 3);
quarters = 1;
if (nickles == 2)
{
nickles = (nickles - 2);
dimes = (dimes + 1);
}
}
else if (dimes == 5)
{
dimes = (dimes - 5);
quarters = 2;
}
else if (dimes >= 8)
{
nickles = (nickles + 1);
dimes = (dimes - 7);
quarters = (quarters + 3);
if (nickles == 2)
{
nickles = (nickles - 2);
dimes = (dimes + 1);
}
}
}
System.out.println("Pennies = "+pennies+"");
System.out.println("Nickles = "+nickles+"");
System.out.println("Dimes = "+dimes+"");
System.out.println("Quarters = "+quarters+"");
}
}
At the moment the above is crudly calculating the pennies, nickles, dimes and quarters with a few errors but it mostly works.
Re: I may be over-complicating this...
Look at using the /, % and - operators to solve this.
Re: I may be over-complicating this...
Quote:
Originally Posted by
Norm
Look at using the /, % and - operators to solve this.
While writing a response to your reply an idea just came to me...
Code :
int exampleInteger = (12345 % 100) // This would equal 45.
double exampleDouble = (exampleInterger / 10) // This would equal 4.5
Would there be a way to get everything on the left side of the decimal point and then save it to an integer, because if there is I believe I may be able to shorten the code tremendously.
Re: I may be over-complicating this...
Quote:
Would there be a way to get everything on the left side of the decimal point and then save it to an integer,
casting a double to an int will drop the fractional parts.
When working with money, look at using pennies instead dollars with 2 decimal points.
This will require scaling dollars to pennies by multiplying by 100.
Re: I may be over-complicating this...
Thank's for the help so-far. After reading what you said today I've re-written the program and I've expanded it. Although it is a lot shorter now there is still one part left of the program to write; I know that I can just copy and paste this:
Code :
if (dimes == 2 && nickles >= 1)
{
dimes = (dimes - 2)
nickles = (nickles - 1)
quarters = (quarters + 1)
}
for the code to sort out the change if there is an excess of dimes and nickles.
Would there be a way to simply tell the program to repeat the above if statement until it can't anymore and then continue along to the final statements?
Here is what the program currently looks like:
Code :
import java.io.*; //tells Java input will be used
class Assignment4Question3
{
public static void main (String[] args) throws IOException
{
InputStreamReader inStream = new InputStreamReader (System.in);
BufferedReader userInput = new BufferedReader (inStream);
String inputData; //Creates a string variable called 'inputData'.
System.out.println ("Enter an amount of money as an interger. (Example: 123 = $1.23):");
inputData = userInput.readLine ( ); //Places input into inputData string variable.
int pennies = 0;
int nickles = 0;
int dimes = 0;
int quarters = 0;
int loonies = 0;
int toonies = 0;
int intInputData = Integer.parseInt(inputData);
int inputDataStringLength = ((inputData.length()) - 3);
String toonieString = inputData.substring(0, inputDataStringLength);
pennies = (intInputData % 10);
dimes = ((intInputData % 100) / 10);
loonies = ((intInputData % 1000) / 100);
toonies = ((Integer.parseInt(toonieString)) / 2);
if (pennies >= 5)
{
nickles = (nickles + 1);
pennies = (pennies - 5);
}
if (dimes == 3)
{
dimes = (dimes - 3);
nickles = (nickles + 1);
quarters = (quarters + 1);
}
if (dimes == 4)
{
dimes = (dimes - 3)
nickles = (nickles + 1)
quarters = (quarters + 1)
}
if (dimes == 5)
{
dimes = (dimes - 5)
quarters = (quarters + 2)
}
if (dimes == 6)
{
dimes = (dimes - 5)
quarters = (quarters + 2)
}
if (dimes == 7)
{
dimes = (dimes - 5)
quarters = (quarters + 2)
}
if (dimes == 8)
{
dimes = (dimes - 8)
nickles = (nickles + 1)
quarters = (quarters + 3)
}
if (dimes == 9)
{
dimes = (dimes - 8)
nickles = (nickles + 1)
quarters = (quarters + 3)
}
if (dimes >= 2 && nickles >= 1) // WORKING HERE ATM
{
dimes = (dimes - 2)
nickles = (nickles - 1)
quarters = (quarters + 1)
}
System.out.println("Pennies = "+pennies+"");
System.out.println("Nickles = "+nickles+"");
System.out.println("Dimes = "+dimes+"");
System.out.println("Quarters = "+quarters+"");
System.out.println("Loonies = "+loonies+"");
System.out.println("Toonies = "+toonies+"");
}
}
Re: I may be over-complicating this...
Code :
nickles = (nickles - 1)
quarters = (quarters + 1)
// can be shortened to:
nickles--; // subtract one
quarters++; // add one
You need to spend more time on designing how the code should work considering the use of arithmetic operators and less on writing code.
For example:
123 / 100 = 1
123 % 100 = 23
Re: I may be over-complicating this...
Quote:
Originally Posted by
Norm
Code :
nickles = (nickles - 1)
quarters = (quarters + 1)
// can be shortened to:
nickles--; // subtract one
quarters++; // add one
You need to spend more time on designing how the code should work considering the use of arithmetic operators and less on writing code.
For example:
123 / 100 = 1
123 % 100 = 23
I'll look more into those after I post this comment. We've only learned the basics of the arithmetic operators at the moment so I don't anything other than +, -, /, %, *, unary +, unary - and the two new ways to use them as you've just showed me.
Re: I may be over-complicating this...
Take a value and manually reduce it to the change values. Start at the big valued coins and move down to pennies. If you have 57 then 57/10 = 5 and 57&10 = 7 7/5 = 1 & 7%5 = 2
As you do the computations, add a println immediately following it to print out the results.
Re: I may be over-complicating this...
Quote:
Originally Posted by
tyeeeee1
double exampleDouble = (exampleInterger / 10) // This would equal 4.5[/code]
No it does not. Try it and see what it gives you.
Quote:
Originally Posted by
tyeeeee1
Would there be a way to get everything on the left side of the decimal point and then save it to an integer, because if there is I believe I may be able to shorten the code tremendously.
Seriously, try it.
Re: I may be over-complicating this...
Quote:
Originally Posted by
jps
No it does not. Try it and see what it gives you.
Seriously, try it.
@jps O.o It equaled 4.0, this doesn't make much sense to me now... Could you explain what's going on jps?
@Norm Thanks for all of the advice, I'll try writing up another version of the program with that in mind.
Re: I may be over-complicating this...
the reason it equals 4.0 is because the variable u r dividing by 10 is of type int... i dont think you know about typecasting yet but if u change 10 to 10.0 it should give u the answer you're looking for
Re: I may be over-complicating this...
So you have a variable of type double. That means you can store a value of type double in it. You can store a value of type integer in a type double because there is no loss of precision in the cast from integer to double. All that has to be done is add .0 to the integer, right? So the compiler does this cast for you.
Now look at your line of code:
double exampleDouble = (exampleInterger / 10);
When the calculation happens, the right side is evaluated, and then assigned to the left side. So step one is taken as (exampleInteger/10). So here we have integer divided by integer. The math is done as integer math because they are both integers. This short-handed math just calculates the integer portion and never does the extra work of anything past the decimal. (Since there is no reason to do the work for integers, it just cuts out extra work). Once the answer 4 is returned, 4 is automatically casted to double, giving 4.0, which is what is assigned to exampleDouble. That is how you get 4.0 with 45/10
If you really wanted the 4.5 you have to explicitly tell the compiler not to do integer math. There are several ways to do this, so the following examples will produce the same result of 4.5, but basically the rule is just to use at least one double in the calculation and you will get a double as a result.
double exampleDouble = (exampleInterger / 10.0); //10.0 is a double value
double exampleDouble = ((double)exampleInterger / 10); //exampleInteger is treated as a double value for the current operation, in this case the division
What do you think the result will be from this line of code?
double exampleDouble = (double)(exampleInterger / 10);
Think about it and try it, see if you understand what is going on.
Re: I may be over-complicating this...
Thanks for all the help everyone, I've just submitted the assignment to my teacher and hopefully I'll get 90+ =P
@jps Your detailed example really helped, I don't think I would have easily figured out that all I needed to do was add '.0' at the end. Thanks for teaching me that.