2626991 2024-11-07 18:17 采纳率: 0%
浏览 15
已结题

请教一下写代码,代码好难

img

图片中的链接里面就是要求,请求指教,本人是大一新生,请帮我写一下代码!

  • 写回答

23条回答 默认 最新

  • 叫兽-郭老师 Java领域新星创作者 2024-11-07 18:56
    关注
    获得0.45元问题酬金

    引用豆包,参看下
    以下是实现上述表达式检查功能的C语言代码示例:

    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    
    // 检查标识符是否合法(只含大小写字母)
    int isIdentifierValid(const char *str) {
        if (str == NULL) {
            return 0;
        }
    
        for (int i = 0; i < strlen(str); i++) {
            if (!isalpha(str[i])) {
                return 0;
            }
        }
    
        return 1;
    }
    
    // 检查操作数是否合法(数字或合法标识符)
    int isOperandValid(const char *str) {
        if (str == NULL) {
            return 0;
        }
    
        // 检查是否为数字
        int dotCount = 0;
        for (int i = 0; i < strlen(str); i++) {
            if (isdigit(str[i])) {
                continue;
            } else if (str[i] == '.' && dotCount == 0) {
                dotCount++;
                continue;
            } else if (!isalpha(str[i])) {
                return 0;
            }
        }
    
        // 也可能是合法标识符
        if (!isIdentifierValid(str) && dotCount == 0) {
            return 0;
        }
    
        return 1;
    }
    
    // 检查单目运算符是否合法且位置正确
    int isUnaryOperatorValid(const char *str, const char *operators) {
        if (str == NULL) {
            return 0;
        }
    
        int len = strlen(str);
        if (len == 0) {
            return 0;
        }
    
        // 允许的单目运算符在数字和标识符左侧最多连续出现一个
        if (operators[0] == '+' || operators[0] == '-') {
            if (!isdigit(str[0]) &&!isIdentifierValid(str + 1)) {
                return 0;
            }
        } else {
            if (!isIdentifierValid(str + 1)) {
                return 0;
            }
        }
    
        // 检查是否只包含允许的单目运算符
        for (int i = 0; i < len; i++) {
            if (!strchr(operators, str[i])) {
                return 0;
            }
        }
    
        return 1;
    }
    
    // 检查双目运算符是否合法
    int isBinaryOperatorValid(const char *str) {
        if (str == NULL) {
            return 0;
        }
    
        const char arithmeticOperators[] = "+ - * / % | & ^ >> <<";
        const char relationalOperators[] = "< > <= >= ==!= ";
        const char logicalOperators[] = "&& ||";
    
        if (strchr(arithmeticOperators, str[0])!= NULL) {
            return 1;
        } else if (strchr(relationalOperators, str[0])!= NULL) {
            return 1;
        } else if (strchr(logicalOperators, str[0])!= NULL) {
            return 1;
        }
    
        return 0;
    }
    
    // 根据运算符优先级判断表达式类型
    const char *getExpressionType(const char *operators) {
        const char arithmeticOperators[] = "+ - * / % | & ^ >> <<";
        const char relationalOperators[] = "< > <= >= ==!= ";
        const char logicalOperators[] = "&& ||";
    
        if (strpbrk(operators, arithmeticOperators)!= NULL) {
            return "arithmetic expression";
        } else if (strpbrk(operators, relationalOperators)!= NULL) {
            return "comparison expression";
        } else if (strpbrk(operators, logicalOperators)!= NULL) {
            return "logic expression";
        }
    
        return NULL;
    }
    
    // 检查整个表达式是否合法并确定类型
    const char *checkExpression(const char *input) {
        const char arithmeticUnaryOperators[] = "+ -";
        const char otherUnaryOperators[] = "* & ~!";
    
        char *token;
        char *rest = (char *)input;
        char operators[100] = {0};
        int operatorIndex = 0;
    
        // 先将输入字符串按空格划分成子串
        token = strtok(rest, " ");
        while (token!= NULL) {
            // 检查是否为双目运算符
            if (isBinaryOperatorValid(token)) {
                operators[operatorIndex++] = token[0];
                if (operatorIndex >= 100) {
                    return "Invalid!";
                }
            } else {
                // 检查是否为单目运算符与操作数结合的形式
                if (!isUnaryOperatorValid(token, arithmeticUnaryOperators) &&
                   !isUnaryOperatorValid(token, otherUnaryOperators) &&
                   !isOperandValid(token)) {
                    return "Invalid!";
                }
            }
    
            token = strtok(NULL, " ");
        }
    
        // 根据最后计算的运算符类别判断表达式类型
        return getExpressionType(operators);
    }
    
    int main() {
        char input[1000];
    
        // 获取输入表达式
        printf("请输入表达式:");
        fgets(input, sizeof(input), stdin);
        // 去除换行符
        input[strcspn(input, "\n")] = '\0';
    
        const char *result = checkExpression(input);
        printf("%s\n", result);
    
        return 0;
    }
    

    在上述代码中:

    1. isIdentifierValid函数用于检查标识符是否只包含大小写字母,合法则返回1,否则返回0。
    2. isOperandValid函数用于检查操作数是否为合法的数字(允许小数点等情况)或合法标识符,合法则返回1,否则返回0。
    3. isUnaryOperatorValid函数用于检查单目运算符是否合法且位置正确,根据不同的单目运算符规则进行判断,合法则返回1,否则返回0。
    4. isBinaryOperatorValid函数用于检查双目运算符是否在允许的运算符范围内,是则返回1,否则返回0。
    5. getExpressionType函数根据出现的运算符优先级来判断表达式属于哪种类型(算术、关系、逻辑),返回对应的字符串描述。
    6. checkExpression函数是主要的表达式检查函数,它先将输入字符串按空格划分成子串,然后分别检查子串是双目运算符还是单目运算符与操作数结合的形式是否合法,最后根据记录的运算符来判断表达式类型并返回结果。
    7. main函数中,获取用户输入的表达式,调用checkExpression函数进行检查,并输出结果。

    对于思考与展望部分:

    • 如果输入字符串在双目运算符两边不添加空格该如何处理:可以通过遍历字符串,根据运算符的字符特点(比如长度、是否为特定字符等)来识别运算符,然后再将字符串分割成子串进行后续的合法性检查和类型判断。例如,对于算术运算符+ - * / % | & ^ >> <<,可以逐个字符判断是否为这些运算符中的一个,遇到运算符时就将字符串在该位置分割。但这样实现会比有空格的情况复杂一些,需要更细致地处理边界情况和可能出现的误判情况。
    • 如果有括号该如何处理:需要增加对括号的处理逻辑。首先要识别括号的匹配情况,确保括号是成对出现且嵌套正确。在计算表达式类型和检查合法性时,可以先将括号内的表达式作为一个整体进行处理,递归地调用检查函数来判断括号内表达式的合法性和类型,然后再根据括号外的运算符和整体结构来确定整个表达式的类型和合法性。例如,对于表达式(a + b) * c,先检查a + b这个括号内表达式的合法性和类型,然后再将其结果作为一个操作数,结合*运算符来判断整个表达式的情况。
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 11月15日
  • 修改了问题 11月7日
  • 创建了问题 11月7日

悬赏问题

  • ¥15 lvm2被mask了,怎么unmask都没用(标签-ubuntu|关键词-apt)
  • ¥15 交叉注意力机制的残差问题
  • ¥15 微信小程序:渲染收货地址时页面不显示
  • ¥20 win7 64位DirectShow提示初始化失败如何解决?
  • ¥20 小规模孤立词识别系统设计
  • ¥15 关于Java对接海康威视车牌识别一体机SDK是否需要固定外网的IP?
  • ¥15 Linux扩容时,格式化卡住了:vgdispaly查看卷组信息,没有输出
  • ¥18 关于#ubuntu#的问题:使用背景-工作职责内有七八台ubuntu系统的电脑,平时需要互相调取资料,想实现把这几台电脑用交换机组成一个局域网,来实现指定文件夹的互相调取和写入
  • ¥20 求一个简易射频信号综测仪
  • ¥15 esp8266 tally灯 接收端改为发射端