四则运算运算器(AI不会)

错误代码

#include <stdio.h>
int main()
{
    char s[30];
    int i;
    int sum=s[0]-'0';
    for(i=1;s[i]!='\0';i=i+2)
    {
        switch(s[i])
        {
            case'+':
                sum=sum+s[i+1]-'0';
                break;
            case'-':
                sum=sum-s[i+1]-'0';
                break;
            case'*':
                sum=sum*s[i+1]-'0';
                break;
            case'/':
                if(s[i+1]!=0)
                {
                sum=sum/s[i+1]-'0';
                break;
                }
            }
    }
    printf("%d",sum);
}

正确代码

#include <stdio.h>
#include <ctype.h> // 包含isdigit函数

int main() {
    char expression[1000]; // 假设表达式不会超过1000个字符
    int i = 0;
    char ch;
    
    // 读取整个表达式,直到遇到 '='
    while ((ch = getchar()) != '=') {
        if (i < sizeof(expression) - 1) { // 防止缓冲区溢出
            expression[i++] = ch;
        }
    }
    expression[i] = '\0'; // 字符串结束符

    int result = 0;     // 存储计算结果
    int current_num = 0; // 存储当前读取到的数字
    char operator = '+'; // 初始操作符设为 '+', 这样第一个数会被加到结果中
    int len = 0;
    
    // 计算表达式的长度
    while(expression[len] != '\0') len++;

    i = 0;
    while (i < len) {
        // 跳过空格(虽然题目说没有空格,但为了健壮性可以加上)
        while (i < len && expression[i] == ' ') {
            i++;
        }

        // 读取数字
        current_num = 0;
        int num_start = 0; // 标记是否开始读取数字
        while (i < len && isdigit(expression[i])) {
            num_start = 1;
            current_num = current_num * 10 + (expression[i] - '0');
            i++;
        }
        
        // 如果没有读取到数字(例如表达式以运算符开头或结尾),则报错
        if (!num_start) {
             printf("ERROR\n");
             return 0;
        }

        // 执行上一个操作符对应的运算
        if (operator == '+') {
            result += current_num;
        } else if (operator == '-') {
            result -= current_num;
        } else if (operator == '*') {
            result *= current_num;
        } else if (operator == '/') {
            if (current_num == 0) {
                printf("ERROR\n");
                return 0; // 除法分母为0
            }
            result /= current_num;
        } else {
             printf("ERROR\n"); // 理论上不会到达这里,因为operator在循环中被更新
             return 0;
        }

        // 跳过数字后面的空格
        while (i < len && expression[i] == ' ') {
            i++;
        }

        // 读取下一个操作符
        if (i < len) {
            operator = expression[i];
            // 检查是否为合法的操作符
            if (operator != '+' && operator != '-' && operator != '*' && operator != '/') {
                 printf("ERROR\n");
                 return 0; // 非法运算符
            }
            i++; // 移动到下一个字符
        }
    }

    // 输出结果
    printf("%d\n", result);
    return 0;
}




全部评论

相关推荐

11-27 21:29
已编辑
武汉理工大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务