C# 如何使用多维数组向计算器程序添加历史函数?

C# 如何使用多维数组向计算器程序添加历史函数?,c#,C#,几天前我开始学习C#,现在我正在玩一些简单的程序。目前,我使用Visual Studio 2015制作了一个简单的计算器。我想在我的程序中添加一个历史函数。我希望它通过使用多维数组来存储最近10次计算的历史记录,并允许用户打印其历史记录,但我对此太缺乏经验了。有人能给我指点吗?这将有助于加深我对C#的理解 你可以这样开始。设计一个简单的类来存储历史,它应该包含两个数字和操作。大概是这样的: public class CalculationHistory { public double f

几天前我开始学习C#,现在我正在玩一些简单的程序。目前,我使用Visual Studio 2015制作了一个简单的计算器。我想在我的程序中添加一个历史函数。我希望它通过使用多维数组来存储最近10次计算的历史记录,并允许用户打印其历史记录,但我对此太缺乏经验了。有人能给我指点吗?这将有助于加深我对C#的理解


你可以这样开始。设计一个简单的类来存储历史,它应该包含两个数字和操作。大概是这样的:

public class CalculationHistory
{
    public double firstNumber { get; set; }
    public double secondNumber { get; set; }
    public string stringOperation { get; set; }

    public CalculationHistory(double firstNum, double secondNum, string op)
    {
        firstNumber = firstNum;
        secondNumber = secondNum;
        stringOperation = op;
    }
}
您可能可以维护这些数据的集合,并根据您的要求将它们限制为10或任何其他数字。如果您只想保持有限的迭代次数,那么队列将更适合

Queue<CalculationHistory> history = new Queue<CalculationHistory>();
并可能在某处添加一个条件,检查队列是否超过
n
项,然后根据需要检查
.Dequeue()

PS:在您的代码中,您可能希望像这样组合
case
语句,而不是为同一操作使用单独的语句

case "+":
case "addition":
    result = firstNumber + secondNumber;
    Console.WriteLine(firstNumber + " + " + secondNumber + " = " + result);
    break;

你可以这样开始。设计一个简单的类来存储历史,它应该包含两个数字和操作。大概是这样的:

public class CalculationHistory
{
    public double firstNumber { get; set; }
    public double secondNumber { get; set; }
    public string stringOperation { get; set; }

    public CalculationHistory(double firstNum, double secondNum, string op)
    {
        firstNumber = firstNum;
        secondNumber = secondNum;
        stringOperation = op;
    }
}
您可能可以维护这些数据的集合,并根据您的要求将它们限制为10或任何其他数字。如果您只想保持有限的迭代次数,那么队列将更适合

Queue<CalculationHistory> history = new Queue<CalculationHistory>();
并可能在某处添加一个条件,检查队列是否超过
n
项,然后根据需要检查
.Dequeue()

PS:在您的代码中,您可能希望像这样组合
case
语句,而不是为同一操作使用单独的语句

case "+":
case "addition":
    result = firstNumber + secondNumber;
    Console.WriteLine(firstNumber + " + " + secondNumber + " = " + result);
    break;

@degant的回答引出了正确的解决方案,特别是从面向对象的角度

但是,由于您似乎对使用阵列实现问题感兴趣,因此这里有一个非常简单的示例,不考虑效率或性能

//要维护的历史表达式数
静态只读int MAX_HISTORY=10;
//将历史记录分配为对象数组(即任何对象)。
//这使得存储多种类型(双精度、字符串等)变得很容易。
静态对象[][]历史记录=新对象[最大历史记录][];
//跟踪历史记录中*有效*表达式的数量。
静态int historyCount=0;
//给历史添点什么
静态void historyAdd(双a、字符串op、双b)
{
//确保historyCount从未超过最大历史记录
historyCount=Math.Min(historyCount+1,MAX\u HISTORY);
//将所有表达式移到1上,为新表达式腾出空间。
//如果数组已满,则删除最旧的表达式。
复制(历史,0,历史,1,historyCount-1);
//创建一个1x3数组以将表达式保存在插槽0中,
//它是由前面的数组移位保留的
历史记录[0]=新对象[3];
历史[0][0]=a;
历史[0][1]=op;
历史[0][2]=b;
//进行上述操作的速记:历史[0]=新对象[]{a,op,b};
}
//演示历史
静态void Main(字符串[]参数)
{
随机r=新随机();
对于(变量i=0;i<20;i++)
历史添加(r.NextDouble(),“+”,r.NextDouble());
控制台。WriteLine(“历史:”);
for(int i=0;i

请注意,这是我通常避免使用的方法。

@degant的回答给出了正确的解决方案,特别是从面向对象的角度

但是,由于您似乎对使用阵列实现问题感兴趣,因此这里有一个非常简单的示例,不考虑效率或性能

//要维护的历史表达式数
静态只读int MAX_HISTORY=10;
//将历史记录分配为对象数组(即任何对象)。
//这使得存储多种类型(双精度、字符串等)变得很容易。
静态对象[][]历史记录=新对象[最大历史记录][];
//跟踪历史记录中*有效*表达式的数量。
静态int historyCount=0;
//给历史添点什么
静态void historyAdd(双a、字符串op、双b)
{
//确保historyCount从未超过最大历史记录
historyCount=Math.Min(historyCount+1,MAX\u HISTORY);
//将所有表达式移到1上,为新表达式腾出空间。
//如果数组已满,则删除最旧的表达式。
复制(历史,0,历史,1,historyCount-1);
//创建一个1x3数组以将表达式保存在插槽0中,
//它是由前面的数组移位保留的
历史记录[0]=新对象[3];
历史[0][0]=a;
历史[0][1]=op;
历史[0][2]=b;
//进行上述操作的速记:历史[0]=新对象[]{a,op,b};
}
//演示历史
静态void Main(字符串[]参数)
{
随机r=新随机();
对于(变量i=0;i<20;i++)
历史添加(r.NextDouble(),“+”,r.NextDouble());
控制台。WriteLine(“历史:”);
for(int i=0;i

请注意,这是我通常避免使用的方法。

您能解释一下为什么您觉得多维数组特别适合此任务吗?你是否愿意考虑他们不是的可能性?你尝试过什么?我看不到任何情况下的内存选项。您想要存储的值到底是什么?为什么要存储