C# 完全学习指南C# 完全学习指南
首页
基础教程
进阶内容
实战项目
编程指南
首页
基础教程
进阶内容
实战项目
编程指南
  • 实战项目

    • 🎨 实战项目
    • 项目1 - 控制台计算器
    • 项目2 - 待办事项管理
    • 项目3 - 学生信息管理系统
    • 项目4 - 命令行文件管理器
    • 项目5 - Web API 接口开发

项目1 - 控制台计算器

嗨,朋友!我是长安。

欢迎来到第一个实战项目!我们要做一个控制台计算器,可以进行加减乘除运算。这个项目会帮你巩固基础语法,学会处理用户输入和异常处理。

🎯 项目需求

功能列表

  1. 支持加、减、乘、除四种基本运算
  2. 可以连续计算
  3. 输入错误时给出提示
  4. 可以随时退出

运行效果

===== 简易计算器 =====
请输入第一个数字:10
请输入运算符(+、-、*、/):+
请输入第二个数字:5
结果:10 + 5 = 15

是否继续计算?(y/n): y
请输入第一个数字:20
...

🤔 需求分析

在开始写代码之前,我们先分析一下需要做什么:

  1. 输入处理

    • 接收用户输入的两个数字
    • 接收用户输入的运算符
    • 验证输入是否合法
  2. 计算逻辑

    • 根据运算符执行对应的运算
    • 处理除数为0的情况
  3. 输出结果

    • 格式化输出计算结果
  4. 循环控制

    • 询问用户是否继续计算
    • 用户输入 'n' 时退出

📐 功能设计

1. 程序流程图

开始
  ↓
显示欢迎信息
  ↓
┌─────────────┐
│ 输入数字1   │
│ 输入运算符   │
│ 输入数字2   │
└─────────────┘
  ↓
验证输入 ───→ 不合法 ───→ 提示错误
  ↓ 合法
执行运算
  ↓
显示结果
  ↓
询问是否继续 ──→ 是 ──┐
  ↓ 否               │
结束 ←───────────────┘

2. 需要的方法

  • GetNumber() - 获取用户输入的数字
  • GetOperator() - 获取用户输入的运算符
  • Calculate() - 执行计算
  • DisplayResult() - 显示结果

💻 代码实现

版本1:基础版本

让我们先实现最基本的功能:

using System;

namespace Calculator
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("===== 简易计算器 =====\n");
            
            // 获取第一个数字
            Console.Write("请输入第一个数字:");
            double num1 = double.Parse(Console.ReadLine());
            
            // 获取运算符
            Console.Write("请输入运算符(+、-、*、/):");
            string op = Console.ReadLine();
            
            // 获取第二个数字
            Console.Write("请输入第二个数字:");
            double num2 = double.Parse(Console.ReadLine());
            
            // 执行计算
            double result = 0;
            
            if (op == "+")
            {
                result = num1 + num2;
            }
            else if (op == "-")
            {
                result = num1 - num2;
            }
            else if (op == "*")
            {
                result = num1 * num2;
            }
            else if (op == "/")
            {
                result = num1 / num2;
            }
            else
            {
                Console.WriteLine("无效的运算符!");
                return;
            }
            
            // 显示结果
            Console.WriteLine($"\n结果:{num1} {op} {num2} = {result}");
            
            Console.ReadKey();
        }
    }
}

问题:

  • 输入错误时程序会崩溃
  • 除数为0会出错
  • 不能连续计算
  • 代码重复多

版本2:使用方法优化

using System;

namespace Calculator
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("===== 简易计算器 =====\n");
            
            bool continueCalc = true;
            
            while (continueCalc)
            {
                try
                {
                    // 获取输入
                    double num1 = GetNumber("第一个数字");
                    string op = GetOperator();
                    double num2 = GetNumber("第二个数字");
                    
                    // 执行计算
                    double result = Calculate(num1, op, num2);
                    
                    // 显示结果
                    DisplayResult(num1, op, num2, result);
                    
                    // 询问是否继续
                    continueCalc = AskToContinue();
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"\n错误:{ex.Message}\n");
                }
            }
            
            Console.WriteLine("\n感谢使用!再见!");
        }
        
        // 获取数字输入
        static double GetNumber(string prompt)
        {
            Console.Write($"请输入{prompt}:");
            string input = Console.ReadLine();
            
            if (double.TryParse(input, out double number))
            {
                return number;
            }
            else
            {
                throw new Exception("输入的不是有效的数字!");
            }
        }
        
        // 获取运算符
        static string GetOperator()
        {
            Console.Write("请输入运算符(+、-、*、/):");
            string op = Console.ReadLine();
            
            if (op == "+" || op == "-" || op == "*" || op == "/")
            {
                return op;
            }
            else
            {
                throw new Exception("无效的运算符!");
            }
        }
        
        // 执行计算
        static double Calculate(double num1, string op, double num2)
        {
            switch (op)
            {
                case "+":
                    return num1 + num2;
                case "-":
                    return num1 - num2;
                case "*":
                    return num1 * num2;
                case "/":
                    if (num2 == 0)
                    {
                        throw new Exception("除数不能为0!");
                    }
                    return num1 / num2;
                default:
                    throw new Exception("无效的运算符!");
            }
        }
        
        // 显示结果
        static void DisplayResult(double num1, string op, double num2, double result)
        {
            Console.WriteLine($"\n结果:{num1} {op} {num2} = {result}\n");
        }
        
        // 询问是否继续
        static bool AskToContinue()
        {
            Console.Write("是否继续计算?(y/n): ");
            string answer = Console.ReadLine().ToLower();
            return answer == "y" || answer == "yes";
        }
    }
}

版本3:完整版本(带历史记录)

using System;
using System.Collections.Generic;

namespace Calculator
{
    class Program
    {
        // 用于存储计算历史
        static List<string> history = new List<string>();
        
        static void Main(string[] args)
        {
            Console.WriteLine("===== 简易计算器 =====");
            Console.WriteLine("提示:输入 'h' 查看历史记录,输入 'c' 清除历史记录\n");
            
            bool continueCalc = true;
            
            while (continueCalc)
            {
                try
                {
                    // 获取输入
                    Console.Write("请输入第一个数字(或命令):");
                    string firstInput = Console.ReadLine();
                    
                    // 处理命令
                    if (firstInput.ToLower() == "h")
                    {
                        ShowHistory();
                        continue;
                    }
                    else if (firstInput.ToLower() == "c")
                    {
                        ClearHistory();
                        continue;
                    }
                    
                    // 解析第一个数字
                    if (!double.TryParse(firstInput, out double num1))
                    {
                        throw new Exception("输入的不是有效的数字!");
                    }
                    
                    string op = GetOperator();
                    double num2 = GetNumber("第二个数字");
                    
                    // 执行计算
                    double result = Calculate(num1, op, num2);
                    
                    // 显示结果
                    DisplayResult(num1, op, num2, result);
                    
                    // 保存到历史记录
                    string record = $"{num1} {op} {num2} = {result}";
                    history.Add(record);
                    
                    // 询问是否继续
                    continueCalc = AskToContinue();
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"\n错误:{ex.Message}\n");
                }
            }
            
            Console.WriteLine("\n感谢使用!再见!");
            Console.ReadKey();
        }
        
        // 获取数字输入
        static double GetNumber(string prompt)
        {
            Console.Write($"请输入{prompt}:");
            string input = Console.ReadLine();
            
            if (double.TryParse(input, out double number))
            {
                return number;
            }
            else
            {
                throw new Exception("输入的不是有效的数字!");
            }
        }
        
        // 获取运算符
        static string GetOperator()
        {
            Console.Write("请输入运算符(+、-、*、/):");
            string op = Console.ReadLine();
            
            if (op == "+" || op == "-" || op == "*" || op == "/")
            {
                return op;
            }
            else
            {
                throw new Exception("无效的运算符!请输入 +、-、* 或 /");
            }
        }
        
        // 执行计算
        static double Calculate(double num1, string op, double num2)
        {
            switch (op)
            {
                case "+":
                    return num1 + num2;
                case "-":
                    return num1 - num2;
                case "*":
                    return num1 * num2;
                case "/":
                    if (num2 == 0)
                    {
                        throw new DivideByZeroException("除数不能为0!");
                    }
                    return num1 / num2;
                default:
                    throw new Exception("无效的运算符!");
            }
        }
        
        // 显示结果
        static void DisplayResult(double num1, string op, double num2, double result)
        {
            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine($"\n结果:{num1} {op} {num2} = {result}\n");
            Console.ResetColor();
        }
        
        // 询问是否继续
        static bool AskToContinue()
        {
            Console.Write("是否继续计算?(y/n): ");
            string answer = Console.ReadLine().ToLower();
            Console.WriteLine();
            return answer == "y" || answer == "yes" || answer == "";
        }
        
        // 显示历史记录
        static void ShowHistory()
        {
            Console.WriteLine("\n===== 计算历史 =====");
            if (history.Count == 0)
            {
                Console.WriteLine("暂无历史记录");
            }
            else
            {
                for (int i = 0; i < history.Count; i++)
                {
                    Console.WriteLine($"{i + 1}. {history[i]}");
                }
            }
            Console.WriteLine("===================\n");
        }
        
        // 清除历史记录
        static void ClearHistory()
        {
            history.Clear();
            Console.WriteLine("\n历史记录已清除!\n");
        }
    }
}

🎮 运行演示

===== 简易计算器 =====
提示:输入 'h' 查看历史记录,输入 'c' 清除历史记录

请输入第一个数字(或命令):10
请输入运算符(+、-、*、/):+
请输入第二个数字:5

结果:10 + 5 = 15

是否继续计算?(y/n): y

请输入第一个数字(或命令):20
请输入运算符(+、-、*、/):*
请输入第二个数字:3

结果:20 * 3 = 60

是否继续计算?(y/n): y

请输入第一个数字(或命令):h

===== 计算历史 =====
1. 10 + 5 = 15
2. 20 * 3 = 60
===================

请输入第一个数字(或命令):n

感谢使用!再见!

📚 知识点总结

这个项目用到了以下知识点:

知识点说明
变量和数据类型double、string、bool
运算符算术运算符、比较运算符
控制流程if-else、switch
循环while 循环
方法方法的定义和调用
异常处理try-catch、自定义异常
集合List<T> 存储历史记录
字符串操作字符串插值、ToLower()
控制台输入输出Console.ReadLine()、Console.WriteLine()

💡 代码优化建议

1. 使用枚举定义运算符

enum Operator
{
    Add,
    Subtract,
    Multiply,
    Divide
}

2. 使用策略模式

把每个运算封装成一个类,更易扩展。

3. 添加科学计算功能

支持幂运算、开方、三角函数等。

🚀 扩展功能建议

完成基本功能后,可以尝试添加:

  1. 支持更多运算

    • 求余数(%)
    • 幂运算(^)
    • 开方(√)
  2. 支持表达式计算

    • 一次性输入完整表达式:10 + 5 * 2
    • 支持括号优先级
  3. 保存历史记录到文件

    • 退出时保存历史记录
    • 启动时加载历史记录
  4. 美化界面

    • 使用颜色区分不同类型的输出
    • 添加边框和图标
  5. 支持单位转换

    • 长度、重量、温度等单位转换

🎯 练习任务

  1. 基础任务:完整实现版本2的代码,确保所有功能正常

  2. 进阶任务:在版本2的基础上,添加求余数运算

  3. 挑战任务:实现版本3,添加历史记录功能

  4. 超级挑战:实现表达式计算,支持 (1 + 2) * 3 - 4 / 2

📝 项目小结

恭喜你完成了第一个项目!通过这个项目,你应该:

  • ✅ 掌握了如何处理用户输入
  • ✅ 学会了使用方法组织代码
  • ✅ 理解了异常处理的重要性
  • ✅ 熟练使用了基本语法和控制流程
  • ✅ 体验了从需求到实现的完整过程

🎯 下一步

完成计算器项目后,下一个项目我们要做一个"待办事项管理"应用,学习如何使用集合管理数据,并实现数据持久化!

下一个项目:待办事项管理 →

💪 自我检测

  • [ ] 能够独立实现基本的四则运算
  • [ ] 知道如何处理除数为0的情况
  • [ ] 会使用 try-catch 捕获异常
  • [ ] 能够把功能封装成独立的方法
  • [ ] 理解程序的循环控制流程

第一个项目完成了!是不是很有成就感?继续加油!💪

最近更新: 2025/12/27 14:02
Contributors: 王长安
Prev
🎨 实战项目
Next
项目2 - 待办事项管理