我需要帮助将数组分配给数组的用户输入,并且do-while循环重复

时间:2013-03-01 16:49:35

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

我的代码存在一些问题,这是该程序的全部目标。

  

你的一位教授听说了你新兴的编程专业知识,并要求你写一个单一的程序,可以帮助他们进行评分。教授给出了三个50分的考试和一个100分的期末考试。您的程序将提示用户输入学生的姓名,输入姓名姓氏(即Bob Smith),学生的3级考试成绩和1次考试成绩(所有整数)。班级大小从学期到学期不等,但100是限制(声明为常数)。

     

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

这就是我所拥有的:

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();
    

    不允许我输入任何东西,不是不是没有任何东西,所以我的程序在那里有效地结束,这对我来说没有意义,因为我之前完成了它并且它已经完成了它。 / p>

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

谢谢

编辑 -

更改为

后我遇到的新问题
if(!again.equalsIgnoreCase("y"))
            student++;
}while (again.equalsIgnoreCase ("y"));

它允许我现在输入内容,但在输入y之后它会打印下一行

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

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

3 个答案:

答案 0 :(得分:1)

`if(again!="y")` is the culprit here 

您应该使用equals()方法来检查字符串相等性。

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

答案 1 :(得分:1)

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

This post explains String comparison well.

要执行您想要的操作,请将if (again != "y")更改为if(! (again.equalsIgnoreCase("y")) )

修改

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

for (int k = 0; k < 1; k++) {

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

你的新问题的一个“解决方案”是让外部的for封闭内部的那个,循环通过4个考试,每个学生通常被称为“双重”或“嵌套循环” ”。

那就是说,然后你会被问到在一个阵列中为所有学生进行所有考试的问题。

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

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

  1. 制作一个Student课程,其中包含学生第一个和第一个的变量。姓氏,以及保存Student考试成绩的数组
  2. 在您的主课程中,创建一个ArrayList来保存您将要创建的所有新Student个对象。
  3. 执行do/while循环。在循环开始时创建一个新的Student对象。然后询问Student的姓名和考试成绩(请注意,如果您知道只有4个考试成绩,那么您不需要在那里做任何额外的逻辑。您可以直接询问4个考试成绩一个for循环,或者如果你想一次全部。如果有一个可变数量的分数,你将不得不做一些检查)
  4. 将您创建的新Student添加到ArrayList的{​​{1}}。
  5. 一旦此人选择“n”,循环浏览Student并打印每个ArrayList的信息!

答案 2 :(得分:0)

你的for(int k = 0; k&lt; 1; k ++)循环只执行一次(对于一个学生),因为你设置它只在k <1时执行。 1,只会发生一次。很快,当你将k增加到1时,循环将停止。我会将其更改为(int k = 0; k&lt; MAX_STUDENTS; k ++)以确保它将循环直到达到允许的最大学生数。