C语言——计算器

53 阅读6分钟

用C语言写个简单计算器

问题描述

我想用C语言写一个简单的计算器,能算加减乘除就行。能处理整数运算,有基本的错误提示就够了。

思路

  1. printf显示菜单
  2. scanf获取用户输入
  3. switch判断用户选择哪种运算
  4. if-else处理除数为零的情况
  5. do-while循环让用户可以连续计算

遇到的问题

  1. scanf输入数字后按回车,下次输入字符时会出错
  2. 不知道怎么写循环菜单
  3. 除法结果如果是小数怎么办

如何求助AI解决

当我遇到问题时,我按照"AI求助三步法"来寻求帮助:

第一步:自行分析

在向AI提问前,我先自己分析问题:

  • 检查代码:我仔细看了一遍代码,发现问题是scanf输入数字后,按回车键会留下一个换行符,影响下一次输入
  • 回顾知识点:我想起老师讲过,scanf读取字符时会读取缓冲区里的任何字符,包括换行符
  • 尝试解决:我试过在scanf格式字符串前加空格,但不知道具体怎么写
  • 明确问题:我已经知道是缓冲区问题,但不知道具体怎么清空缓冲区

第二步:向AI清晰描述问题

当我无法自己解决时,我这样向AI描述问题:

问题描述:
我在用C语言写计算器程序时遇到了问题。程序第一次运行正常,但选择继续计算时,scanf读取字符会出错。

相关代码段:

c

printf("要继续计算吗?(y/n): ");
scanf("%c", &again);  // 这里有问题

错误现象:
程序不等待我输入,直接跳过,然后重新显示菜单。

期望结果:
程序应该等待我输入'y'或'n',然后根据选择继续或退出。

实际结果:
程序直接跳过这个输入,继续循环。

我尝试过的解决方法:

  1. 我在scanf前加了getchar(),但有时候能解决,有时候不行
  2. 我试过用fflush(stdin),但老师说这个方法不好

具体问题:
如何正确清空输入缓冲区,让scanf能正常读取用户的选择?

第三步:反思总结

AI给了我解决方案后,我这样做:

验证解决方案:
AI建议我用scanf(" %c", &again);,在%c前加一个空格。我试了一下,真的可以!

理解原理:
通过问AI和查资料,我理解了:

  • %c前的空格会跳过所有空白字符(包括空格、换行符等)
  • 这样就能清除上次输入留下的换行符

总结根本原因:
问题的根本原因是输入缓冲区中有残留的换行符,%c会直接读取这个换行符,导致程序不等待用户输入。

记录学习要点:

  1. scanf读取字符时,要在格式字符串前加空格
  2. 或者可以用getchar()先读取换行符,再用scanf读取字符
  3. 养成好习惯:每次用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;
}

使用说明

  1. 把代码保存为calculator.c
  2. 打开命令行(Windows用cmd,Mac/Linux用终端)
  3. 输入gcc calculator.c -o calculator 编译
  4. 输入./calculator(Mac/Linux)或calculator.exe(Windows)运行

反思与总结

  1. 学习"AI求助三步法"很有效:先自己分析,再清晰描述问题,最后总结反思。这样求助AI,能得到更好的答案。
  2. 自己先分析很重要:尝试自己解决问题,即使没解决,也能更清楚问题在哪。这样问AI时,问题描述更准确。
  3. 描述问题要具体:不要只说"我的代码不行",要说清楚错误现象、相关代码、期望结果和实际结果。
  4. 理解原理是关键:得到答案后,要理解为什么这个答案能解决问题,这样才能真正学会。
  5. 记录学习要点:把学到的东西记下来,下次遇到类似问题就能自己解决。

这个简单计算器虽然功能不多,但包含了C语言编程的基本要素。学会了这个,就可以慢慢添加更多功能,比如:

  • 支持更多运算(取余数、平方、开方)
  • 记住上一次的计算结果
  • 支持连续计算(5 + 3 + 2)
  • 有更好的界面(用*号画个框)