项目1 - 控制台计算器
嗨,朋友!我是长安。
欢迎来到第一个实战项目!我们要做一个控制台计算器,可以进行加减乘除运算。这个项目会帮你巩固基础语法,学会处理用户输入和异常处理。
🎯 项目需求
功能列表
- 支持加、减、乘、除四种基本运算
- 可以连续计算
- 输入错误时给出提示
- 可以随时退出
运行效果
===== 简易计算器 =====
请输入第一个数字:10
请输入运算符(+、-、*、/):+
请输入第二个数字:5
结果:10 + 5 = 15
是否继续计算?(y/n): y
请输入第一个数字:20
...
🤔 需求分析
在开始写代码之前,我们先分析一下需要做什么:
输入处理
- 接收用户输入的两个数字
- 接收用户输入的运算符
- 验证输入是否合法
计算逻辑
- 根据运算符执行对应的运算
- 处理除数为0的情况
输出结果
- 格式化输出计算结果
循环控制
- 询问用户是否继续计算
- 用户输入 '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. 添加科学计算功能
支持幂运算、开方、三角函数等。
🚀 扩展功能建议
完成基本功能后,可以尝试添加:
支持更多运算
- 求余数(%)
- 幂运算(^)
- 开方(√)
支持表达式计算
- 一次性输入完整表达式:
10 + 5 * 2 - 支持括号优先级
- 一次性输入完整表达式:
保存历史记录到文件
- 退出时保存历史记录
- 启动时加载历史记录
美化界面
- 使用颜色区分不同类型的输出
- 添加边框和图标
支持单位转换
- 长度、重量、温度等单位转换
🎯 练习任务
基础任务:完整实现版本2的代码,确保所有功能正常
进阶任务:在版本2的基础上,添加求余数运算
挑战任务:实现版本3,添加历史记录功能
超级挑战:实现表达式计算,支持
(1 + 2) * 3 - 4 / 2
📝 项目小结
恭喜你完成了第一个项目!通过这个项目,你应该:
- ✅ 掌握了如何处理用户输入
- ✅ 学会了使用方法组织代码
- ✅ 理解了异常处理的重要性
- ✅ 熟练使用了基本语法和控制流程
- ✅ 体验了从需求到实现的完整过程
🎯 下一步
完成计算器项目后,下一个项目我们要做一个"待办事项管理"应用,学习如何使用集合管理数据,并实现数据持久化!
💪 自我检测
- [ ] 能够独立实现基本的四则运算
- [ ] 知道如何处理除数为0的情况
- [ ] 会使用 try-catch 捕获异常
- [ ] 能够把功能封装成独立的方法
- [ ] 理解程序的循环控制流程
第一个项目完成了!是不是很有成就感?继续加油!💪
