每周一坑--简单的计算器

简介: 每周一坑--简单的计算器

问题: 做一个计算器,要能够进行+-*/等基本计算。后续可能支持幂运算,求对数,等运算。

效果大概是这样

输入1+2/3 =

输出:ans =1.66

先从比较简单的版本开始。

版本1:

思路:获取用户输入,得到一个字符串类型的值  input。

然后对这个字符串进行处理:

逐个字符的分析,如果出现 +-*/=这样的运算符,则它的前面的那些字符一定是个数字,把这些字符转换成数字。

然后提取运算符,进行运算即可。

先提取字符串:

//简单的计算器
#include<iostream>
#include<string>
int main(void)
{
  using namespace std;
  string input;//字符串input 用来读取用户输入
  double ans;  //ans,用来存储答案
  int kk = -1;     //kk用来储存当前运算符位置  
  cout << "输入表达式:例如1+2=\n";
  cin >> input;
  int length = input.length();
  for (int i = 0; i < length; i++)
  {
    switch (input[i])
    {
    case '+':case '-': case '*': case '/':case '=':
    {
      string s_num;
      s_num = input.substr(kk+1, i-kk-1);
      //debug
      cout << s_num<<endl;
      kk = i;
    }
    }
  }
  system("pause");
  return 0;
}

效果如下:

 

然后,要把字符串转换成字符,可以直接按位转换,但是C++已经有了字符串转数字的函数了。在<sstream>有个stringstream对象,用它可以 进行 字符串和数字互相转换。

参考:https://blog.csdn.net/michaelhan3/article/details/75667066/

 

//简单的计算器
#include<iostream>
#include<string>
#include<sstream>
int main(void)
{
  using namespace std;
  string input;//字符串input 用来读取用户输入
  double ans;  //ans,用来存储答案
  int kk = -1;     //kk用来储存当前运算符位置  
  cout << "输入表达式:例如1+2=\n";
  cin >> input;
  int length = input.length();
  for (int i = 0; i < length; i++)
  {
    switch (input[i])
    {
    case '+':case '-': case '*': case '/':case '=':
    {
      string s_num;
      s_num = input.substr(kk+1, i-kk-1);
      //debug
      stringstream ss;
      ss << s_num;
      double num;
      ss >> num;
      cout << num<<endl;
      kk = i;
    }
    }
  }
  system("pause");
  return 0;
}


下面只要进行计算就好了

//进行计算
  int arr_index = 0; //下个要算的数字的索引
  ans = arr_double[0];
  arr_index++;
  for (int i = 0; i < length; i++)
  {
    switch (input[i])
    {
    case '+':
      ans +=arr_double[arr_index++];
      break;
    case '-': 
      ans -= arr_double[arr_index++];
      break;
    case '*':
      ans *= arr_double[arr_index++];
      break;
    case '/':
      ans /= arr_double[arr_index++];
      break;
    case '=':
      break;
    }
  }

--

最后是完整代码

//简单的计算器
#include<iostream>
#include<string>
#include<sstream>
int main(void)
{
  const int N = 100;
  using namespace std;
  string input;//字符串input 用来读取用户输入
  int kk = -1;     //kk用来储存当前运算符位置  
  double arr_double[N]; //用来存储要算的数字
  int arr_all = 0;      //数字的数量
  double ans;  //ans,用来存储答案
  cout << "输入表达式:例如1+2=\n";
  cin >> input;
  int length = input.length();
  //获取数字
  for (int i = 0; i < length; i++)
  {
    switch (input[i])
    {
    case '+':case '-': case '*': case '/':case '=':
    {
      string s_num;
      s_num = input.substr(kk+1, i-kk-1);
      stringstream ss;
      ss << s_num;
      ss >> arr_double[arr_all] ;
      arr_all++;
      kk = i;
    }
    }
  }
  //进行计算
  int arr_index = 0; //下个要算的数字的索引
  ans = arr_double[0];
  arr_index++;
  for (int i = 0; i < length; i++)
  {
    switch (input[i])
    {
    case '+':
      ans +=arr_double[arr_index++];
      break;
    case '-': 
      ans -= arr_double[arr_index++];
      break;
    case '*':
      ans *= arr_double[arr_index++];
      break;
    case '/':
      ans /= arr_double[arr_index++];
      break;
    case '=':
      break;
    }
  }
 
  cout << "ans=" << ans<<endl;
  system("pause");
  return 0;
}
 
 
 

 

 

当然,这个计算器还有一些问题。

1.优先级问题,这个计算器只会从左往右计算。

2.不支持()的形式,很多时候我们都会用到()

3.不支持一些常用运算,比如求平方,立方,根号等等。

这些问题留到第二版解决吧。

第一版先到这里。 2018/11/2 22:07


相关文章
|
1月前
|
安全 Serverless Python
用Python实现计算器功能
用Python实现计算器功能
42 1
|
3天前
|
测试技术
技术心得记录:复利计算器4.0之再遇JUnit
技术心得记录:复利计算器4.0之再遇JUnit
|
1月前
|
前端开发
好看的前端计算器代码分享(html+css+js制作计算器)
好看的前端计算器代码分享(html+css+js制作计算器)
50 0
|
11月前
|
小程序 JavaScript 开发工具
【每周一坑】房贷计算器 |【解答】生成九宫格图片
因为是“刚需”,所以网上早有无数的版本。有人已经用过,有人以后可能会用。有没有想过,类似这种小工具,其实你自己也可以实现。
|
11月前
|
开发工具 Python
【每周一坑】鸡兔同笼 +【解答】房贷计算器
附加题:输入头数 m 和脚数 n,输出鸡的数量 c 和兔子的数量 r,或提示无解。
|
11月前
|
数据安全/隐私保护 计算机视觉 Python
【每周一坑】新个税计算器 + 【解答】数字水印
详细解答和参考代码将在下次栏目中给出,也可以其他同学在留言中的代码。
计算器(简易版)
另一种是利用转移表的方式来写,将各个函数的地址存放在一个函数指针数组里面,当要使用函数时,就直接调用指针即可,可以改观上面的美观(上面的代码有很多重复的,太挫了)
75 0
蓝桥杯之单片机学习(二十一)——自动售水机(附题目和完整代码)
蓝桥杯之单片机学习(二十一)——自动售水机(附题目和完整代码)
333 0
蓝桥杯之单片机学习(二十一)——自动售水机(附题目和完整代码)
|
JavaScript
蓝桥模拟赛刷题之计算个人所得税
蓝桥第一次线上模拟赛的第三题,要让我们实现一个个人所得税计算功能,原生实现
102 1
|
算法
算法 | 计算器系列 | 刷题打卡
算法 | 计算器系列 | 刷题打卡
107 0
算法 | 计算器系列 | 刷题打卡