主頁 > .NET開發 > java三個最低分

java三個最低分

2022-03-02 23:53:18 .NET開發

我很難弄清楚我在這個程式中哪里出錯了。它會給我最低分和第三低分,但不是第二低分。

我也不知道如何讓程式只接受名字或名字和姓氏。我知道如何做一兩個名字,但不是要么。

任何幫助是極大的贊賞!

(找出三個最低的分數)撰寫一個程式,提示用戶輸入學生的人數和每個學生的姓名和分數,最后顯示分數最低的學生和分數第二低的學生和排名第二的學生第三低的分數。

程式必須只接受名字或名字和姓氏

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

標籤:爪哇 循环 for循环

上一篇:如何創建一個回圈從變數中列印新單詞

下一篇:如何使用slim將div嵌套在for回圈中的另一個div中

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more