【问题标题】:I need of assistance with array assigning user inputs to an array, and do-while loop repeat我需要帮助数组将用户输入分配给数组,并执行循环重复
【发布时间】:2013-03-01 16:49:34
【问题描述】:

我的代码有一些问题,这是程序的总体目标。

您的一位教授听说了您的新兴编程专业知识,并要求您编写一个可用于帮助他们评分的 SINGLE 程序。教授给出了三门 50 分的考试和一次 100 分的期末考试。您的程序将提示用户输入学生的姓名,输入为 Firstname Lastname(即 Bob Smith)、学生的 3 次考试成绩和 1 次期末考试成绩(所有整数)。班级规模因学期而异,但限制为 100 人(声明为常数)。

在进行任何计算或显示任何输出之前,请阅读所有学生的信息。确认 3 次考试成绩在 0-50 分之间,并且在输入时确保期末考试成绩在 0-100 分之间。将最小值和最大值声明为常数,以便根据需要轻松更新它们。如果无效,则显示错误消息并允许用户重新输入该无效分数。读入所有学生信息后,以 LASTNAME、FIRSTNAME(全部大写)的格式显示每个学生的姓名、学生的考试百分比(所有考试的总和加上可能的期末考试/可能的总数)到小数点后 1 位以及学生的期末成绩。

这就是我所拥有的:

import java.util.*;
import java.text.*;


public class Proj4 {
public static void main(String[] args){
Scanner s= new Scanner(System.in);
String input;
String again = "y";
final int MAX_STUDENTS = 100;
final int MIN_EXAM = 0;
final int MAX_EXAM = 50;
final int MIN_FINAL = 0;
final int MAX_FINAL = 100;

String[] names = new String[MAX_STUDENTS];
int [] exams = new int[MAX_STUDENTS * 4];
int student = 1;

do
{
        System.out.print("PLease enter the name of student " + student + ": " );
        for (int k = 0; k < 1; k++) {
            names[k] = s.nextLine().toUpperCase();
        }
        for ( int i = 0; i < 4; i++){
            if(i==3){
                System.out.print("Please enter score for Final Exam: ");
                exams[i] = s.nextInt();
            }
            else{
            System.out.print("Please enter score for Exam " + (i+1) + ": ");
            exams[i] = s.nextInt(); 

                if((exams[0]<MIN_EXAM||exams[0]>MAX_EXAM)||(exams[1]<MIN_EXAM||exams[1]>MAX_EXAM)||(exams[2]<MIN_EXAM||exams[2]>MAX_EXAM)){
                    System.out.println("Invalid enter 0-50 only...");
                    System.out.print("Please re-enter score: ");
                    exams[i] = s.nextInt();
                }
                else if(exams[3]<MIN_FINAL||exams[3]>MAX_FINAL){
                    System.out.println("Invalid enter 0-100 only...");
                    System.out.print("Please re-enter score: ");
                    exams[i] = s.nextInt();
                }
            }
        }
        System.out.print("do you wish to enter another? (y or n) ");
        again = s.next();
        if(again!="y")
            student++;
}while (again.equalsIgnoreCase ("y"));

System.out.println("***Class Results***");
System.out.println(names[1] + "," + names[0] + "   " + "Exam Percentage: "+ ((exams[0]+exams[1]+exams[2]+exams[3])/(MAX_EXAM*3+MAX_FINAL)));

}
}

我遇到的问题是:

  • 弄清楚如何将用户输入的测试分数分配给第一个学生以外的学生,我相信我只为一个学生设置了正确的分数,但是当我转到第二个学生时遇到了问题。
  • 由于某种原因,我无法弄清楚这条线

    System.out.print("do you wish to enter another? (y or n) ");
    again = s.next();
    

    不允许我输入任何东西,不是 y 不是 n 不是任何东西,所以我的程序有效地到此结束,这对我来说没有意义,因为我之前已经完成了它并且它已经工作了。

  • 除此之外,如果有任何其他问题,您可以通过我的代码指出它们,这将非常有帮助。

谢谢

编辑-

改成之后遇到的新问题

if(!again.equalsIgnoreCase("y"))
            student++;
}while (again.equalsIgnoreCase ("y"));

它让我现在可以输入内容,但是在我输入 y 之后,它会打印下一行

请输入学生 1 的姓名:请输入考试 1 的分数:

我不知道为什么或需要更改什么来修复它,有什么建议吗?

【问题讨论】:

    标签: java arrays for-loop constants do-while


    【解决方案1】:
    `if(again!="y")` is the culprit here 
    

    你应该使用 equals() 方法来检查字符串是否相等。

    if(!again.equals("y"))

    【讨论】:

    • 奇怪的错误,因为 OP 在该代码行下方使用了again.equalsIgnoreCase("y")
    • 谢谢,这解决了问题,它不让我输入 y 但由于某种原因它没有像预期的那样计算学生变量,以及另一个错误(不知道为什么)但它也打印了下一行,看起来像Please enter the name of student 1: Please enter score for Exam 1:
    【解决方案2】:

    如果您使用==!= 运算符比较Java 中的字符串,那么您实际上并没有比较这些值。相反,您正在测试两个字符串是否相同 Object

    This post explains String comparison well.

    要做你想做的事,把if (again != "y")改成if(! (again.equalsIgnoreCase("y")) )

    编辑

    我相信您的新问题源于您在 do 循环中执行的第一个 for 循环。每次您在do/while 末尾键入“y”时,您都将执行整个

    for (int k = 0; k &lt; 1; k++) {

    再次循环。这就是为什么在你输入“y”后你会看到Please enter the name of student 1: Please enter score for Exam 1:

    新问题的“解决方案”是让外部for 包含内部问题,为每个学生循环完成 4 次考试,通常称为“双 for”或“嵌套 for 循环”。

    也就是说,您随后会遇到将所有学生的所有考试都放在一个数组中的问题。

    我认为现在是坐下来认真思考程序设计的时候了。如果您使用Student 对象来代表学生并保存他们的考试成绩,IMO 会容易得多。然后你可以创建一个Students 的数组,而不是你现在拥有的两个不同的数组。

    以下是一些“入门”步骤(不一定是完整列表):

    1. 创建一个 Student 类,其中包含学生的名字和姓氏变量,以及一个保存 Students 考试成绩的数组
    2. 在您的主类中创建一个ArrayList 来保存您将要创建的所有新Student 对象。
    3. 执行do/while 循环。在循环开始时创建一个新的Student 对象。然后询问Students 的姓名和考试成绩(请注意,如果您知道只有 4 个考试成绩,您不必在那里做任何额外的逻辑。您可以使用 for 简单地询问 4 个考试成绩循环,或者如果你想要一次全部。如果有可变数量的分数,你将不得不做某种检查)
    4. 将您创建的新Student 添加到Students 的ArrayList
    5. 一旦该人选择“n”,循环遍历ArrayList 并打印每个Student 的信息!

    【讨论】:

    • 在我输入 y 后,这一行和提到的 @PremGenError 都做同样的事情,这给了我Please enter the name of student 1: Please enter score for Exam 1:
    • 在测试again 不等于“y”后,您正在增加学生。所以基本上如果他们输入“y”,学生就不会增加。你可能想要if (again.equalsIgnoreCase("y")){ student++; }
    • 实际上,正如发帖者发现的那样,您可以,但结果并非您所期望的。 == 或 != 询问是否是同一个 Object,.equals() 将比较内容。在某些 JVM 上,poster 的方法会起作用,因为 JVM 决定重新使用相同的“y”字符串而不是创建一个新字符串。 (我刚刚在 intellij 中运行了这个程序,例如它运行良好)这种不一致的行为就是为什么你应该(几乎)永远不要使用 == 或 != 来比较字符串。
    • 所以你是说我应该有什么工作?嗯,我想知道我在做什么有什么问题,我正在使用 eclipse 来键入、编译和运行代码。
    • 是的,你是对的,你可以这样比较它们,但是大多数人的意图不是比较对象而是你所说的值。我将根据我的了解进行编辑,但假设 OP 想要比较值,因此在这种情况下“不能”是“真”。谢谢。
    【解决方案3】:

    您的 for (int k = 0; k

    【讨论】:

    • 当我这样做时,其余代码不会打印出来或运行,k 已初始化并仅针对 for 循环运行,我认为每次重新运行 do 后不会记住它-while 循环
    猜你喜欢
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多