I have a static function which gets and returns a char input.
It will then check the input using a while loop.
After my main method gets the input, the result will display accordingly to the user input.
Below is my method:
public class test
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
char choice = getInput(sc);
String result;
switch (choice)
{
case ('a'): result = "u choose A";
break;
}
}
private static char getInput(Scanner keyboard)
{
Scanner sc = new Scanner(System.in);
System.out.println("a, b, c, d, e, q: ");
char choice = sc.nextLine().trim().toLowerCase().charAt(0);
while (choice != 'a' || choice != 'b' || choice != 'c' || choice != 'd' || choice != 'e' || choice != 'q')
{
System.out.println("You have entered an invalid entry.");
System.out.println("a, b, c, d, e, q: ");
choice = sc.nextLine().trim().toLowerCase().charAt(0);
}
return choice;
}
}
However, I am getting the result of invalid input even though I entered the character 'a'.
May I know which part have I gone wrong?
This condition:
while (choice != 'a' || choice != 'b' || choice != 'c' || choice != 'd' || choice != 'e' || choice != 'q')
will always return true if your choice is not a or is not b or is not c, etc. Change those || operators to && operators and you should be good to go.
Related
This is quite a beginner question but I'm wondering why my do...while loop is not closing.
The program is supposed to loop while the user input is not 'C', 'c', 'F', or 'f'.
It seems to close when just one boolean expression in the while section is valid but not if multiple are valid.
public class CelsToFaren
{
public static void main(String[] args)
{
// scanner setup
Scanner sc = new Scanner(System.in);
// Variable declarations
int celsius;
int answerC;
int farenheit;
int answerF;
char userLetter;
do
{
// initial menu options
System.out.println("Which temperature would you like to convert from? ");
System.out.println(" >(C)elsius ");
System.out.println(" >(F)arenheit ");
// user input of C, c, F, or f to select option
userLetter = sc.next().charAt(0);
// if user input C or c
if ((userLetter == 'C' || userLetter == 'c'))
{
System.out.print("Please enter the temperature: ");
celsius = sc.nextInt();
answerC = ((celsius*9/5)+32);
System.out.println("The answer is: " + answerC + " Farenheit ");
}
else
{
// if user input F or f
if ((userLetter == 'F' || userLetter == 'f'))
{
System.out.print("Please enter the temperature: ");
farenheit = sc.nextInt();
answerF = ((farenheit-32)*5/9);
System.out.println("The answer is: " + answerF + " Celsius ");
}
else
{
// if user input not F, f, C, or c
if ((userLetter != 'F' || userLetter != 'f' || userLetter != 'C' || userLetter != 'c'));
{
System.out.println("Please enter a valid option");
}
}
}
} while ((userLetter != 'c') || (userLetter != 'C') || (userLetter != 'f') || (userLetter != 'F'));
}
}
You need to change the exit logic.
In your case 1 | 0 | 0 = true so the loop continues.
You need to change it to:
while ((userLetter != 'c') && (userLetter != 'C') && (userLetter != 'f') && (userLetter != 'F'));
Your condition is wrong. Lets assume you want to break loop in if statement. It would look like
if(userLetter == 'c' || userLetter == 'C' || userLetter == 'f' || userLetter == 'F')
Now let's apply negation to get a condition under which you do not need to exit the loop
if(!(userLetter == 'c' || userLetter == 'C' || userLetter == 'f' || userLetter == 'F'))
this condition is simillar to
if(userLetter != 'c' && userLetter != 'C' && userLetter != 'f' && userLetter != 'F')
I want my program to quit when I input "Q" or "q". However, the loop never finishes. Can you help me figure it out, please?
public static void main(String[] args) {
Scanner input= new Scanner(System.in);
char str ;
do {
System.out.println("Choose one of the following option : ");
System.out.println("U or u - to convert SAR amount to USD");
System.out.println("E or e - to convert SAR amount to EURO");
System.out.println("Q or q - to quit");
str = input.next().charAt(0);
if (str == 'U' || str == 'u' ) {
}
else if (str == 'E' || str == 'e' ){
}
} while( str != 'Q' || str != 'q' );
}
str != 'Q' || str != 'q' is always true. Any given string is not equal to one or the other of these (or both). You want && instead of ||.
A nice structure to use would be the structure similar to the one recommended for getopt_long() in C but for Java obviously. Can read the man page here https://linux.die.net/man/3/getopt_long
while(true)
{
str = input.next().charAt(0);
if(str.toUpperString.equals('Q'))
{
break;
}
// In general if you want upper and lower case to do the same thing
//use toUpperString
switch (str) {
case 'U':
case 'u':
// Do something
break;
case 'E':
case 'e':
// Do something
break;
default:
System.out.println("Wrong input");
break;
}
}
Another good solution to this problem, if you don't want to use the switch statement, is the loop-and-a-half.
https://codehs.gitbooks.io/introcs/content/Basic-JavaScript-and-Graphics/loop-and-a-half.html
The structure goes like this:
while(true)
{
String token = Character.toUpperCase( input.next().charAt(0) );
if(token.equals('A'))
{
// Do something
}
else if(token.equals('B'))
{
// Do something
}
else if(token.equals('Q'))
{
break;
}
else
{
System.out.println("Invalid Option");
}
}
If you want to stop the program when you write Q or q. you can convert the input to any of the lower or uppercase.
str.toUpperCase();
if (str == 'U'){
}
else if (str == 'E'){
}
} while( str != 'Q');
}
OR
change the condition for checking Q or q.
while( str != 'Q' && str != 'q' );
for the above code snippet, the while loop will execute if str is not Q or q.
public static void main(String [] args) {
Scanner input= new Scanner(System.in);
char str ;
do{
System.out.println("Choose one of the following option : ");
System.out.println("U or u - to convert SAR amount to USD");
System.out.println("E or e - to convert SAR amount to EURO");
System.out.println("Q or q - to quit");
str = input.next().charAt(0);
if (str == 'U' || str == 'u'){}
else if (str == 'E' || str == 'e'){}
} while(str != 'Q' && str != 'q'); // change the condition from || to &&
// Also close the input stream to avoided memery leakage
input.close();
}
What I want is no matter what the user inputs, if the first letter of their input is either a 'y' or 'n' regardless of case, it will print "game start".
I've tried equalsIgnoreCase() with the "letter" variable but it gives the error: char cannot be dereferenced. Any recommendations will be really appreciated on this! Thanks!
Scanner input = new Scanner(System.in);
System.out.println("Do you want to continue?");
String wesker = input.nextLine();
char letter = wesker.charAt(0);
if(letter == 'y' || letter == 'p'){
System.out.println("Game start");
} else {
System.out.println("Game over");
}
Try use Character#toLowercase():
if (Character.toLowerCase(letter) == 'y' || Character.toLowerCase(letter) == 'n') {
or
if (Character.toUpperCase(letter) == 'Y' || Character.toUpperCase(letter) == 'N') {
or simply
if( letter == 'y' || letter == 'Y' || letter == 'n' || letter == 'N' )
Just check against both cases:
if( letter == 'y' || letter == 'Y' || letter == 'p' || letter == 'P' )
equalsIgnoreCase can be used only by Strings. For your case, if you want to use that method, you can do this:
Scanner input = new Scanner(System.in);
String wesker = input.nextLine();
String letter = wesker.substring(0,1);
if(letter.equalsIgnoreCase("y") || letter.equalsIgnoreCase("n")){
System.out.println("Game start");
} else {
System.out.println("Game over");
}
You could pre-build a set of acceptable characters.
Set<Character> yes = new HashSet<>(Arrays.asList('y','Y','p','P'));
public void test() {
char letter = 'c';
if ( yes.contains(letter)) {
}
}
How do you restrict the letter being inputted;
for example I have the code
System.out.println("Enter a letter(A,B,C or D):");
letter = input.next().charAt(0);
How would I set up an if statement to say if letter does not equal "A" "B" "C" or "D", it will say please input correct letter?
thanks
I would recommend you to use a while loop, so it loops until you get a valid input:
Scanner input = new Scanner(System.in);
System.out.println("Enter a letter(A,B,C or D):");
char letter = input.next().charAt(0);
while (letter != 'A' && letter != 'B' && letter != 'C' && letter != 'D') {
System.out.println("Enter a valid letter(A,B,C or D):");
letter = input.next().charAt(0);
}
System.out.println(letter);
Output:
Enter a letter(A,B,C or D):
E
Enter a valid letter(A,B,C or D):
A
Valid: A
But if you just want an if conditional, use the same condition of the while above:
if (letter != 'A' && letter != 'B' && letter != 'C' && letter != 'D') {
...
}
I am trying to create a menu in the console and have the user select an option, for some reason when I run the application it goes straight to the else, bypassing options a-d.
import java.util.Scanner;
public class UserChoice {
public static void main(String[] args)
{
boolean status = true;
while (status == true)
{
System.out.println("");
System.out.println("MENU");
System.out.println("");
System.out.println("A : String Functions");
System.out.println("B : Simple Arithmetic Functions");
System.out.println("C : Temperature Conversion");
System.out.println("D : Sequences");
System.out.println("E : Exit Application");
System.out.println("");
System.out.println("Please make a selection.");
Scanner keyboard = new Scanner(System.in);
String choice =null;
choice = keyboard.nextLine();
if (choice == "a" || choice == "A")
{
StringFunctions();
}
else if (choice == "b" || choice == "B")
{
ArithmeticFunctions();
}
else if (choice == "c" || choice == "C")
{
TemperatureConversion();
}
else if (choice == "d" || choice == "D")
{
Sequences();
}
else if (choice == "e" || choice == "E")
{
System.exit(0);
}
else
{
System.out.println("You have entered an invalid selection, please choose again.");
}
}
}
All String/Object comparisons should use equals() method instead of == (except String literals)
if (choice.equals("a") || choice .equals( "A")){....}
Apply same change to other else/if blocks also.
== compares reference equality. equals() method checks for content equality.
You may want to make sure that at least one character is entered:
String choiceString ="";
while(choiceString.length() <1){
choiceString = keyboard.nextLine();
}
Once done, you may want to get the first character from the string as:
char choice = choiceString.charAt(0);
now since your choice is char, you may write your conditions using single quote as below:
if (choice == 'a' || choice == 'A'){
.......
......
Also if you want, you want to change the case of String entered to upper or lower case, get the char and then use simpler conditions as below:
char choice = choiceString.toUpperCase().charAt(0);
if (choice == 'A'){
.....
}else if(...