我正在制作一个程序,它应该让用户输入一个字符串,其中包含一个学生的名字,然后是他们的测验、家庭作业和考试成绩(用户输入决定每个学生的数量),并将每个数据添加到数组中。
我打算用4个不同的数组来完成这个任务:一个是名字,一个是HW分数,一个是测验成绩,一个是考试成绩。
它是如何工作的每个学生,你输入的名字,后面的分数,前面的字母,每一个表明它是什么样的分数。示例:
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:权重
这是用户在程序开始时输入“等级项目详细信息”的方式:
考试(编号、分数、重量):310060(用户按下“输入”)
小测验(编号、分数、重量):31020(用户按下输入)
作业(编号、分数、重量):31020(用户按下输入)
第一个数字是课程中的考试/测验/家庭作业的数量,第二个数字是每次考试/测验/家庭作业的最高分,第三个数字是期末考试/测验/家庭作业的重量。
发布于 2014-11-21 19:46:49
如果输入是
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)
一般来说,您的代码很难理解,我认为它在这个问题上还不完整。
祝好运!开始编程可能很困难,但很快就会很棒。
发布于 2014-11-21 20:43:21
您可以尝试将用户输入存储为字符串,然后使用split(),但我认为使用StringTokenizer解析学生姓名和分数会更好:https://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html
一旦你把学生的名字和分数分开,你就可以检查每个分数的第一个字符;如果这个字符是"e",把数字部分添加到考试数组中;如果是"q",添加到测验数组中;"h“进入家庭作业数组。
一些一般性建议:
我建议您允许程序继续逐行输入学生数据,直到用户输入"END“或其他关键字为止。
根据你设置数组的方式,无法判断哪个学生得到了什么分数。您将需要能够这样做的其他部分的程序。我建议创建一个以每个学生为对象的学生类,并将分数记录为int数组。
您可以将学生数据信息存储在hashmap中,但我认为使用数组更适合您的级别。
一旦设置了“学生”类,就可以创建一个“学生数组”(称为“教室”或类似的内容)。这个教室阵列将有一个最大的大小为200或任何最大的学生人数是。每当您为新学生添加分数时,您应该在教室数组中添加相应的“学生对象”,并记下他们的学生ID。第一个学生的ID为1,第二个学生的ID为2,依此类推。这样你就可以轻松地为现有的学生添加更多的分数。您必须以不同的方式解析用户输入以解决此更改。
学生数据的用户输入现在可以采取以下形式:
示例:
(第一次输入学生资料)
Bob Jones: e100 e95 e87 q10 q10 q8 h10 h10 h10
(用户按回车)
鲍勃琼斯有StudentID 1,输入更多的学生数据或“结束”。
Joe Smith: q10 q10 h7 h10 h9 h10 e80
然后,如果你想给一个已经存在的学生增加更多的分数,你可以使用他们的学生ID来引用他们,这样
1: e90 h7 q8 q9 h10
将这些分数添加到studentID 1的学生中,即Bob。因为数组从0开始,每个学生的学生ID只会比数组中的索引多1(学生1在索引0,学生2在索引1,等等)。另一种(更复杂和效率较低)方法是根据数组中的每个元素检查学生姓名,如果学生已经存在,则添加更多的分数,如果不存在,则添加一个新的student对象。
由于不能更改数组的大小,所以当您向用户询问每个学生的考试、测验和家庭作业的总数时,可能会遇到问题,假设您将分数作为学生类的变量来实现。您应该查找数组和数组列表之间的差异。确保阻止用户添加比开始时指定的分数更多的分数。
https://stackoverflow.com/questions/27066541
复制相似问题