65.9K
CodeProject 正在变化。 阅读更多。
Home

一个比只给出答案更给力的数学类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.64/5 (5投票s)

2009 年 8 月 6 日

CPOL

4分钟阅读

viewsIcon

28910

downloadIcon

571

查看线性方程或分数问题的中间步骤

classMath

不仅仅是一个计算器

这个动态链接库包含了你在任何专门用于线性方程或分数的 classMath 中会找到的所有常用函数。 除了进行算术运算并为你输出答案之外,这个花哨的小玩意还可以成为一个有用的学习工具。 例如,如果你正在学习线性方程并正在努力解决高斯-约旦消元法问题,那么查看答案并不一定能帮助你。 你需要的是解决方案,因为虽然一些教科书/老师可能会为你提供答案,但他们并不总是告诉你如何获得它。 这正是这个程序所做的。 使用此工具,你可以查看解决问题所需的中间步骤,就像你的老师在黑板上解题一样(除了前面那个自以为是的人,他一直看着你并嘲笑你,因为他已经解决了这个问题)。

使用计算器

testClassMath 应用程序可以很容易地被称为“矩阵方程计算器”,它的工作方式就像你在市场上找到的任何其他程序一样。 有两个输入文本框,A 和 B,以及右侧的结果文本框。 你可以通过选择你想要的文本框,然后点击右侧运算组框中的按钮,对任何这些文本框的内容进行一元运算,答案将出现在结果文本框中。 将值从一个文本框移动到另一个文本框、文件或内存,是通过所选文本框下方的“移动控件”完成的。 这些控件非常直观,不应该给你带来任何问题。

classMath

在上图中,用户已将两个分数 8/12 和 4/8 输入到输入框 A 和 B 中,然后进行了加法运算,结果显示在结果文本框中,为 7/6。 单击运算组框中的“显示解决方案”按钮,您将得到以下结果

classMath

矩阵计算以类似的方式完成,但需要以确切的格式输入矩阵。 具体来说,所有条目都是整数或分数,用逗号分隔,并且每行必须有相同数量的条目。 示例如下

classMath

结果文本框显示了输入 A 的“解增广矩阵”的答案,即:存在一个精确的解,其中 X1=2,X2=0,X3=-1。 结果的解释可能不容易阅读,使用矩阵和矩阵计算器的一部分涉及一些关于如何阅读答案的知识,但使用“显示解决方案”按钮,你可以查看以下内容

classMath

这里使用的符号是相当标准的,对于任何线性方程的学生来说,应该不难理解。 你可以在这个 3x3 方程矩阵及其答案矩阵中看到逐步的高斯-约旦消元法解。 你会注意到,在底部,解决方案为你清楚地拼写出来。 如果有“无限多个解”或“无解”,那么这个方便的工具就会告诉你,这样你就不必再问班级前面的那个家伙了。 由于许多这些解决方案太长而无法在一个屏幕上显示,该程序允许你通过将鼠标移动到屏幕边缘来滚动查看你喜欢的内容。

Using the Code

如果你只想使用这个 mathClass() 来求解矩阵,并且懒得自己编写,那么你会发现它非常方便,而且你不需要再寻找其他工具了。 用户定义类型 udtFractionudtMatrix 如下所示。

classFractions 中,你会找到

public struct udtFraction
    {
        public int numerator;
        public int denominator;
    }

udtMatrixclassLinearEquations

public struct udtMatrix
    {
        public udtMatrixRow[] rows;
        public enuLinearEquationTypeSolution typeSolution;
        public classFractions.udtFraction[] uniqueSolution;
        public bool augmentedMatrix;
    }
public struct udtMatrixRow
    { public classFractions.udtFraction[] elements;}

这些是完成所有操作的基本构建块。 在分数的方面,事情很清楚,至于矩阵,你可能需要在用它之前思考一下,因为你会注意到有数组,这些数组需要在你使用它们之前调整大小和初始化。 这些类具有在分数/字符串或矩阵/字符串之间转换的函数,你可能会发现更容易处理。 至于实例化类本身,再简单不过了

classMath cLibMath = new classMath();

如果我们看一下“乘法”按钮的事件处理程序,你就会了解如何调用这些函数

void lblOp_Multiply_Click(object sender, EventArgs e)
{
 switch ((TabIndices)MathFolder.SelectedIndex)
 {
 case TabIndices.LinearEquations:
  txtResult.Text = cLibMath.cLibLinearEquations.convertMatrixToString(
         cLibMath.cLibLinearEquations.matrixMultiplication(
               cLibMath.cLibLinearEquations.convertStringToMatrix(
                                             txtInput_A.Text.ToString()
                                                                  ),
               cLibMath.cLibLinearEquations.convertStringToMatrix(
                                             txtInput_B.Text.ToString()
                                                                  ),
               true
                                                          )
                                                                      );
  lblOp_ShowSolution.Visible = true;
  break;

 case TabIndices.Fractions:
  txtResult.Text = cLibMath.cLibFractions.getStringFromFraction(
   cLibMath.cLibFractions.multiplyFractions(
     cLibMath.cLibFractions.getFractionFromString(txtInput_A.Text.ToString()),
     cLibMath.cLibFractions.getFractionFromString(txtInput_B.Text.ToString()),
     true 
                                            )
                                                                );
  lblOp_ShowSolution.Visible = true;
  break;
 }            
}

许多程序员会发现这些行特别难看,所以让我为你分解其中一部分。 假设我们要重写“一行代码”(实际上在 IDE 中占用了 10 行)在 TabIndices.LinearEquations 的情况下,其中 txtResults.Text 被赋值,读作如下

// convert the text in txtInputA into a matrix 
classLinearEquations.udtMatrix udrMatrixA = 
  cLibMath.cLibLinearEquations.convertStringToMatrix(txtInput_A.Text.ToString());

// convert the text in txtInputB into another matrix
classLinearEquations.udtMatrix udrMatrixB = 
  cLibMath.cLibLinearEquations.convertStringToMatrix(txtInput_B.Text.ToString());

// multiply these two matrices and write the result into a third matrix
classLinearEquations.udtMatrix udrMatrixResult = 
  cLibMath.cLibLinearEquations.matrixMultiplication(udrMatrixA, udrMatrixB, true);

// convert the result matrix into a string and assign it to txtResult
txtResult.Text = cLibMath.cLibLinearEquations.convertMatrixToString(udrMatrixResult);

对于你们大多数人来说,这可能更容易理解,但我仍然更喜欢我的方式。

你应该注意的最后一件事是 formSolution 的事件处理程序...

void formSolution_Disposed(object sender, EventArgs e)
{
 lblOp_ShowSolution.Visible = false;
 formSolution = new Form();
 formSolution.Disposed += new EventHandler(formSolution_Disposed);
}

...以及 formMath() 中的最后两行代码

formSolution = new Form();
formSolution.Disposed += new EventHandler(formSolution_Disposed);

暂时就这样了……

历史

  • 2009 年 8 月 6 日:首次发布
© . All rights reserved.