目录

  • C++程序设计语言——一个桌面计算器示例
    • 程序代码

C++程序设计语言——一个桌面计算器示例

C++程序设计语言一书中第10章 10.2节的桌面计算器示例。

程序代码

#include <ctype.h>
#include <iostream>
#include <istream>
#include <vector>
#include <string>
#include <map>using std::map;
using std::string;static int error_cnt = 0;//Token defination
enum Kind : char
{name, number, end,plus='+', minus='-', mutiple='*', divid='/', lp='(', rp=')',print=';', assign='='
};struct Token {Kind kind;string string_val;double number_val;
};extern double expr(bool);
extern double term(bool);
extern double prim(bool);// this table is for storing value of variables
// key is name of variable
map<string, double> table;double error(const string& err_info)
{error_cnt++;std::cerr << "error : " << err_info << '\n';return 1;
}class TokenStream {public:TokenStream(std::istream& s) : ip{&s}, own{false} {};TokenStream(std::istream* p) : ip{p}, own{true} {};~TokenStream() {close();};void setInput(std::istream& s) {close(); ip = &s; own = false;}void setInput(std::istream* p) {close(); ip = p; own = true;}Token get();const Token& current() const { return ct; };
private:std::istream *ip;bool own;Token ct {Kind::end};void close() { if(own) delete ip; }
};Token TokenStream::get()
{char ch = 0;do{if(!ip->get(ch)) return ct = {Kind::end};}while(ch != '\n' && isspace(ch));switch (ch) {case ';':case '\n':return ct = {Kind::print};case 0:return ct = { Kind::end };case '+':case '-':case '*':case '/':case '(':case ')':case '=':return ct = {static_cast<Kind>(ch)};case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':case '.':ip->putback(ch);*ip >> ct.number_val;ct.kind = Kind::number;return ct;default:if(isalpha(ch)){ct.string_val = ch;while(ip->get(ch) && isalnum(ch))ct.string_val += ch;ip->putback(ch);ct.kind = Kind::name;return ct;}error("bad token");return ct = {Kind::print};}
}TokenStream ts {std::cin};void calculate()
{for(;;){ts.get();if(ts.current().kind == Kind::end) break;if(ts.current().kind == Kind::print) continue;std::cout << expr(false) << '\n';}
}int main()
{table["pi"] = 3.14;table["e"] = 2.71;calculate();// system("pause");return error_cnt;
}double prim(bool get)
{if(get) ts.get();switch (ts.current().kind) {case Kind::number:{double v = ts.current().number_val;ts.get();return v;}case Kind::name:{double& v = table[ts.current().string_val];if(ts.get().kind == Kind::assign) v = expr(true);return v;}case Kind::minus:return -prim(true);break;case Kind::lp:{auto e = expr(true);if(ts.current().kind != Kind::rp) return error("')' expected");ts.get();return e;}default:return error("primary expected.");}
}double term(bool get)
{double left = prim(get);for (;;){switch (ts.current().kind) {case Kind::mutiple:left *= prim(true);break;case Kind::divid:if(auto d = prim(true)){left /= d;break;}return error("divide by 0");default:return left;}}
}double expr(bool get)
{double left = term(get);for (;;){switch (ts.current().kind) {case Kind::plus:left += term(true);break;case Kind::minus:left -= term(true);break;default:return left;}}
}

C++程序设计语言——一个桌面计算器示例相关推荐

  1. C++程序设计语言(特别版) -- 一个桌面计算器

    前言 这里要介绍各种语句和表达式,将通过一个桌面计算器的程序做些事情,该计算器提供四种座位浮点数的中缀运算符的标准算术运算. 这个计算器由四个部分组成:一个分析器,一个输入函数,一个符号表和一个驱动程 ...

  2. c语言设计程序计算器,C语言程序设计,做一个简单计算器

    题目: C语言程序设计,做一个简单计算器 程序内容有:加减乘除和平方,立方,开方等.用if或者swith结构来编程. 算加法时只输出加法的结果,算减法时只出减法的结果,如此类推. 解答: 已发送, # ...

  3. lex yacc 创建一个桌面计算器

    作为学习龙书前4章一个总结,做一个计算器,支持+-*/(),*/优先,lex采用flex2.5.37,yacc采用bison2.7 最后的效果是可以连续输入表达式进行计算,比如3.2+5.3*(6.2 ...

  4. C++程序设计语言编程风格演变史

    程序代码也有风格,这算不得什么新鲜事.早在20世纪80年代,C语言程序员就必须在K&R风格和ANSI风格之间择善而从.但平心而论,我确实没有见过哪一种语言能像C++这样,在代码风格方面表现得如 ...

  5. c++学习书籍推荐《C++程序设计语言(特别版)》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <C++程序设计语言(特别版•十周年中文纪念版)>编辑推荐:十周年纪念版,体味C++语言的精妙与魅力,享受与大师的心灵对话.1979年,Biarn ...

  6. 编译原理——C++版桌面计算器

    编译原理--C++版桌面计算器 系统描述 设计并实现一个桌面计算器,支持基本四则运算,关系运算,可编程运算 基本功能 (1)以命令行方式解析用户输入的表达式,计算并显示结果: (2)支持基本的整型和浮 ...

  7. linux shell 计算器 除0,用shell写一个简易计算器,可以实现加、减、乘、除运算,假如脚本名字为1.sh,执行示例:./1....

    用shell写一个简易计算器,可以实现加.减.乘.除运算,假如脚本名字为1.sh,执行示例:./1.sh 1 + 2#!/bin/bash if [ $# -ne 3 ] then echo &quo ...

  8. linux脚本计算器加减乘除,用shell写一个简易计算器,可以实现加、减、乘、除运算,假如脚本名字为1.sh,执行示例:./1....

    用shell写一个简易计算器,可以实现加.减.乘.除运算,假如脚本名字为1.sh,执行示例:./1.sh 1 + 2#!/bin/bash if [ $# -ne 3 ] then echo &quo ...

  9. c语言课程设计报告-计算器的实现,C语言课程设计--一个简易计算器的设计与实现.doc...

    C语言课程设计--一个简易计算器的设计与实现 扬 州 大 学 ------------------1 程序设计内容:------------------1 课程设计所补充的内容:补充的函数或算法--- ...

最新文章

  1. pyEcharts安装及详细使用指南
  2. 为什么华为在发布会不提鸿蒙,华为又要开发布会?这次没有手机,鸿蒙系统要当主角!...
  3. SRS学习笔记7-SrsHttpServer
  4. c-free为什么要多输入一条_为什么微信语音不能转发?知道真相后才发现我们都错怪了微信!...
  5. python round函数_python中round函数如何使用
  6. LeetCode 1534. 统计好三元组
  7. 【Day09】JavaScript 为什么要区分微任务和宏任务
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的校园二手自行车交易系统
  9. 网络爬虫-原理篇(一)
  10. python有趣的代码-盘点10个一行强大的、有趣的Python源代码
  11. 17年北邮计算机应用基础,2017计算机应用基础考试题及答案
  12. Merry Christmas
  13. 2017-2018 20155309 南皓芯 信息安全基础设计第八周博客
  14. CSDN博客添加友情链接
  15. 2018华为软挑参赛体验
  16. Citrix 桌面云 XenApp_XenDesktop_7.15 部署系列(八)部署虚拟桌面及应用
  17. 中文圣经 for Android
  18. 微信小程序-实现保存图片功能的3种方式
  19. k8s+docker集群整合搭建(完整版)
  20. html制作网站 知乎,做短视频运营看那些网站(推荐这些短视频素材网站)

热门文章

  1. python代码颜色搭配_修改Python IDLE代码配色及语法高亮主题
  2. 记录--Three.js的简单使用,Three.js在vue3.x中导入.pcd三维模型文件
  3. 【心路历程】微职位报名华为HCNP认证,妥妥过。。。(嗯,最后有彩蛋)
  4. 计算机网络与电竞的论文,谈谈电子竞技毕业论文.doc
  5. Autojs 抖音自动养号脚本+抖音直播控场脚本
  6. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java装修服务分析系统03563
  7. android打乱数据方法,拼图打乱图片顺序的算法
  8. 电销机器人是如何获客的?
  9. 锂离子电池热失控预警资料整理(一)
  10. 富斯i6设置APM失控保护