题目:
打开文本文件a.txt,文件中的每一行都有一个数学表达式,将他们运算出来,以后保存到b.txt中。
如:
a.txt
1+2/3*4=
2+1*5-6=
b.txt
1
1
以上是题目要求。
下面是主要代码。
是通过递归的方法实现的。
// diguisuanfa.cpp : Defines the entry point for the console application.
//
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
inline int IsDigit(char c)
{
return (c >= '0' && c <= '9') || c == '.';
}
string curr_token;
void NextToken(string& exp, int& curr)
{
char result[64] ={0};
int j = 0;
result[j++] = exp[curr++];
if (IsDigit(result[0])) while (IsDigit(exp[curr])) result[j++] += exp[curr++];
curr_token = result;
}
double Evalue1(string& exp, int& curr);
double Evalue2(string& exp, int& curr);
double Evalue3(string& exp, int& curr);
double Evalue4(string& exp, int& curr);
double Evalue(string& exp)
{
int curr = 0;
NextToken(exp, curr);
return Evalue1(exp, curr);
}
double Evalue1(string& exp, int& curr)
{
double left_value = Evalue2(exp, curr);
char ope;
while ((ope = curr_token[0]) == '+' || ope == '-')
{
NextToken(exp, curr);
double right_value = Evalue2(exp, curr);
switch (ope)
{
case '+':left_value+=right_value;break;
case '-':left_value-=right_value;break;
}
}
return left_value;
}
double Evalue2(string& exp, int& curr)
{
double left_value = Evalue3(exp, curr);
char ope;
while ((ope = curr_token[0]) == '*' || ope == '/')
{
NextToken(exp, curr);
double right_value = Evalue3(exp, curr);
switch (ope)
{
case '*':left_value*=right_value;break;
case '/':left_value/=right_value;break;
}
}
return left_value;
}
double Evalue3(string& exp, int& curr)
{
char ope;
double value;
if ((ope = curr_token[0]) == '+' || ope == '-')
{
NextToken(exp, curr);
value = Evalue4(exp, curr);
if (ope == '-') value = -value;
}
else
{
value = Evalue4(exp, curr);
}
return value;
}
double Evalue4(string& exp, int& curr)
{
double value = 0;
if (IsDigit(curr_token[0]))
{
value = atof(curr_token.c_str());
}
else if (curr_token[0] == '(')
{
NextToken(exp, curr);
value = Evalue1(exp, curr);
}
NextToken(exp, curr);
return value;
}
int main(void)
{
//=================================
string exp = "12*(3+5)+4/(6-2)";
cout << Evalue(exp) << endl;
//==================================
char szifile[256];
char szofile[256];
cout<<"请输要打开源文件名字:"<<endl;
cin>>szifile;
cout<<szifile<<endl;
ifstream i_file;
i_file.open(szifile,ios::in);
if (!i_file)
{
cout<<"源文件创建失败"<<endl;
return 1;
}
cout<<"请输入存放文件的文件名字:"<<endl;
cin>>szofile;
cout<<szofile<<endl;
ofstream ofile;
ofile.open(szofile,ios::out);
if (!ofile)
{
cout<<"源文件打开失败!"<<endl;
return 1;
}
char str[256];
int i = 0;
while (!i_file.eof())
{
i_file.getline(str,sizeof(str),'/n');
cout<<str<<endl;
string temp_exp = str;
cout << Evalue(temp_exp)<<endl;
int temp_i=Evalue(temp_exp);
//===============store b.txt======
ofile<<str<<temp_i<<endl;
//===============store b.txt======
cout<<i<<endl;
i++;
}
i_file.close();
ofile.close();
//==================================
return 0;
}
//程序下载地址:http://download.csdn.net/source/1462461
编译环境:VC++6.0 操作系统XP2