получение среднего балла учащихся по тестам

Прочтите информацию для ВСЕХ учащихся, прежде чем выполнять какие-либо расчеты или отображать какие-либо выходные данные. Убедитесь, что 3 балла за экзамен находятся в диапазоне от 0 до 50 баллов, а финальный балл находится в диапазоне от 0 до 100 на момент ввода. Объявлены минимальные и максимальные значения постоянными, чтобы их можно было легко обновлять по мере необходимости. Если он недействителен, отобразите сообщение об ошибке и позвольте пользователю повторно ввести этот неверный счет. После того, как вся информация об учащемся будет прочитана, отобразите имя каждого учащегося в формате ФАМИЛИЯ, ИМЯ (все в верхнем регистре), процент экзаменов учащегося (общее количество всех экзаменов плюс окончательный/общий возможный) с точностью до 1 десятичного знака и итоговую оценку учащегося на основе следующие проценты:

90–100 А, 80–89,9 В, 70–79,9 С, 60–60,9 Д, ниже 60 F

Как должен выглядеть вывод

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

import java.util.*;
import java.text.*;


public class Proj4 {
public static void main(String[] args){
Scanner s= new Scanner(System.in);
String input;
String again = "y";

int [] exams = new int[4];
int student = 1;

do
{

    String [] names = new String[student];
        System.out.print("PLease enter the name of student" + student );
        names[student-1] = s.nextLine();
        for ( int i = 1; i < exams.length; i++){
            if(i==4){
                System.out.print("Please enter score for Final Exam: ");
            }

            System.out.print("Please enter score for Exam" + i);
            exams[i] = s.nextInt(); 

                if((exams[1]<0||exams[1]>50)||(exams[2]<0||exams[2]>50)||(exams[3]<0||exams[3]>50)){
                    System.out.println("Invalid enter 0-50 only...");
                    System.out.print("Please re-enter score: ");
                    exams[i] = s.nextInt();
                }
                else if(exams[4]<0||exams[4]>100){
                    System.out.println("Invalid enter 0-100 only...");
                    System.out.print("Please re-enter score: ");
                    exams[i] = s.nextInt();
                }
        }
        System.out.println("do you wish to enter another?");
        again = s.nextLine();
    student++;
}while (again.equalsIgnoreCase ("y"));
}
}

Это сообщение об ошибке:

Исключение в потоке «основной» java.lang.ArrayIndexOutOfBoundsException: 4 в Proj4.main(Proj4.java:32)

Но это сбивает с толку, потому что строка 32 - это просто }, так что я действительно не знаю точно, что это значит, я знаю, что мне, вероятно, нужно уменьшить длину одного из входов для массивов, но я не уверен, что и есть ли вообще более неправильно, чем это.

РЕДАКТИРОВАТЬ:

Извините, вот мой вопрос. Не могли бы вы, ребята, помочь мне разобраться в проблеме и / или сказать мне, если или что я делаю неправильно, чтобы получить требуемый от меня вывод?


person Joseph Mindrup    schedule 01.03.2013    source источник


Ответы (2)


Массив exams имеет только 4 элемента, но вы пытаетесь получить доступ к 5-му элементу с индексом 4 здесь exams[4]<0. Первый индекс массива равен 0 (не 1).

person Alex    schedule 01.03.2013
comment
а так вместо экзаменов 1-4 должно быть 0-3? - person Joseph Mindrup; 01.03.2013
comment
Возможно, вам следует изменить индекс i на 0 в for (int i=0), если вам нужно получить доступ к первому элементу в цикле. - person Alex; 01.03.2013
comment
Хорошо, я исправил это, но код не печатает строку Пожалуйста, введите баллы за выпускной экзамен: я уменьшил все на 1, для начала установил i=0, оператор if для него: if(i==3 )... - person Joseph Mindrup; 01.03.2013
comment
любая причина, по которой вы можете видеть, что это может быть сделано? - person Joseph Mindrup; 01.03.2013
comment
Проверьте и здесь логику String [] names = new String[student]; Вы создаете фиксированный массив размером student = 1; - person Alex; 01.03.2013
comment
изменится ли этот массив по мере изменения значения студента ?? - person Joseph Mindrup; 01.03.2013
comment
но если вам нужно, вы можете вызвать names = new String[student]; с новым значением студента, чтобы создать новый массив. - person Alex; 01.03.2013
comment
о, хорошо, так что, если я поставлю эту строку со строкой моего студента ++, это увеличит массив? или это сбросит все назначения к нему и просто сделает его больше? - person Joseph Mindrup; 01.03.2013
comment
Вы можете снова создать массив (большего размера), как я писал выше, но это не увеличит уже созданный массив. Вы создаете массив и снова назначаете имя переменной. Если вам не нужен фиксированный размер, вы можете использовать ArrayList. - person Alex; 01.03.2013
comment
хорошо, но дело в том, что мне нужно будет распечатать имена, введенные в массив, если я просто создам новый массив, он запишется поверх первого и избавится от уже введенных данных правильно ?? смогу ли я просто создать большой массив из 100 и просто не заполнить его целиком? извините, что задаю вам так много вопросов, вы очень полезны - person Joseph Mindrup; 01.03.2013
comment
о, ладно, тогда забудь мой последний комментарий, я думаю, я просто сделаю большой массив. Спасибо за помощь. - person Joseph Mindrup; 01.03.2013

Нижеприведенное работает для вас?

public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        String again = "y";

        int[] exams = new int[4];
        int student = 1;

        do {

            String[] names = new String[student];
            System.out.print("PLease enter the name of student" + student);
            names[student - 1] = s.nextLine();
            for (int i = 0; i < exams.length; i++) {
                System.out.println(i + " i");
                if (i == 3) {
                    System.out.print("Please enter score for Final Exam: ");
                    exams[i] = s.nextInt();
                    if (exams[3] < 0 || exams[3] > 100) {
                        System.out.println("Invalid enter 0-100 only...");
                        System.out.print("Please re-enter score: ");
                        exams[i] = s.nextInt();
                    }
                } else {
                    System.out.print("Please enter score for Exam " + i);
                    exams[i] = s.nextInt();

                    if ((exams[i] < 0 || exams[i] > 50)) {
                        System.out.println("Invalid enter 0-50 only...");
                        System.out.print("Please re-enter score: ");
                        exams[i] = s.nextInt();
                    }

                }
            }
            System.out.println("do you wish to enter another?");
                again = s.next();
                student++;
        } while (again.equalsIgnoreCase("y"));
    }
person artfullyContrived    schedule 01.03.2013