pawsome
pawsome

Reputation: 29

confusion about while loop

I'm just starting to learn my first programming language as of yesterday, so I'm writing simple test programs from my java book.

What I'm attempting to do is to have a user enter a static monthly investment and how many months they will be saving for, then display their total savings after that period of time.

when I compile the program it says that in system.out.println at the end of the program that total has not been initialized. I have tried initializing total in just the loop but I figured that would put the scope of it in the loop So I tried initializing it at the top and figured it runs through the loop until the condition is met but doesn't go back to the top of the program to put the value back in so I make another variable at the end of the loop to hold the total at the end of the loop. What's Wrong with my logic

thank you for the help!

import java.util.Scanner;

public class CompoundInterestSteadyRate {

public static void main(String[] args){ 
Scanner input = new Scanner(System.in);


double monthlyInterestRate = (1 + 0.00417);

System.out.println("please enter amount saved each mounth");

double amountSavedMonthly = input.nextDouble();

System.out.println("please enter amount of months you will be saving for");
int amountOfMonthsSaved = input.nextInt();

int monthCountDown = amountOfMonthsSaved;

double totalAmount;
double addMonths;
double intitalAmount = 0;
while (monthCountDown > 0){

    addMonths = amountSavedMonthly * monthlyInterestRate + intitalAmount;

    intitalAmount = addMonths;

      totalAmount = intitalAmount;

}
double total = totalAmount;
System.out.println("your total after " + " " + amountOfMonthsSaved + " " + "months is:" + " " + "$" + total);
}

}

thanks everyone for the help it now compiles however it seems when going through the math it doesn't take in account the first month of savings for example if I do $100 each month its total at the end is %502.08 which I don't believe is right

import java.util.Scanner;

public class CompoundInterestSteadyRate {

public static void main(String[] args){ 
Scanner input = new Scanner(System.in);


double monthlyInterestRate = (1 + 0.00417);

System.out.println("please enter amount saved each mounth");

double amountSavedMonthly = input.nextDouble();

System.out.println("please enter amount of months you will be saving for");
int amountOfMonthsSaved = input.nextInt();

int monthCountDown = amountOfMonthsSaved;

double totalAmount = 0;
double addMonths;
double intitalAmount = 0;
while (monthCountDown > 1){

    addMonths = amountSavedMonthly * monthlyInterestRate + intitalAmount;

    intitalAmount = addMonths;

      totalAmount = intitalAmount;

    monthCountDown = monthCountDown - 1;
}
double total = totalAmount;
System.out.println("your total after " + " " + amountOfMonthsSaved + " " + "months is:" + " " + "$" + total);

Upvotes: 2

Views: 122

Answers (7)

Sea Killer
Sea Killer

Reputation: 3

cricket-007 is right about initializing totalamount = 0; But it looks like your while loop keeps going. Try this!

changed your arrow key from > to <, on the while loop

import java.util.Scanner;

public class CompoundInterestSteadyRate {

    public static void main(String[] args) { 
        Scanner input = new Scanner(System.in);

        double monthlyInterestRate = (1 + 0.00417);

        System.out.println("please enter amount saved each mounth");

        double amountSavedMonthly = input.nextDouble();

        System.out.println("please enter amount of months you will be saving for");
        int amountOfMonthsSaved = input.nextInt();

        int monthCountDown = amountOfMonthsSaved;

        double totalAmount =0;
        double addMonths;
        double intitalAmount = 0;
        while (monthCountDown < 0) {
            addMonths = amountSavedMonthly * monthlyInterestRate + intitalAmount;

            intitalAmount = addMonths;

            totalAmount = intitalAmount;
        }
        double total = totalAmount;
        System.out.println("your total after " + " " + amountOfMonthsSaved + " " + "months is:" + " " + "$" + total);
    }
}

Upvotes: 0

Pritam Pallab
Pritam Pallab

Reputation: 68

First of all there is no need of using intitalAmount and totalAmount. Because each time you are inserting same values to them. Secondly if you make

monthCountdown > 1

then it will count a month less. Because suppose you are counting for 6 months. Now for monthCountdown > 1 the loop will iterate for 5 times and calculate interest for 5 times. Which I believe is not the logic you want to implement. So it should be,

monthCountdown > 0

Lastly your mathematical logic is not correct because each time you are calculating the interest on the monthly value and adding it with the previous balance. But it should be like each time interest should be calculated on the total current balance.

while (monthCountDown > 0){    
        totalAmount = ( amountSavedMonthly + totalAmount ) * monthlyInterestRate;
}

Please let me know if any concern.

Upvotes: 1

jatin_ghataliya
jatin_ghataliya

Reputation: 154

Initialize totalAmount to 0...

Make in while condition greater than 1..

Upvotes: 0

Kedar Mhaswade
Kedar Mhaswade

Reputation: 4695

This problem is a little intricate although the compiler (javac program) provides following helpful message:

Compound.java:33: error: variable totalAmount might not have been initialized double total = totalAmount;

What could be happening you may wonder. The easy answer is to go to line 20 in your program and initialize the value of totalAmount to 0. Then your program would compile.

The reason the compiler does that is rather complicated, but you can reason about it this way:

What if, just what if the while loop did not get run even once (as written, in your program, opposite is happening as you will soon figure out that you are forgetting something about the loop variable)? Then Java would execute the (next) statement double total = totalAmount; and the way this assignment statement is executed is roughly like this:

  • read the variable on the right side of =, that is totalAmount in a temporary location
  • transfer the contents of that location to the memory for the variable on the left side of =, i.e. total.

Now, Java does not like to read a local variable's (such as totalAmount) value that is never written to because it may contain some garbage value. When you initialize it with a value like 0, this problem goes away.

Upvotes: 1

okingniko
okingniko

Reputation: 11

try 2 steps:

  1. double totalAmount; ==> double totalAmount = 0;
  2. while (monthCountDown > 0); ==> while (monthCountDown-- > 0);

Hava a nice day, my friend.

Upvotes: 1

Bethany Louise
Bethany Louise

Reputation: 646

First of all, it isn't necessarily the case that totalAmount will not be initialized. However, depending on the user input, it is POSSIBLE that totalAmount will not have been initialized, which will then throw an exception when the program attempts to assign the value of totalAmount to total. To avoid this, you need to ensure that totalAmount gets initialized, which is easy to do. When you declare totalAmount, simply assign 0 as its value.

You also have a problem with your while loop. Because the value of monthCountDown is never changed within the loop, there is no way for the condition monthCountDown > 0 to become false. I'm assuming you intended for monthCountDown to be reduced by 1 each time the loop is run, so you should include monthCountDown--; within the loop to prevent it from becoming an infinite loop.

Upvotes: 0

Nathan Marotta
Nathan Marotta

Reputation: 136

set totalAmount = 0,that will instialize it, let me know if this fixes the problem

when you declare it declare it like this double totalAmount = 0;

Upvotes: 2

Related Questions