2014-11-21 106 views
1

我正在製作一個程序,該程序應該讓用戶輸入一個包含學生姓名的字符串,然後是測驗,作業和考試分數(用戶輸入決定了每個字母的數量學生)並獲取每一段數據並將其添加到數組中。從用戶輸入中向數組添加數據字符串

我打算通過有4個不同的數組來做到這一點:1爲名字,1爲HW分數,1爲測驗分數,1爲考試分數。

它的工作原理是爲每個學生輸入名稱,然後是每個分數前面帶有字母的分數,表示它是哪種分數。例如:

Bob Jones: e100 e95 e87 q10 q10 q8 h10 h10 h10 
Joe Smith: q10 q10 h7 h10 h9 h10 e80 

這似乎很容易讓程序存儲在一個陣列中的每個名字,但我的代碼爭取得到它拉E100,E95等,並把他們的考試陣中,例如。我到目前爲止的代碼顯然不會這麼做,轉而成立只是一個整數增加的順序每個陣列它們輸入:

import java.util.Scanner; 

public class GradeBook { 

    public static void main(String[] args) { 

     Scanner s = new Scanner (System.in); 

     System.out.println("Welcome to GradeBook!"); 
     System.out.println("Please provide grade item details"); 

     System.out.print("Exams (number, points, weight): "); 
     int numExam = s.nextInt(); 
     int examPoints = s.nextInt(); 
     int examWeight = s.nextInt(); 

     System.out.print("Quizzes (number, points, weight): "); 
     int numQuiz = s.nextInt(); 
     int quizPoints = s.nextInt(); 
     int quizWeight = s.nextInt(); 

     System.out.print("Homework (number, points, weight): "); 
     int numHomework = s.nextInt(); 
     int homePoints = s.nextInt(); 
     int homeWeight = s.nextInt(); 

     System.out.println("------------------"); 

     String names[] = new String [200]; 
     int examScores[] = new int [200 * numExam]; 
     int quizScores[] = new int [200 * numQuiz]; 
     int homeworkScores[] = new int [200 * numHomework]; 

     int students = 0; 
     int e = 0; 
     int h = 0; 
     int q = 0; 


    for (;;){ 


     System.out.println("What would you like to do?"); 
     System.out.println("1 Add student data"); 
     System.out.println("2 Display student grades & statistics"); 
     System.out.println("3 Plot grade distribution"); 
     System.out.println("4 Quit"); 

     int input = s.nextInt(); 
     s.nextLine(); 

     if(input == 1){ 

      for(int i = 0; i <= students;){ 
       for (boolean done = false;done = true;){ 
        System.out.println("Enter student data: "); 
        System.out.print("data>"); 
        names[i] = s.next(); 
        examScores[e] = s.nextInt(); 
        quizScores[q] = s.nextInt(); 
        homeworkScores[h] = s.nextInt(); 

EDIT1:重量

這是怎樣的用戶進入 「級項目的詳細信息」 的節目的開始:

考試(數字,點,重量):3 100 60(用戶按壓輸入)

測驗(數字,點,重量):3 10 20 (用戶按下輸入)

作業(數字,點,重量):3 10 20(用戶按壓輸入)

第一個數字是考試/測驗/功課的在使用過程中的量,第二個數字是每種檢查最大點/測驗/作業,第三個數字是最終成績中考試/測驗/作業的重量。

+0

你的代碼示例有權重,但是你的描述根本沒有提到權重。你能否澄清如何輸入權重? – 2014-11-21 17:09:32

+0

我的錯誤,我編輯了OP。 – sam 2014-11-21 17:17:53

回答

0

如果輸入

Bob Jones: e100 e95 e87 q10 q10 q8 h10 h10 h10 

而且你恢復它:

names[i] = s.next(); 
examScores[e] = s.nextInt(); 
quizScores[q] = s.nextInt(); 
homeworkScores[h] = s.nextInt(); 

它永遠不會工作...分數不上你的例子整數(他們是一個字符串),您必須分析該字符串和分裂它:

String readString = s.next(); // "e99" 
char type = readString.charAt(0); // "e" 
String sScore = readString.substring(1); // "99" 
int score = Integer.valueOf(sScore); // 99 

[上面的代碼尚未經過測試]

(見https://docs.oracle.com/javase/7/docs/api/java/lang/String.html

一般情況下,你的代碼是相當困難的理解,我認爲這是不完整的問題。

  • 嘗試使用方法和評論重點線路
  • 使用常數200(我想它的學生數量)
  • 創建對象(學生,分數,...)
  • 使用Java對象(HashMaps,列表,...)
  • 使用的switch/case代替if(輸入== 1)

祝你好運!開始編程可能很難,但很快就會令人驚歎。

+0

謝謝,但我正在努力如何讓它以這種方式閱讀更多比分。難道不是僅僅將e99添加到考試數組中,然後停下來,忽略其他分數? – sam 2014-11-21 23:30:04

+0

要繼續其他分數,您必須將循環中的每個分數處理的代碼(或更好地稱爲方法)。 我寫的例子只是包括如何獲得分數的值和類型,而不是如何處理它。 – MarionaDSR 2014-11-23 12:43:18

1

您可以嘗試存儲用戶輸入一個字符串,然後採用分體式(),但我認爲使用的StringTokenizer解析出該學生的姓名和成績會更好:https://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html

一旦分開了學生姓名分數,你可以檢查每個分數的第一個字符;如果字符是「e」,則將數字部分添加到考試數組;如果它是「q」,則添加到測驗數組; 「h」進入作業數組。

一些一般性的建議:

我建議您啓用的計劃,以確保由線進入學生數據線,直到用戶輸入「END」或其他一些關鍵字。

您設置陣列的方式,沒有辦法告訴哪個學生得到了什麼分數。您需要爲程序的其他部分做到這一點。我建議製作一個Student類,讓每個學生作爲一個Object,並將分數記錄爲int數組。

您可以將學生數據信息存儲在hashmap中,但我認爲使用數組會更適合您的級別。

一旦你設置了學生類,你可以創建一個學生數組(稱之爲「教室」或類似的東西)。這個教室陣列的最大尺寸爲200或者最大學生數量。每當爲新學生添加分數時,您應該將相應的Student對象添加到教室陣列並記下他們的學生ID。添加的第一個學生的學號爲1,第二個學生的學號爲2,依此類推。這只是讓您可以輕鬆地爲現有學生添加更多分數。您將不得不以不同方式解析用戶輸入以解決此更改。

用戶輸入學生的數據現在可以採取以下形式:

  • [studentName]:[score1,score2,...]

  • [studentID]:[score1,score2, ...]

實施例:

(第一次進入學生數據)

Bob Jones: e100 e95 e87 q10 q10 q8 h10 h10 h10 

(用戶按下ENTER)

>鮑勃·瓊斯具有StudentID 1.輸入更多學生數據或 「END」。

Joe Smith: q10 q10 h7 h10 h9 h10 e80 

然後,如果你想要更多的分數添加到現有的學生,你是指他們用自己的學生證,讓

1: e90 h7 q8 q9 h10 

會增加這些分數到studentID爲1的學生,這將是Bob Jones。由於數組從0開始,因此每個學生的學生ID將僅比它們在數組中的索引多1(學生1將在索引0處,學生2在索引1處等)。另一種(更復雜和效率更低)的方法是檢查學生姓名與數組中的每個元素,如果學生已經存在,則添加更多分數,或者如果他們不存在,則添加新的Student對象。

由於您無法更改陣列的大小,因此假設您將分數作爲學生的變量實施時,當您向用戶詢問每個學生的考試,測驗和作業總數時,可能會遇到問題類。你應該查看數組和ArrayList之間的區別。確保阻止用戶添加比他們在開始時指定的分數更多的分數。

+0

我們並沒有真正涵蓋製作一個包含這樣的對象的類,所以我不知道如何去做這件事。儘管我將如何將每個分數線與名稱連接起來,以及我將如何計算每個學生的總分數,我感到非常困惑。方向還表示,如果沒有輸入所有分數,那麼未輸入的分數將被添加爲0。也有問題。 – sam 2014-11-21 23:28:18

+0

從這裏開始:https://docs.oracle.com/javase/tutorial/java/javaOO/ 當您使用StringTokenizer時,您可以使用nextToken()獲取每個令牌。令牌將被一個分隔符分隔,在你的情況下,一個空格。這樣,您可以按學生姓名和分數分割用戶的輸入。 – 2014-11-22 00:07:25

+0

除此之外,除了鼓勵你在網上瀏覽並找到可以學習的例子之外,我無法幫助你。 – 2014-11-22 00:23:26