2014-10-17 2 views
0

Я искал в Интернете решения этой проблемы часами, но не могу ее найти. Я новичок в Java, поэтому я не понимаю многих ошибок, и поэтому я сам не смог исправить это.Проблемы с назначением переменной для возврата функции

В любом случае, я пытаюсь присвоить значение переменной, а затем добавить значение int из переменной в другую. При компиляции я получаю ошибки: «это не утверждение», и ошибка, которую я пропущу точку с запятой, которая, как я подозреваю, будет очищена, если я исправлю инструкцию.

Здесь ошибка, только в случае, если вам это нужно:

hw8_ex2_jm2rv.java:61: error: ';' expected 
     int sumOfGames += value; 
        ^
hw8_ex2_jm2rv.java:61: error: not a statement 
     int sumOfGames += value; 
         ^
2 errors 

Это мой код:

public static int oneGame() 
{ 
    int trueValue = 1; 
    int falseValue = 0; 
    int total = sumTwoDice(); 
    if((total == 7) || (total == 11)) 
    { 
     //System.out.println(trueValue + " " + total); 
     return(trueValue); 
    } 
    else if((total == 2) || (total == 3) || (total == 12)) 
    { 
     //System.out.println(falseValue + " " + total); 
     return(falseValue); 
    } 
    else 
    { 
     int total2 = 0; 
     while((total2 != 7) || (total2 != total)) 
     { 
      total2 = sumTwoDice(); 
      if(total2 == total) 
      { 
       //System.out.println(trueValue + " " + total + " " + total2); 
       return(trueValue); 

      } 
      else if(total2 == 7) 
      { 
       //System.out.println(falseValue + " " + total + " " + total2); 
       return(falseValue); 

      } 
     } 
    } 

} 

Вы, вероятно, интересно о методе sumTwoDice, все это делает возвращать число от 2 до 12, и я уже знаю, что он работает. Если вы хотите его увидеть, я тоже могу опубликовать его, просто спросите.

Функция oneGame просто имитирует игру из крэпса и возвращает целочисленное значение 1 или 0. Если 1 является выигрышем и 0 является потерей.

//this method runs a simulation of n values and returns the avg. 
public static double monteCarloSim() 
{ 
    int trueValue = 1; 
    int falseValue = 0; 
    int sumOfGames = 0; 
    int n = 2; 
    for (int i = 0; i <= n; i++) 
    { 
     int value = oneGame(); 
     int sumOfGames += value; 

    } 
    double avg = sumOfGames/n; 
    return(avg); 
} 

В настоящее время у меня только небольшое количество n, так что с ним проще справляться и быстрее компилировать.

Мой главный вопрос: что делает этот оператор недействительным и что я могу сделать, исправить его, но также, поскольку многие потоки не покрывают это при переполнении стека, что делает a заявление недействительным вообще. Надеюсь, это поможет мне и другим новичкам, которые не понимают эту ошибку.

Заранее благодарим за помощь и знания!

+0

Wow! Не могу поверить, что я пропустил это, спасибо за вашу помощь! – jm2rv

ответ

0

Вы должны понимать разницу между декларацией и присваиванием. Декларация: int sumOfGames;, или вы также можете объявить и назначить, как вы делаете: int sumOfGames = 0;. Но вы не можете и не должны объявлять переменную более одного раза. Поэтому в вашем цикле вы не должны использовать int. Это будет выглядеть следующим образом:

for (int i = 0; i <= n; i++) 
{ 
    value = oneGame(); 
    sumOfGames += value; 

} 

Помните, что вам нужно объявить переменной первой, а затем назначить это один или несколько раз. Так что в вашем случае весь метод выглядит следующим образом:

public static double monteCarloSim() 
{ 
    /* declaration of variables */ 
    int trueValue = 1; 
    int falseValue = 0; 
    int sumOfGames = 0; 
    int n = 2; 
    int value; //this is what you have been missing 
    for (int i = 0; i <= n; i++) 
    { 
     value = oneGame(); 
     sumOfGames += value; 
    } 
    double avg = sumOfGames/n; 
    return(avg); 
} 

Кроме того, ваш цикл может быть сокращен, не используя дополнительную переменную:

public static double monteCarloSim() 
{ 
    /* declaration of variables */ 
    int trueValue = 1; 
    int falseValue = 0; 
    int sumOfGames = 0; 
    int n = 2; 
    for (int i = 0; i <= n; i++) 
    { 
     sumOfGames += oneGame(); 
    } 
    double avg = sumOfGames/n; 
    return(avg); 
} 
0

Просто удалите int часть

int sumOfGames += value; 

Так это становится

sumOfGames += value; 

Вы не можете использовать сложный оператор присваивания в объявлении переменной - вся точка сложного оператора присваивания состоит в том, что он использует предыдущее значение.Даже если вы могли бы сделать это, он столкнулся бы с предыдущим объявлением sumOfGames тем же методом.

Что касается стиля, стоит отметить, что вы используете больше кронштейнов, чем вам нужно - иногда это может быть полезно, но может также повредить его. Например, вместо:

if((total == 7) || (total == 11)) 
{ 
    //System.out.println(trueValue + " " + total); 
    return(trueValue); 
} 

Я хотел бы написать:

if (total == 7 || total == 11) 
{ 
    //System.out.println(trueValue + " " + total); 
    return trueValue; 
} 

Как за то, что делает заявление недействительным в целом - это, если он нарушает правила Java Language Specification в некотором роде. Существует множество различных способов, которые могут произойти, начиная от лексических и синтаксических ошибок (вещи, которые просто не имеют никакого смысла, например x..y в выражении) для синтаксически действительных, но семантически недействительных (например, попытки вызвать метод который не существует или пытается вызвать метод, который существует , но там, где вызов неоднозначен из-за допустимости нескольких перегрузок, но никто не перегружается лучше других).

1

Объявите переменную сумму вне цикла:

int sumOfGames = 0; 

приращение значения внутри цикла:

int sumOfGames = 0; 
for (int i = 0; i <= n; i++) 
{ 
    int value = oneGame(); 
    sumOfGames += value; 
} 
Смежные вопросы