0

更新:只要在第 2 类中输入值,唯一显示的结果就是最后输入的结果。例如:如果在 class1 行和 class2 行中输入数据,则仅显示 class2 行的计算。有人可以告诉我为什么会这样吗?

平均分计算器

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace Grade_Point_Average_Calculator
{
    public partial class GPA_Calculator : Form
    {
        SaveFileDialog saveFileDialog1;

        public GPA_Calculator()
        {
            InitializeComponent();
        }

        private void GPA_Calculator_FormClosed(object sender, FormClosedEventArgs e)
        {
            Application.Exit();
        }


        //  Closes application after exitToolStripMenuItem_Click
        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }


        // Displays information about the application version number and creator
        private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Version 1.0., "About");
        }

        private void calculateBtn_Click(object sender, EventArgs e)
        {
            int maskbox1, maskbox2, maskbox3, maskbox4, maskbox5, maskbox6;

        CalculatorLogics oCalculatorLogics1 = new CalculatorLogics(this);
        oCalculatorLogics1.SelectedGrade = double.Parse(comboBox1.SelectedValue.ToString());
        if (!int.TryParse(maskedTextBox1.Text, out maskbox1))
        {
            maskbox1 = 0; // Assign zero is parse fails
        }
        else 
        {
            oCalculatorLogics1.CourseCredit = int.Parse(maskedTextBox1.Text);
        }
        oCalculatorLogics1.performGpaCalculations();
        answerLabel.Text = oCalculatorLogics1.CalcGrade.ToString();


        CalculatorLogics oCalculatorLogics2 = new CalculatorLogics(this);
        oCalculatorLogics2.SelectedGrade =            double.Parse(comboBox2.SelectedValue.ToString());
        if (!int.TryParse(maskedTextBox2.Text, out maskbox1))
        {
            maskbox2 = 0; // Assign zero is parse fails
        }
        else
        {
            oCalculatorLogics2.CourseCredit = int.Parse(maskedTextBox2.Text);
        }
        oCalculatorLogics2.performGpaCalculations();
        answerLabel.Text = oCalculatorLogics2.CalcGrade.ToString();

        }
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Grade_Point_Average_Calculator
{
    class CalculatorLogics
    {

        private double grade;
        private double gradeValue;
        private double calculateGrades;
        private int credits;
        private GPA_Calculator _GPA_Calculator;

        // Pass form to CalculatorLogics constructor
        public CalculatorLogics(GPA_Calculator theGPA_Calculator)
        {
            _GPA_Calculator = theGPA_Calculator;
        }

        public double SelectedGrade 
        {
            get { return grade; }
            set { grade = value; }
        }

        public int CourseCredit 
        {
            get { return credits; }
            set { credits = value; }
        }

        public double CalcGrade 
        {
            get 
            {
            return calculateGrades; 
            }
        }

        public void performGpaCalculations() 
        {
            gradeVal = grade * credits;
            totalCredits += credits; // Add the amount of credits
            totalGradeValue += gradeVal;

            calculateGrades = totalGradeValue/totalCredits; // Calculates gpa
            return calculateGrades;
        }
    }
}
4

2 回答 2

2

正如代码所示,您的问题是您没有performGpaCalculations()在类中调用该方法,CalculatorLogics这导致calculateGradesCalcGrade属性返回的值是默认值 a double(0.0)。

您需要performGpaCalculations()在代码中调用该方法,如下所示:

private void calculateBtn_Click(object sender, EventArgs e)
{
    CalculatorLogics oCalculatorLogics = new CalculatorLogics();
    oCalculatorLogics.performGpaCalculations();
    answerLabel.Text = oCalculatorLogics.CalcGrade.ToString();
}

这将允许CalcGrade类确定 的值calculateGrades

更新:

但是您真正的问题是您正在实例化表单类的新实例GPA_Calculator,这会破坏用户选择的值。

相反,您需要将GPA_Calculator表单类的实例传递给类的构造函数CalculatorLogics,如下所示:

public CalculatorLogics(GPA_Calculator theGPA_Calculator)
{

}

现在您的表单正在传递给构造函数,您需要在某个地方存储它以便CalculatorLogics类可以使用它,这是您的CalculatorLogics类的重写以支持这一点:

public class CalculatorLogics
{
    private double grade;
    private double gradeValue;
    private double calculateGrades;
    private int credits;
    private GPA_Calculator _GPA_Calculator;

    public CalculatorLogics(GPA_Calculator theGPA_Calculator)
    {
        _GPA_Calculator = theGPA_Calculator;
    }

    public double SelectedGrade 
    {
        get { return grade; }
        set { grade = value; }
    }

    public int CourseCredit 
    {
        get { return credits; }
        set { credits = value; }
    }

    public double CalcGrade 
    {
        get 
        {
        return calculateGrades; 
        }
    }

    public void performGpaCalculations() 
    {
        const double grade_A = 4.00;
        const double grade_A_minus = 3.67;
        const double grade_B_plus = 3.33;
        const double grade_B = 3.00;
        const double grade_B_minus = 2.67;
        const double grade_C_plus = 2.33;
        const double grade_C = 2.00;
        const double grade_C_minus = 1.67;
        const double grade_D = 1.33;
        const double grade_F = 0.00;

        switch (_GPA_Calculator.comboBox1.SelectedItem.ToString()) 
        {
            case "A":
                gradeValue = grade_A;
                break;
            case "A-":
                gradeValue = grade_A_minus;
                break;
            case "B+":
                gradeValue = grade_B_plus;
                break;
            case "B":
                gradeValue = grade_B;
                break;
            case "B-":
                gradeValue = grade_B_minus;
                break;
            case "C+":
                gradeValue = grade_C_plus;
                break;
            case "C":
                gradeValue = grade_C;
                break;
            case "C-":
                gradeValue = grade_C_minus;
                break;
            case "D":
                gradeValue = grade_D;
                break;
           case "F":
                gradeValue = grade_F;
                break;
        }
        calculateGrades = gradeValue * credits;
    }
}

最后,当您实例化您的CalculatorLogics类时,您需要传递对您所在表单的引用,如下所示:

CalculatorLogics oCalculatorLogics = new CalculatorLogics(this);

注意:this是指向类本身的指针,在本例中为GPA_Calculator表单。

于 2013-07-31T17:15:34.367 回答
1

要获得组合框的选定值,仅创建表单类的新实例是没有帮助的。

相反,您可以将当前表单传递给方法,例如:

public void performGpaCalculations(GPA_Calculator form)

或者最好只传递所选项目的列表:

public void performGpaCalculations(int[] selectedValues)

int[] 因为我建议您不要使用组合框的 selectedItem 而是 selectedIndex 并创建一个静态等级数组

double[] grades = {4.00, 3.67, // ...

所以你不需要那个开关。

更新:好的,上面的答案已用我写的内容进行了更新,所以我的答案将不再有帮助......

于 2013-07-31T17:24:40.527 回答