华为笔试 四川大学 2013.09 第三题:输入计算式得结果 http://stornado.cn

来源:互联网 发布:网络黄页照片 编辑:程序博客网 时间:2024/06/04 17:58
/**C/C++ Document * @author stornado * @作者 仲夏叶 */ #include <iostream>#include <string>#include <math.h>using namespace std;#define MAX 10int ch2Int(const char);int str2Int(const string);float ch2OP(const char, const float, const float);void str2Result(const string, float &);int main(){cout<<"请输入计算式:"<<endl;string str;cin>>str;if (str[0]<'0' || str[0]>'9'){cerr<<"请输入正确的计算式,只能计算加减乘除,计算式不能包含括号"<<endl;return -1;}float Result=0;str2Result(str,Result);cout<<"Result = "<<Result<<endl;return 0;}void str2Result(const string str, float &Result){// 存储参与运算的数string strInt[MAX];for (int i=0; i<MAX; i++){strInt[i] = '0';}// 存储运算符char chFH[MAX-1];for (int j=0; j<MAX-1; j++){chFH[j] = '+';}// 存储符号int m = 0;// 存储数,从第一个开始int n = 0;for (i=0; i<str.length(); i++){if ((str[i]=='+' || str[i]=='-' || str[i]=='*' || str[i]=='/') &&(str[i+1]=='+' || str[i+1]=='-' || str[i+1]=='*' || str[i+1]=='/')){cerr<<"计算式不合法!"<<endl;return;}if (str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/'){chFH[m] = str[i];//cout<<"#"<<chFH[m]<<"# ";m++;n++;}else if (str[i] >= '0' && str[i] <= '9'){strInt[n] += str[i];//cout<<"%"<<strInt[n]<<"% ";}else{cerr<<"计算式不合法!"<<endl;return;}}// 开始计算/************************************************************************//* 先假设没有连续的*或/                                                 *//************************************************************************/// chFH[-1] = '@';// for (i=0; i<4;i++)// {// if ((chFH[i] == '*' || chFH[i] == '/') && (chFH[i-1] != '*' || chFH[i-1] != '/') && (chFH[i+1] != '*' || chFH[i+1] != '/'))// {// Result += ch2OP(chFH[i],str2Int(strInt[i]),str2Int(strInt[i+1]));// }// else if ((chFH[i] == '*' || chFH[i] == '/') && (chFH[i-1] == '*' || chFH[i-1] == '/'))// {// Result += ch2OP(chFH[i],Result,str2Int(strInt[i+2]));// } // else// {// Result += ch2OP(chFH[i],str2Int(strInt[i]),str2Int(strInt[i+1]));// }// }float num[MAX];for (i=0; i<MAX; i++){num[i] = str2Int(strInt[i]);}Result = num[0];chFH[-1] = '+';for (i=0; i<MAX-1; i++){if (chFH[i] == '*' || chFH[i] == '/'){float temp = 0;// temp = ch2OP(chFH[i],str2Int(strInt[i]),str2Int(strInt[i+1]));// str2Int(strInt[i]) = 0;// str2Int(strInt[i+1]) = temp;temp = ch2OP(chFH[i], num[i], num[i+1]);num[i] = 0;num[i+1] = temp;// chFH[i] = '+';chFH[i] = chFH[i-1];}// Result = ch2OP(chFH[i], Result, num[i+1]);//  cout<<Result<<"\n";} Result = num[0];for (i=0; i<MAX-1; i++){// cout<<i+1<<"#\t"<<Result<<" =>";Result = ch2OP(chFH[i], Result, num[i+1]);// cout<<Result<<"\n";}}int str2Int(const string str){int Result=0;for (int i=0; i<str.length(); i++){Result += pow(10,(str.length()-1-i))*ch2Int(str[i]);}return Result;}int ch2Int(const char ch){switch (ch){case '0':return 0;break;case '1':return 1;break;case '2':return 2;break;case '3':return 3;break;case '4':return 4;break;case '5':return 5;break;case '6':return 6;break;case '7':return 7;break;case '8':return 8;break;case '9':return 9;break;}}float ch2OP(const char ch, const float a, const float b){switch (ch){case '+':return a+b;break;case '-':return a-b;break;case '*':return a*b;break;case '/':return a/b;break;}}
第二版:华为要求无输入输出提示
/**C/C++ Document * @author stornado * @作者 仲夏叶 * for 华为 * 无提示版 */#include <iostream>#include <string>#include <math.h>using namespace std;// 最多操作十个数#define MAX 10// 将每一位转换为intint ch2Int(const char);// 将字符串转换为intint str2Int(const string);float ch2OP(const char, const float, const float);// 计算算式结果float str2Result(const string, float &);int main(){string str;cin>>str;float Result=0;cout<<str2Result(str,Result)<<endl;return 0;}float str2Result(const string str, float &Result){// 存储参与运算的数string strInt[MAX];for (int i=0; i<MAX; i++){strInt[i] = '0';}// 存储运算符char chFH[MAX-1];for (int j=0; j<MAX-1; j++){chFH[j] = '+';}// 存储符号int m = 0;// 存储数,从第一个开始int n = 0;for (i=0; i<str.length(); i++){// 如果有连续符号则计算式不合法// Result = 0;if ((str[i]=='+' || str[i]=='-' || str[i]=='*' || str[i]=='/') &&(str[i+1]=='+' || str[i+1]=='-' || str[i+1]=='*' || str[i+1]=='/')){return 0;}if (str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/'){chFH[m] = str[i];m++;n++;}else if (str[i] >= '0' && str[i] <= '9'){strInt[n] += str[i];}}float num[MAX];for (i=0; i<MAX; i++){num[i] = str2Int(strInt[i]);}Result = num[0];chFH[-1] = '+';for (i=0; i<MAX-1; i++){if (chFH[i] == '*' || chFH[i] == '/'){float temp = 0;temp = ch2OP(chFH[i], num[i], num[i+1]);num[i] = 0;num[i+1] = temp;chFH[i] = chFH[i-1];}} Result = num[0];for (i=0; i<MAX-1; i++){Result = ch2OP(chFH[i], Result, num[i+1]);}return Result;}int str2Int(const string str){int Result=0;for (int i=0; i<str.length(); i++){Result += pow(10,(str.length()-1-i))*ch2Int(str[i]);}return Result;}int ch2Int(const char ch){switch (ch){case '0':return 0;break;case '1':return 1;break;case '2':return 2;break;case '3':return 3;break;case '4':return 4;break;case '5':return 5;break;case '6':return 6;break;case '7':return 7;break;case '8':return 8;break;case '9':return 9;break;}}float ch2OP(const char ch, const float a, const float b){switch (ch){case '+':return a+b;break;case '-':return a-b;break;case '*':return a*b;break;case '/':return a/b;break;}}

原创粉丝点击