2014-05-14 4 views
-1

Я довольно новичок в массивах и методах, и я видел эту ошибку, повторяющуюся через несколько программ: error '[' expected.Array in Method Header: error ']' expected (Java)

В каждом случае кажется, что он исправляет себя, поскольку я настраиваю что-то еще, но в этом конкретном случае я полностью в тупике.

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

Возможно, что я не передаю массивы правильно между методами, так как я немного мутный в этом процессе. По моему мнению, для отправки/получения (т. Е. Импорта/экспорта) массива или другой переменной между методами я должен объявить эту переменную/массив в параметрах заголовка метода.

import java.util.Scanner; 

public class H7pseudo 
{ 

    public static void main(String[] args) 
    { 
    //call getAnswerkey method 
    getAnswerkey(answerkey[i]); 

    //call getAnswers method 
    getAnswers(answers[i]); 

    //call passed method? necessary or no? 
    boolean passed = passed(answerkey[i], answers[i], qMissed[i], points); 

    //Print results of grading 
    if (passed) 
    { 
     System.out.println("Congratulations! You passed."); 
    } 
    else 
    { 
    System.out.println("Try again, sucka. You FAILED."); 
    } 

    //call totalPoints 
    totalIncorrect(points); 

    //call questionsMissed 
    questionsMissed(qMissed[i]); 
    } 

    //get answer key (create answerkey array & export) 
    public static void getAnswerkey(answerkey[i]) 
    { 
    //create answerkey array here 
    char[] answerkey; 

    //determine number of questions (indices) 
    answerkey = new char[20]; 

    //input values (correct answers) for each index 
    //for our purposes today, the answer is always 'c'. 
    for (int i = 0; i <=20; i++) 
    { 
     answerkey[i] = 'c'; 
    } 
    } 

    //get student answers (create answers array & export) 
    public static void getAnswers(answers[i]) 
    { 
    //initialize scanner for user input 
    Scanner scan = new Scanner(System.in); 

    //create answer array here 
    char[] answers; 

    //determine number of questions (indices) 
    answers = new char[20]; 

    //prompt for user input as values of each index 
    for (int i = 0; i <= 20; i++) { 
     answers[i] = scan.nextChar(); 
    } 
    } 

    //grade student answers (import & compare index values of arrays:answers&answerkey 
    //create & export qMissed array 
    public static boolean passed(answerkey[i], answers[i], qMissed[i], points) 
    { 
    int points = 0; 

    //create new array: qMissed 
    boolean[] qMissed; 

    //determine number of questions to be graded 
    qMissed = new boolean[20]; 

    //initialize values for array 
    for (int i = 0; i <= 20; i++) { 
     qMissed[i] = false; 
    } 

    //cycle through indices of answerkey[i] & answers[i]; 
    for (int i = 0; i =< 20; i++) 
    { 
     if (answers[i] == answerkey[i]) 
     { 
     correct = true; 
     points = points+1; 
     qMissed[i] = true; 
     } 
     else { 
     qMissed[i] = false; 
     } 
    } 

    //evaluate whether or not the student passed (15+ correct answers) 
    if (points >= 15) 
    { 
     passed = true; 
    } 
    else 
    { 
     passed = false; 
    } 
    return passed; 
    } 

    public static void totalIncorrect(points) 
    { 
    int missed = 20 - points; 
    System.out.println("You missed " + missed + " questions."); 
    } 


    public static void questionsMissed(qMissed[i]) 
    { 
    // for each index of the array qMissed... 
    for (int i = 0; i < qMissed.length; i++) 
    { 
     //...print correct and false answers. 
     system.out.println(i + ": " + qMissed[i] + "\n"); 
    } 
    } 


} 
+0

Что вы думаете? 'Public static void getAnswerkey (answerkey [i])' должен делать? –

+0

Возможно, вы захотите рассмотреть циклы для инициализации вместо тех массивных блоков инициализации ... – awksp

+0

@Sotirios Delimanolis: Идея заключается в том, что getAnswerkey устанавливает массив, который содержит правильное значение (ответ) для каждого индекса (вопроса). Я поставил его в методе, чтобы все было организовано и аккуратно. Кроме того, по моей неопытности я немного склонен вкладывать массив, который хочу разделить между методами в «public main» ... – corvidia

ответ

0

Вы не можете определить размер массива в сигнатуре метода в Java.

0
public static void getAnswerkey(answerkey[i]) 

Вы не можете ничего внутри [] положить в объявлении метода. Кроме того, вы должны упомянуть тип:

public static void getAnswerKey(char[] answerkey) 

Это не единственная причина, почему ваш код не будет работать, как задумано, но я оставляю остальное как часть упражнения.

0

Посмотрите на ваших определений методов:

public static void questionsMissed(qMissed[i]) 

Это неправильно. Вы должны определить тип переменной и не должны содержать [i] как элемент массива. Это должно быть что-то вроде этого:

public static void questionsMissed(int qMissed) 

Или, если вы хотите передать массив, записать это так:

public static void questionsMissed(int[] qMissed) 

Помимо этого, есть и другие несколько ошибок в коде :

getAnswerkey(answerkey[i]); //answerkey is not defined 

getAnswers(answers[i]); //answers is not defined 

Было бы лучше сначала начать чтение учебника по Java.

+0

@AntonH нет, потому что он использует единственный элемент массива, а не массив. –

+1

@AntonH ok, я прочитал другие методы и запутался. Фактически, у IMO нет ответа, который может быть написан менее чем за 5 минут, который может исправить все проблемы в коде OP и дать ему учебник о том, как программировать на Java. –

0

Я хочу голосовать на ответ Луиджи, но у меня не хватает репутации сделать это :)

Congrats, cordivia, на начало работы с Java!

Вот как объявляется массив:

type[] arrayName = new type[numberOfElements] 

Например, вы сделали это прямо в вашем определении метода для getAnswerkey():

char[] answerkey; 
answerkey = new char[20]; 

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

getAnswerkey() { 

... Но это еще не все. Если вы хотите, чтобы получил что-то из метода, он должен иметь тип возврата. A тип возврата - это то, что вы собираетесь выбраться из метода, когда этот метод совершает магию. Например, если вы хотите получить ИНТ массив из метода вы могли бы сделать что-то вроде этого:

public static int getTheInteger() { 

Поскольку вы хотите массив символов от метода, вы хотите сделать что-то вроде этого:

public static char[] getAnswerkey() { 

Так вот как вы получите способ дать вам что-то обратно. Если ничего не хочу назад, вы положили аннулируются:

public static void noMarshmallows() { 

Теперь, когда вы используете метод, ты собираешься нужно что-то делать с тем, что она дает вам, или он сделал всю эту работу за ничего. Так что вам нужно, чтобы сохранить значение возврата в переменном при вызова массив (вызова методов является то, что вы делали в главного). Вы знаете, как хранить что-то в переменной . Вы используете оператор «=»:

int myVeryFavoriteNumber; 
myVeryFavoriteNumber = 5; 

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

int[] myFavs; 
myFavs = getMyFavoriteNumbers(); 

То же самое с символов:

char[] answerKey; 
answerKey = getAnswerKey(); 

вуаля! Ваш ключ ответ теперь прямо под открытым небом для остальной части главного увидеть :)

Теперь, если вы хотите, чтобы положить что-то в метод и он что-то делать с тем, что вы положили, вы определите параметр . Вы знаете, как это работает. Это как объявление переменной, и это именно то, что она есть. Параметры идут в круглых скобках, и только метод с использованием параметра видит это имя переменной (это local). Что-то вроде этого:

public static void plusOneToAll (int[] numbers) { 
    for (int i = 0; i < numbers.length; i++) { 
     numbers[i] = numbers[i] + 1; 
    } 
} 

Примечание ИНТ [] Номера в скобках. Код передается в int [] или целочисленный массив. номера - это просто имя параметра.Он функционирует точно так же, как переменная, но объявляется локально (внутри круглых скобок) и использует локально (внутри метода). Итак, если вы хотите, чтобы сравнить ответы из двух массивов и возвращает количество совпадений (например, общий балл, например), вы могли бы сделать что-то вроде этого:

public static int getTotalScore (char[] correctAnswers, char[] userAnswers) { 

    int totalScore = 0; 

    for (int i = 0; i < correctAnswers.length; i++) { 
     if (userAnswers[i] == correctAnswers[i]) { 
      totalScore = totalScore + 1; 
     } 
    } 

    return totalScore; 
} 

Обратите внимание на тип возврата: INT (написанное до имени метода). Внутри массив Я использую переменную totalScore, чтобы отслеживать количество совпадений ответов. Метод принимает два массива символов снаружи и использует их внутри. И наконец, I возвращение a int: totalScore. Это пинает значение totalScore обратно к тому, что называется (main).

Если бы я мог добавить последнее, что угодно: сделайте себе одолжение и возьмите копию Head First Java. Трудно найти хороший учебник онлайн, а учебники по Java просто скучны. Серия Head First похожа на раскраски для взрослых.

Удачи!

+0

Большое спасибо за исчерпывающий ответ. Это отличное объяснение1. Теперь я уничтожил проблему до одной ошибки! Если я могу запросить ваш совет, я не уверен, что лучше всего подходит для SO: следует ли обновлять код в этой теме? Или опубликовать его в новом потоке? Или не отправляйте одну и ту же программу дважды (потому что это плохие манеры или просто хромые)? Пожалуйста, будьте откровенны. Еще раз спасибо! – corvidia

+0

Я довольно новичок в переполнении стека, поэтому я не уверен, что такое лучшая практика. Тем не менее, я знаю это: это хороший этикет в Stack Overflow, чтобы сфокусировать вопрос на одной проблеме, поэтому, если ваша последняя ошибка не была отвечена этой нитью, вероятно, лучше всего открыть на ней новый поток. – chacewells