我很難弄清楚我在這個程式中哪里出錯了。它會給我最低分和第三低分,但不是第二低分。
我也不知道如何讓程式只接受名字或名字和姓氏。我知道如何做一兩個名字,但不是要么。
任何幫助是極大的贊賞!
(找出三個最低的分數)撰寫一個程式,提示用戶輸入學生的人數和每個學生的姓名和分數,最后顯示分數最低的學生和分數第二低的學生和排名第二的學生第三低的分數。
程式必須只接受名字或名字和姓氏
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
//variables
String name1 = "";
String name2 = "";
String lowestName1 = "";
String lowestName2 = "";
String lowestName3 = "";
double score = 0.0;
double lowestScore1 = -1.0;
double lowestScore2 = -1.0;
double lowestScore3 = -1.0;
int numStudent = 0;
int i = 1; //counter
//get number of students
System.out.print("Enter the number of students: ");
numStudent = input.nextInt();
for (i = 1; i <= numStudent; i ) {
System.out.println("Student " i " of " numStudent);
System.out.print("Enter student's name: ");
name1 = input.next();
//name2 = input.next();
System.out.print("Enter student's score: ");
score = input.nextDouble();
if (i == 1) {
lowestScore1 = score;
lowestName1 = name1;
}
if (score < lowestScore1) {
lowestScore1 = lowestScore2;
lowestName1 = lowestName2;
lowestScore1 = score;
lowestName1 = name1;
} else {
lowestScore2 = score;
lowestName2 = name1;
}
if (score > lowestScore1 && score < lowestScore2){
lowestScore3 = lowestScore2;
lowestScore2 = score;
}
if (score < lowestScore2) {
lowestScore3 = lowestScore2;
lowestName3 = lowestName2;
lowestScore2 = score;
lowestName2 = name1;
} else {
lowestScore3 = score;
lowestName3 = name1;
}
}
System.out.println("The lowest score was " lowestScore1 " and " lowestName1 " got it");
System.out.println("The second lowest score was " lowestScore2 " and " lowestName2 " got it");
System.out.println("The third lowest score was " lowestScore3 " and " lowestName3 " got it");
}
}
uj5u.com熱心網友回復:
以下代碼應該可以作業(我將在下面解釋所有內容):
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("First student name: ");
String name1 = input.nextLine();
boolean firstOnly = true;
if(name1.indexOf(" ") != -1){
firstOnly = false;
}
System.out.println("First student score: ");
double score1 = input.nextDouble();
System.out.println("Second student name: ");
input.nextLine();
String name2 = input.nextLine();
if(firstOnly){
while(name2.indexOf(" ") != -1){
System.out.println("Please enter first name only");
name2 = input.nextLine();
}
}
else{
while(name2.indexOf(" ") == -1){
System.out.println("Please enter first and last name");
name2 = input.nextLine();
}
}
System.out.println("Second student score: ");
double score2 = input.nextDouble();
input.nextLine();
System.out.println("Third student name: ");
String name3 = input.nextLine();
if(firstOnly){
while(name3.indexOf(" ") != -1){
System.out.println("Please enter first name only");
name3 = input.nextLine();
}
}
else{
while(name3.indexOf(" ") == -1){
System.out.println("Please enter first and last name");
name3 = input.nextLine();
}
}
System.out.println("Third student score: ");
double score3 = input.nextDouble();
input.close();
String[] names = {name1,name2,name3};
double[] scores = {score1,score2,score3};
for (int i = 0; i < 2; i ){
double min = scores[i];
int minInd = i;
for (int j = 1; j < 3; j ){
if (scores[j] < min){
min = scores[j];
minInd = j;
}
}
double tempScore = scores[minInd];
scores[minInd] = scores[i];
scores[i] = tempScore;
String tempName = names[minInd];
names[minInd] = names[i];
names[i] = tempName;
}
for (int i = 0; i < 3; i ){
System.out.println(names[i] ": " scores[i]);
}
}
}
是的。。很多。
好的,所以第一部分只是接受用戶輸入:名稱和分數。我還實作了“只有名字或只有名字和姓氏”功能。
我這樣做的方法是首先接受用戶輸入的名字。我創建了一個布爾變數 ,firstOnly它存盤名稱是否應該是名字。如果 的值name1包含空格,那么我們將其設定為 false,否則為 true。
name2當我們為和獲取用戶輸入時name3,如果firstOnly為真,那么我們將繼續詢問用戶輸入,直到他們的輸入不包含空格。如果firstOnly為假,那么我們將繼續詢問用戶輸入,直到他們的輸入包含空格。
Make sure that when you take in user input for the test scores, you type in input.nextLine() afterwards. This is because after you enter an int or double into user input, it will leave behind a trailing newline which will affect the following user input if it is a String.
Next, we store the 3 names and 3 scores in lists: names, scores. Now, we need to sort the lists with respect to scores. That is, we sort scores and shuffle names the same way so that the elements correspond to each other.
To sort scores we can use selection sort. I will quickly explain selection sort below:
Let's say we have an array, arr that has 4 elements. We find the minimum element from arr[0] to arr[3]. After we find this minimum element, we swap it with arr[0].
Next, we continue to find the minimum element from arr[1] to arr[3] and swap it with arr[1]. We continue this process until we reach the end of our loops.
The key to this problem is to modify the "swapping" part of selection sort. By applying the same changes of scores to names the arrays elements will maintain the correspondence to each other prior to the sorting.
Here is a kind of "test" that may help demonstrate:
names = {"Apple", "Banana", "Carrot", "Date"};
scores = {50, 20, 40, 60};
We set our swapping element to scores[0], 50 and find the minimum between {50,20,40,60}, which is 20. We then switch 50 and 20, and thus we switch "Apple" and "Banana".
Now we have:
names = {"Banana", "Apple", "Carrot", "Date"};
scores = {20, 50, 40, 60};
We set our swapping element to scores[1], 50 and find the minimum between {50,40,60}, which is 40. We then switch 50 and 40, and thus we switch "Apple" and "Carrot".
names = {"Banana", "Carrot", "Apple", "Date"};
scores = {20, 40, 50, 60};
我們將交換元素設定為scores[2],50并找到 之間的最小值{50,60},即50。然后我們切換50and 50,因此我們切換"Apple"and "Apple",它沒有變化。
因此,我們的最終陣列是:
names = {"Banana", "Carrot", "Apple", "Date"};
scores = {20, 40, 50, 60};
現在我們可以將它們列印出來,它們將從最小到最大輸出(在我們的問題中,我們只能有 3 個名稱和 3 個分數,但這是相同的想法)。
我希望這有助于回答你的問題!如果您需要任何進一步的說明或詳細資訊,請告訴我:)
uj5u.com熱心網友回復:
if-else現有代碼在重新分配最低分值時在陳述句結構和拼寫錯誤方面存在一些邏輯缺陷。
比較應該從最低分數開始,然后“上移”以前的分數:首先將當前分數與 進行比較lowestScore1,然后與 進行比較,lowestScore2最后與 進行比較lowestScore3:
for (i = 1; i <= numStudent; i ) {
System.out.println("Student " i " of " numStudent);
System.out.print("Enter student's name: ");
name1 = input.next();
System.out.print("Enter student's score: ");
score = input.nextDouble();
if (i == 1) {
lowestScore1 = score;
lowestName1 = name1;
}
if (score < lowestScore1) { // new minimum found
lowestScore3 = lowestScore2; // shifting up 2nd to 3rd
lowestName3 = lowestName2;
lowestScore2 = lowestScore1; // shifting up previous min to 2nd
lowestName2 = lowestName1;
lowestScore1 = score; // storing current minimum
lowestName1 = name1;
} else if (score < lowestScore2) { // new 2nd minimum found
lowestScore3 = lowestScore2; // shifting up 2nd to 3rd
lowestName3 = lowestName2;
lowestScore2 = score; // storing current 2nd minimum
lowestName2 = name1;
} else if (score < lowestScore3) {
lowestScore3 = score; // storing current 3rd minimum
lowestName3 = name1;
}
}
但是,這只有在所有學生的分數不同時才能正常作業。
如果分數重復,那么幾個學生可能共享相同的分數,因此可能需要按分數收集學生的一些集合。
uj5u.com熱心網友回復:
解決方案 1
final class StudentReport
{
private static final class Student
{
private final String firstName,lastName;
private final int score;
private Student(BufferedReader console)throws Exception
{
System.out.println("Enter Your Name[FirstName.LastName]");
//name split at the .[regex involves escaping the character with \\]
String[] nameParts=console.readLine().split("\\.");
if(nameParts.length>2)//Whoo you have a wierd name
{
throw new Exception("You have wierd name1!!");
}
firstName=nameParts[0];
//last name available only if user typed a dot else make it empty
lastName=nameParts.length==2?nameParts[1]:"";
System.out.println("Enter Your Score");
score=Integer.parseInt(console.readLine());
//for neat output
System.out.println("============================");
}
//used to print the student in println method
@Override
public String toString() {
return "Student{" "firstName=" firstName ", lastName=" lastName ", score=" score '}';
}
}
public static void main(String[] args)throws Exception
{
//I prefer this over scanner as scanner has many bugs with new lines and skipping inputs
try(BufferedReader console=new BufferedReader(new InputStreamReader(System.in)))
{
//This is where all the magic happens. All student's inserted into your queue are automatically sorted in ascending order of their marks[lowest to highest]
PriorityQueue<Student> students=new PriorityQueue((Comparator<Student>)(s1,s2)->Integer.compare(s1.score,s2.score));
//After this point all student's are sorted in ascending order[lowest to highest] of their marks
System.out.println("How many students you want to admit?");
int numStudents=Integer.parseInt(console.readLine());
System.out.println("====================");
for(int i=0;i<numStudents;i ){students.offer(new Student(console));}
/*
Now we just have to poll[remove] the first 3 elements which will give us the
Lowest , 2nd Lowest & 3rd Lowest Student
*/
System.out.println("Call your parents[Lowest Score]=" students.poll());
System.out.println("Meet me after class[2nd Lowest Score]=" students.poll());
System.out.println("You can do better[3rd Lowest score]=" students.poll());
}
}
}
輸出
How many students you want to admit?
5
====================
Enter Your Name[FirstName.LastName]
John.Smith
Enter Your Score
100
============================
Enter Your Name[FirstName.LastName]
James.Douglus
Enter Your Score
80
============================
Enter Your Name[FirstName.LastName]
Jimmy
Enter Your Score
70
============================
Enter Your Name[FirstName.LastName]
Charlie
Enter Your Score
50
============================
Enter Your Name[FirstName.LastName]
Henry.The3rd
Enter Your Score
20
============================
Call your parents[Lowest Score]=Student{firstName=Henry, lastName=The3rd, score=20}
Meet me after class[2nd Lowest Score]=Student{firstName=Charlie, lastName=, score=50}
You can do better[3rd Lowest score]=Student{firstName=Jimmy, lastName=, score=70}
解決方案 2
如果您的分配不允許您使用 PriorityQueues 那么您可以使用此邏輯
public static void main(String[] args)throws Exception
{
//I prefer this over scanner as scanner has many bugs with new lines and skipping inputs
try(BufferedReader console=new BufferedReader(new InputStreamReader(System.in)))
{
System.out.println("How many students you want to admit?");
int numStudents=Integer.parseInt(console.readLine());
Student[] students=new Student[numStudents];
for(int i=0;i<students.length;i ){students[i]=new Student(console);}
System.out.println("====================");
//Finding the 1st,2nd...nth lowest is simply a matter of finding the lowest then ignoring that element in successive iterations
//create an temporary array which will hold students which we have already assessed
int[] toIgnore={-1,-1,-1};
//since we want only 3 students we run our loop 3 times
for(int i=0;i<3;i )
{
//holds the nth lowest student for this iteration
int lowestStudent=-1;
lowest : for(int j=0;j<students.length;j )
{
//we check if the current student at jth index was already assessed as the lowest in the previous iteration
for(int ignore:toIgnore)
{
//looks like we already dealt with this student so we continue on with others
if(j==ignore)
{
continue lowest;
}
}
Student currentStudent=students[j];
if(lowestStudent==-1)
{
//very first assigment
lowestStudent=j;
}
else if(currentStudent.score<students[lowestStudent].score)
{
//we found our new lower student
lowestStudent=j;
}
}
if(lowestStudent!=-1)//happens if the number of students is lesser than 3
{
//add to ignore list
toIgnore[i]=lowestStudent;
System.out.println((i 1) " Lowest Student=" students[lowestStudent]);
}
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/436062.html
