2016-06-18 12 views
0
 Console.Write ("How many students do you have?: "); 
     student = Convert.ToInt32 (Console.ReadLine()); 

     int[] numberOfStudents = new int[student]; 

     for (int i = 1; i <= numberOfStudents.Length; i++) { 
      Console.Write ($"Enter student {i}'s current grade: "); 
      numberOfStudents [i] = Convert.ToInt16 (Console.ReadLine()); 
     } 

     int sum = 0; 
     for(int i = 0; i < numberOfStudents.Length; i++) 
     { 
      sum += numberOfStudents[i]; 
     } 

     average = sum/numberOfStudents.Length; 

     Console.WriteLine ($"Your student average is {average}."); 
     Console.ReadLine(); 

基本的に、ユーザーは学生の数を入力し、それによって配列の長さが決まります。 forループは、後で平均が計算されるすべてのマークを集めます。c#マークの平均計算問題

の長さが5の場合、forループが5回目になると生徒のマークが尋ねられますが、合計を取得して平均を計算する代わりに入力すると、system.indexoutofrangeエラー。

ありがとうございました!

+1

配列はC#でゼロベースです。 * for * forループ( 'for(int i = 0; i

+0

最初のforループは1から始まります。これをゼロベースに変更する必要があります。 – Yobik

+0

同じ変数を2つの異なる目的で使用しています。あなたは学生数の配列を持っています。各生徒にはグレードの配列が必要です。 2つの配列の長さは異なっていてもよい。あなたのコードをもう一度見てください。 – jdweng

答えて

1

配列はインデックス0で開始するため、最後の値を選択しようとすると、最初のfor-loopは範囲外になります(から変数iが移動するため)。この問題を解決するには

for (int i = 1; i <= numberOfStudents.Length; i++) { 
    // The i variable is starting on 1, loops til the index is greater than 5 (I.E., 6) 
    Console.Write ($"Enter student {i}'s current grade: "); 
    numberOfStudents [i] = Convert.ToInt16 (Console.ReadLine()); 
    // On last fetch the variable i is 6, trying to fetch from array where last index is 5 
    // will make the array throw an exception. 
} 

、あなたはあなたの第二のループ(for (i=0;i<numberOfStudents.Length;i++))でそうであるように、インデックス0とちょうどループその上にループを開始してからの出力に代わり1に出力開始を作るために+1を追加することができますいずれか
または、配列からフェッチする部分を変更して、i - 1をフェッチするだけです。

+2

またはループを0から開始するように初期化する – Li357

+0

はい、あなたは@AndrewLです。 – Jite

+0

私は0でループを開始すると思っていましたが、その後は "Student 0"と書かれていて意味がありません。 @AndrewLしかし、上記の解決策は両方の問題を解決します。 – AlexAgla

6

C#配列の開始インデックスは0ではないので、最初のforループを0で初期化する必要があります。コードは完全に正常に動作します。 以下のコードを試してください:

Console.Write ("How many students do you have?: "); 
    student = Convert.ToInt32 (Console.ReadLine()); 

    int[] numberOfStudents = new int[student]; 

    for (int i = 0; i <= numberOfStudents.Length; i++) { 
     Console.Write ($"Enter student {i+1}'s current grade: "); 
     numberOfStudents [i] = Convert.ToInt16 (Console.ReadLine()); 
    } 

    int sum = 0; 
    for(int i = 0; i < numberOfStudents.Length; i++) 
    { 
     sum += numberOfStudents[i]; 
    } 

    average = sum/numberOfStudents.Length; 

    Console.WriteLine ($"Your student average is {average}."); 
    Console.ReadLine();