2012-12-12 28 views
-1

我無法從do-while循環內複製數據並在循環外重複它。這是在分裂功能,每個學生的測試分數輸入在他/她的名字相同的行。我很抱歉,如果這是一個非常簡單的問題,但我無法找到任何地方如何解決它。非常感謝您的幫助。在C中一次填充兩個數組#

do { 
     Console.Write("Enter the student's name followed by his/her score on the same line:"); 
     studentAndScore = Console.ReadLine(); 
     if (studentAndScore == "") 
     { 
      break; 
     } 
     string[] parsedInput; 
     parsedInput = studentAndScore.Split(); 
      string student = parsedInput[0] = students[0]; 
      score = int.Parse(parsedInput[1]); 
      score = studentScores[0]; 
     i++; 
    } while (i<=MAX); 
    Console.WriteLine("The test scores of the students are:"); 
    Console.WriteLine("students \t scores \t"); 
//And I need to repeat the list of student names and scores here 
+2

除了羅伯特哈維指出的錯誤,你一次又一次覆蓋了兩個數組中的同一個項目。將'0'索引替換爲'i'索引... –

+0

您也連續兩次分配給「分數」。另外,這是一個循環,所以不知道你希望使用'score'值。 – weston

+0

感謝大家的幫助 – jvlv

回答

4

這行代碼:

string student = parsedInput[0] = students[0]; 

是要複製students[0]parsedInput[0]第一。所以你失去了你的解析輸入。

相反,嘗試:

string student = parsedInput[0]; 
students[0] = student; 

如果是這樣,其實你的意圖。在同一行代碼中執行兩個任務很少是個好主意。

您可能真的想在索引器中使用i而不是0,如parsedInput[i]students[i]

0

羅伯特寫的是真的。此外,您不使用循環變量i將每個學生存儲在數組的不同「插槽」中,因此您將覆蓋當前位於同一位置的所有內容。數組的聲明必須在循環之外,否則它將在每次迭代中清除它。

總結需要你的C#代碼示例的變化,修改後的版本是這樣的:

void Main() 
{ 
    int MAX = 20; 

    var students = new string[MAX]; 
    var scores = new int[MAX]; 

    int i=0; 
    do { 
     Console.Write("Enter the student's name followed by his/her score on the same line:"); 
     var studentAndScore = Console.ReadLine(); 
     if (studentAndScore == "") 
     { 
      break; 
     } 

     string[] parsedInput = studentAndScore.Split();  
     students[i] = parsedInput[0];  
     scores[i] = int.Parse(parsedInput[1]); 

     i++; 
    } while (i<MAX); 
    Console.WriteLine("The test scores of the students are:"); 
    Console.WriteLine("students \t scores \t"); 
    for(int k=0; k<i; k++) { 
     Console.WriteLine("Student: {0}, Score: {1}", students[k], scores[k]); 
    } 
} 

注意,我用的for語句,而不是MAXi價值,因爲用戶可以通過輸入一個空白行來跳出do循環。並且i始終包含之前已輸入的項目數量。

當然,這段代碼還沒有包含任何錯誤處理,這在現實世界中是需要的。

0

只需創建兩個列表...

var names = new List<String>(); 
var scores = new List<Int32>(); 

...讀取輸入到列表...

while (true) 
{ 
    Console.Write("student/score: "); 

    var input = Console.ReadLine(); 

    if (String.IsNullOrWhiteSpace(input)) 
    { 
     var parts = input.Split(); 

     names.Add(parts[0]); 
     scores.Add(Int32.Parse(parts[1]); 
    } 
    else 
    { 
     break; 
    } 
} 

...和輸出列表。

for (var i = 0; i < names.Count; i++) 
{ 
    Console.WriteLine("{0}\t{1}", names[i], scores[i]); 
} 

並且當然會添加很多錯誤處理。或者你可以使用字典,但我不確定你對物品的訂購有什麼保證。

var data = new Dictionary<String, Int32>(); 

while (true) 
{ 
    Console.Write("student/score: "); 

    var input = Console.ReadLine(); 

    if (String.IsNullOrWhiteSpace(input)) 
    { 
     var parts = input.Split(); 

     data.Add(parts[0], Int32.Parse(parts[1])); 
    } 
    else 
    { 
     break; 
    } 
} 

foreach (var entry in data) 
{ 
    Console.WriteLine("{0}\t{1}", entry.Key, entry.Value); 
} 
+0

工作;謝謝! – jvlv