posts - 0,comments - 0,trackbacks - 0
#include "stdafx.h"

#include <iostream>
#include <fstream>
using namespace std;

const int MAX = 1000;
typedef struct
{
//char coeff[10];
int coeff;
int power;
}Items;

typedef struct
{
Items items[MAX];
int num_items;
}Poly;

bool readnumber(istream &ifs,int & i){
bool ret=false;
i=0;
while(ifs.peek()>='0' && ifs.peek()<='9'){
i*=10;
i+=ifs.peek()-'0';
ifs.ignore();
ret=true;
}
return ret;
}
bool read(istream &ifs,Items &i){
while(ifs.good()){
if(isspace(ifs.peek())){
ifs.ignore();
}else{
break;
}
}

if(!ifs.good()) return false;
int sign=1;
if(ifs.peek()=='+'){
sign=1;
ifs.ignore();
}else if(ifs.peek()=='-'){
sign=-1;
ifs.ignore();
}

bool ret=false;
if(ifs.peek()=='X'){
i.coeff=1;
ret=true;
}else{
if(readnumber(ifs,i.coeff)){
ret=true;
}
}
i.coeff*=sign;

if(ifs.peek()=='X'){
ifs.ignore();//X
if(ifs.peek()=='^'){
ifs.ignore();//'
ifs>>i.power;
}else{
i.power=1;
}
ret=true;
}else{
i.power=0;
}
return ret;
}
void ReadTextFile(const char * fname,Poly & p){
ifstream ifs(fname);
Items *pi=&p.items[0];
p.num_items=0;
while(read(ifs,*pi++))p.num_items++;
}
void DifferentationPoly(Poly &p){
for(int i=0;i<p.num_items;++i){
p.items[i].coeff*=p.items[i].power--;
}
}

void PrintComplex(const char *ofname,Poly &p){
ofstream ofs(ofname);
//ostream &ofs=cout;

for(int i=0;i<p.num_items;++i){

Items it=p.items[i];
if(it.power==0){
if(i!=0)ofs<<'+';
ofs<<it.coeff;
}else if(it.coeff!=0){
if(i!=0)ofs<<'+';
if(it.coeff!=1){
ofs<<it.coeff;
}
ofs<<"X";
if(it.power!=1){
ofs<<"^"<<it.power;
}
}
}
}

int main(int argc, char *argv[])
{
Poly eq;
ReadTextFile(argv[1], eq); // process text file
DifferentationPoly(eq); // differentiation of polynomials
PrintComplex(argv[2], eq); // print the results on file.
return 0;
}