我正在创建一个程序,该程序应该让用户输入一个包含学生姓名的字符串,然后是他们的测验,作业和考试成绩(用户输入确定学生每个人的数量)并获取每个数据并将其添加到数组中。
我打算通过4个不同的阵列来做到这一点:名称为1,HW得分为1,测验得分为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 :(得分:1)
您可以尝试将用户输入存储为字符串,然后使用split(),但我认为使用StringTokenizer来解析学生姓名和分数会更好:https://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html
将学生姓名与分数分开后,您可以查看每个分数的第一个字符;如果字符是“e”,则将数字部分添加到检查数组中;如果它是“q”,则添加到测验数组; “h”进入作业阵列。
一些一般性建议:
我建议您启用该程序,以便逐行输入学生数据,直到用户输入“END”或其他关键字为止。
您设置阵列的方式,无法分辨哪个学生得分。您需要能够为程序的其他部分执行此操作。我建议创建一个将每个学生作为对象的Student类,并将分数记录为int数组。
您可以将学生数据信息存储在哈希映射中,但我认为使用数组更适合您的级别。
一旦你设置了Student课程,你就可以创建一个Student数组(称之为“教室”或类似的东西)。这个教室阵列的最大大小为200或无论学生的最大数量是多少。每当您为新学生添加分数时,您应该将相应的学生对象添加到教室阵列并记下他们的学生ID。添加的第一个学生的学生ID为1,第二个学生的ID为2,依此类推。这样您就可以轻松为现有学生添加更多分数。您必须以不同方式解析用户输入以解决此更改。
学生数据的用户输入现在可以采用以下形式:
[studentName]:[score1,score2,...]
[studentID]:[score1,score2,...]
示例:
(第一次输入学生数据)
Bob Jones: e100 e95 e87 q10 q10 q8 h10 h10 h10
(用户按ENTER)
&GT; Bob Jones有StudentID 1.输入更多学生数据或“结束”。
Joe Smith: q10 q10 h7 h10 h9 h10 e80
然后,如果您想为现有学生添加更多分数,您可以使用他们的学生ID来引用他们,以便
1: e90 h7 q8 q9 h10
会将这些分数添加到学生ID为1的学生中,这将是Bob Jones。由于数组从0开始,每个学生的学生ID将比数组中的索引多1(学生1将在索引0,学生2在索引1,等等)。另一种(更复杂,效率更低)的方法是根据数组中的每个元素检查学生姓名,如果学生已经存在则添加更多分数,否则添加新学生对象。
由于您无法更改数组的大小,因此当您向用户询问每个学生的考试,测验和家庭作业总数时,您可能会遇到问题,假设您将分数作为Student类的变量实现。你应该查看数组和arraylist之间的差异。确保阻止用户添加比开头指定的分数更多的分数。
答案 1 :(得分: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)
一般来说,您的代码很难理解,我认为这个问题并不完整。