C#实现简单计算器功能的脚本怎么写

发布时间:2022-02-07 15:59:56 作者:iii
来源:亿速云 阅读:194
# C#实现简单计算器功能的脚本怎么写

计算器是编程初学者最经典的练手项目之一。本文将详细介绍如何使用C#语言实现一个具有基础功能的控制台计算器,涵盖从项目搭建到功能实现的完整流程。

## 一、开发环境准备

### 1.1 安装必要工具
首先确保已安装以下开发环境:
- Visual Studio 2022(社区版即可)
- .NET 6.0 SDK或更高版本

### 1.2 创建新项目
1. 打开Visual Studio
2. 选择"创建新项目" > "控制台应用(.NET Core)"
3. 命名为"SimpleCalculator"
4. 选择.NET 6.0作为目标框架

## 二、基础程序结构

我们先建立程序的基本框架:

```csharp
using System;

namespace SimpleCalculator
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("简单计算器 v1.0");
            Console.WriteLine("----------------");
            
            bool continueCalculating = true;
            
            while (continueCalculating)
            {
                try
                {
                    // 计算逻辑将放在这里
                    
                    Console.Write("是否继续计算?(y/n): ");
                    continueCalculating = Console.ReadLine().ToLower() == "y";
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"发生错误: {ex.Message}");
                }
            }
            
            Console.WriteLine("感谢使用计算器!");
        }
    }
}

三、实现核心计算功能

3.1 输入处理

首先添加获取用户输入的方法:

static double GetNumberFromUser(string prompt)
{
    double number;
    Console.Write(prompt);
    while (!double.TryParse(Console.ReadLine(), out number))
    {
        Console.Write("输入无效,请重新输入数字: ");
    }
    return number;
}

3.2 运算符选择

添加运算符选择方法:

static char GetOperatorFromUser()
{
    Console.Write("请选择运算符(+, -, *, /): ");
    char op;
    while (!char.TryParse(Console.ReadLine(), out op) || 
          !(op == '+' || op == '-' || op == '*' || op == '/'))
    {
        Console.Write("无效运算符,请重新输入(+, -, *, /): ");
    }
    return op;
}

3.3 计算逻辑

实现核心计算功能:

static double Calculate(double num1, double num2, char op)
{
    return op switch
    {
        '+' => num1 + num2,
        '-' => num1 - num2,
        '*' => num1 * num2,
        '/' => num2 == 0 ? throw new DivideByZeroException("不能除以零") : num1 / num2,
        _ => throw new InvalidOperationException("未知运算符")
    };
}

四、完整实现代码

将上述方法整合到主程序中:

using System;

namespace SimpleCalculator
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("简单计算器 v1.0");
            Console.WriteLine("----------------");
            
            bool continueCalculating = true;
            
            while (continueCalculating)
            {
                try
                {
                    double num1 = GetNumberFromUser("请输入第一个数字: ");
                    char op = GetOperatorFromUser();
                    double num2 = GetNumberFromUser("请输入第二个数字: ");
                    
                    double result = Calculate(num1, num2, op);
                    Console.WriteLine($"结果: {num1} {op} {num2} = {result}");
                    
                    Console.Write("是否继续计算?(y/n): ");
                    continueCalculating = Console.ReadLine().ToLower() == "y";
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"发生错误: {ex.Message}");
                }
            }
            
            Console.WriteLine("感谢使用计算器!");
        }
        
        static double GetNumberFromUser(string prompt)
        {
            double number;
            Console.Write(prompt);
            while (!double.TryParse(Console.ReadLine(), out number))
            {
                Console.Write("输入无效,请重新输入数字: ");
            }
            return number;
        }
        
        static char GetOperatorFromUser()
        {
            Console.Write("请选择运算符(+, -, *, /): ");
            char op;
            while (!char.TryParse(Console.ReadLine(), out op) || 
                  !(op == '+' || op == '-' || op == '*' || op == '/'))
            {
                Console.Write("无效运算符,请重新输入(+, -, *, /): ");
            }
            return op;
        }
        
        static double Calculate(double num1, double num2, char op)
        {
            return op switch
            {
                '+' => num1 + num2,
                '-' => num1 - num2,
                '*' => num1 * num2,
                '/' => num2 == 0 ? throw new DivideByZeroException("不能除以零") : num1 / num2,
                _ => throw new InvalidOperationException("未知运算符")
            };
        }
    }
}

五、功能扩展

5.1 添加更多运算符

我们可以扩展计算器支持更多运算:

static char GetOperatorFromUser()
{
    Console.Write("请选择运算符(+, -, *, /, %, ^): ");
    char op;
    while (!char.TryParse(Console.ReadLine(), out op) || 
          !(op == '+' || op == '-' || op == '*' || 
            op == '/' || op == '%' || op == '^'))
    {
        Console.Write("无效运算符,请重新输入(+, -, *, /, %, ^): ");
    }
    return op;
}

static double Calculate(double num1, double num2, char op)
{
    return op switch
    {
        '+' => num1 + num2,
        '-' => num1 - num2,
        '*' => num1 * num2,
        '/' => num2 == 0 ? throw new DivideByZeroException("不能除以零") : num1 / num2,
        '%' => num1 % num2,
        '^' => Math.Pow(num1, num2),
        _ => throw new InvalidOperationException("未知运算符")
    };
}

5.2 添加历史记录功能

class CalculationHistory
{
    public double Num1 { get; set; }
    public double Num2 { get; set; }
    public char Operator { get; set; }
    public double Result { get; set; }
    public DateTime Timestamp { get; set; }
}

// 在主类中添加
static List<CalculationHistory> history = new List<CalculationHistory>();

// 修改主循环中的计算部分
double result = Calculate(num1, num2, op);
Console.WriteLine($"结果: {num1} {op} {num2} = {result}");
history.Add(new CalculationHistory
{
    Num1 = num1,
    Num2 = num2,
    Operator = op,
    Result = result,
    Timestamp = DateTime.Now
});

// 添加查看历史的方法
static void ShowHistory()
{
    Console.WriteLine("\n计算历史:");
    Console.WriteLine("----------------");
    foreach (var item in history)
    {
        Console.WriteLine($"[{item.Timestamp:HH:mm:ss}] {item.Num1} {item.Operator} {item.Num2} = {item.Result}");
    }
    Console.WriteLine("----------------\n");
}

5.3 添加菜单系统

static void ShowMenu()
{
    Console.WriteLine("\n菜单选项:");
    Console.WriteLine("1. 开始计算");
    Console.WriteLine("2. 查看历史");
    Console.WriteLine("3. 清除历史");
    Console.WriteLine("4. 退出");
    Console.Write("请选择: ");
}

// 修改主程序结构
static void Main(string[] args)
{
    Console.WriteLine("简单计算器 v1.0");
    
    bool running = true;
    while (running)
    {
        ShowMenu();
        string choice = Console.ReadLine();
        
        switch (choice)
        {
            case "1":
                CalculateMode();
                break;
            case "2":
                ShowHistory();
                break;
            case "3":
                history.Clear();
                Console.WriteLine("历史记录已清除");
                break;
            case "4":
                running = false;
                break;
            default:
                Console.WriteLine("无效选择");
                break;
        }
    }
    
    Console.WriteLine("感谢使用计算器!");
}

static void CalculateMode()
{
    bool continueCalculating = true;
    while (continueCalculating)
    {
        try
        {
            double num1 = GetNumberFromUser("请输入第一个数字: ");
            char op = GetOperatorFromUser();
            double num2 = GetNumberFromUser("请输入第二个数字: ");
            
            double result = Calculate(num1, num2, op);
            Console.WriteLine($"结果: {num1} {op} {num2} = {result}");
            history.Add(new CalculationHistory
            {
                Num1 = num1,
                Num2 = num2,
                Operator = op,
                Result = result,
                Timestamp = DateTime.Now
            });
            
            Console.Write("是否继续计算?(y/n): ");
            continueCalculating = Console.ReadLine().ToLower() == "y";
        }
        catch (Exception ex)
        {
            Console.WriteLine($"发生错误: {ex.Message}");
        }
    }
}

六、错误处理增强

6.1 自定义异常类

class InvalidCalculationException : Exception
{
    public InvalidCalculationException(string message) : base(message) { }
}

// 修改Calculate方法
static double Calculate(double num1, double num2, char op)
{
    try
    {
        return op switch
        {
            '+' => num1 + num2,
            '-' => num1 - num2,
            '*' => num1 * num2,
            '/' => num2 == 0 ? throw new DivideByZeroException("不能除以零") : num1 / num2,
            '%' => num2 == 0 ? throw new InvalidCalculationException("取模运算除数不能为零") : num1 % num2,
            '^' => num1 == 0 && num2 < 0 ? 
                  throw new InvalidCalculationException("零的负指数幂未定义") : Math.Pow(num1, num2),
            _ => throw new InvalidOperationException("未知运算符")
        };
    }
    catch (OverflowException)
    {
        throw new InvalidCalculationException("计算结果超出范围");
    }
}

七、单元测试

为关键功能添加单元测试:

using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class CalculatorTests
{
    [TestMethod]
    public void TestAddition()
    {
        Assert.AreEqual(5, Program.Calculate(2, 3, '+'));
    }
    
    [TestMethod]
    public void TestSubtraction()
    {
        Assert.AreEqual(-1, Program.Calculate(2, 3, '-'));
    }
    
    [TestMethod]
    public void TestMultiplication()
    {
        Assert.AreEqual(6, Program.Calculate(2, 3, '*'));
    }
    
    [TestMethod]
    public void TestDivision()
    {
        Assert.AreEqual(0.5, Program.Calculate(1, 2, '/'));
    }
    
    [TestMethod]
    [ExpectedException(typeof(DivideByZeroException))]
    public void TestDivisionByZero()
    {
        Program.Calculate(1, 0, '/');
    }
}

八、部署与发布

8.1 发布为独立应用

  1. 在Visual Studio中右键项目
  2. 选择”发布”
  3. 选择”文件夹”作为目标
  4. 配置为”独立”应用
  5. 选择目标运行时(如win-x64)
  6. 点击”发布”按钮

8.2 创建安装程序

可以使用Inno Setup等工具创建Windows安装程序。

九、进一步改进方向

  1. 图形界面:使用WPF或WinForms实现GUI版本
  2. 科学计算:添加三角函数、对数等科学计算功能
  3. 表达式解析:支持直接输入复杂表达式如”3+5*2”
  4. 多语言支持:添加国际化支持
  5. 云端同步:将计算历史保存到云端
  6. 移动端适配:使用Xamarin或MAUI开发移动版本

十、总结

本文详细介绍了如何使用C#实现一个功能完整的控制台计算器,包括: - 基础四则运算实现 - 错误处理机制 - 历史记录功能 - 菜单系统 - 单元测试 - 部署发布

这个项目虽然简单,但涵盖了C#编程的许多基础概念,是初学者很好的练习项目。通过不断扩展功能,可以深入学习更多C#和.NET平台的高级特性。

完整项目代码已托管在GitHub: https://github.com/example/simple-calculator “`

推荐阅读:
  1. 使用JavaScript实现简单计算器功能的案例
  2. 怎么使用Python实现简单计算器功能

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

上一篇:JAVA中怎么用for循环打印空心菱形

下一篇:怎么为Xamarin.Forms的导航栏增加搜索功能

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》