当前位置: 首页 > 知识库问答 >
问题:

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

史骏祥
2023-03-14

我正在制作一个程序,该程序应该让用户输入一个字符串,其中包含一个学生的名字,后跟他们的测验、家庭作业和考试分数(用户输入决定每个学生的分数),并获取每个数据段并将其添加到一个数组中。

我计划通过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等,并将其放入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();

编辑1:权重

这是用户在程序开始时输入“成绩项目详细信息”的方式:

考试(数量、分数、权重):3 100 60(用户按回车键)

测验(数量、分数、重量):3 10 20(用户按回车键)

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

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

共有2个答案

堵昊焱
2023-03-14

如果输入是

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、列表、...)
  • 使用开关/case代替if(输入==1)

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

卫宁
2023-03-14

您可以尝试将用户输入存储为字符串,然后使用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,依此类推。这只是为了方便您为现有学生添加更多分数。您必须以不同的方式解析用户输入以解决此更改。

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

>

[学生ID]:[score1, score2,...]

例子:

(首次输入学生数据)

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

(用户按ENTER键)

Joe Smith: q10 q10 h7 h10 h9 h10 e80

然后,如果你想给已经存在的学生增加更多的分数,你可以使用他们的学生证来参考他们,这样

1: e90 h7 q8 q9 h10

将这些分数添加到学生ID为1的学生,即Bob Jones。由于数组从0开始,因此每个学生的学生ID只会比他们在数组中的索引多1(学生1将在索引0,学生2在索引1,等等)。另一种(更复杂且效率更低)的方法是根据数组中的每个元素检查学生名称,如果学生已经存在则添加更多分数,如果不存在则添加新的学生对象。

由于您无法更改数组的大小,因此当您向用户询问每个学生的考试、测验和家庭作业的总数时,您可能会遇到问题,假设您将分数作为学生类的变量实现。您应该查找数组和数组列表之间的差异。确保阻止用户添加比他们在开始时指定的更多的分数。

 类似资料:
  • 问题内容: 我是Java新手,所以我几乎不需要帮助 我有 我想向此数组(脚本)添加新的字符串(string1,string2)作为示例 我想在以后的阶段中不添加新字符串 我该怎么办? 问题答案: 您无法在Java中调整数组的大小。 声明数组的大小后,它将保持固定。 相反,您可以使用具有动态大小的对象,这意味着您无需担心其大小。如果数组列表的大小不足以容纳新值,则它将自动调整大小。

  • 我正在做一项关于使用结构化/半结构化/非结构化数据的作业,我正在对莎士比亚的戏剧进行字数统计(以了解语言如何随时间变化),方法是导入每部戏剧的txt文件和xml索引文件,该文件存储有关每部戏剧的关键信息,如编写年份、角色列表等。。然后,我将删除字符名、设置、标点符号和常用词(和、但、或,如果等…)从txt文件准备好进行字数统计-全部在C#中运行的控制台脚本中。我正在编写一个类,每个剧本的数据都将存

  • 我正在做一个程序,用户给我一个10行或更少的数组,可以检查是否有少于x个字符的行(由用户给出x)。。。现在我所有的都是这个,但我不确定什么不起作用。任何解释方面的帮助都将不胜感激! 输入应为: ie数组=('hi my name is'、'rick'、'23') 插入字符数: 输入-5 输出-'rick','23' 基本上,我希望它列出的所有行的字符都少于用户提供的值。

  • 假设我在一个数组列表中添加了2个用户Apple和Orange。然后我想将牛顿添加到苹果的朋友列表中。所以苹果应该有1个朋友,而橙色仍然没有任何朋友,因为我还没有添加他们。 我的问题是,当我把牛顿添加到苹果的朋友中时,牛顿也会出现在orange的朋友中。我只需要一个朋友出现在苹果和橙色没有。 我认为这是我为用户的朋友设置arraylist的方式,但我不确定如何更改它。

  • 问题内容: System.out.print(“Name : “); String name = in.nextLine(); 输出将是: 名称:测试 年龄:20 建立成功 当我调试它们时,它不会读取“ city”的用户输入。但是,当我将“年龄”的数据类型更改为字符串时,它将读取。我如何在读取城市用户输入的系统中将age的数据类型保持为整型? 问题答案: 读取年龄后,由于缓冲区中仍然有换行符,请将

  • 在java.util.scanner.throwfor(未知源)在java.util.scanner.next(未知源)在java.util.scanner.nextint(未知源)在java.util.scanner.nextint(未知源)在test.main(test.java:6) 如何修复以及如何在数组中输入字符串