问题: 做一个计算器,要能够进行+-*/等基本计算。后续可能支持幂运算,求对数,等运算。
效果大概是这样
输入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/
转载文章受原作者版权保护。转载请注明原作者出处!