C++实现简单计算器

本文实例为大家分享了C++实现简单计算器的具体代码,供大家参考,具体内容如下

工具

  • stack
  • map

步骤

  • 初始化
  • 读取字符串
  • 去空格
  • 负号处理
  • 判断为空
  • 检查格式
  • 计算

示例

代码

#include <iostream>
#include <string>
#include <stdio.h>
#include <stack>
#include <map>
#include <math.h>
#include <stdlib.h>
#include <sstream>
using namespace std;

char op[8][8];
map<char, int> m;
void init()
{
 m['+'] = 1, m['-'] = 2, m['*'] = 3, m['/'] = 4, m['('] = 5, m[')'] = 6, m['#'] = 7;
 op[1][1] = '>', op[1][2] = '>', op[1][3] = '<', op[1][4] = '<', op[1][5] = '<', op[1][6] = '>', op[1][7] = '>';
 op[2][1] = '>', op[2][2] = '>', op[2][3] = '<', op[2][4] = '<', op[2][5] = '<', op[2][6] = '>', op[2][7] = '>';
 op[3][1] = '>', op[3][2] = '>', op[3][3] = '>', op[3][4] = '>', op[3][5] = '<', op[3][6] = '>', op[3][7] = '>';
 op[4][1] = '>', op[4][2] = '>', op[4][3] = '>', op[4][4] = '>', op[4][5] = '<', op[4][6] = '>', op[4][7] = '>';
 op[5][1] = '<', op[5][2] = '<', op[5][3] = '<', op[5][4] = '<', op[5][5] = '<', op[5][6] = '=';
 op[6][1] = '>', op[6][2] = '>', op[6][3] = '>', op[6][4] = '>', op[6][6] = '>', op[6][7] = '>';
 op[7][1] = '<', op[7][2] = '<', op[7][3] = '<', op[7][4] = '<', op[7][5] = '<', op[7][7] = '=';
}
double operate(double num1, char oper, double num2)
{
 if(oper == '+')
 return num1 + num2;
 if(oper == '-')
 return num1 - num2;
 if(oper == '*')
 return num1 * num2;
 if(oper =='/')
 return num1 / num2;
}
string trim(string str)
{
 index = 0;
 if(!str.empty()){
 while((index = str.find(' ',index) != string::nops)
 str.erase(index,1);
 }
 return str;
}
string change(string str)
{
 int start;
 start += "#";
 for(int i = 0; i < str.length(); i++){
 if(str[i] == '-'){
 if(i == 0 || i != 0 && (m[str[i-1]] >= 1 && m[str[i-1]] <= 5
 && str[i+1] >= '0' && str[i+1] <= '9'){
 str += " ";
 int j = i+1;
 start = j;
 while(m[str[j]] == 0)
 j++;

 for(int k = str.length() - 1; k >= j; k--)
 str[k] = str[k-3];

 str[i] = '(', str[i+1] = '0', str[i+2] = '-';

 int l = i+3;
 string s = str.substr(start, j - start);
 for(int k = 0; k < s.length(); k++)
 str[l+k] = s[k];

 str[l+s.length()] = ')';
 }
 }
 }
 str.erase(str.length()-1, 1);
 return str;
}
bool test(string str)
{
 bool ifOK = true;
 int flag = 0;
 stack<char> s;
 int start, e;
 str += "#";
 for(int i = 0; i < str.length(); i++){
 //判断非法字符
 if((str[i] < '0' || str[i] > '9') && m[str[i]] == 0 && str[i] != '.')
 return false;
 if(str[i] == '#' && i!= str.length()-1)
 return false;

 //判断小数点
 if(m[str[i]] == 0){
 if(flag == 0){
 start = i;
 flag = 1;
 }
 }
 if(m[str[i]] != 0){
 if(flag == 1){
 e = i;
 string st = str.substr(start, e - start);
 int pointNum = 0;
 if(st[0] == '.') return false;
 for(int j = 0; j < st.length(); j++){
 if(st[j] == '.') pointNum++;
 }
 if(pointNum > 1) return false;

 }
 flag = 0;
 }

 //判断运算符
 if(str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/'){
 if(i == 0) return false;
 if((str[i-1] < '0' || str[i-1] > '9') && str[i-1] != ')') return false;
 if((str[i+1] < '0' || str[i+1] > '9') && str[i+1] != '(') return false;
 }

 //判断括号
 if(str[i] == '(')
 s.push(str[i]);
 if(str[i] == ')'){
 if(s.empty()) return false;
 char c = s.top();
 if(c == '(')
 s.pop();
 else
 return false;
 }
 }
 //判断括号
 if(!s.empty())
 ifOK = false;
 return ifOK;

}

void caculate(string str)
{
 str += "#";
 int flag = 0;
 int start, e;
 stack<double> numStack;//操作数栈
 stack<char> operStack;//运算符栈
 operStack.push('#');
 int i = 0;

 while(str[i] != '#' || operStack.top() != '#'){
 if(m[str[i]] == 0){
 if(flag == 0){
 start = i;
 flag = 1;
 }
 }
 else{
 if(flag == 1){
 e = i;
 //string 转 double
 stringstream s (str.substr(start, e - start));
 double num;
 s >> num;

 numStack.push(num);
 flag = 0;
 }
 char c = operStack.top;
 if(op[m[c]][m[str[i]]] == '<'){
 operStack.push(str[i]);
 i++;
 }
 else if(op[m[c]][m[str[i]]] == '='){
 operStac.pop();
 i++;
 }
 else{
 char oper = operStack.top();
 operStac.pop();
 double num2 = numStack.top();
 numStack.pop();
 double num1 = numStack.top();
 numStack.pop();
 double result = operate(num1, oper, num2);
 numStack.push(result);
 }
 }

 }
 printf("\t\t\t= %f\n",numStack.top());

}
int main()
{
 init();//初始化
 printf("\n\n\n\t\t\t请输入表达式, 退出请输入end:\n");
 string s;
 getline(cin, s, "\n");//读取字符串
 s = trim(s);//去空格
 s = change(s);//处理负号
 if(s == "end"){
 break;
 }
 else if(s.length() > 0){//判断为空
 if(!test(s))//检查格式
 printf("\t\t\t格式错误\n");
 else
 caculate(s);//计算
 }
 else{
 printf("\t\t\t输入不能为空\n");
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 基于C++实现简单日期计算器

    基于C++编写的简单的日期计算器,供大家参考,具体内容如下 以下代码是在VS2013下编译运行的: 下面展示我的测试结果: 标题 代码如下: #include<iostream> using namespace std; #include"vld.h"//这个是检测虚拟内存是否泄露,我在这里安装了vld,所以直接用,包含头文件就好了 class Date { public: //构造函数 Date(int year=2018, int month=8, int day=16

  • C/C++经典实例之模拟计算器示例代码

    前言 本文主要给大家介绍了关于利用C/C++如何实现模拟计算器的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. Problem Description 简单计算器模拟:输入两个整数和一个运算符,输出运算结果. Input 第一行输入两个整数,用空格分开: 第二行输入一个运算符(+.-.*./). 所有运算均为整数运算,保证除数不包含0. Output 输出对两个数运算后的结果. Example Input 30 50 * Example Output import j

  • C/C++实现日期计算器的示例代码

    问题介绍: 今天突然看到一个问题看起来蛮有趣的,跟大家分享一下. 给定任意日期对该日期进行加减天数,最后得出加减后出现的日期.以及给两个日期你可以得出他们两个之间相隔多少天.(需要考虑闰年,每个月天数不同,我们需要写一个我们直接可以使用的日期加减器)因为时间比较仓促,我也没有写界面,只有其中几个主要的函数的架构思想以及简单的调试就发出来了. 代码实现: #include<iostream> #include<Windows.h> #include<assert.h> u

  • 简单实现C++复数计算器

    本文实例为大家分享了简单实现C++复数计算器的具体代码,供大家参考,具体内容如下 1.有关计算器的功能  A,实现多个复数(包括实数)的加减乘除,大小比较,   B.实现十进制实数的进制转换,可以转换任意进制 2.有关设计的原理  A.复数计算的部分,采用运算符的重载,进行复数的加减乘除以及大小比较  对于输入输出,(>>和<<),加减乘除运算进行重载.  输入的重载,实现a+bi形式的复数的输入.  输出的重载,实现实数的输出(实现特殊的只输出实部虚部之类的).  加减乘除的重载

  • c++编写简单的计算器程序

    首先来看下本人的开发环境 系统:win7 电脑:dell 运行环境:vs2015 语言:c++ 简单计算器代码 //四则运算 #include "stdafx.h" #include<iostream> #include<stdio.h> using namespace std; void add() { printf("输入要计算的加数(例如a b)\n"); int adda=0, addb=0,addc=0; cin >>

  • C++有限状态机实现计算器小程序

    本文介绍利用有限状态机原理开发计算器小程序的过程. 实现的功能 支持整数.小数输入 支持+ - * / 四则运算 CE 清除当前操作数 C 清除所有.回到初始状态 回显操作数和结果 HSM状态图 计算器可以分为七种状态:Start.Operand_1.Negate_1.Operator.Operand_2.Negate_2.Error.其中Start.Operand_1.Operand_1状态又分了几种子状态. 下面简要的介绍下状态状态转换的过程: 启动软件,进入Start状态 当用户点击1-9

  • js的表单操作 简单计算器

    代码: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv

  • php学习之简单计算器实现代码

    复制代码 代码如下: <html> <head> <title>PHP实现简单计算器</title> <meta http-equiv="Content-Type" content="text/html;charset=gb2312"> </head> <?php //单路分支 if(isset($_GET["sub"])) { $num1=true;//数字1是否为空

  • javascript实现简单计算器效果【推荐】

    最终效果如下图-2,有bug:就是整数后点击%号结果正确,如果小数后面点击%的话结果就错误!其他都正常,求指点:input的value是string类型的,在JS中改如何正确处理下图-1中的if部分?? 图-1 图-2 HTML代码如下 <body> <div id="calculator"> <div class="LOGO"> <span class="name">简单的计算器</span

  • 纯js代码实现简单计算器

    本文实例分享了纯js代码实现简单计算器代码,相信大家会喜欢.具体如下: 运行效果截图如下: 具体代码如下: <!DOCTYPE html> <html> <head> <title> new document </title> <script type="text/javascript"> function count(){ var txt1 = parseInt( document.getElementById(

  • 基于JSP实现一个简单计算器的方法

    本文实例讲述了基于JSP实现一个简单计算器的方法.分享给大家供大家参考.具体实现方法如下: index.jsp 复制代码 代码如下: <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>  <%  String path = request.getContextPath();  String basePath = request.getSch

  • javascript简单计算器 可美化

    JS计算器代码: javascript简单计算器 [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行] 说明: JavaScript eval() 函数 定义和用法 eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码. 返回值 通过计算 string 得到的值(如果有的话). 说明 该方法只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该方法将不作任何改变地返回.因此请不要为 eval() 函数传递 String 对象来作为参数. 如果试图

  • 使用JavaScript 编写简单计算器

    本文方法超级简单,思路非常的值得推荐,小伙伴们参考下吧 复制代码 代码如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />      <title>javascript 简单计算器</title>     <script>     

  • Javascript 实现简单计算器实例代码

    效果图: 刚开始做时没考虑到清零和退格两个功能,嘻嘻,后来加的整体与传统计算器比有点小瑕疵. 代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>js简单计算器</title> <style type="text/css"> *{ margin:0px; padding:0px; } input{ margi

  • 基于javascript实现简单计算器功能

    本文实例为大家介绍javascript实现简单计算器功能的详细代码,分享给大家供大家参考,具体内容如下 效果图: 实现代码: <html> <head> <script> function calc(event){ // test //window.alert(event.value); var val = new String(event.value); // clear space val = val.trim(); var res = document.getEl

  • JS简单计算器实例

    本文实例讲述了JS简单计算器的实现方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <html xmlns="http://www.w3.org/1999/xhtml">  <head>      <title></title>      <script type="text/javascript">          function sum() {              //js

随机推荐