问题: 做一个计算器,要能够进行+-*/等基本计算。后续可能支持幂运算,求对数,等运算。
效果大概是这样
输入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