c语言变量表达式计算器,C语言表达式计算器~
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include
#include
#include
struct Numerical
{
double value;
struct Numerical *next;
};
struct Symbol
{
char c;
struct Symbol *next;
};
void Push_Numerical(struct Numerical **top,double value)
{
struct Numerical *p = *top;
(*top = (struct Numerical*)malloc(sizeof (struct Numerical)))->next = p;
(*top)->value = value;
}
void Push_Symbol(struct Symbol **top,char c)
{
struct Symbol *p = *top;
(*top = (struct Symbol*)malloc(sizeof (struct Symbol)))->next = p;
(*top)->c = c;
}
double Pop_Numerical(struct Numerical **top)
{
struct Numerical *p = *top;
double n = (*top)->value;
*top = (*top)->next;
free(p);
return n;
}
char Pop_Symbol(struct Symbol **top)
{
struct Symbol *p = *top;
char c = (*top)->c;
*top = (*top)->next;
free(p);
return c;
}
int priority(char c)
{
switch (c)
{
case *+*:
case *-*:
return 1;
case ***:
case */*:
return 2;
default:
return 10;
}
}
double calculate(char c,double l,double g)
{
switch (c)
{
case *+*:
return l + g;
case *-*:
return l - g;
case ***:
return l * g;
case */*:
return l / g;
}
}
int main (void)
{
struct Numerical *Numerical_stack = NULL;
struct Symbol *Symbol_stack = NULL;
double n;
int last_number = 0; //上一个读取的是不是数则值为假,如果上一个读取的是数,下一个只能是读取字符
char pop_c,c;
puts("表达式计算器\n\n");
puts("1.作者很笨,写出来的程序智商很低,因此它是一个很单纯的计算器,请不要用复杂的算数表达式为难它\n");
puts("2.因为作者忘记了除数不能为0,所以并没有做特殊处理,请不要故意除以0\n");
puts("3.当你输入错误的表达式,程序会采用崩溃的方式提示你的输入有误,请重启程序重新输入\n");
puts("4.支持的运算符:英文状态下:‘(’‘)’‘+’‘-’‘*’‘/’\n");
puts("程序有些BUG,某些表达式会得出错误的结果,希望大家能够指出\n作者:642985327");
system("pause");
system("cls");
begin:
if((c = getchar()) == *-*)Push_Numerical(&Numerical_stack,0); //如:-(5)第一个字符被压栈双目运算数字栈空导致错误
ungetc(c,stdin);
while ((c = getchar())!= *\n*) //读取表达式内容,在转换后缀表达式的同时进行运算
{
ungetc(c,stdin);
if (last_number == 0 && scanf("%lf",&n))
{
Push_Numerical(&Numerical_stack,n);
last_number = 1;
}
else
{
char a = getchar();
if ((c == *+* || c == *-* ) && c != a && last_number != 1) //防止scanf吃掉正负号导致程序错误计算,如果scanf勿吃掉了计算用的正负号则仍回输入流
ungetc(a,stdin);
else
c=a;
if ((c) == *)*)
{
while ((pop_c = Pop_Symbol(&Symbol_stack)) != *(*)
{
double g = Pop_Numerical(&Numerical_stack);
double l = Pop_Numerical(&Numerical_stack);
Push_Numerical(&Numerical_stack,calculate(pop_c,l,g));
}
}
else if (Symbol_stack == NULL || c == *(* || Symbol_stack->c ==*(* || priority(Symbol_stack->c) < priority(c))
{
Push_Symbol(&Symbol_stack,c);
}
else
{
while (Symbol_stack->c != *(*)
{
pop_c = Pop_Symbol(&Symbol_stack);
double g = Pop_Numerical(&Numerical_stack);
double l = Pop_Numerical(&Numerical_stack);
Push_Numerical(&Numerical_stack,calculate(pop_c,l,g));
if (Symbol_stack == NULL || priority(Symbol_stack->c) < pop_c || Symbol_stack->c == *(*)break;
}
Push_Symbol(&Symbol_stack,c);
}
if (c != *)*)last_number = 0; //除了在读到*)*的情况,读到其他符号,下一次都能尝试读取一个数字
}
}
while (Symbol_stack != NULL) //剩余符号全部弹出栈参与运算
{
double g = Pop_Numerical(&Numerical_stack);
double l = Pop_Numerical(&Numerical_stack);
Push_Numerical(&Numerical_stack,calculate(Pop_Symbol(&Symbol_stack),l,g));
}
printf("%g\n",Pop_Numerical(&Numerical_stack));
goto begin
return 0;
}
c语言变量表达式计算器,C语言表达式计算器~相关推荐
- c语言变量加常量,C语言(二)---常量与变量(示例代码)
一.进制 1.1 二进制 1.1 简介 二进制数据是用0和1两个数码来表示的数.它的基数是2,进位规则是"逢二进1",借位规则是"借一当二".当前的计算机系统使 ...
- c语言变量定义数组,C语言中数组的定义和使用
一.1.一维数组的定义: 类型说明符 数组名[常量表达式]; 注意:常量表达式包括常量与符号常量,不能包含变量. 2.一维数组的引用: 数组名[下标]; 3.一维数组的初始化: a.在定义数组时 ...
- python语言变量名规则_python语言变量命名规则
Python语言变量命名规则 变量名只能包含字母.数字和下划线.(推荐学习:Python视频教程) 变量名可以字母或下划线开头,但不能以数字开头.例如,可将变量命名为message_1,但不能将其命名 ...
- C语言变量初始化作用,C语言变量初始化
C语言变量初始化教程 如果是定义的 因此,在 C 语言中,一个很好的习惯就是在定义变量的同时,给变量初始化,也就是给变量一个默认值. C语言变量初始化详解 语法 type varname = valu ...
- c语言 变量 定义 使用,C语言为什么要规定对所用到的变量要“先定义,后使用”...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 int a=10; 以上一句话对变量a进行了声明,定义以及初始化 extern int a; 以上一句话仅仅对变量a进行了声明,将a的链接属性设置为ext ...
- linux c语言变量地址类型,C语言基础知识:访问内存地址的方法
汇编语言寄存器间接寻址方法 #define GPJ0CON0xE0200240 ldr r0, =GPJ0CON //把地址值赋给寄存器r0,从后面的=可以看出用的是ldr伪指令,因为需要编译器来判断 ...
- 无效的变量名c语言,变量方法用法 _C语言-w3school教程
C语言 的 变量 变量是内存位置的名称.它用于存储数据.其值可以更改,可以重复使用多次. 它是通过符号表示内存位置的方法,以便可以容易识别. 我们来看一下声明一个变量的语法: type variabl ...
- c语言变量名下表,C语言变量名命名规则
一.程序风格: 1.严格采用阶梯层次组织程序代码: 各层次缩进的分格采用VC的缺省风格,即每层次缩进为4格,括号位于下一行. 要求相匹配的大括号在同一列,对继行则要求再缩进4格.例如: 2.提示信息字 ...
- GO语言变量和常量、语言控制语句流程
1.算术运算符 (比较简单,可以跳过) + 添加两个操作数 A+B - 从第一个操作数中减去第二个操作数 A-B / 将分子除分母 % 模数运算符,整数除法的余数 B%A ++ 增加(递增)运算符, ...
- c语言变量类型double,C语言double数据类型介绍、示例和应用经验
1.浮点数的概念 浮点数也称小数或实数.例如,0.0.75.0.4.023.0.27.-937.198 都是合法的小数. C语言中采用float和double关键字来定义小数,float称为单精度浮点 ...
最新文章
- 计算机基础知识自考真题,自考《计算机应用基础》基础试题
- python conn_python中conn是什么
- Virtools学习(七)—2D Picking
- vscode更改插件路径_用好这7个 VS Code 插件,效率蹭蹭涨!
- android apk签名工具_Android 应用修改为系统签名的方法(macOS)
- MYSQL数据库性能调优之六:备份
- 多租户数据中心该如何布线?
- 微信读书android换到ios,Android 微信读书本周推荐传送带列表实现
- java 监听 变量_[Java学习小记]使用PropertyChangeSupport来监听变量的变化
- 转载]SA权限九种上传方法
- php mvc 路由,PHP MVC框架路由学习笔记
- Airflow集成在线编写创建dag的插件
- Android 插件化和热修复知识梳理
- 显卡虚拟化--最强实践
- C语言数字图像处理---1.6图像亮度对比度调节
- Python Web 框架-Django day06
- html thead作用,html元素thead标签的使用方法及作用
- 中文搜索引擎2010Q2市场份额
- Linux命令整理(二)
- 【SaltStack官方版】—— returners——返回器
热门文章
- n9009+android+4.4.2,三星N9009 (Galaxy Note 3 电信版 Android 4.4)ROOT教程,一键获取ROOT权限...
- 服装尺寸 html,服装尺寸表
- ZooKeeper系列:Leader选举
- sourcetree添加gitignore不生效解决方案
- 计算机无法开机如何读u盘启动,无法开机u盘装系统教程
- IOS10上崩溃错误“View has lost track of its superview, most likely through unsupported use of CALayer”解决方案
- 山重水复疑无路,最快下降问梯度(深度学习入门系列之七)
- Python案例1—人民币与美元的汇率兑换V_5.0
- 软件工程师的职业道德与修养
- 台式电脑一般价钱多少_一般普通台式电脑价格多少为好?