【问题标题】:How to list individual students grades...?如何列出个别学生的成绩...?
【发布时间】:2013-04-25 23:06:57
【问题描述】:

使用多维数组对我来说是第一次,所以我对这些数组的某些方面的理解有点……模糊。现在快速回顾一下这个程序在完成后将用于什么......

它收集输入的学生姓名和四个对应的考试成绩。你可以用它找到学校的平均值,现在我正在尝试找到每个学生的平均值。

public class StudentGradesView extends FrameView {

int [][] aryStudent = new int [15][4]; // [15] being max students [4] being # of test scores
String[] studentNames = new String[15]; 
int numOfStudents = 0; //student names start from 0...

int marks = 0;

int test1;
int test2;
int test3;
int test4;

public StudentGradesView(SingleFrameApplication app) {

//unimportant...for GUI

}                                          

private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {                                          

//这很好...只是收集姓名和考试成绩并将它们保存在studentListField中...

    aryStudent[numOfStudents][0] = Integer.parseInt(test1Field.getText());
    aryStudent[numOfStudents][1] = Integer.parseInt(test2Field.getText());
    aryStudent[numOfStudents][2] = Integer.parseInt(test3Field.getText());
    aryStudent[numOfStudents][3] = Integer.parseInt(test4Field.getText());

    StringBuilder sb = new StringBuilder();

    for (int x=0; x <= numOfStudents && x<15; x++) {
        sb.append(firstNameField.getText() + " " + lastNameField.getText());
        for (int y=0; y < 4; y++) {
            sb.append(" " + aryStudent[x][y]);
        }
        sb.append("\n");
    }

    studentListField.setText(sb.toString());
    numOfStudents ++;
}                                         

private void classAverageButtonActionPerformed(java.awt.event.ActionEvent evt) {    

//找到学校平均水平....很好

    for(int x = 0; x < numOfStudents && x<15; x++) {
        averageField.setText("The class average is " + (aryStudent[x][0] + aryStudent[x][1] + aryStudent[x][2] + aryStudent[x][3])/4 + "%");
    }

}                                                  

private void studentAverageButtonActionPerformed(java.awt.event.ActionEvent evt) {

然后!这……我以为这会单独列出学生的平均成绩,但它一次只输入一个学生,这是个问题……它需要做的就是列出与此类似的列表……

约翰·史密斯 78 简·多伊 80 等等等等

     for (int i = 0; i < numOfStudents; i++) {
         for (int y = 0; y < marks; y++) {
             averageField.setText("Student" + (aryStudent[y][0] + aryStudent[y][1] + aryStudent[y][2] + aryStudent[y][3])/4);
         }
    }
     marks++;
}

【问题讨论】:

  • averageField的类型是什么?

标签: java arrays loops awt


【解决方案1】:

最后一段代码中的变量marks 到底是什么?它在循环之外,所以它实际上并没有做任何事情。例如,如果有 4 名学生并且分数为 3,我希望您的代码执行以下操作 (i=0 y=0), 学生A (i=0 y=1), 学生B (i=0 y=2), StudentC

(i=1 y=0),  StudentA <AVG>
(i=1 y=1), StudentB <AVG>
(i=1 y=2), StudentC <AVG>

(i=2 y=0),  StudentA <AVG>
(i=2 y=1), StudentB <AVG>
(i=2 y=2), StudentC <AVG> 

....

首先尝试以文本模式打印您的结果(无需任何 GUI)。当它在那里工作时,您可以移动到 GUI。

【讨论】:

    【解决方案2】:

    您的索引似乎不正确。您正在使用y,这是作为学生索引的标记索引,而i 未使用。此外,按照您的方式,您不需要 2 个循环。

    如果您将i s 命名为学生,将y m 命名为标记,则可能会避免此问题。

    另外,通过使用setText,您将替换文本,而不是添加文本。假设您使用的是JTextArea,则应改为使用append

    应该是这样的:

     averageField.setText(""); // clear
     for (int s = 0; s < numOfStudents; s++)
        averageField.append(studentNames[s] + " - " + (aryStudent[s][0] +
           aryStudent[s][1] + aryStudent[s][2] + aryStudent[s][3])/4 + "\n");
    

    更通用的方式:

     averageField.setText(""); // clear
     for (int s = 0; s < numOfStudents; s++)
     {
        int average = 0;
        for (int m = 0; m < marks; m++)
           average += aryStudent[s][m];
        average /= 4;
        averageField.append(studentNames[s] + " - " + average + "\n");
     }
    

    请注意,您的班级平均水平似乎也不正确。它目前只显示最后一个学生的平均成绩(setText 也会随你而去)。

    这样的事情应该可以工作:

    int average = 0;
    for (int s = 0; s < numOfStudents; s++)
       for (int m = 0; m < marks; m++)
          average += aryStudent[s][m];
    average /= numOfStudents * marks;
    averageField.setText("The class average is " + average + "%");
    

    另外,numOfStudents 不会(或不应该)被限制为15,你为什么要检查这两个值?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 2021-09-18
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      相关资源
      最近更新 更多