2014-10-10 3 views
0

Вот фрагмент моего кода для задания. Я не могу заставить логический флаг работать правильно. Когда я пытаюсь понять это, либо каждое имя получает скидку, либо никакое имя не получает скидку. Чтобы уточнить имя, Майк или Диана должны дать скидку.Не уверен, что я делаю неправильно здесь (Boolean flag)

String firstName;  //user's first name 
boolean discount = false; //flag, true if user is eligible for discount 
int inches;  //size of the pizza 
char crustType;  //code for type of crust 
String crust; //name of crust 
double cost = 12.99; //cost of the pizza 
final double TAX_RATE = .08; //sales tax rate 
double tax;  //amount of tax 
char choice;  //user's choice 
String input;  //user input 
String toppings = "Cheese "; //list of toppings 
int numberOfToppings = 0; //number of toppings 

//prompt user and get first name 
System.out.println("Welcome to Mike and Diane's Pizza"); 
System.out.print("Enter your first name: "); 
firstName = keyboard.nextLine(); 

if (firstName == "mike" || firstName == "diana" || firstName == "Mike" || firstName == "Diana" || 
firstName == "MIKE" || firstName == "DIANA") 
{ 
discount = true; 
} 

if (discount = true) 
{ 
cost -= 2.0; 
System.out.println ("You are eligible for a $2 discount."); 
+0

Что происходит не так? – PeterK

+0

В дополнение к сопоставлениям строк вы должны заменить 'if (discount = true)' на 'if (discount == true)'. Первый присваивает значение переменной 'discount', вторая - comparaison. – AntonH

+0

Сравнение строк @SotiriosDelimanolis не является единственной проблемой здесь –

ответ

3

Прежде всего, для того, чтобы сравнивать строки, вы не используете ==. Вам необходимо использовать метод String#equals() как per this SO question.

if (firstName == "mike" || firstName == "diana" || firstName == "Mike" || firstName == "Diana" || firstName == "MIKE" || firstName == "DIANA") 

будет заменен

if (firstName.equals("mike") || firstName.equals("diana") || firstName.equals("Mike") || firstName.equals("Diana") || firstName.equals("MIKE") || firstName.equals("DIANA")) 

Однако, как Gavin говорит в комментариях к первоначальному вопросу, было бы лучше, чтобы преобразовать всю строку в верхнем или нижнем регистре, чтобы сделать меньше Comparaisons. Или, в соответствии с комментарием Pshemo, используйте equalsIgnoreCase().

Кроме того, необходимо изменить:

if (discount = true) 

который присваивая значение true переменной discount, чтобы

if (discount == true) 

или, как в Pshemo «ы комментарий,

if (discount) 
+4

Я бы предложил избегать 'if (discount == true)' и вместо этого использовать 'if (discount)'. Таким образом, мы уверены, что не будем ошибаться, как один OP-код формы. – Pshemo

+3

Также 'equalsIgnoreCase' кажется более приятным, чем преобразование строк в верхний регистр. – Pshemo

+0

@Pshemo Оба действительных пункта. Я отредактировал свой ответ и зачислил вам изменения. – AntonH

0

Я проверил ваш код с моим затмением , Использование

if(firstName == "mike" || firstName == "diana" || firstName == "Mike" || firstName == "Diana" ||firstName == "MIKE" || firstName == "DIANA") 

проблема возникает из-за проблем при сравнении таких строк. Вам необходимо изменить его на

if (firstName.equals("mike")){ 
    discount = true; 
} 

Тогда имейте в виду, что дисконт является логической переменной. Поэтому вам не нужно сравнивать, верно это или нет.

if (discount) //if will check whether it's true or not if provided with a condition,discount is boolean, so need of comparison 

будет очень простым для булевого оператора.