在之前版本中使用栈结构来实现,但由于51单片机不支持malloc函数,所以使用C语言又写了一个计算器版本。

通过数组存放值和操作符模拟栈操作。

实现代码:

 #include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define OK 1
#define ERROR 0
int InputJudge(char c); //判断函数是否为数字
float Calc(char optr, float num1, float num2);
char PriorityJudge(char optr1, char optr2);
int main()
{
char arrayChar[];
float arrayFloat[] = {};
char tempChar, optr, c;
float tempFloat, num1, num2;
int topChar = ;
int topFloat = ;
int i;
for (i = ; i < ; ++i)
{
arrayChar[i] = '';
}
arrayChar[topChar] = '#';
topChar++;
c = getchar();
while(c != '#' || arrayChar[topChar - ] != '#')
{
if (InputJudge(c))
{
arrayFloat[topFloat] = (float)(c - '');
topFloat++;
c = getchar();
/* 当连续输入数字时,计算十位数和百位数 */
while(InputJudge(c))
{
topFloat--;
tempFloat = arrayFloat[topFloat];
arrayFloat[topFloat] = (float)(tempFloat * + (c - ''));
topFloat++;
c = getchar();
}
if (c == '.')
{
i = ;
c = getchar();
do
{
topFloat--;
tempFloat = arrayFloat[topFloat];
tempFloat = tempFloat + ((c - '') / pow(, i));
i++;
arrayFloat[topFloat] = tempFloat;
topFloat++;
c = getchar();
}
while(InputJudge(c));
}
}
else
{
tempChar = arrayChar[topChar - ];
switch(PriorityJudge(tempChar, c))
{
case '<':
arrayChar[topChar] = c;
topChar++;
c = getchar();
break;
case '=':
topChar--;
c = arrayChar[topChar];
c = getchar();
break;
case '>':
topChar--;
optr = arrayChar[topChar];
topFloat--;
num2 = arrayFloat[topFloat];
topFloat--;
num1 = arrayFloat[topFloat];
arrayFloat[topFloat] = Calc(optr, num1, num2);
topFloat++;
break;
}
}
}
while(topFloat != )
{
topFloat--;
tempFloat = arrayFloat[topFloat];
printf("%f\n", tempFloat);
}
return OK;
}
float Calc(char optr, float num1, float num2)
{
switch(optr)
{
case '+':
return (num1 + num2);
break;
case '-':
return (num1 - num2);
break;
case '*':
return (num1 * num2);
break;
case '/':
return (num1 / num2);
break;
}
}
int InputJudge(char c)
{
switch(c)
{
case '':
case '':
case '':
case '':
case '':
case '':
case '':
case '':
case '':
case '':
return OK;
break;
case '.':
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '#':
return ERROR;
break;
default:
break;
}
}
char PriorityJudge(char optr1, char optr2)
{
int i, j;
char priorityTable[][] =
{
{'>', '>', '<', '<', '<', '>', '>'},
{'>', '>', '<', '<', '<', '>', '>'},
{'>', '>', '>', '>', '<', '>', '>'},
{'>', '>', '>', '>', '<', '>', '>'},
{'<', '<', '<', '<', '<', '=', ''},
{'>', '>', '>', '>', '', '>', '>'},
{'<', '<', '<', '<', '<', '', '='}
};
switch(optr1)
{
case '+':
i = ;
break;
case '-':
i = ;
break;
case '*':
i = ;
break;
case '/':
i = ;
break;
case '(':
i = ;
break;
case ')':
i = ;
break;
case '#':
i = ;
break;
}
switch(optr2)
{
case '+':
j = ;
break;
case '-':
j = ;
break;
case '*':
j = ;
break;
case '/':
j = ;
break;
case '(':
j = ;
break;
case ')':
j = ;
break;
case '#':
j = ;
break;
}
return priorityTable[i][j];
}

C语言 | 计算器实现 version 2.的更多相关文章

  1. 计算器(console version)

    题目描述 请用python编写一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算. 输入描述 数字包括& ...

  2. C语言 | 计算器实现(中缀表示法/后缀表示法)

    ———————————————————————————————————————————— 实现原理: 每个操作数都被依次压入栈中,当一个运算符到达时,从栈中弹出相应数目的操作数(对于二元运算符来说是两 ...

  3. C语言计算器

    地址:  https://wenda.so.com/q/1371173683061754?src=140

  4. 用c语言写的简单计算器

    这是自己在学习C语言,凭借自己的兴趣,将课本的知识运用后整理的关于C语言计算器的代码.计算器实现的功能有:加.减.乘.除.求余.功能简单,但对于初学者的我来说能把它写出来,排除每个错误依旧是个难题.前 ...

  5. 如何为Linux安装Go语言

    导读 Go 语言又称为 golang, 是由 Google 最初开发的一种开源编程语言,其在设计时就遵循了简单.安全和速度的 3 大原则.Go 语言具有多种调试.测试.分析和代码审查工具,如今 Go ...

  6. go语言环境安装

    Go 是一个开源的编程语言,被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言. 1. 准备环境并安装依赖包 创建centos 7.6 64bit的虚拟机. 安装 ...

  7. Go语言学习笔记1

    1.Go语言环境搭建及基础知识 Go语言官方网站(http://golang.org) 代码包文档网站(http://godoc.org) Go语言中文网(http://studygolang.com ...

  8. android——实现多语言支持

    我们知道,建好一个android 的项目后,默认的res下面 有layout.values.drawable等目录.这些都是程序默认的资源文件目录,如果要实现多语言版本的话,我们就要添加要实现语言的对 ...

  9. Android原生多语言切换方案,兼容Android10

    前言 一个应用若需要国际化,至少需要支持中文和英语这两种语言,而同时随着谷歌的系统的更新,安卓系统可以设置当前语言的首选语言.因此,本文立足于此,多语言的切换方案为:App固定的文字内容,跟随系统,中 ...

随机推荐

  1. 在lua中正确使用uuid的方法:

    -- 参考:http://ju.outofmemory.cn/entry/97724local function guid()        local template ="xxxxxxx ...

  2. Laravel项目使用腾讯云对象存储上传图片(cos-php-sdk-v5版本)

    为了加快网站访问速度.降低网站负载,现在越来越多的网站选择把图片等静态文件放在云上,这里介绍一下腾讯云对象存储在Laravel项目中的使用 1.申请腾讯云对象存储.创建Bucket.获取APPID等参 ...

  3. yii2 项目初始化

    yii 项目目录下执行.composer self-updatecomposer global require "fxp/composer-asset-plugin:^1.4.1" ...

  4. thinkphp函数学习(0)——开篇

    因为新公司都使用thinkphp,所以就想通读一遍源码,可是在读的过程中,时常半路杀出个自定义函数,然后又要跳到函数定义的地方先看具体的函数定义,感觉特别的难受,好几次都是看到runtime.php就 ...

  5. Dfs【p1454】 圣诞夜的极光

    题目描述-->p1454 圣诞夜的极光 题意概括: 寻找联通块数量,这里的连通块定义与其他的不同. 这里定义为曼哈顿距离不超过2的都属于一个联通块. 什么?不知道曼哈顿距离是啥? 曼哈顿距离简易 ...

  6. Manacher【p1210】回文检测

    题目描述--->P1210 回文检测 分析: 看到回文显然想到了manacher算法(线性求解回文串问题 如果不了解还是去敲一下板子,学习一下比较好.-->manacher 题目要求我们求 ...

  7. 洛谷——P2958 [USACO09OCT]木瓜的丛林Papaya Jungle

    P2958 [USACO09OCT]木瓜的丛林Papaya Jungle 题目描述 Bessie has wandered off the farm into the adjoining farmer ...

  8. Windows 环境下 Redis 安装

    1.redis官方下载地址:https://redis.io/download,redis 64位下载地址:https://github.com/MicrosoftArchive/redis/rele ...

  9. 1353表达式括号匹配(stack)

    [题目描述] 假设一个表达式有英文字母(小写).运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符.请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”:否 ...

  10. 【动态规划】【记忆化搜索】CODEVS 3415 最小和 CodeVS原创

    f(l,r,i)表示第i段截第l位到第r位时,当前已经得到的价格最小值,可以很显然地发现,这个是没有后效性的,因为对之后截得的段都不造成影响. 注意水彩笔数=1的特判. 递归枚举当前段的r求解(∵l是 ...