简体   繁体   中英

Infinite Loop or Early terminating do while loop

I have been fighting with this program for awhile now. It has started to compile correctly, but when I run it as it is, it says "Your bill is __" infinitely. When I change the initial response value it refuses to run. I'm at a lose as to how to fix it.

/* Savannah Moore
   CSCI 1301
    2/11/2013
    Internet Package Code: Code determines customer's final pricing. */
import java.util.Scanner;

public class internet{
    public static void main(String[] args){
      double hours, price;
      int internet;
      String response, check="Yes";


      Scanner kb = new Scanner(System.in); /* This sections questions the user as to which package they have bought. */
       System.out.println("Our internet packages include:");
        System.out.println("Package 1: For $9.95 per month, 10 hours of access are provided. Additional hours are $2.00 per hour.");
        System.out.println("Package 2: For $13.95 per month, 20 hours of access are provided. Additional hours are $1.00 per hour.");
        System.out.println("Package 3: For $19.95 per month, unlimited access is provided.");
        System.out.println("Please enter your package number:");
       internet=kb.nextInt();
        System.out.println("Please enter your total hours used:");
       hours=kb.nextDouble();   
        response = "Yes";

while(check.compareToIgnoreCase(response)== 0)
  {
      switch (internet)
      {
      case 1: 
              {  if (hours > 10)
                       price = (hours-10)*2 + 9.95; /* This adds the additional hours to the user's price at the current overage rate. */
                    else    
                        price = 9.95;
                }
              System.out.println("Your bill is $" +price);  
               break; 
      case 2: 
              {  if (hours > 20)
                       price = (hours-20) + 13.95;
                    else    
                        price = 13.95;
                }
              System.out.println("Your bill is $" +price);  
               break;        
     case 3:System.out.println("Your bill is $19.95");  
                break; 
      default: System.out.println("This package choice is invalid.");

      System.out.println("Would you like to compare your price with that of another package? Yes or No"); /* This gives the user the ability to stop the loop. */
      response=kb.nextLine();
      response=kb.nextLine();   
     }
    }

    System.out.println("Thank you for using us as your internet service provider.  Have a nice day!");
    }
    }

The loop goes infinite because the chances for the user to change the response to 'No' are inside the case statement. Therefore, when you break; out of the case statement, you immediately jump back into the 'while' check, and because response and check are both still 'Yes', it does it all again.

Just put those statements after the default: case in the case statement and it should work.

In other words, change:

   ...
   default: System.out.println("This package choice is invalid.");

   System.out.println("Would you like to compare your price with that of another package? 
       Yes or No"); /* This gives the user the ability to stop the loop. */
   response=kb.nextLine();
   response=kb.nextLine();   
  }
}

to:

     ...
     default: System.out.println("This package choice is invalid.");
   }
   System.out.println("Would you like to compare your price with that of another package? 
        Yes or No"); /* This gives the user the ability to stop the loop. */
   response=kb.nextLine();
   response=kb.nextLine();   
}

I'm not sure why you're doing response=kb.nextLine(); twice.

This should do the trick

import java.lang.*;
import java.util.Scanner;

public class Program
{
    /**
     * This is the main entry point for the application
     */
  public static void main(String[] args){
      double hours, price;
      int internet;
      String response, check="Yes";


        response = "Yes";

while(check.compareToIgnoreCase(response)== 0)
  {

      Scanner kb = new Scanner(System.in); /* This sections questions the user as to which package they have bought. */
       System.out.println("Our internet packages include:");
        System.out.println("Package 1: For $9.95 per month, 10 hours of access are provided. Additional hours are $2.00 per hour.");
        System.out.println("Package 2: For $13.95 per month, 20 hours of access are provided. Additional hours are $1.00 per hour.");
        System.out.println("Package 3: For $19.95 per month, unlimited access is provided.");
        System.out.println("Please enter your package number:");
       internet=kb.nextInt();
        System.out.println("Please enter your total hours used:");
       hours=kb.nextDouble();   
      switch (internet)
      {
      case 1: 
              {  if (hours > 10)
                       price = (hours-10)*2 + 9.95; /* This adds the additional hours to the user's price at the current overage rate. */
                    else    
                        price = 9.95;
                }
              System.out.println("Your bill is $" +price);  
               break; 
      case 2: 
              {  if (hours > 20)
                       price = (hours-20) + 13.95;
                    else    
                        price = 13.95;
                }
              System.out.println("Your bill is $" +price);  
               break;        
     case 3:System.out.println("Your bill is $19.95");  
                break; 
      default: System.out.println("This package choice is invalid.");
      }
      System.out.println("Would you like to compare your price with that of another package? Yes or No"); /* This gives the user the ability to stop the loop. */
      response=kb.nextLine();
      response=kb.nextLine();   

    }

    System.out.println("Thank you for using us as your internet service provider.  Have a nice day!");
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM