繁体   English   中英

从用户输入字符串向数组添加数据

[英]Adding data to array from user input String

我正在制作一个程序,该程序应该让用户输入一个包含学生姓名的字符串,然后是他们的测验,家庭作业和考试成绩(用户输入确定每个学生有多少个),并获取每个数据并将其添加到一个数组。

我正打算通过4种不同的数组来做到这一点:1表示姓名,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等并将其放入exams数组中的代码。 到目前为止,我所拥有的代码显然不会这样做,而是将其设置为仅按输入顺序在每个数组中添加一个整数:

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(用户按Enter键)

测验(数字,分数,重量):3 10 20(用户按Enter)

作业(数字,分数,重量):3 10 20(用户按Enter键)

第一个数字是课程中考试/测验/家庭作业的数量,第二个数字是每个考试/测验/家庭作业的最高分,第三个数字是期末考试/测验/家庭作业的权重。

您可以尝试将用户输入存储为字符串,然后使用split(),但是我认为使用StringTokenizer解析学生姓名和分数会更好: https : //docs.oracle.com/javase/7/docs/api /java/util/StringTokenizer.html

将学生姓名与分数分开后,您可以检查每个分数的第一个字符; 如果字符是“ e”,则将数字部分添加到exams数组中; 如果是“ q”,则添加到测验数组中; “ h”转到作业数组。

一些一般性建议:

我建议您使该程序保持一行一行地输入学生数据,直到用户输入“ END”或其他关键字。

建立数组的方式无法告诉哪个学生获得了什么分数。 您将需要能够对程序的其他部分执行此操作。 我建议创建一个Student类,将每个学生作为对象,并将分数记录为int数组。

您可以将学生数据信息存储在哈希图中,但是我认为使用数组更适合您的水平。

一旦设置了Student类,就可以创建一个Student数组(称之为“教室”或类似的东西)。 此教室阵列的最大大小为200或最大学生人数。 每当为新学生添加分数时,都应在教室阵列中添加相应的Student对象,并记下他们的学生ID。 添加的第一个学生的学生ID为1,第二个学生的学生ID为2,依此类推。 这样做是为了您可以轻松为现有学生添加更多分数。 您必须以不同的方式分析用户输入以解决此更改。

用户输入的学生数据现在可以采用以下形式:

  • [studentName]:[score1,score2,...]

  • [studentID]:[score1,score2,...]

例:

(第一次输入学生数据)

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

(用户按ENTER)

>鲍勃·琼斯(Bob Jones)具有StudentID 1.输入更多学生数据或“ END”。

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对象。

由于您无法更改数组的大小,因此如果您要求用户将分数实施为Student类的变量,那么当您询问用户每个学生的考试,测验和家庭作业的总数时,您可能会遇到问题。 您应该查找数组和arraylist之间的差异。 确保阻止用户添加比开始指定的分数更多的分数。

如果输入为

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对象(HashMap,列表等)
  • 使用switch / case代替if(input == 1)

祝好运! 开始编程可能很困难,但很快就会令人惊奇。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM