C++实现“简单计算器”

article/2025/10/24 0:23:54

最近在看九度上面的题目,其中一道题本以为比较简单,但花了不少时间,题目如下:

题目1019:简单计算器

我的思路是先读入一个字符串,再将字符串里面的数字和运算符号分别提取出来,最后根据运算的先后顺序计算得到最后的结果,程序清单如下:

#include<iostream>
#include<vector>
#include<string>
#include<cmath>
#include<iomanip>using namespace std;string  skipblacks(string str) //忽略空格
{string return_str="";int length=str.length();for(int i=0;i<length;i++)if(str[i]!=' ')return_str+=str[i];return return_str;
}string str_dele(string s,int m)    //删除字符串str的第m个字符
{int len=s.length(); char temp_str[100];if(m>len)cout<<"删除的位置不对!"<<endl;else{int j = 0;for(int i = 0;i<s.size();i++){if(i==m-1) continue;else temp_str[j++]=s[i];}}for(int i=0,j=0;j<len-1;)s[j++]=temp_str[i++];string sn = "";for(int i = 0;i<s.size()-1;++i)sn += s[i];return sn;
}vector<double> renew(vector<double> num,double tmpresult,int i)
{vector<double> vnew;for(int j = 0;j<i;++j)vnew.push_back(num[j]);vnew.push_back(tmpresult);if(i < num.size()-2)for(int j = i + 2;j<num.size();++j)vnew.push_back(num[j]);return vnew;
}vector<char> clearchch(vector<char> vch)  //去除乘号除号
{vector<char> nvch;for(int i = 0;i<vch.size();++i)if(vch[i] != '*'&&vch[i] != '/')nvch.push_back(vch[i]);return nvch;
}int main()
{string str;vector<double> result;//保存结果while(getline(cin,str)){if(str == "0")break;vector<char> vch;vector<int> vi;string s = skipblacks(str);//忽略字符串中的空格for(int i = 0;i<s.size();++i){if((s[i]=='+')|(s[i]=='-')|(s[i]=='*')|(s[i]=='/'))vch.push_back(s[i]); //保存运算符哈else if(s[i]>='0'&&s[i]<='9')vi.push_back(s[i]-'0'); //保存数字}string ns = s;vector<double> vpos;//记录运算符号在原字符串中的位置vector<double> vnum;//记录每个数的位数for(int i = 0;i<vch.size();++i){size_t pos = ns.find(vch[i]);ns = str_dele(ns,pos+1);vpos.push_back(pos+i+1);}vnum.push_back(vpos[0]-1);for(int i = 0;i<vpos.size()-1;++i)vnum.push_back(vpos[i+1]-vpos[i]-1);double tmpsum = 0;for(int i = 0;i<vnum.size();++i)tmpsum += vnum[i];double tmps = s.size()-vch.size()-tmpsum;vnum.push_back(tmps);vector<double> num;//将vi转化为数字double tmpn = 0;for(int i = 0;i<=vch.size();++i){double sum = 0;tmpn += vnum[i];for(int j = 0;j<vnum[i];++j)sum += vi[j+tmpn-vnum[i]]*pow(10,vnum[i]-1-j);num.push_back(sum);}vector<double> vnew = num;int ccnt = 0;for(int i = 0;i<vch.size();++i){if((vch[i] == '*')|(vch[i] == '/')){double tmpresult;if(vch[i] == '*')tmpresult = num[i]*num[i+1];elsetmpresult = num[i]/num[i+1];vnew = renew(vnew,tmpresult,i-ccnt);//更新结果++ccnt; //统计已经计算过多少个*和/。}}vector<char> nvch = clearchch(vch);//去除乘号和除号只剩下加减号double restmp = vnew[0];for(int i = 0;i<nvch.size();++i){if(nvch[i] == '+')restmp = restmp + vnew[i+1];elserestmp = restmp - vnew[i+1];}result.push_back(restmp);}for(int i = 0;i<result.size();++i)cout<<fixed<<setprecision(2)<<result[i]<<endl;  //保留两位小数system("pause");return 0;
}

演示结果如下:


从结果可以看到,实现了题设的要求,但是奇怪的是提交代码之后显示“ Wrong Answer”,暂时还不知道是啥原因。

在编写这个程序的过程中,遇到很多细节问题和一些编程基本知识,在这里总结一下:

(1)保留小数点位数,参见博客C++ 标准输出控制小数点后位数的方法;

(2)实现“忽略一个字符串里的空格”和“删除字符串中某个字符或某个位置的字符”这样类似的功能可以编写一个函数进行实现;

(3)在进行除法运算时,要注意整形数据到双精度形数据过程可能会损失掉小数部分,可以先将整形数据转化为双精度形数据再进行计算;

(4)读取整行数据用getline(cin,str)实现。


此外,我在九度论坛里也看到很多特别简洁的答案,深感佩服,其中贴出一个代码如下:

#include "stdio.h"
#include "string.h"
#define MAX 1001double stack[MAX];
int tail;int main(){int a;while(scanf("%d ",&a)&&a!=0){tail=0;stack[++tail]=1.0*a;//tail始终指向末尾数字位置//1.入栈所有数据(如果遇到*/号,只更新栈尾)char ch1,ch2;while(scanf("%c %d%c",&ch1,&a,&ch2)!=EOF){if(ch1=='+'){stack[++tail]=1.0*a;//push}else if(ch1=='-'){stack[++tail]=-1.0*a;//push neg}else if(ch1=='*'){stack[tail]=stack[tail]*a;//update tail}else if(ch1=='/'){stack[tail]=stack[tail]/(double)a;//updata tail}if(ch2!=' ')break; }//2.把栈里头的东西全部加起来,求和double result=0;for(int i=1;i<=tail;i++)result+=stack[i];printf("%.2lf\n",result);}return 1;
}

代码只有30多行,却实现了题目所要求的功能,感觉C++真是博大精深!


http://chatgpt.dhexx.cn/article/O3LIvcDk.shtml

相关文章

C++ 简单计算器

C实现简单的计算器 实现一个简单的计算器&#xff0c;可以实现对数字的加减乘除运算并输出显示结果。 完整代码 #include <iostream> using namespace std;int main() {char op;float num1, num2;cout << "输入运算符&#xff1a;、-、*、/ : ";cin &…

简单的计算器

实例说明 从键盘上输入数据并进行加、减、乘、除四则运算&#xff08;以“a运算符b” 的形式输入〕&#xff0c;判断输入的数据是否可以进行计算&#xff0c;若能计算&#xff0c;则输出计算结果。 实现代码 实现结果

C语言实现简单计算器

C语言实现简单计算器 一、背景二、代码1、数据结构2、弟弟行为的编程三、基本逻辑中缀转后缀&#xff08;1&#xff09;为什么要转&#xff08;2&#xff09;怎么转&#xff08;3&#xff09;注意事项 四、演示图片 一、背景 自己希望通过这个处女帖&#xff0c;来互相学习、经…

PHP实现简单计算器

目录 一、题目&#xff1a; 二、基本界面设计代码&#xff1a; 三、分析&#xff1a; 四、实现编程三个步骤 五、完整实现代码 一、题目&#xff1a; 题目描述&#xff1a;下列列表框中有、-、*、/四种运算符&#xff0c;选择不同的运算符进行&#xff0c;单击计算按钮进行不…

Linux:简单计算器

四则运算 vim一下1. 思路2. 代码分析及展示3. 运行结果 vim一下 用vi编写一个简单的四则运算程序&#xff0c;可以接受键盘输入的两个数和一个运算符号&#xff0c;并在控制台输出结果。 1. 思路 从键盘输入变量的值&#xff0c;获取这个值调用加减乘除这些函数&#xff0c;…

HTML实现简单计算器

简单计算器 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>简易计算器</title><style type"text/css">*{margin: auto;padding: 0px;text-align: center;font-family: "微软雅黑";}.con…

C语言实现简单计算器程序

简单计算器程序 编写一个简单计算器程序&#xff0c;输入格式为&#xff1a;data1 op data2。其中data1和data2是参加运算的两个数&#xff0c;op为运算符&#xff0c;它的取值只能是、-、*、/。。要求必须使用switch-case语句实现。 输出结果精确到小数点后2位&#xff1a;如…

AndroidStudio案例——简单计算器

效果展示 实验内容及步骤 设计一款带有可视化界面的简单计算器&#xff0c;供用户输入数据并查看结果。用户通过点击相应按钮&#xff08;加减乘除运算符、等号、数字&#xff09;输入正确的表达式&#xff0c;计算器进行相应的加减乘除运算&#xff0c;且可以进行小数和整数的…

Android简单计算器

文章目录 一、案列一、步骤1、activity_main.xml2、colors.xml3、strings.xml4、图片 一、案列 实现简易计算器 一、步骤 线性布局实现计算器&#xff0c;一个线性垂直布局里嵌套多个线性水平布局&#xff0c;插入文本框&#xff0c;编辑框&#xff0c;按钮多个控件&#x…

19:简单计算器

原题链接 总时间限制: 1000ms 内存限制: 65536kB 描述 一个最简单的计算器&#xff0c;支持, -, *, / 四种运算。仅需考虑输入输出为整数的情况&#xff0c;数据和运算结果不会超过int表示的范围。 输入 输入只有一行&#xff0c;共有三个参数&#xff0c;其中第1、2个参数…

python制作简单计算器

​ 做一个计算器&#xff0c;这是我们想要的效果。 1、准备工作 导入time、tqdm、math库 from tqdm import* from time import* from math import*2、开始 添加一个重复循环并添加变量s while True:#清屏print(\033c)while True:#如果用法输入的是str类型将打印输入错误&…

JavaScript实现简单计算器

一、两个输入框输入数值计算 步骤 1、编写html代码&#xff0c;实现计算器页面视图效果 2、编写js&#xff0c;实现点击输入数字和符号输出结果 1、编写html 1.1定义两个输入框和一个隐藏框。 1.2定义加减乘除四个按钮&#xff0c;并在里面设置一个单击事件onclick&#…

Java编写简单计算器

本文用Java的swing来实现一个简单计算器&#xff0c;主要内容为图形用户界面GUI的实现以及运算表达式核心算法的设计编写。 程序运行环境为Windows10 &#xff0c;编译环境为IntelliJ IDEA Community Edition 2022.2.3 一、具体功能&#xff1a; 1、&#xff1a;输入&#x…

项目一:简单计算器的实现

项目概述 1.1项目目标和主要内容 学习图形界 面的设计&#xff0c;利用 MFC 应用程序&#xff08;Java swing 或 QT 框架&#xff0c;或 C#&#xff09;创建基于对话框的应用程序&#xff0c;添加按钮、编辑框等控件&#xff1b; 能通过设计的按钮控件输入并实现简单算术运算&a…

【C语言】实现简易计算器

目录 1.实现逻辑 2.运行过程 3.优化前代码分析 主函数 计算函数 4.优化后代码分析 主函数 计算方法函数 输入操作数的函数 5.完整代码展示 1.实现逻辑 实现一个简易的计算器&#xff0c;可以计算两个整数的加减乘除 2.运行过程 3.优化前代码分析 主函数 int main()…

java工作流引擎,roadflow(一个强大的工作流引擎)

JAVA工作流引擎(J-RoadFlow) J-RoadFlow工作流平台是知名的.NET工作流引擎RoadFlow的JAVA移植版。该工作流平台由从事多年OA和工作流实施及开发的团队研发&#xff0c; 采用最简单的SM架构实现大中小企业中日常复杂业务流程审批。JAVA版不仅仅是.NET版本的移植&#xff0c;从架…

Easy-Flows - Java的简单愚蠢的工作流引擎

The simple, stupid workflow engine for Java 源代码名称&#xff1a;easy-flows源代码网址&#xff1a;http://www.github.com/j-easy/easy-flowseasy-flows 源代码文档easy-flows 源代码下载 Git URL git://www.github.com/j-easy/easy-flows.git Git Clone 代码到本地 g…

Flowable工作流引擎

Flowable工作流引擎 Flowable-基础篇(根据BV1Pb4y1p7Ku整理) 一、简介 Flowable是BPMN的一个基于java的软件实现&#xff0c;不过Flowable不仅仅包括BPMN&#xff0c;还有DMN决策表和CMMN Case管理引擎&#xff0c;并且有自己的用户管理、微服务API等一系列功能&#xff0c;…

Java工作流引擎

Java工作流引擎有很多&#xff0c;有免费和商业的 主流免费&#xff1a;Activiti和Flowable Activiti和Flowable都是来自于一个叫JBPM的开源工作流。在早期Jboss发行JBPM4的时候&#xff0c;因为合作伙伴关系闹的不开心。于是其中一个核心人员离职。加入了Alfresco(Activiti所…

工作流引擎技术选型

一、主流开源框架介绍 1、工作流相关文档 1.Camunda 官方文档&#xff1a;https://camunda.com/ 中文文档&#xff1a;介绍 | docs.camunda.org 2.Activiti 官方文档&#xff1a;https://www.activiti.org/ 中文文档&#xff1a;[activiti6用户手册 3.Snaker 官方文档&…