问题简介:
已知文件read.txt,文件可以用记事本来创建,文件内容如下:
134+6787, 765*24, 6515-1233, 765/67,675431+6754
现要求将文件中的表达式读出来计算,并把结果连同表达式写入文件ok.txt,写入文件内容格式如下:
134+6787=6921
765*24=18360
...
过程与部分算法解释:
刚开始看到题目有点蒙~
刚开始主要问题是在如何把文件中的若干个表达式转成一个个元素存进数组。
写这个的时候还没完全掌握指针,所以想了一个折中的方法,弄了个全局变量。
在读取文件部分,用了get()一个个字符读取,以逗号和文件尾为界,将几个表达式写进string(全局)数组里,并且将表达式的个数写进int类型的全局变量里。
至于计算部分,写了四个函数,分别计算加减乘除,然后写了一个总的计算函数,通过find()确定运算符号,再调用对应的计算函数;计算函数中,是用find()把传入的的string类型变量中的运算符位置找出来,再用substr()和stringstream把表达式的两个项提取出来,最后计算函数直接返回计算结果;然后总计算函数再返回计算函数的结果。
写入文件部分,调用了总计算函数,直接写入文件。
至此,题目要求基本解决。
源码:
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <cmath>
using namespace std;
int calt(string),calplu(string),calmin(string),calmul(string),caldiv(string);//Calculate: total(double term),plus,minus,multiply,divided
void readdata(),writedata();
string rd[500];
int rdn=0;
void writedata()//funtion:write data to "d:\\ok.txt"
{
ofstream file("d:\\ok.txt",ios::out);
for(int i=0;i<rdn;i++)
{
file<<rd[i]<<"="<<calt(rd[i])<<endl;
}
}
void readdata()//funtion:read data from "d:\\read.txt"
{
ifstream file("d:\\read.txt",ios::in);
char sc;
string sg="";
int i=0;
stringstream ss;
while(!file.eof())
{
sc=file.get();
if(sc==','||file.eof())
{
ss<<sg;
ss>>rd[i];
ss.clear();
sg="";
i++;
}
else
{
sg=sg+sc;
}
}
//file.colse();
rdn=i;
}
int calt(string str)//Calculate: total(double term)
{
int plu=0,min=0,mul=0,div=0,res=0;
plu=str.find('+');
if(plu>0){res=calplu(str);}
min=str.find('-');
if(min>0){res=calmin(str);}
mul=str.find('*');
if(mul>0){res=calmul(str);}
div=str.find('/');
if(div>0){res=caldiv(str);}
return res;
}
int calplu(string str)//Calculate: plus
{
int len=str.length(),pos=str.find('+');
stringstream ss;
int a=0,b=0;
ss<<str.substr(0,pos);
ss>>a;
ss.clear();
ss<<str.substr(pos+1,len-(pos+1));
ss>>b;
ss.clear();
return a+b;
}
int calmin(string str)//Calculate: minus
{
int len=str.length(),pos=str.find('-');
stringstream ss;
int a=0,b=0;
ss<<str.substr(0,pos);
ss>>a;
ss.clear();
ss<<str.substr(pos+1,len-(pos+1));
ss>>b;
ss.clear();
return a-b;
}
int calmul(string str)//Calculate: multiply
{
int len=str.length(),pos=str.find('*');
stringstream ss;
int a=0,b=0;
ss<<str.substr(0,pos);
ss>>a;
ss.clear();
ss<<str.substr(pos+1,len-(pos+1));
ss>>b;
ss.clear();
return a*b;
}
int caldiv(string str)//Calculate: divided
{
int len=str.length(),pos=str.find('/');
stringstream ss;
int a=0,b=0;
ss<<str.substr(0,pos);
ss>>a;
ss.clear();
ss<<str.substr(pos+1,len-(pos+1));
ss>>b;
ss.clear();
return a/b;
}
int main()
{
readdata();
writedata();
cout<<"Finished!!"<<endl;
/*
//TEST
string str;
cout<<"Input a double term pls:"<<endl;
cin>>str;
cout<<calt(str)<<endl;
*/
cout<<"ALL Finished!!"<<endl;
return 0;
}
存在问题:
emmm.......问题还是比较多的。
这段东西能解决双项式的运算,但解决不了三项以上的多项式运算,哎最后还是憋不出解决方案......
而且代码量也比较多,算法效率也比较低,我自己都这么觉得......
还有一个,如果文件中的表达式大于定义的数组容量,那边界后的表达式就算不到了;这个用指针的动态内存分配应该可以解决。