Я делаю программу, в которой предполагается, что пользователь вводит строку, содержащую имя ученика, а затем их викторину, домашнюю работу и экзамен (пользовательский ввод определяет, сколько из них для ученика) и берет каждую часть данных и добавляет их к массиву.
Я планировал сделать это, имея 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 (нажатие на пользователя)
Первое число - количество экзаменов/викторин/домашнее задание в курсе, второе число - максимальное количество баллов для каждого экзамена/викторины/домашнее задание, третье число - вес экзаменов/викторин/домашнее задание в окончательном классе.
Если вход
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)
В общем, ваш код довольно трудно понять, и я думаю, что он не является полным вопросом.
Удачи! Начать программирование может быть сложно, но скоро будет потрясающе.
Вы можете попробовать сохранить ввод пользователя в виде строки, а затем использовать 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. Убедитесь, что пользователь не добавил больше баллов, чем указано в начале.