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






4.64/5 (5投票s)
查看线性方程或分数问题的中间步骤

不仅仅是一个计算器
这个动态链接库包含了你在任何专门用于线性方程或分数的 classMath
中会找到的所有常用函数。 除了进行算术运算并为你输出答案之外,这个花哨的小玩意还可以成为一个有用的学习工具。 例如,如果你正在学习线性方程并正在努力解决高斯-约旦消元法问题,那么查看答案并不一定能帮助你。 你需要的是解决方案,因为虽然一些教科书/老师可能会为你提供答案,但他们并不总是告诉你如何获得它。 这正是这个程序所做的。 使用此工具,你可以查看解决问题所需的中间步骤,就像你的老师在黑板上解题一样(除了前面那个自以为是的人,他一直看着你并嘲笑你,因为他已经解决了这个问题)。
使用计算器
testClassMath
应用程序可以很容易地被称为“矩阵方程计算器”,它的工作方式就像你在市场上找到的任何其他程序一样。 有两个输入文本框,A 和 B,以及右侧的结果文本框。 你可以通过选择你想要的文本框,然后点击右侧运算组框中的按钮,对任何这些文本框的内容进行一元运算,答案将出现在结果文本框中。 将值从一个文本框移动到另一个文本框、文件或内存,是通过所选文本框下方的“移动控件”完成的。 这些控件非常直观,不应该给你带来任何问题。

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

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

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

这里使用的符号是相当标准的,对于任何线性方程的学生来说,应该不难理解。 你可以在这个 3x3 方程矩阵及其答案矩阵中看到逐步的高斯-约旦消元法解。 你会注意到,在底部,解决方案为你清楚地拼写出来。 如果有“无限多个解”或“无解”,那么这个方便的工具就会告诉你,这样你就不必再问班级前面的那个家伙了。 由于许多这些解决方案太长而无法在一个屏幕上显示,该程序允许你通过将鼠标移动到屏幕边缘来滚动查看你喜欢的内容。
Using the Code
如果你只想使用这个 mathClass()
来求解矩阵,并且懒得自己编写,那么你会发现它非常方便,而且你不需要再寻找其他工具了。 用户定义类型 udtFraction
和 udtMatrix
如下所示。
在 classFractions
中,你会找到
public struct udtFraction
{
public int numerator;
public int denominator;
}
而 udtMatrix
在 classLinearEquations
中
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 日:首次发布