我的代码存在一些问题,这是该程序的全部目标。
你的一位教授听说了你新兴的编程专业知识,并要求你写一个单一的程序,可以帮助他们进行评分。教授给出了三个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的分数:
我不知道为什么或需要修改它来解决它,有什么建议吗?
答案 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
的数组,而不是你现在拥有的两个不同的数组。
以下是一些“入门”步骤(不一定是完整列表):
Student
课程,其中包含学生第一个和第一个的变量。姓氏,以及保存Student
考试成绩的数组ArrayList
来保存您将要创建的所有新Student
个对象。 do/while
循环。在循环开始时创建一个新的Student
对象。然后询问Student
的姓名和考试成绩(请注意,如果您知道只有4个考试成绩,那么您不需要在那里做任何额外的逻辑。您可以直接询问4个考试成绩一个for循环,或者如果你想一次全部。如果有一个可变数量的分数,你将不得不做一些检查)Student
添加到ArrayList
的{{1}}。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 ++)以确保它将循环直到达到允许的最大学生数。