C语言 | 计算器实现 version 2.
在之前版本中使用栈结构来实现,但由于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.的更多相关文章
- 计算器(console version)
题目描述 请用python编写一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算. 输入描述 数字包括& ...
- C语言 | 计算器实现(中缀表示法/后缀表示法)
———————————————————————————————————————————— 实现原理: 每个操作数都被依次压入栈中,当一个运算符到达时,从栈中弹出相应数目的操作数(对于二元运算符来说是两 ...
- C语言计算器
地址: https://wenda.so.com/q/1371173683061754?src=140
- 用c语言写的简单计算器
这是自己在学习C语言,凭借自己的兴趣,将课本的知识运用后整理的关于C语言计算器的代码.计算器实现的功能有:加.减.乘.除.求余.功能简单,但对于初学者的我来说能把它写出来,排除每个错误依旧是个难题.前 ...
- 如何为Linux安装Go语言
导读 Go 语言又称为 golang, 是由 Google 最初开发的一种开源编程语言,其在设计时就遵循了简单.安全和速度的 3 大原则.Go 语言具有多种调试.测试.分析和代码审查工具,如今 Go ...
- go语言环境安装
Go 是一个开源的编程语言,被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言. 1. 准备环境并安装依赖包 创建centos 7.6 64bit的虚拟机. 安装 ...
- Go语言学习笔记1
1.Go语言环境搭建及基础知识 Go语言官方网站(http://golang.org) 代码包文档网站(http://godoc.org) Go语言中文网(http://studygolang.com ...
- android——实现多语言支持
我们知道,建好一个android 的项目后,默认的res下面 有layout.values.drawable等目录.这些都是程序默认的资源文件目录,如果要实现多语言版本的话,我们就要添加要实现语言的对 ...
- Android原生多语言切换方案,兼容Android10
前言 一个应用若需要国际化,至少需要支持中文和英语这两种语言,而同时随着谷歌的系统的更新,安卓系统可以设置当前语言的首选语言.因此,本文立足于此,多语言的切换方案为:App固定的文字内容,跟随系统,中 ...
随机推荐
- ubuntu下中文输入法安装
个人认为ubantu下fcitx比sogo好用 安装fcitx首先到ubantu软件中心下载fcitx两个软件,一个是配置软件,一个是输入法软件 到system setting中language su ...
- CURL命令的使用
原文地址:http://blog.sina.com.cn/s/blog_4b9eab320100slyw.html 可以看作命令行浏览器 1.开启gzip请求curl -I http://www.si ...
- C3P0连接池一些基本配置
C3P0连接池配置 数据库连接是一个耗费大量资源且相当慢的操作,所以为了提高性能和连接速度,诞生了连接池这样的概念. 在多用户并发操作过程中,连接池尤为重要. 它是将那些已连接的数据库连接存放在一个容 ...
- 欧拉函数O(sqrt(n))与欧拉线性筛素数O(n)总结
欧拉函数: 对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目. POJ 2407.Relatives-欧拉函数 代码O(sqrt(n)): ll euler(ll n){ ll ans=n; ...
- 神器mimikatz使用命令方法总结
神器mimikatz使用命令方法总结 文章地址:http://www.isharepc.com/300.html mimikatz是一款功能强大的轻量级调试神器,通过它你可以提升进程权限注入进程读取进 ...
- POJ 2255 Tree Recovery && Ulm Local 1997 Tree Recovery (二叉树的前中后序遍历)
链接:poj.org/problem?id=2255 本文链接:http://www.cnblogs.com/Ash-ly/p/5463375.html 题意: 分别给你一个二叉树的前序遍历序列和中序 ...
- hdu6158(圆的反演)
hdu6158 题意 初始有两个圆,按照标号去放圆,问放完 \(n\) 个圆后的总面积. 分析 圆的反演的应用. 参考blog 设反演圆心为 \(O\) 和反演半径 \(R\) 圆的反演的定义: 已知 ...
- ASP.NET Core 2.2 基础知识(十) Web服务器 - Kestrel
ASP.NET Core 应用与进程内的 HTTP 服务器实现一起运行.该服务器实现侦听 HTTP 请求,并在一系列请求功能被写到 HttpContext 时,将这些请求展现到应用中. ASP.NET ...
- 一条命令搞定在VMware中的Ubuntu14.04 64 位安装Docker
对,就是这么炫酷! curl -sSL https://get.docker.com/ | sudo sh 如果提示没有装curl就apt-get install一下,另外提醒一下必须是64位的ubu ...
- sed 很棒的介绍
选项与参数:-n :使用安静(silent)模式.在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上.但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作) ...