用c语言实现四则运算 需要带括号和小数运算和报错提示

时间: 2024-03-10 18:46:02 浏览: 26
以下是一个简单的 C 语言程序,实现了带括号和小数运算的四则运算,并能够报错提示输入不合法的表达式。 ```c #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define MAX_STACK 100 // 定义运算符栈 char op_stack[MAX_STACK]; int op_top = -1; // 定义操作数栈 double num_stack[MAX_STACK]; int num_top = -1; // 运算符的优先级 int priority(char op) { switch (op) { case '+': case '-': return 1; case '*': case '/': return 2; case '(': case ')': return 0; default: return -1; } } // 将中缀表达式转换为后缀表达式 int infix_to_postfix(char *infix, char *postfix) { int i = 0, j = 0; while (infix[i]) { if (isdigit(infix[i]) || infix[i] == '.') { // 如果是数字,直接添加到后缀表达式中 postfix[j++] = infix[i++]; while (isdigit(infix[i]) || infix[i] == '.') { postfix[j++] = infix[i++]; } postfix[j++] = ' '; } else if (infix[i] == '(') { // 如果是左括号,压入运算符栈中 op_stack[++op_top] = infix[i++]; } else if (infix[i] == ')') { // 如果是右括号,弹出运算符栈中的元素,直到遇到左括号为止 while (op_top >= 0 && op_stack[op_top] != '(') { postfix[j++] = op_stack[op_top--]; postfix[j++] = ' '; } if (op_top < 0) { return 0; // 括号不匹配,返回错误 } op_top--; // 弹出左括号 i++; } else if (infix[i] == '+' || infix[i] == '-' || infix[i] == '*' || infix[i] == '/') { // 如果是运算符,弹出运算符栈中优先级大于等于该运算符的元素,添加到后缀表达式中 while (op_top >= 0 && priority(op_stack[op_top]) >= priority(infix[i])) { postfix[j++] = op_stack[op_top--]; postfix[j++] = ' '; } op_stack[++op_top] = infix[i++]; } else { return 0; // 表达式中包含非法字符,返回错误 } } while (op_top >= 0) { if (op_stack[op_top] == '(') { return 0; // 括号不匹配,返回错误 } postfix[j++] = op_stack[op_top--]; postfix[j++] = ' '; } postfix[j] = '\0'; return 1; // 转换成功 } // 计算后缀表达式的值 double evaluate_postfix(char *postfix) { int i = 0; double num1, num2; char *endptr; while (postfix[i]) { if (isdigit(postfix[i]) || postfix[i] == '.') { // 如果是数字,将其压入操作数栈中 num_stack[++num_top] = strtod(&postfix[i], &endptr); i = endptr - postfix; } else if (postfix[i] == ' ') { // 如果是空格,跳过 i++; } else { // 如果是运算符,弹出操作数栈中的两个元素进行计算,并将结果压入操作数栈中 if (num_top < 1) { return 0; // 操作数不足,返回错误 } num2 = num_stack[num_top--]; num1 = num_stack[num_top--]; switch (postfix[i]) { case '+': num_stack[++num_top] = num1 + num2; break; case '-': num_stack[++num_top] = num1 - num2; break; case '*': num_stack[++num_top] = num1 * num2; break; case '/': if (num2 == 0) { return 0; // 除数为零,返回错误 } num_stack[++num_top] = num1 / num2; break; default: return 0; // 非法运算符,返回错误 } i++; } } if (num_top != 0) { return 0; // 操作数不匹配,返回错误 } return num_stack[0]; } int main() { char infix[MAX_STACK], postfix[MAX_STACK]; printf("请输入四则运算表达式(带括号和小数):"); fgets(infix, MAX_STACK, stdin); if (infix_to_postfix(infix, postfix)) { printf("后缀表达式为:%s\n", postfix); printf("计算结果为:%.2f\n", evaluate_postfix(postfix)); } else { printf("表达式不合法!\n"); } return 0; } ``` 在程序中,我们首先定义了一个运算符栈和一个操作数栈,用于中间过程的存储。然后定义了一个 `priority` 函数,用于计算运算符的优先级。接着,我们实现了一个 `infix_to_postfix` 函数,将中缀表达式转换为后缀表达式,并返回转换是否成功的标志。如果转换成功,我们输出后缀表达式,并计算表达式的值。如果转换失败,我们输出错误信息。最后,我们在 `main` 函数中读取用户输入的表达式,调用 `infix_to_postfix` 函数和 `evaluate_postfix` 函数,输出结果或错误信息。

相关推荐

最新推荐

recommend-type

表达式求值顺序栈实现包括小数点运算(C语言版).docx

实现思路 使用两个栈,stack0用于存储操作数,stack1用于存储操作符 从左往右扫描,遇到操作数入栈stack0 遇到操作符时,如果优先级低于...遇到左括号,直接入栈stack1,遇到右括号,则直接出栈并计算,直到遇到左括号
recommend-type

C语言程序设计标准教程

在C语言中,使用的整常数有八进制、十六进制和十进制三种。 整型常量 1.八进制整常数八进制整常数必须以0开头,即以0作为八进制数的前缀。数码取值为0~7。八进制数通常是无符号数。 以下各数是合法的八进制数: ...
recommend-type

基于三层感知机实现手写数字识别-内含源码和说明书.zip

基于三层感知机实现手写数字识别-内含源码和说明书.zip
recommend-type

setuptools-40.7.0.zip

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
recommend-type

搭建VGG16神经网络实现图像分类-内含源码和说明书.zip

搭建VGG16神经网络实现图像分类-内含源码和说明书.zip
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

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

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用 Python 画一个可以动的爱心

好的,我可以帮助您使用Python来绘制一个动态的爱心。您可以使用turtle库来实现。以下是实现代码: ```python import turtle import math # 设置画布和画笔 canvas = turtle.Screen() canvas.bgcolor("black") pencil = turtle.Turtle() pencil.speed(0) pencil.color("red", "pink") pencil.pensize(3) # 定义爱心函数 def draw_love(heart_size, x_offset=0, y_offset=0):
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。