1

もう一度、完成できない配列を手に入れました!入力した情報と入力した情報を入力しましたが、クイズグレード全体の平均も出してほしいです。基本的に、クイズの成績を配列に追加するたびに、それらをすべて一緒に追加してから平均を出してほしいと思っています。私は良い考えがなく、この部分を理解できません。誰でも助けてください。すべての助けに感謝します!ありがとう

少し歴史を説明します。このコードは、人の名前と番号と学年を取り、それをすべて配列に追加してから、リスト ボックスに表示します。ただし、配列に配置した成績も平均化する必要がありますが、試したことはありません。以下はコードです。誰かが助けてくれるかもしれません。

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }
    int[] quizGrade = new int[1];
    string[] studentName = new string[1];
    string[] studentNumber = new string[1];
    int numberOfEntries = 0;

    private void button1_Click(object sender, EventArgs e)
    {
        addToArray();
        txtStudentName.Clear();
        txtStudentNumber.Clear();
        txtQuizGrade.Clear();
        addArrayElementsToListbox();
    }
    public void addArrayElementsToListbox()
    {
        listBox1.Items.Clear();
        listBox1.Items.Add("Student Name \t Student Number \t Quiz Grade");
        for (int i = 0; i < studentName.Length; i++)
        {
            listBox1.Items.Add(studentName[i] + "\t" + studentNumber[i] + "\t\t" + quizGrade[i]);
        }
    }
    public void addToArray()
    {
        if (numberOfEntries == 0)
        {
            quizGrade[0] = Convert.ToInt32(txtQuizGrade.Text);
            studentName[0] = txtStudentName.Text;
            studentNumber[0] = txtStudentNumber.Text;
            numberOfEntries += 1;
        }
        else
        {
            numberOfEntries += 1;
            Array.Resize(ref quizGrade, numberOfEntries);
            Array.Resize(ref studentName, numberOfEntries);
            Array.Resize(ref studentNumber, numberOfEntries);
            quizGrade[numberOfEntries - 1] = Convert.ToInt32(txtQuizGrade.Text);
            studentName[numberOfEntries - 1] = txtStudentName.Text;
            studentNumber[numberOfEntries - 1] = txtStudentNumber.Text;
        }
    }
    public void txtAverage_TextChanged(object sender, EventArgs e)
        {
        }

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
        }

    private void ClearButton_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
            txtStudentName.Clear();
            txtStudentNumber.Clear();
            txtQuizGrade.Clear();
            Array.Clear(studentName, 0,studentName.Length);
            Array.Clear(studentNumber, 0,studentNumber.Length);
            Array.Clear(quizGrade, 0,quizGrade.Length);
        }

}

}

4

3 に答える 3

1

Foreach ループを実行してすべてを加算し、エントリの数を分割することができます。以下のように。

int total = 0;

foreach(int a in quizGrade)
{
    total = total + a;
}

次に、配列の合計数で割ります。

total = total / numberOfEntries;

そんな感じ。これが役立つことを願っています!

于 2013-11-08T19:43:52.417 に答える
0

まず、成績記録をまとめて複雑さを取り除きましょう。

public class StudentQuizGrade {
    public string StudentName {get; set;}
    public string StudentNumber {get; set;}
    public int QuizGrade {get; set;}
}

配列のサイズを繰り返す際の「自分自身を繰り返さないでください」というエラーを取り除きます。これにより、すでに持っているものを次のように書くことができます

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }
    StudentQuizGrade [] quizGrades = new StudentQuizGrade [0];

    private void button1_Click(object sender, EventArgs e)
    {
        addToArray();
        txtStudentName.Clear();
        txtStudentNumber.Clear();
        txtQuizGrade.Clear();
        addArrayElementsToListbox();
    }
    public void addArrayElementsToListbox()
    {
        listBox1.Items.Clear();
        listBox1.Items.Add("Student Name \t Student Number \t Quiz Grade");
        foreach (StudentQuizGrade quizGrade in quizGrades)
        {
            listBox1.Items.Add(quizGrade.StudentName + "\t" + quizGrade.StudentNumber + "\t\t" + quizGrade.QuizGrade);
        }
    }
    public void addToArray()
    {
        Array.Resize(ref quizGrades, quizGrades.Count + 1);
        quizGrade[quizGrades.Count- 1] = new StudentQuizGrade() {
            QuizGrade = Convert.ToInt32(txtQuizGrade.Text);
            StudentName = txtStudentName.Text;
            StudentNumber = txtStudentNumber.Text;
        }
    }

    public void txtAverage_TextChanged(object sender, EventArgs e)
        {
        }

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
        }

    private void ClearButton_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
            txtStudentName.Clear();
            txtStudentNumber.Clear();
            txtQuizGrade.Clear();
            Array.Clear(quizGrades, 0,quizGrades.Length);
        }

}

次に、配列が変更されたときに起こることの繰り返しをクリーンアップします。これを行うには、配列の内容を変更するたびに発生させるイベントを追加します。通知が必要なものは に追加できQuizGradesChanged、変更されたものquizGradesは を呼び出す必要がありますQuizGradesChanged()。また、新しいメソッド で add 入力をクリアするリファクタリングを行い、clearAddInputs()いくつかの不要なメソッドを削除します。

public delegate void EventHandler();

public partial class Form1 : Form
{
    public event EventHandler QuizGradesChanged;

    public Form1()
    {
        InitializeComponent();
        QuizGradesChanged += addArrayElementsToListbox;
    }
    StudentQuizGrade [] quizGrades = new StudentQuizGrade [0];

    private void button1_Click(object sender, EventArgs e)
    {
        addToArray();
        clearAddInputs();
    }

    private void clearAddInputs()
    {
        txtStudentName.Clear();
        txtStudentNumber.Clear();
        txtQuizGrade.Clear();
    }

    public void addArrayElementsToListbox()
    {
        listBox1.Items.Clear();
        listBox1.Items.Add("Student Name \t Student Number \t Quiz Grade");
        foreach (StudentQuizGrade quizGrade in quizGrades)
        {
            listBox1.Items.Add(quizGrade.StudentName + "\t" + quizGrade.StudentNumber + "\t\t" + quizGrade.QuizGrade);
        }
    }

    public void addToArray()
    {
        Array.Resize(ref quizGrades, quizGrades.Count + 1);
        quizGrade[quizGrades.Count- 1] = new StudentQuizGrade() {
            QuizGrade = Convert.ToInt32(txtQuizGrade.Text);
            StudentName = txtStudentName.Text;
            StudentNumber = txtStudentNumber.Text;
        }
        QuizGradesChanged();
    }

    private void ClearButton_Click(object sender, EventArgs e)
    {
        clearAddInputs();
        Array.Clear(quizGrades, 0,quizGrades.Length);
        QuizGradesChanged();
    }    
}

最後に、クイズの成績の平均を追加できます。recalculateAverage()平均を再計算してコントロールに表示するメソッドがありますtxtAverage

    public Form1()
    {
        InitializeComponent();
        QuizGradesChanged += addArrayElementsToListbox;
        QuizGradesChanged += recalculateAverage
    }

    public void recalculateAverage() {
        if (quizGrades.Count > 0) {
           txtAverage.Text = quizGrades.Select(x => (decimal) x.QuizGrade).Average().ToString();
        } else {
           txtAverage.Text = "No grades to average";
        }
    }

編集:配列...うーん

おそらくバグがある

private void ClearButton_Click(object sender, EventArgs e)
{
    clearAddInputs();
    Array.Clear(quizGrades, 0,quizGrades.Length);
    QuizGradesChanged();
}

これが正しく機能することをより確信しています:

private void ClearButton_Click(object sender, EventArgs e)
{
    clearAddInputs();
    quizGrades = new StudentQuizGrade[0];
    QuizGradesChanged();
}
于 2013-11-08T20:01:45.080 に答える