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

2

您可以使用Enumerable.Average(TSource)函数之一。

于 2013-11-08T19:37:42.650 回答
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()。我们还将使用新方法重构清除添加输入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";
        }
    }

编辑:数组...呃

应该是有bug

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 回答