每周一坑–简单的计算器

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

效果大概是这样

输入1+2/3 =

输出:ans =1.66

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

版本1:

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

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

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

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

先提取字符串:

//简单的计算器
#include
#include
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++已经有了字符串转数字的函数了。在

参考:​​

//简单的计算器
#include
#include
#include
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
#include
#include
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

Original: https://blog.51cto.com/u_15710630/5451353
Author: 一只大鸽子
Title: 每周一坑–简单的计算器

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/516682/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球