P1902 简单算术表达式求值

时间: 2023-11-26 20:45:18 浏览: 48
P1902是一道算法题,要求实现一个简单的算术表达式求值程序。该程序可以进行加、减、乘、除基本算术运算(可以进行浮点和负数运算)和sin、cos、tan等三角函数求值运算,同时能进行指数运算和自然对数运算,还有求倒数、退格和清零功能。设计思路可以参考引用中的内容。在实现过程中,可以使用一个二维数组来定义算符之间的优先关系,具体可以参考引用中的代码。在每次进行操作时,可以使用printf函数打印该操作,具体可以参考引用中的代码。
相关问题

算术表达式求值演示 c++代码

以下是一个简单的C++代码演示算术表达式求值:\n\```++\#inclu <iostream>\#inclu <stack>\#inclu <string>\using namesp s;\n\i priority(char op) {\ if (p == '+' || op == '-') {\ retur 1;\ }\ els if (p == '*' || op == '/') {\ retur 2;\ }\ els {\ retur ;\ }\}\n\ub calcu(doub , doub b, char op) {\ switch (p) {\ cas '+':\ retur + b;\ cas '-':\ retur - b;\ cas '*':\ retur * b;\ cas '/':\ retur / b;\ defau\ retur ;\ }\}\n\ub evalu(string exp) {\ stack<doub> numStack;\ stack<char> opStack;\ for (i i = ; i < exp.length(); i++) {\ if (isdigi(exp[i])) {\ doub num = exp[i] - '';\ whi (i + 1 < exp.length() && isigi(exp[i + 1])) {\ num = num * 10 + (xp[i + 1] - '');\ i++;\ }\ numStack.push(num);\ }\ els if (xp[i] == '(') {\ opStack.push(exp[i]);\ }\ els if (xp[i] == ')') {\ whi (pStack.top() != '(') {\ char op = opStack.top();\ opStack.pop();\ doub b = numStack.top();\ numStack.pop();\ doub = numStack.top();\ numStack.pop();\ numStack.push(u(, b, op));\ }\ opStack.pop();\ }\ els if (xp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/') {\ whi (!pStack.empty() && priority(opStack.top()) >= priority(exp[i])) {\ char op = opStack.top();\ opStack.pop();\ doub b = numStack.top();\ numStack.pop();\ doub = numStack.top();\ numStack.pop();\ numStack.push(u(, b, op));\ }\ opStack.push(exp[i]);\ }\ }\ whi (!pStack.empty()) {\ char op = opStack.top();\ opStack.pop();\ doub b = numStack.top();\ numStack.pop();\ doub = numStack.top();\ numStack.pop();\ numStack.push(u(, b, op));\ }\ retur numStack.top();\}\n\i mai() {\ string exp = \2*(3+4)-5/2\";\ doub resu = evalu(exp);\ cou << \Th resu of \ << exp << \ is \ << resu << ;\ retur ;\}\```\n\

c语言算术表达式求值。要求运行结果显示为“请输入一个算术表达式(e退出)”用户从键盘输入一个算术表达式,数字都是十进制整型(必须支持负数),运算符支持+-*/()。 ​​​​​编写源程序中的 ​​​​d​​​​​​ouble deal_exp (char *exp) 函数,对这个算术表达式求值,返回结果。

以下是一个简单的 C 语言算术表达式求值程序,实现了对输入的算术表达式的求值,支持负数、加减乘除和括号操作。 ```c #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define STACK_SIZE 100 // 定义操作符栈结构体 typedef struct { char op[STACK_SIZE]; int top; } OpStack; // 定义操作数栈结构体 typedef struct { double val[STACK_SIZE]; int top; } ValStack; // 操作符栈入栈函数 void op_push(OpStack *stack, char c) { if (stack->top >= STACK_SIZE) { printf("Error: op stack overflow!\n"); exit(1); } stack->op[stack->top++] = c; } // 操作符栈出栈函数 char op_pop(OpStack *stack) { if (stack->top <= 0) { printf("Error: op stack underflow!\n"); exit(1); } return stack->op[--stack->top]; } // 操作数栈入栈函数 void val_push(ValStack *stack, double val) { if (stack->top >= STACK_SIZE) { printf("Error: val stack overflow!\n"); exit(1); } stack->val[stack->top++] = val; } // 操作数栈出栈函数 double val_pop(ValStack *stack) { if (stack->top <= 0) { printf("Error: val stack underflow!\n"); exit(1); } return stack->val[--stack->top]; } // 获取操作符栈顶元素函数 char op_top(OpStack *stack) { if (stack->top <= 0) { printf("Error: op stack underflow!\n"); exit(1); } return stack->op[stack->top - 1]; } // 获取操作数栈顶元素函数 double val_top(ValStack *stack) { if (stack->top <= 0) { printf("Error: val stack underflow!\n"); exit(1); } return stack->val[stack->top - 1]; } // 判断是否为操作符函数 int is_op(char c) { return (c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')'); } // 判断操作符优先级函数 int op_precedence(char c) { switch (c) { case '+': case '-': return 1; case '*': case '/': return 2; default: return 0; } } // 处理单个操作符函数 void deal_op(OpStack *op_stack, ValStack *val_stack) { char op = op_pop(op_stack); double val2 = val_pop(val_stack); double val1 = val_pop(val_stack); double res; switch (op) { case '+': res = val1 + val2; break; case '-': res = val1 - val2; break; case '*': res = val1 * val2; break; case '/': res = val1 / val2; break; default: printf("Error: invalid operator!\n"); exit(1); } val_push(val_stack, res); } // 对算术表达式求值函数 double deal_exp(char *exp) { OpStack op_stack = {{0}, 0}; ValStack val_stack = {{0}, 0}; char *p = exp; while (*p) { if (isspace(*p)) { // 忽略空白字符 } else if (isdigit(*p) || (*p == '-' && isdigit(*(p + 1)))) { // 处理数字 char *q = p; while (isdigit(*q) || *q == '-') { q++; } double val = atof(p); val_push(&val_stack, val); p = q - 1; } else if (*p == '(') { // 处理左括号 op_push(&op_stack, '('); } else if (*p == ')') { // 处理右括号 while (op_top(&op_stack) != '(') { deal_op(&op_stack, &val_stack); } op_pop(&op_stack); } else { // 处理操作符 while (op_precedence(*p) <= op_precedence(op_top(&op_stack))) { deal_op(&op_stack, &val_stack); } op_push(&op_stack, *p); } p++; } while (op_stack.top > 0) { deal_op(&op_stack, &val_stack); } return val_pop(&val_stack); } int main() { printf("请输入一个算术表达式(e退出)\n"); char exp[STACK_SIZE]; while (fgets(exp, STACK_SIZE, stdin)) { if (exp[0] == 'e') { break; } double res = deal_exp(exp); printf("%.2f\n", res); printf("请输入一个算术表达式(e退出)\n"); } return 0; } ``` 注意,这个程序还有很多可以完善的地方,比如处理错误、增加更多的操作符等等。但是,以上代码已经可以满足题目要求。

相关推荐

最新推荐

recommend-type

C语言程序设计标准教程

第二章: 数据类型、运算符、表达式 C语言的数据类型  在第一课中,我们已经看到程序中使用的各种变量都应预先加以说明,即先说明,后使用。对变量的说明可以包括三个方面: ?数据类型 ?存储类型 ?作用域  在本课...
recommend-type

Linux 平台基于 Qt5 的网速浮窗.zip

Linux 平台基于 Qt5 的网速浮窗
recommend-type

手机游戏峡谷沼泽农田关卡地图Ai+EPS+PSD源文件.zip

游戏开发资源,游戏UI,游戏GUI,游戏图标,PSD格式,XD格式,PNG下载,源文件,可编辑下载,游戏购物充值界面,宝石,图标,PS格式,AI格式等,游戏APP
recommend-type

上市公司-企业资本结构动态调整数据及代码(2001-2022年).txt

数据存放网盘,txt文件内包含下载链接及提取码,永久有效。 样例数据及详细介绍参见文章:https://blog.csdn.net/li514006030/article/details/138324717
recommend-type

Git 常用命令手册大全

Git 是一个开源的分布式版本控制系统,它允许你跟踪代码的更改,并且可以与他人合作开发项目。附件中是一些常用的 Git 命令。 这些命令覆盖了 Git 的基本操作,包括初始化、克隆、提交、分支管理、合并、查看状态和历史、远程仓库操作等。根据你的具体需求,可能还需要学习更多的命令和 Git 的高级用法。 文件绿色安全,仅供学习交流使用,欢迎大家下载学习交流!
recommend-type

RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz

REALTEK 8188FTV 8188eus 8188etv linux驱动程序稳定版本, 支持AP,STA 以及AP+STA 共存模式。 稳定支持linux4.0以上内核。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章

![:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章](https://img-blog.csdnimg.cn/img_convert/69b98e1a619b1bb3c59cf98f4e397cd2.png) # 1. 目标检测算法概述 目标检测算法是一种计算机视觉技术,用于识别和定位图像或视频中的对象。它在各种应用中至关重要,例如自动驾驶、视频监控和医疗诊断。 目标检测算法通常分为两类:两阶段算法和单阶段算法。两阶段算法,如 R-CNN 和 Fast R-CNN,首先生成候选区域,然后对每个区域进行分类和边界框回归。单阶段算法,如 YOLO 和 SSD,一次性执行检
recommend-type

设计算法实现将单链表中数据逆置后输出。用C语言代码

如下所示: ```c #include <stdio.h> #include <stdlib.h> // 定义单链表节点结构体 struct node { int data; struct node *next; }; // 定义单链表逆置函数 struct node* reverse(struct node *head) { struct node *prev = NULL; struct node *curr = head; struct node *next; while (curr != NULL) { next
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。