用C语言写个简单计算器
问题描述
我想用C语言写一个简单的计算器,能算加减乘除就行。能处理整数运算,有基本的错误提示就够了。
思路
- 用
printf显示菜单 - 用
scanf获取用户输入 - 用
switch判断用户选择哪种运算 - 用
if-else处理除数为零的情况 - 用
do-while循环让用户可以连续计算
遇到的问题
scanf输入数字后按回车,下次输入字符时会出错- 不知道怎么写循环菜单
- 除法结果如果是小数怎么办
如何求助AI解决
当我遇到问题时,我按照"AI求助三步法"来寻求帮助:
第一步:自行分析
在向AI提问前,我先自己分析问题:
- 检查代码:我仔细看了一遍代码,发现问题是
scanf输入数字后,按回车键会留下一个换行符,影响下一次输入 - 回顾知识点:我想起老师讲过,
scanf读取字符时会读取缓冲区里的任何字符,包括换行符 - 尝试解决:我试过在
scanf格式字符串前加空格,但不知道具体怎么写 - 明确问题:我已经知道是缓冲区问题,但不知道具体怎么清空缓冲区
第二步:向AI清晰描述问题
当我无法自己解决时,我这样向AI描述问题:
问题描述:
我在用C语言写计算器程序时遇到了问题。程序第一次运行正常,但选择继续计算时,scanf读取字符会出错。
相关代码段:
c
printf("要继续计算吗?(y/n): ");
scanf("%c", &again); // 这里有问题
错误现象:
程序不等待我输入,直接跳过,然后重新显示菜单。
期望结果:
程序应该等待我输入'y'或'n',然后根据选择继续或退出。
实际结果:
程序直接跳过这个输入,继续循环。
我尝试过的解决方法:
- 我在
scanf前加了getchar(),但有时候能解决,有时候不行 - 我试过用
fflush(stdin),但老师说这个方法不好
具体问题:
如何正确清空输入缓冲区,让scanf能正常读取用户的选择?
第三步:反思总结
AI给了我解决方案后,我这样做:
验证解决方案:
AI建议我用scanf(" %c", &again);,在%c前加一个空格。我试了一下,真的可以!
理解原理:
通过问AI和查资料,我理解了:
- %c前的空格会跳过所有空白字符(包括空格、换行符等)
- 这样就能清除上次输入留下的换行符
总结根本原因:
问题的根本原因是输入缓冲区中有残留的换行符,%c会直接读取这个换行符,导致程序不等待用户输入。
记录学习要点:
- 用
scanf读取字符时,要在格式字符串前加空格 - 或者可以用
getchar()先读取换行符,再用scanf读取字符 - 养成好习惯:每次用
scanf读取前,先考虑是否需要清空缓冲区
最终解决方案
下面是完整的代码,非常简单:
c
#include <stdio.h>
int main() {
int choice; // 用户选择
float num1, num2; // 两个数字
float result; // 计算结果
char again; // 是否继续计算
printf("=== 简单计算器 ===\n");
do {
// 显示菜单
printf("\n请选择运算:\n");
printf("1. 加法 (+)\n");
printf("2. 减法 (-)\n");
printf("3. 乘法 (*)\n");
printf("4. 除法 (/)\n");
printf("5. 退出\n");
printf("请输入数字选择:");
scanf("%d", &choice);
// 如果选择退出,直接结束
if(choice == 5) {
printf("谢谢使用!再见!\n");
break;
}
// 如果不是1-4的选项,提示错误
if(choice < 1 || choice > 5) {
printf("错误:请选择1-5的数字!\n");
continue;
}
// 输入两个数字
printf("\n请输入第一个数字:");
scanf("%f", &num1);
printf("请输入第二个数字:");
scanf("%f", &num2);
// 根据选择进行计算
switch(choice) {
case 1: // 加法
result = num1 + num2;
printf("\n%.2f + %.2f = %.2f\n", num1, num2, result);
break;
case 2: // 减法
result = num1 - num2;
printf("\n%.2f - %.2f = %.2f\n", num1, num2, result);
break;
case 3: // 乘法
result = num1 * num2;
printf("\n%.2f * %.2f = %.2f\n", num1, num2, result);
break;
case 4: // 除法
// 检查除数是否为零
if(num2 == 0) {
printf("\n错误:除数不能为零!\n");
} else {
result = num1 / num2;
printf("\n%.2f / %.2f = %.2f\n", num1, num2, result);
}
break;
}
// 询问是否继续
printf("\n要继续计算吗?(y/n): ");
scanf(" %c", &again); // 注意%c前面有个空格,用来跳过换行符
} while(again == 'y' || again == 'Y');
printf("\n谢谢使用简单计算器!\n");
return 0;
}
运行效果
text
=== 简单计算器 ===
请选择运算:
1. 加法 (+)
2. 减法 (-)
3. 乘法 (*)
4. 除法 (/)
5. 退出
请输入数字选择:1
请输入第一个数字:5
请输入第二个数字:3
5.00 + 3.00 = 8.00
要继续计算吗?(y/n): y
更简单的版本(只做加减乘除)
如果觉得上面还是太复杂,这里有个更简单的:
c
#include <stdio.h>
int main() {
float a, b;
char op;
printf("简单计算器(输入格式:数字 运算符 数字)\n");
printf("支持运算符:+ - * /\n");
printf("示例:5 + 3\n");
printf("输入 q 退出\n\n");
while(1) {
printf("输入表达式:");
// 读取输入
if(scanf("%f %c %f", &a, &op, &b) != 3) {
break; // 输入错误或输入q时退出
}
// 计算结果
switch(op) {
case '+':
printf("结果:%.2f + %.2f = %.2f\n\n", a, b, a + b);
break;
case '-':
printf("结果:%.2f - %.2f = %.2f\n\n", a, b, a - b);
break;
case '*':
printf("结果:%.2f * %.2f = %.2f\n\n", a, b, a * b);
break;
case '/':
if(b == 0) {
printf("错误:除数不能为零!\n\n");
} else {
printf("结果:%.2f / %.2f = %.2f\n\n", a, b, a / b);
}
break;
default:
printf("错误:不支持的运算符!\n\n");
break;
}
}
printf("程序结束!\n");
return 0;
}
使用说明
- 把代码保存为
calculator.c - 打开命令行(Windows用cmd,Mac/Linux用终端)
- 输入
gcc calculator.c -o calculator编译 - 输入
./calculator(Mac/Linux)或calculator.exe(Windows)运行
反思与总结
- 学习"AI求助三步法"很有效:先自己分析,再清晰描述问题,最后总结反思。这样求助AI,能得到更好的答案。
- 自己先分析很重要:尝试自己解决问题,即使没解决,也能更清楚问题在哪。这样问AI时,问题描述更准确。
- 描述问题要具体:不要只说"我的代码不行",要说清楚错误现象、相关代码、期望结果和实际结果。
- 理解原理是关键:得到答案后,要理解为什么这个答案能解决问题,这样才能真正学会。
- 记录学习要点:把学到的东西记下来,下次遇到类似问题就能自己解决。
这个简单计算器虽然功能不多,但包含了C语言编程的基本要素。学会了这个,就可以慢慢添加更多功能,比如:
- 支持更多运算(取余数、平方、开方)
- 记住上一次的计算结果
- 支持连续计算(5 + 3 + 2)
- 有更好的界面(用
*号画个框)