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(...
Related
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();
}
I need to create a program that asks the user for a string value and returns a string value of "rock" "paper" or "scissors" if the input was "r" "p" or "s" If the user typed in something different.
package loopsGamesProject;
import java.util.Scanner;
public class LoopsGamesProject_RockPaperScissors {
public static void main(String[] args) {
String in="-";
Scanner input= new Scanner(System.in);
System.out.print("Enter 'r' for rock, and 'p' for paper,'s' for scissors:");
in=input.next();
if(in=="r"||in=="p"||in=="s"){
if(in=="r"){
in="Rock";
}
if(in=="p"){
in="Paper";
}
if(in=="s"){
in="Scissors";
}
while(in!="r"||in!="p"||in!="s") {
System.out.print("Enter 'r' for rock, and 'p' for paper,'s' for scissors:");
in=input.next();
if(in=="r"||in=="p"||in=="s"){
if(in=="r"){
in="Rock";
}
if(in=="p"){
in="Paper";
}
if(in=="s"){
in="Scissors";
}
}
}
input.close();
System.out.print(in);
}
}
}
The issue is, it will ask for a variable, but the terminate itself. I've tried adding an "out" variable. When I tried to do this using a do while loop, it kept asking for an input but never returned anything. I can't find the issue.
When you compare Strings in java, you need to use the .equals() method instead of the == function. This rule applies for all objects in java, String inclusive.
EG:
if (in.equals("r"))
//Rock!
You also need to replace the != and add a break statement to exit the loop. Something like this will do:
while (!(in.equals("r") || in.equals("p") || in.equals("s"))) {
System.out.print("Enter 'r' for rock, and 'p' for paper,'s' for scissors:");
in = input.next();
if (in.equals("r") || in.equals("p") || in.equals("s")) {
if (in.equals("r"))
in = "Rock";
else if (in.equals("p"))
in = "Paper";
else
in = "Scissors";
break;
}
}
EDIT: The above prompts twice. This will fix it:
public static void main(String[] args) {
String in = "";
Scanner input = new Scanner(System.in);
while (!(in.equals("Rock") || in.equals("Paper") || in.equals("Scissors"))) {
System.out.print("Enter 'r' for rock, and 'p' for paper,'s' for scissors:");
in = input.next();
if (in.equals("r") || in.equals("p") || in.equals("s")) {
if (in.equals("r")) {
in = "Rock";
}
if (in.equals("p")) {
in = "Paper";
}
if (in.equals("s")) {
in = "Scissors";
}
break;
}
}
input.close();
System.out.print(in);
}
As has been mentioned, you need to compare String equality using the String.equals(Object anObject) - alternatively you may use others methods (compareTo), but the == operator will not suffice (See here why).
On top of this, when you match the String you overwrite the String with the full word - in = 'r'; -> in = 'Rock';. But the condition you use to loop will only terminate when in is r, p or s specifically.
Further, you have some duplicated code there that could be reduced significantly. This is not a bug, but this can become very difficult to manage very quickly.
All things considered:
while (true) {
// Get the next input
in = input.next();
// Maps the word to the character
// If a word was not mapped, try again.
if (in.equals("r"))
in = "Rock";
else if (in.equals("p"))
in = "Paper";
else if (in.equals("s"))
in = "Scissors";
else
continue;
// Terminate the loop as you can infer a match was found.
break;
}
I have to write a program which checks a password.
If the password entered by the user is 'bolt', it will display 'The password is valid'
Otherwise it will display 'The password is invalid'.
The program is working only for the if part but not for the else.
That is when I input bolt, it displays the correct message.
But when I enter something other than bolt, it does not display 'The password is invalid'.
I have been told to test for all four characters that is to use char.At.
import java.util.Scanner;
public class MyClass {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Please enter your 4-character password:");
String password = input.next();
for (int i = 0; i < password.length(); i++) {
if (password.charAt(i) == 'B' || password.charAt(i) == 'b')
if (password.charAt(i + 1) == 'O'
|| password.charAt(i + 1) == 'o')
if (password.charAt(i + 2) == 'L'
|| password.charAt(i + 2) == 'l')
if (password.charAt(i + 3) == 'T'
|| password.charAt(i + 3) == 't') {
System.out.println("The password is valid");
}
else {
System.out.println("The password is invalid!");
}
}
}
It would be more readable to check using equalsIgnoreCase():
String password= input.next();
if(password.equalsIgnoreCase("bolt"){
System.out.println("The password is valid");
}
else{
System.out.println("The password is invalid!");
}
Why don't you just check for String equality directly?
String password= input.next();
if("bolt".equals(password))) {
System.out.println("Valid password");
} else {
System.out.println("InValid password");
}
Or use equalsIgnoreCase() if you'd also consider BOLT or Bolt valid.
If you need to implement this without equals you could use something like this:
if (password != null &&
password.length() == 4 &&
(password.charAt(0) == 'B' || password.charAt(0) == 'b') &&
...) {
System.out.println("Valid password");
} else {
System.out.println("InValid password");
}
For your updated question:
String password = input.next().toLowerCase();
String correctPassword = "bolt";
if (password.length() != correctPassword.length()) {
System.out.println("Not valid");
return;
}
for (int i = 0; i < correctPassword.length(); i++) {
if (password.charAt(i) != correctPassword.charAt(i)) {
System.out.println("Not valid");
return;
}
}
System.out.println("Valid");
In your code there are two problems,
1. Your for loop doesn't serve any purpose because you have checked the whole password in the first iteration itself. Your second iteration would cause IndexOutOfBoundsException.
You didnt see the invalid password message because, your else condition is applied only to the innermost if (which checks for the char "T" or "t").
So, if the provided password starts with "BOL" but last char is different like "BOLA" or "BOLB", then you would see the invalid message. But if the first three char fail, then it wont execute the else.
Hope this helps..
I'did use string.matches function which accepts regex as argument. (?i) helps to do a case-insensitive match.
if(string.matches("(?i)bolt"))
{
System.out.println("Valid password");
}
else {System.out.println("InValid password");}
What you are doing is not making much sense. You should probably use a character array an then check sequentially. Another small thing is that the else block is associated with the last if statement. Where it should be attached to the first if. This is one place where you need to use braces intelligently.
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.
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)) {
}
}