I need help with homework. I need to write a program that will use if else statements instead of the switch statement shown:
switch (day) {
case 1: case 2: case 3: case 4:
message = "regular workday";
break;
case 6: case 7:
message = "weekend";
break;
default:
message = "tgif";
}
I need to allow the user to key in the day of the week and then display the corresponding output. I also need to make sure it tests the input for a valid number (1-7). The user needs to be able to enter as many different days as they would like and to have a value (-1) end the program when entered.
I have this so far:
public class Question1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
int day;
do {
System.out.println("What day of the week do you want to enter? When finished, please enter \"-1\".");
day = input.nextInt(); //User input assigned to variable day
if (day == 1 || day == 2 || day == 3 || day == 4) {
System.out.println("Regular workday");
}
else if (day == 6 || day == 7) {
System.out.println("Weekend");
}
else if (day == 5) {
System.out.println("TGIF");
}
else {
System.out.println("Invalid Month. Please try again or enter \"-1\" when finished.");
}
} //end do
while (day != -1); //Loops when input meets the criteria
}
}
PROBLEM: The problem I am having is that when I enter -1 to end the program, it takes it as an else and prints the else statement when I simply just want the program to end.
Try replacing the line else { with else if (day != -1) {. This will trigger the branch for any number that didn't satisfy the previous conditions, or being -1
You can re-test your input while inside the else-block and return false and/or jump to quitProgram-part - before showing the error message.
Related
This question already has answers here:
Why do I get a "variable might not have been initialized" compiler error in my switch block?
(2 answers)
Closed 4 years ago.
I'm learning Java and I'm making simple programs to find the season that a month is in, based off some book examples. These two classes demonstrate two ways of testing a value: if/else if statement, and switch statement. The thing I'm confused with is the string that is used to hold the season. When I declare it as just String season; it works with the if statements. But with the switch statement, doing that produces a "The local variable season may not have been initialized" error.
public class IfElse {
public static void main(String args[]) {
int month = 5;
String season;
// isn't initialized, works fine
if(month == 12 || month == 1 || month == 2)
season = "Winter";
else if(month == 3 || month == 4 || month == 5)
season = "Spring";
else if(month == 6 || month == 7 || month == 8)
season = "Summer";
else
season = "Fall";
// this is okay
System.out.println("May is a " + season + " month.");
}
}
Not initializing season at the same time as declaration works fine for the above code, but the season variable in the last println() for the switch produces an error if it's declared the same way.
The following code doesn't work:
public class Switch {
public static void main(String args[]) {
int month = 5;
String season;
// HAS to be initialized, currently causes error
switch(month) {
case(12):
case(1):
case(2):
season = "Winter";
break;
case(3):
case(4):
case(5):
season = "Spring";
break;
case(6):
case(7):
case(8):
season = "Summer";
break;
case(9):
case(10):
case(11):
season = "Fall";
break;
default:
System.out.println("Invalid month");
break;
}
System.out.println("May is a " + season + " month");
} // produces an error if season isn't initialized to null or ""
}
What causes this? Is it the braces enclosing the switch statement, or a problem with the switch statement itself? How is initializing a string inside an if statement any different than initializing it inside a switch statement? I just can't seem to understand this.
Sorry if this is extremely obvious or if it seems like a dumb question.
That is because you did not specify what season has to be in the default case. What happens when month is not within 1-12? season will not be initialized.
If you are expecting strictly only 1-12 as month input, then you might want to consider throwing an Exception in default:
default:
throw new IllegalArgumentException("Invalid month");
In your first example, there is no path through the code that fails to assign a value to 'season'. In the second example, the default case does not assign a value, so the last print ("May is...") can be executed with an uninitialized value.
In your if/else code, there is an assurance that the variable season will get a value. That is, the else statement.
Your switch code does not have it. Look what will happen to the variable season if the given value for month is 13 -- it will not get a value, and will remain un-initialised.
You should use this
public class Switch {
public static void main(String args[]) {
int month = 5;
String season;
// HAS to be initialized, currently causes error
switch(month) {
case 12:
case 1:
case 2:
season = "Winter";
break;
case 3:
case 4:
case 5:
season = "Spring";
break;
case 6 :
case 7 :
case 8 :
season = "Summer";
break;
case 9 :
case 10 :
case 11 :
season = "Fall";
break;
default:
season = "Invalid";
break;
}
System.out.println("May is a " + season + " month");
} // produces an error if season isn't initialized to null or ""
}
I am working on a to do list and am currently stuck making a menu. The menu receives input from the user of the numbers 1-6 and carries out a specific task associated with that number(int). That's the perfect world scenario, so I need the menu to be able to take non integer values and not be bricked as well as display an error message to the user. I think I have created an efficient way of asking the user for integers without bricking the program but I cannot determine what my return statement should be in order to utilize the method in the main. I'll use it in a switch statement like this:
while (true) {
switch (getMenuOption()) {
case 1:
etc
This is the current method that I have for the getMenuOption. What return statement should I use, or is there a more efficient way to carry this out?
package project1_martinez_adriel;
import java.util.Scanner;
public class getMenuOption {
public static int getMenuOption() {
Scanner input = new Scanner(System.in);
System.out.println(" 1. Create a new item \n 2. Mark an item as in progress \n 3. Mark an item as completed \n 4. List all to do items \n 5. Remove completed items \n 6. Exit \n What would you like to do? \n ");
String value = input.nextLine();
int num;
try {
num = Integer.parseInt(value);
if (!(num == 1 || num == 2 || num == 3 || num == 4 || num == 5 || num == 6)) {
System.out.println("ERROR! Invalid choice! \nPlease enter a valid choice BETWEEN 1 & 6: ");
}else if (num == 6){
System.exit(0);
}
} catch (NumberFormatException e) {
System.out.println("ERROR! Please enter a valid INTEGER between 1 & 6.");
}
return //What do I put here!?
}
how about cleaning it up to be
if (num < 1 || num > 6) {
System.out.println("ERROR! Invalid choice!...");
}
then later
return num;
The code in your switch statement should process the options between 1 && 6 including 6 being System.exit (0);
I would even have the error messages in the switch default block
edit
num should also be initialized with a value, something like
int num = -1;
So after some clean up, frustration, & long hours I have come up with this, including the switch statements:
Scanner input = new Scanner(System.in);
boolean validInput = false;
do {
System.out.print("Enter an integer: ");
int num;
try {
num = input.nextInt();
switch (num) {
case 1:
case 2:
case 3:
case 4:
case 5:
case 6: // cascading case statement example
validInput = true;
break;
default:
System.out.println("ERROR! Please enter a valid choice BETWEEN 1 & 6 (inclusive): ");
num = input.nextInt();
break;
}
} catch (Exception e) {
/* input.next() to move the Scanner forward. */
System.out.println(input.next() + " was not valid input.");
System.out.println("ERROR! Please enter a valid INTEGER between 1 & 6.");
}
} while (!validInput);
input.close();
}
}
I'm writing a program where I am supposed to have the user input a date from the year 0 - 4000. I'm supposed to see if the date is valid, and if it was a leap year or not. I'm having problems in my code.
I'm getting an else without error on line 57.
I also am not sure how to how to say if the date is valid or not.
IE: this date is valid, is a leap year - or is not valid is not a leap year ...etc...
I'm still a beginner so I dont want the code written for me but I would like to know how to fix it! Thank you.
import java.util.*;
public class LegalDate //file name
{
public static void main (String [] args)
{
Scanner kb = new Scanner (System.in); //new scanner
//name the variables
int month, day, year;
int daysinMonth;
boolean month1, year1, day1;
boolean validDate;
boolean leapYear;
//ask the user for input
//I asked the MM/DD/YYYY in seperate lines to help me visually with the program
System.out.println("Please enter the month, day, and year in interger form: " );
kb.nextInt();
//now I'm checking to see if the month and years are valid
if (month <1 || month >12)
{ month1 = true;}
if (year <0 || year >4000)
{year1= true;}
//I'm using a switch here instead of an if-else statement, which can also be used
switch (month) {
case 1:
case 3:
case 5: //months with 31 days
case 7:
case 8:
case 10:
case 12:
numDays = 31;
break;
case 4:
case 6: //months with 30 days
case 9:
case 11:
numDays = 30;
break;
case 2:
if (((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0)) //formula for leapyear
numDays = 29;
{
system.out.println("is a leap year");
}
else
numDays = 28;
{
system.out.println("is not a leap year");
}
break;
default:
System.out.println("Invalid month.");
break;
if (month1 == true)
if (day1 == true)
if (year1 == true)
System.out.println ("date is valid ");
else
if (month1 == false)
System.out.println ("date is invalid");
else
if (day1 == false)
System.out.println ("date is invalid");
else
if (year1 == false)
System.out.println ("date is invalid");
}}
}
On line 57, you open a new code block but nothing is able to access it. I believe you meant to type:
else{
numDays = 28;
system.out.println("is not a leap year");
}
As a small tip, you can change this:
if (month1 == true)
if (day1 == true)
if (year1 == true)
System.out.println ("date is valid ");
to this:
if (month1 && day1 && year1)
System.out.println ("date is valid ");
Since the boolean comparison operators return true or false, you can tell that the condition just needs to be boolean. Since month1, day1, and year1 are all boolean values, you dont need to compare them to anything.
What the condition means, in the event you don't know, is if month1 and day1 and year1 are all true, then print date is valid
Why don't you try Java 8 date time API
It validates date and do much more for you
Like
try {
LocalDate date =LocalDate.of(2016, 12, 31);
if(date.isLeapYear())
System.out.println("Leap year");
else
System.out.println("Not leap year");
}
catch(DateTimeException e) {
System.out.println(e.getMessage());
}
You don't appear to be placing the code between your 'if' and 'else' statements in curly brackets, which means that the statement will only apply to the next line. For example:
if (a)
b = true
c = true
else
d = true
is read as
if (a) {
b = true
}
c = true
else {
d = true
}
Hopefully, you can see how the compiler wouldn't understand this, as an 'else' statement must occur directly after its associated 'if' block.
I would suggest adding some methods to simplify your code. For example:
public static boolean isLeapYear(int year) {
return (((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0));
}
Also, if you use boolean variables to store information, you can print it all neatly at the end. For example, you could instantiate a variable 'isValid' to true at the top of your code, set it to false if you calculate that the date is invalid, and use an if statement at the end to print your result.
I know you said you didn't want it written for you, but that's the easiest way to demonstrate the importance of methods. Hopefully you can see how this is more readable than your version?
import java.util.Scanner;
public class LegalDate {
static final int maxYear = 4000;
public static void main (String [] args) {
int month, day, year;
boolean leapYear, validDate = false;
Scanner kb = new Scanner (System.in);
System.out.println("Please enter the month, day, and year in interger form.");
System.out.print("Month: ");
month = kb.nextInt();
System.out.print("Day: ");
day = kb.nextInt();
System.out.print("Year: ");
year = kb.nextInt();
leapYear = isLeapYear(year);
validDate = isValidDate(month, day, year);
System.out.printf("%nThe date is %svalid and is %sa leap year.%n", validDate ? "" : "not ", leapYear ? "" : "not ");
kb.close();
}
public static int numDaysInMonth(int month, boolean isLeapYear) {
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 4:
case 6:
case 9:
case 11:
return 30;
case 2:
if (isLeapYear) {
return 29;
} else {
return 28;
}
default:
return 0;
}
}
public static boolean isLeapYear(int year) {
return (((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0));
}
public static boolean isValidDate(int month, int day, int year) {
return (month >= 1 && month <= 12) && (day >= 1 && day <= numDaysInMonth(month, isLeapYear(year))) && (year >= 0 && year <= maxYear);
}
}
If you have any questions I'll try my best to answer them!
The syntax of if-else statement on line 50 of your program is not correct.
It's a dangling else. Enclosing the body of if and else statement within braces should resolve this.
if (((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0))
{
numDays = 29;
system.out.println("is a leap year");
}
else
{
numDays = 28;
system.out.println("is not a leap year");
}
you can make use of IDE or give attention to compiler error message to resolve such errors.
I was here earlier before, and got pointed in the right direction. But I couldn't get the offered solution to work. It now mostly works, but i'm stuck on one part, and I'm not sure how to proceed. If anyone can point me to the right direction, i'll be grateful. I just need a hint, or pointers to something I'm not seeing.
I'm trying to add a random number of days, and determine what that adds up to. I know I have to have a counter that flips over after 7, but I've tried everything, and keep getting errors
import java.util.*;
public class pooped
{
static Scanner console = new Scanner(System.in);
public static void main(String[] args)
{
int day;
System.out.println(" Days of the week are numbered 1-7"+
"From Sunday to Saturday, enter a number now");
day = console.nextInt();
System.out.println(isWeek(day));
printday(day);
}
public static boolean isWeek(int day)
{
return day >= 0 && day <= 7;
}
static Scanner console = new Scanner(System.in);
public static void addDay()
{
int date;
System.out.println("Enter how many days you want to go forward.");
date = console.nextInt();
if (int date > 0)
{
int day = date + 1;
}
}
public static void printday(int day)
{
switch (day) {
case 1:
System.out.println("Sunday");
break;
case 2:
System.out.println("Monday");
break;
case 3:
System.out.println("Tuesday");
break;
case 4:
System.out.println("Wednesday");
break;
case 5:
System.out.println("Thursday");
break;
case 6:
System.out.println("Friday");
break;
case 7:
System.out.println("Saturday");
default:
break;
}
}
}
If you need
a counter that flips over after 7
consider using day = day % 7; in your main method, which gives you the modulo operation.
When you say "I have to have a counter that flips over after 7", do you mean that 7 should roll back to 0, 8 to 1, etc?
If that's the case, you need to look at the modulus operator (%)
You inWeek function looks incorrect. If your day is 0 based, it should be:
public static boolean isWeek(int day)
{
return day >= 0 && day < 7;
}
Otherwise you will have 8 days.
My program contains a few options that the user can select via the input of a number which allows them to complete a specific task. Currently, my code is set up with if and else if loops to complete task if a certain number of input. However, at the minute the program terminates after one task. I want the user to be able to input another number to complete another task. I have tried surrounding the code with a while loop and an exit option to allow the user to escape the loop and end the program, but this is not working and results in a "java.util.NoSuchElementException". The program works fine without the while loop.
This is an example of the current code which hopefully conveys what I mean:
System.out.println("Enter one of the following commands:");
System.out.println("1 - something..");
System.out.println("2 - something else..");
System.out.println("3 - exit");
Scanner scanchoice = new Scanner(System.in);
System.out.println();
System.out.println("Enter \"1\", \"2\" or \"3\"");
int choiceentry = scanchoice.nextInt();
while (choiceentry != 3) {
if (choiceentry < 1 || choiceentry > 3) {
System.out.println("Enter \"1\", \"2\", \"3\" or \"4\"");
choiceentry = scanchoice.nextInt();
}
else if(choiceentry == 1) {
// ..do something
}
else if(choiceentry == 2) {
//..something else
}
else if(choiceentry == 3) {
//...exit program
}
}
So I want to get into this loop, and only exit to terminate the program. I'm hoping that the while loop would take the user back to a menu, allowing you to select another option, however this is not working. What is wrong with this code? And how can I implement this idea?
Thanks in advance!
Use Scanner#hasNextInt() before you call Scanner.nextInt() to get rid of the NoSuchElementException
if(scanchoice.hasNextInt())
choiceentry = scanchoice.nextInt();
hasNextInt() returns true only if the next token is a valid int
You can do like this
//set choiceentry to -1, this will make it to enter while loop
int choiceentry = -1
while(choiceentry < 1 || choiceentry > 3){
System.out.println("Enter \"1\", \"2\", \"3\" or \"4\"");
if(scanchoice.hasNextInt())
choiceentry = scanchoice.nextInt();
}
switch(choiceentry){
case 1:
//do logic
break;
case 2:
//do logic
break;
case 3:
//do logic
break;
}
I have changed it to use switch statements, since they come handy in getting input data
You are only asking the user to pick another menu item if choice is < 1 or > 3
you have to set this code in an else statement`:
while (choiceentry != 3) {
else if(choiceentry == 1) {
// ..do something
}
else if(choiceentry == 2) {
//..something else
}
else if(choiceentry == 3) {
//...exit program
}
else{
System.out.println("Enter \"1\", \"2\", \"3\" or \"4\"");
choiceentry = scanchoice.nextInt();
}
}
If you want your program to continue prompting the user to select a task you'll need to move that prompt as well as your nextInt() call to somewhere inside your loop yet outside of an if statement so that it will always be invoked on each iteration.
As Mr Phi suggested in the comments, a switch statement would be a better alternative to your current if-else structure. It'll make your code cleaner to read and a default case is pretty nice for catching unexpected values.
I'd also add that a do-while might be more suitable for this task. This way you won't need to code your prompt for a choice twice.
int choiceentry;
do {
System.out.println("Enter \"1\", \"2\" or \"3\"");
choiceentry = scanchoice.nextInt();
switch (choiceentry)
{
case 1:
// do something
break;
case 2:
// ..something else
break;
case 3:
// .. exit program
break;
default:
System.out.println("Choice must be a value between 1 and 3.");
}
} while (choiceentry != 3);