Добавление данных в массив из пользовательского ввода String

1

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

Я планировал сделать это, имея 4 разных массива: 1 для имен, 1 для очков HW, 1 для очков Викторины, 1 для экзаменов.

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

Bob Jones: e100 e95 e87 q10 q10 q8 h10 h10 h10
Joe Smith: q10 q10 h7 h10 h9 h10 e80

Кажется, достаточно легко заставить программу хранить каждое имя в массиве, но я борюсь с кодом, чтобы заставить его вытащить e100, e95 и т.д. И поместить их в массив экзаменов, например. Код, который у меня до сих пор, очевидно, не сделает этого, и вместо этого будет настроен, чтобы просто добавить одно целое к каждому массиву в том порядке, в котором они были введены:

import java.util.Scanner;

public class GradeBook {

    public static void main(String[] args) {

        Scanner s = new Scanner (System.in);

        System.out.println("Welcome to GradeBook!");
        System.out.println("Please provide grade item details");

        System.out.print("Exams (number, points, weight): ");
        int numExam = s.nextInt();
        int examPoints = s.nextInt();
        int examWeight = s.nextInt();

        System.out.print("Quizzes (number, points, weight): ");
        int numQuiz = s.nextInt();
        int quizPoints = s.nextInt();
        int quizWeight = s.nextInt();

        System.out.print("Homework (number, points, weight): ");
        int numHomework = s.nextInt();
        int homePoints = s.nextInt();
        int homeWeight = s.nextInt();

        System.out.println("------------------");

        String names[] = new String [200];
        int examScores[] = new int [200 * numExam];
        int quizScores[] = new int [200 * numQuiz];
        int homeworkScores[] = new int [200 * numHomework];

        int students = 0;
        int e = 0;
        int h = 0;
        int q = 0;


    for (;;){


        System.out.println("What would you like to do?");
        System.out.println("1 Add student data");
        System.out.println("2 Display student grades & statistics");
        System.out.println("3 Plot grade distribution");
        System.out.println("4 Quit");

        int input = s.nextInt();
        s.nextLine();

        if(input == 1){

            for(int i = 0; i <= students;){
                for (boolean done = false;done = true;){
                    System.out.println("Enter student data: ");
                    System.out.print("data>");
                    names[i] = s.next();
                    examScores[e] = s.nextInt(); 
                    quizScores[q] = s.nextInt();
                    homeworkScores[h] = s.nextInt();

edit1: Вес

Именно так пользователь вводит "сведения о деталях" в начале программы:

Экзамены (количество, баллы, вес): 3 100 60 (ввод нажатий пользователя)

Викторины (количество, баллы, вес): 3 10 20 (нажатие на пользователя)

Домашнее задание (число, баллы, вес): 3 10 20 (нажатие на пользователя)

Первое число - количество экзаменов/викторин/домашнее задание в курсе, второе число - максимальное количество баллов для каждого экзамена/викторины/домашнее задание, третье число - вес экзаменов/викторин/домашнее задание в окончательном классе.

  • 0
    В вашем примере кода есть весовые коэффициенты, однако в вашем описании весовые коэффициенты вообще не указаны. Не могли бы вы уточнить, как вводятся веса?
  • 0
    моя ошибка, я редактировал ОП.
Теги:
arrays

2 ответа

0
Лучший ответ

Если вход

Bob Jones: e100 e95 e87 q10 q10 q8 h10 h10 h10

И вы восстановите его с помощью:

names[i] = s.next();
examScores[e] = s.nextInt(); 
quizScores[q] = s.nextInt();
homeworkScores[h] = s.nextInt();

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

String readString = s.next(); // "e99"
char type = readString.charAt(0); // "e"
String sScore = readString.substring(1); // "99"
int score = Integer.valueOf(sScore);  // 99

[Код выше не был протестирован]

(см. https://docs.oracle.com/javase/7/docs/api/java/lang/String.html)

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

  • Попробуйте использовать методы и прокомментировать ключевые строки
  • Используйте константу для 200 (я думаю, это число студентов)
  • Создание объектов (ученик, оценка,...)
  • Используйте java-объекты (HashMaps, Lists,...)
  • Используйте переключатель /case вместо if (input == 1)

Удачи! Начать программирование может быть сложно, но скоро будет потрясающе.

  • 0
    Спасибо, но я изо всех сил пытаюсь заставить его читать более одного балла таким образом. Не будет ли он просто добавить e99, например, в массив экзаменов, а затем остановиться, игнорируя другие результаты?
  • 0
    Чтобы продолжить работу с другими оценками, вы должны поместить код (или, лучше сказать, метод), обрабатывающий каждую оценку, в цикл. Пример, который я написал, включает в себя, как получить значение и тип оценки, а не то, что с ней делать.
1

Вы можете попробовать сохранить ввод пользователя в виде строки, а затем использовать split(), но я думаю, что использование StringTokenizer для анализа имени студента и оценки было бы лучше: https://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html

После того как вы отделите имя ученика от баллы, вы можете проверить первый символ каждого балла; если символ "e", добавьте числовую часть в массив экзаменов; если он "q", добавьте в массив викторины; "h" переходит к массиву домашних заданий.

Некоторые общие предложения:

Я предлагаю вам включить программу, чтобы она продолжала вводить данные студента по строкам, пока пользователь не войдет в "END" или какое-либо другое ключевое слово.

То, как вы настраиваете свои массивы, не может сказать, какой студент получил, какой счет. Вам нужно будет сделать это для других частей программы. Я бы рекомендовал создать класс Student, в котором каждый ученик будет объектом Object, и записывает оценки как массивы int.

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

После того, как у вас установлен класс Student, вы можете создать массив Student (назовите его "класс" или что-то в этом роде). Этот массив классов будет иметь максимальный размер 200 или любое максимальное количество студентов. Всякий раз, когда вы добавляете баллы для нового ученика, вы должны добавить соответствующий объект Student в массив классов и записать их идентификатор студента. Первый добавленный ученик будет иметь идентификатор студента 1, второй - студенческий ID 2 и т.д. Это просто так, что вы можете легко добавить больше баллов для существующих учеников. Вам придется разобрать пользовательский ввод по-разному, чтобы устранить это изменение.

Пользовательский ввод данных для студентов теперь может принимать следующие формы:

  • [studentName]: [оценка1, оценка2,...]

  • [studentID]: [оценка1, оценка2,...]

Пример:

(Первый раз ввод данных о студентах)

Bob Jones: e100 e95 e87 q10 q10 q8 h10 h10 h10

(Пользователь нажимает ENTER)

> Боб Джонс имеет StudentID 1. Введите больше данных о студентах или "END".

Joe Smith: q10 q10 h7 h10 h9 h10 e80

Затем, если вы хотите добавить больше баллов для уже существующего ученика, вы можете обратиться к ним, используя свой идентификатор студента, чтобы

1: e90 h7 q8 q9 h10

добавили бы эти баллы к студенту с studentID 1, который будет Боб Джонсом. Поскольку массивы начинаются с 0, идентификатор студента для каждого ученика будет всего на 1 больше, чем их индекс в массиве (учащийся 1 будет в индексе 0, студент 2 в индексе 1 и т.д.). Другой (более сложный и менее эффективный) способ состоял бы в том, чтобы проверить имя студента на каждый элемент в массиве, добавив больше баллов, если студент уже существует или добавляет новый объект Student, если они этого не делают.

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

  • 0
    На самом деле мы не рассматривали создание класса, содержащего такие объекты, поэтому я понятия не имею, как это сделать. Я действительно смущен тем, как я собираюсь связать каждую строку баллов с именем, и как я собираюсь рассчитать общий балл каждого студента из класса. В инструкциях также говорится, что если не все оценки введены, те, которые не введены, будут добавлены как 0. Проблемы с этим тоже.
  • 0
    Начните здесь: docs.oracle.com/javase/tutorial/java/javaOO Когда вы используете StringTokenizer, вы можете получить каждый токен с помощью nextToken (). Токен будет чем-то разделенным разделителем, в вашем случае - пробелом. Таким образом, вы можете разделить ввод пользователя по имени ученика и баллам.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню