2017-02-09 5 views
0

私は3つのテキストボックス(名前入力用、グレード入力用、グレード出力用)を含むGUIを使用してプログラムを作成しています。名前/等級を対応する配列に追加します.1つは入力したばかりの名前とグレードだけを表示し、1つは最も低いグレードを表示し、もう1つは最高グレードを表示し、もう1つはクラス平均を表示します。C#で配列と平均を使用してプログラムを書く

私はフォームを設計しましたが、いくつかのコードで助けが必要です。グレードには2つの配列があり、名前には最初に5つの値が格納されています。 、最低/最高グレード継続的に出力することが可能でありながら、いつでもユーザーがクリック

namespace WindowsFormsApplication3 
{ 
using static System.Console; 
public partial class highestGrade : Form 
{ 
    int[] grade = new int[] { 90, 80, 60, 70, 80, }; 
    string[] name = new string[] { "Sally", "Joe", "Sue", "Pete", "Tom", }; 
    double sum = 0; 
    double average; 
    int x = 4; 
    int y = 4; 
    int z = 0; 
    public highestGrade() 
    { 
     InitializeComponent(); 
    } 

    private void label1_Click(object sender, EventArgs e) 
    { 

    } 

    private void label2_Click(object sender, EventArgs e) 
    { 

    } 

    private void addStudent_Click(object sender, EventArgs e) 
    { 
     if (x <= 9) 
     { 
      Array.Sort(grade, name); 
      name[x] = textBox1.Text; 
      grade[x] = Convert.ToInt32(textBox2.Text); 
      sum = sum + grade[x]; 
      textBox1.Text = string.Empty; 
      textBox2.Text = string.Empty; 
     } 


    } 

    private void display_Click(object sender, EventArgs e) 
    { 
     outputText.Visible = true; 
     outputText.Text = textBox1.Text + " " + textBox2.Text; 
    } 

    private void lowestGrade_Click(object sender, EventArgs e) 
    { 
     Array.Sort(grade, name); 
     outputText.Visible = true; 
     outputText.Text = name[z] + " " + grade[z]; 
    } 

    private void button4_Click(object sender, EventArgs e) 
    { 

     Array.Sort(grade, name); 
     outputText.Visible = true; 
     outputText.Text = name[y] + " " + grade[y]; 

    } 

    private void averageGrade_Click(object sender, EventArgs e) 
    { 

     for (int y = 0; y < 5; y++) 
     { 
      sum = sum + grade[y]; 
     } 
     average = sum/grade.Length; 
     string avgOutput = Convert.ToString(average); 
     outputText.Visible = true; 
     outputText.Text = "Class Average: " + avgOutput; 
     y++; 
     } 

} 
} 

私は10人の学生にグレード/名の入力を取るためのプログラムが必要になります。ここに私はこれまで持っているコードです。また、ユーザーがクリックするたびに連続的に合計平均を出力する必要があります。

平均値が正しく計算されていないため、平均ボタンをクリックするたびに合計に加算され続け、最高のグレード値を保持することができません。たとえば、新しい等級を100と入力してから最高級をクリックすると、その等級が表示されます。しかし、次の成績で95を入力すると、100を95に置き換えます。

何か助けていただければ幸いです。

+0

https://www.dotnetperls.com/averageを試してください。一番低いものから最高のものまで並べ替えて、配列の最初か最後を取得してください.... – Trey

+0

リストに切り替えるほうがよいでしょう。 ' –

答えて

2

あなたは正しく平均値を計算するために、再度グレードを追加する前に、現在のsumをリセットする必要があります。

private void averageGrade_Click(object sender, EventArgs e) { 

    sum = 0; // reset sum 

    for (int y = 0; y < 5; y++) { 
     sum = sum + grade[y]; 
    } 
    average = sum/grade.Length; 
    string avgOutput = Convert.ToString(average); 
    outputText.Visible = true; 
    outputText.Text = "Class Average: " + avgOutput; 
} 

あなたはまた、合計値や平均値を計算するforループ書く必要LINQを使用することはできません。

using System.Linq; 
var sum = grade.Sum(); 
var average = grade.Average(); 

最低/最高グレードの問題は、ボタンをクリックするたびにこれらを計算します。グローバル変数yzを削除してください。あなたはまた、コレクションのまたはLINQ .Min().Max()メソッドを使用してソートを必要とせずに最初または最後の要素にアクセスするためのLINQ .First().Last()を使用することができます

private void lowestGrade_Click(object sender, EventArgs e) { 
    // this probably only needs to be sorted if a value is added or removed (addStudent_Click)   
    Array.Sort(grade, name); 
    outputText.Visible = true; 

    // first element (with index 0) will be the lowest because arrays are sorted now 
    outputText.Text = name[0] + " " + grade[0]; 
} 

+0

クール、それはありがとうございました!!! – CoreyC

関連する問題