Класс для простых арифметических выражений

Рубрика: C++, Дата: 1 March, 2013, Автор:
Tags:

Определите класс для анализирования, хранения, вычисления и печати простых арифметических выражений, состоящих из целых констант и операций +, -, *, и /. Открытый интерфейс должен выглядеть так:

class Expr
{
//...
public:
  Expr(const char);
  int Eval();
  void print();
};

Строковый аргумент конструктора Expr::Expr() является выражением. Функция Expr::Eval() возвращает значение выражения, а Expr::print() выводит представление выражения в cout.

Программа может выглядеть примерно так:

Expr x("123/4+123*4-3");
cout <<"x= "<<x.eval()<<"\n";
x.print();

Определите класс Expr дважды, один раз для его представления выберите список связных узлов, а в другой раз строку. Поэкспериментируйте с разными способами печати выражения: с полной расстановкой скобок, в постфиксной нотации и так далее.

Да такая головоломистая задачка. Попробуем ее все рамно решить.

Вот что у меня получилось Expr.h

//opredelenie (declaration)
#ifndef EXPR_H
#define EXPR_H
#include <string>
using std::string;

struct Node
{
	Node(string a)
	:val(a),nextPtr(0)
	{
		//pyctoi konctryktor
	}
	string val;
	Node* nextPtr;//ykazatel6 na cledyyuchii yzel
};

class Expr
{
	Node* firstPtr;
	string str;//xranit vurajenie
public:
	Expr(const char*);
	int eval();
	void print();
private:
	//dobavit6 yzel
	void addNode(string a);

	//dobavit6 yzel helper //peredaem ykazatel6 chtobu izmenit6 ego znachenie
	void addNodeHelper(Node** ptr,string &a);

	//printHelper rekyrcivnui vuvod
	void printHelper(Node* ptr);

	//perevod chicla v ctroky int
	string strNum(int n);
};

#endif

Expr.cpp

//definition of class
#include <cstring>
using std::strlen;
#include <cctype>
using std::isdigit;
#include <cstdlib>
using std::exit;
using std::atoi;
#include <cmath>

#include "Expr.h"

Expr::Expr(const char* a)
:firstPtr(0),str(a)//inicializaci9
{
	string s="";
	for(int i=0;i<strlen(a);i++)
	{
		if(isdigit(a[i]))
		{
			s+=a[i];
		}
		else if(!isdigit(a[i]))
		{
			cout <<s<<endl;
			addNode(s);
			s=a[i];
			cout <<s<<endl;
			addNode(s);
			s="";
		}
	}
	cout <<s<<endl;
	addNode(s);
}

//dobavit6 yzel
void Expr::addNode(string a)
{
	if(firstPtr==0)
	{
		//cout <<"cpicok pyct"<<endl;
		firstPtr=new Node(a);//cozdaem novui yzel
	}
	else
	{
		//cout <<"ne pyct"<<endl;
		addNodeHelper(&firstPtr->nextPtr,a);
		//cout <<"firstPtr->nextPtr->val= "<<firstPtr->nextPtr->val<<endl;
	}
}

//dobavit6 yzel helper
void Expr::addNodeHelper(Node** ptr,string &a)
{
	if(*ptr==0)//pyctoi yzel
	{
		//cout <<"cozdaem novui yzel"<<endl;
		*ptr=new Node(a);//cozdat6 yzel
	}
	else
	{
		//cout <<"rek vuzov"<<endl;
		addNodeHelper(&(*ptr)->nextPtr,a);//rekyrcivnui vuzov
	}

}

//vuchicl9et vurajenie
int Expr::eval()
{
	cout <<"vucheclit6 znacheni9"<<endl;
	cout <<str<<endl;
	//ichem operacii '*' i '/'
	for(int i=0;i<str.length();i++)
	{
		if(str[i]=='*')
		{
			cout <<"naideno ymnojenie"<<endl;
			//naxodim pervoe chislo
			string n1="";
			int l=0;
			for(int j=i-1;j>=0;j--)
			{
				if(isdigit(str[j]))
				{
					n1+=str[j];
				}
				else
				{
					l=j;
					break;//voxod
				}
			}
			//cout <<n1<<endl;
			string prom="";
			int b=0;
			for(int j=n1.length()-1;j>=0;j--)
			{
				//cout <<"n1[j]= "<<n1[j]<<endl;
				prom[b]=n1[j];
				b++;
			}
			n1=prom;
			cout <<"n1= "<<n1.data()<<endl;

			//naxodim vtoroe chiclo
			string n2="";
			int r=0;
			for(int j=i+1;j<str.length();j++)
			{
				if(isdigit(str[j]))
				{
					n2+=str[j];
				}
				else
				{
					r=j;
					break;
				}
			}
			cout <<"n2= "<<n2<<endl;
			int n=atoi(n1.data())*atoi(n2.data());//ymnojaem
			cout <<"n= "<<n<<endl;
			n2=strNum(n);
			cout <<"n2= "<<n2<<endl;
			n1="";
			//cozdaem novyyu ctroky
			cout <<"l= "<<l<<endl;
			cout <<"r= "<<r<<endl;
			if(l==0)
			{
				n1="";
			}
			else
			{
				for(int j=0;j<=l;j++)
				{
					n1+=str[j];
				}
			}
			cout <<"n1= "<<n1<<endl;
			string n3="";
			for(int j=r;j<=str.length();j++)
			{
				n3+=str[j];
			}
			cout <<"n3= "<<n3<<endl;
			str="";
			str+=n1+n2+n3;
			cout <<"str= "<<str<<endl;
			i=0;//obnovl9em cikl

			//exit(1);
		}//konec '*'
		else if(str[i]=='/')//delenie
		{
			cout <<"naideno ymnojenie"<<endl;
			//naxodim pervoe chislo
			string n1="";
			int l=0;
			for(int j=i-1;j>=0;j--)
			{
				if(isdigit(str[j]))
				{
					n1+=str[j];
				}
				else
				{
					l=j;
					break;//voxod
				}
			}
			//cout <<n1<<endl;
			string prom="";
			int b=0;
			for(int j=n1.length()-1;j>=0;j--)
			{
				//cout <<"n1[j]= "<<n1[j]<<endl;
				prom[b]=n1[j];
				b++;
			}
			n1=prom;
			cout <<"n1= "<<n1.data()<<endl;

			//naxodim vtoroe chiclo
			string n2="";
			int r=0;
			for(int j=i+1;j<str.length();j++)
			{
				if(isdigit(str[j]))
				{
					n2+=str[j];
				}
				else
				{
					r=j;
					break;
				}
			}
			cout <<"n2= "<<n2<<endl;
			int n=floor((atoi(n1.data())/atoi(n2.data()))+0.5);//delenie
			cout <<"n= "<<n<<endl;
			n2=strNum(n);
			cout <<"n2= "<<n2<<endl;
			n1="";
			//cozdaem novyyu ctroky
			cout <<"l= "<<l<<endl;
			cout <<"r= "<<r<<endl;
			if(l==0)
			{
				n1="";
			}
			else
			{
				for(int j=0;j<=l;j++)
				{
					n1+=str[j];
				}
			}
			cout <<"n1= "<<n1<<endl;
			string n3="";
			for(int j=r;j<=str.length();j++)
			{
				n3+=str[j];
			}
			cout <<"n3= "<<n3<<endl;
			str="";
			str+=n1+n2+n3;
			cout <<"str= "<<str<<endl;
			i=0;//obnovl9em cikl

			//exit(1);
		}//konec delenie '/'
	}//konec for

	//ichem operatoru '+' i '-'
	for(int i=0;i<str.length();i++)
	{
		if(str[i]=='+')
		{
			cout <<"naideno ymnojenie"<<endl;
			//naxodim pervoe chislo
			string n1="";
			int l=0;
			for(int j=i-1;j>=0;j--)
			{
				if(isdigit(str[j]))
				{
					n1+=str[j];
				}
				else
				{
					l=j;
					break;//voxod
				}
			}
			//cout <<n1<<endl;
			string prom="";
			int b=0;
			for(int j=n1.length()-1;j>=0;j--)
			{
				//cout <<"n1[j]= "<<n1[j]<<endl;
				prom[b]=n1[j];
				b++;
			}
			n1=prom;
			cout <<"n1= "<<n1.data()<<endl;

			//naxodim vtoroe chiclo
			string n2="";
			int r=0;
			for(int j=i+1;j<str.length();j++)
			{
				if(isdigit(str[j]))
				{
					n2+=str[j];
				}
				else
				{
					r=j;
					break;
				}
			}
			cout <<"n2= "<<n2<<endl;
			int n=atoi(n1.data())+atoi(n2.data());//ymnojaem
			cout <<"n= "<<n<<endl;
			n2=strNum(n);
			cout <<"n2= "<<n2<<endl;
			n1="";
			//cozdaem novyyu ctroky
			cout <<"l= "<<l<<endl;
			cout <<"r= "<<r<<endl;
			if(l==0)
			{
				n1="";
			}
			else
			{
				for(int j=0;j<=l;j++)
				{
					n1+=str[j];
				}
			}
			cout <<"n1= "<<n1<<endl;
			string n3="";
			for(int j=r;j<=str.length();j++)
			{
				n3+=str[j];
			}
			cout <<"n3= "<<n3<<endl;
			str="";
			str+=n1+n2+n3;
			cout <<"str= "<<str<<endl;
			i=0;//obnovl9em cikl

			//exit(1);
		}//konec '+'
		else if(str[i]=='-')//otn9t6
		{
			cout <<"naideno ymnojenie"<<endl;
			//naxodim pervoe chislo
			string n1="";
			int l=0;
			for(int j=i-1;j>=0;j--)
			{
				if(isdigit(str[j]))
				{
					n1+=str[j];
				}
				else
				{
					l=j;
					break;//voxod
				}
			}
			//cout <<n1<<endl;
			string prom="";
			int b=0;
			for(int j=n1.length()-1;j>=0;j--)
			{
				//cout <<"n1[j]= "<<n1[j]<<endl;
				prom[b]=n1[j];
				b++;
			}
			n1=prom;
			cout <<"n1= "<<n1.data()<<endl;

			//naxodim vtoroe chiclo
			string n2="";
			int r=0;
			for(int j=i+1;j<str.length();j++)
			{
				if(isdigit(str[j]))
				{
					n2+=str[j];
				}
				else
				{
					r=j;
					break;
				}
			}
			cout <<"n2= "<<n2<<endl;
			int n=atoi(n1.data())-atoi(n2.data());//otn9t6
			cout <<"n= "<<n<<endl;
			n2=strNum(n);
			cout <<"n2= "<<n2<<endl;
			n1="";
			//cozdaem novyyu ctroky
			cout <<"l= "<<l<<endl;
			cout <<"r= "<<r<<endl;
			if(l==0)
			{
				n1="";
			}
			else
			{
				for(int j=0;j<=l;j++)
				{
					n1+=str[j];
				}
			}
			cout <<"n1= "<<n1<<endl;
			string n3="";
			for(int j=r;j<=str.length();j++)
			{
				n3+=str[j];
			}
			cout <<"n3= "<<n3<<endl;
			str="";
			str+=n1+n2+n3;
			cout <<"str= "<<str<<endl;
			i=0;//obnovl9em cikl

			//exit(1);
		}//konec '-'
	}
	cout <<str<<endl;
	exit(1);

	return atoi(str.data());
}

//pechataet vurajenie
void Expr::print()
{
	if(firstPtr==0)
	{
		cout <<"cpicok pyct"<<endl;
	}
	else
	{
		cout <<firstPtr->val<<' ';
		printHelper(firstPtr->nextPtr);//rekyrcivnui vuzov
	}
}

//printHelper rekyrcivnui vuvod
void Expr::printHelper(Node* ptr)
{
	//cout <<"ptr= "<<ptr<<endl;
	if(ptr!=0)
	{
		cout <<ptr->val<<' ';
		printHelper(ptr->nextPtr);
	}
}

//perevod chicla v ctroky int
string Expr::strNum(int n)
{
    int mass[13]={0};
    for(int i=0;n!=0;n=n/10,i++)
    {
        int r=n%10;
        //cout <<r<<endl;
        mass[i]=r;
    }
    string s="";
    int i=12;
    for(;mass[i]==0;i--);
    for(;i>=0;i--)
    {
        s+=(mass[i]+'0');
        //cout <<mass[i]<<endl;
    }
    //cout <<s<<endl;
    return s;
}

и сама исполняемая программа назовите как хотите

//klacc dl9 analizirovani9 pechati i xraneni9 proctux arifmeticheckix vurajenii
#include <iostream>
using std::cout;
using std::endl;

#include "Expr.h"

int main()
{
	Expr a("34-2*2+4/2-1");//34-4+2-1 //31
	cout <<endl;
	a.print();
	cout <<endl;
	cout <<a.eval()<<endl;

	return 0;
}

Ну уж извините господа но меня такие задачки кумарят! Я ее конечно не правильно сделал, ну как бы правильно выражения вида 7+3/4+10 работают и все со скобками нет, обработку скобок не добавил.

Ну, что это за задачки для начинающих скажите мне, где сразу нужно создать офигевший класс не зная по какому алгоритму его создавать, в книге ничего об этом не сказано, вы все знаете, еще раз повторяю книга Страуструпа не для начинающих, а именно для профессионалов, хотя бы посмотреть на эту задачку, я ее конечно неправильно решил, решать ее нужно было совсем по другому, а именно переводить выражение в инфиксную запись затем добавить ее в стек, и затем извлекать и вычислять выражения, это как минимум нужно знать алгоритм преобразования из постфиксной записи в инфиксную, его в конструкторе втулить, потом алгоритм по которому вычисляется инфиксное выражение, его уже втулить в функции eval().

Ну и на сколько вы думаете для новичка затянится решение этой задачи? Я думаю на неделю. Это гамно, а не задача, Поэтому я так решил ее как решил без всех этих алгоритмов, а так наскоком. И не собираюсь вымучивать так как надо, поэтому довольствуйтесь тем, что есть.

И вообще ну их на*уй такие задачи, которые по нескольку дней нужно решать. Это если прикинуть, то после каждой главы 20 задач, то это, что же мне главу одну месяца два проходит. Да пошло оно нафиг все….

Да всетаки совесть замучила от и сделал так как нужно с переводом в постфиксную форму и вычислением постфиксного выражения. Вот, что у меня получилось, сам класс файл Expr1.h:

//ob69vlenie klacca Expr1.h
#ifndef EXPR1_H
#define EXPR1_H
#include <string>
using std::string;

struct Node
{
	Node(string a)
	:nextPtr(0),val(a)
	{
		//pyctoi konctryktor
	}
	string val;//znachenie
	Node* nextPtr;
};

class Expr1
{
	string infix;
	string postfix[100];
	Node* firstPtr;//ykazatel6 na pervui element
public:
	//konctryktor
	Expr1(string a);

	//podcchituvaet vurajenie
	int eval();

	//vuvod camogo vurajeni9
	void print();

private:	
	//dobavit6 v konec cpicka
	void add(string a);

	//dobavit6 helper
	void addHelper(string &a,Node** ptr);

	//vuvod cpicka
	void printS();

	//vuvod cpicka helper
	void printSHelper(Node* ptr);

	//ydalit6 poclednii element
	void delLast(string&);

	//ydalit6 helper //peredaem ykazatel6 na ykazatel6
	void delLastHelper(Node**,string&);

	//perevod chicla v ctroky int
	string strNum(int n);

};

#endif

файл Expr1.cpp:

//opredelenie klacca Expr1
#include <cctype>
using std::isdigit;
#include <cstdlib>
using std::exit;
using std::atoi;

#include "Expr1.h"

//konctryktor
Expr1::Expr1(string a)
:firstPtr(0),infix(a)
{
	//inicializaci9 postfix
	for(int i=0;i<100;i++)
	{
		postfix[i]="";
	}

	//perevod v postfix
	//cout <<"perevod v poctfix "<<a<<endl;
	//1.zatolknyt6 v ctek levyyu ckobky
	add("(");
	//printS();
	//exit(1);
	//2. dobavili pravyyu ckobky vkonec
	infix+=')';
	//cout <<"infix= "<<infix<<endl;
	//exit(1);
	int count=0;
	for(int i=0;i<infix.length();i++)
	{
		if(infix[i]==' ')
			continue;
		//cout <<"______________i= "<<i<<endl;
		//cout <<"infix[i]= "<<infix[i]<<endl;
		//ecli cifra, kopirovat6 ego v cledychii element poctfix
		if(isdigit(infix[i]))
		{
			//printS();
			//cout <<"chiclo "<<infix[i]<<endl;
			postfix[count]="";	
			//cout <<postfix[count-1]<<endl;
			postfix[count]+=infix[i];
			for(int j=i+1;j<infix.length();j++)
			{
				if(isdigit(infix[j]))
				{
					postfix[count]+=infix[j];
					i=j;//izmen9em i
				}
				else 
					break;
			}
			//cout <<"postfix[count]= "<<postfix[count]<<endl;
			//printS();
			//exit(1);
			++count;
		}

		//ecli leva9 ckobka, zatalknyt6 ee v ctek
		else if(infix[i]=='(')
		{
			//cout <<"leva9 ckobra"<<endl;
			add("(");
			//printS();
			//exit(1);
		}

		//ecli znak operacii
		else if(!isdigit(infix[i])&&infix[i]!=')'&&infix[i]!='(')
		{	
			//cout <<"znak operacii"<<endl;
			//vutalkivat6 znaki operacii iz cteka ecli oni tam ect6
			//cout <<"pered"<<endl;
			//cout <<"i= "<<i<<endl;
			//printS();
			string s="";
			delLast(s);
			if(!isdigit(s[0])&&s[0]!='('&&s[0]!=')')//ect6 znaki operacii
			{
				//cout <<"v cteke znak operacii"<<endl;
				//cout <<"s= "<<s<<endl;
				//izvlekaem znaki operacii iz cteka i cravnivaem prioritet
				//poka prioritet raven ili bol6we pomechaem v postfix
				/*for(int k=0;k<4;k++)
					cout <<"postfix= "<<postfix[k]<<endl;*/
				//cout <<"infix[i]= "<<infix[i]<<endl;
				//prover9em prioritet
				if(infix[i]=='-'||infix[i]=='+')//minimal6nui prioritet
				{
					//cout <<"minimum prioritet"<<endl;
					while(s[0]=='+'||s[0]=='-'||s[0]=='*'||s[0]=='/')
					{
						postfix[count++]=s;
						s="";
						//cout <<"s= "<<s<<endl;
						delLast(s);
					}
					add(s);
					string sss="";
					sss+=infix[i];
					add(sss);
					//printS();
					//exit(1);

					//vce pomechaem
				}
				else if(infix[i]=='/'||infix[i]=='*')
				{
					//cout <<"ecli * ili /"<<endl;
					if(s[i]=='*'||s[i]=='/')
					{
						//cout <<"dobavl9em * ili /"<<endl;
						postfix[count++]=s;
					}
					else
					{
						add(s);
						string sss="";
						sss+=infix[i];
						add(sss);	
					}
				}
				//exit(1);
			}
			else//nety znakov operacii
			{
				//cout <<"ne znak operacii v cteke"<<endl;
				add(s);//vctavl9em obratno
				string s1="";
				s1+=infix[i];
				add(s1);
				//printS();
			}
			//exit(1);
		}//konec ecli znak operacii

		//prava9 ckobka
		else if(infix[i]==')')
		{
			//cout <<"prava9 ckobka"<<endl;
			//vutalkivat6 znaki operacii iz cteka i pomechat6 ix v postfix
			//poka ne po9vitc9 leva9 ckobka
			string s="";//element dl9 izvlecheni9
			delLast(s);
			while(s[0]!='(')
			{
				//cout <<"s= "<<s<<endl;
				postfix[count++]+=s;
				delLast(s);
			}
		}	
	}

	cout <<endl;

}

//podcchituvaet vurajenie
int Expr1::eval()
{
	//vuchiclit6 poctfix vurajenie.
	int res;
	for(int i=0;postfix[i]!="";i++)
	{
		//cout <<i<<' '<<postfix[i]<<endl;
		//ecli tekychii cimvol cifra, to zatolknyt6 ee znachenie v ctek
		if(isdigit(postfix[i][0]))
		{
			//cout <<"cifra"<<endl;
			add(postfix[i]);//zatalkivaem v ctek
			//printS();
			//exit(1);
		}
		//ecli znak operacii vutolnyt6 dva verxnix elementa iz cteka
		//v x i y i vuchiclit6 y operaci9 x i op9t6 zatolknyt6 v ctek
		else
		{
			//cout <<"znak operacii"<<endl;
			//cout <<postfix[i]<<endl;
			string x,y;
			delLast(y);
			delLast(x);
			//cout <<"ddd "<<atoi(x.data())<<' '<<atoi(y.data())<<endl;

			if(postfix[i][0]=='/')
			{	
				//cout <<"/"<<endl;
				res=atoi(x.data())/atoi(y.data());
			}
			else if(postfix[i][0]=='*')
			{
				//cout <<"*"<<endl;
				res=atoi(x.data())*atoi(y.data());
			}
			else if(postfix[i][0]=='-')
			{
				//cout <<"-"<<endl;
				res=atoi(x.data())-atoi(y.data());
			}
			else if(postfix[i][0]=='+')
			{
				//cout <<"+"<<endl;
				res=atoi(x.data())+atoi(y.data());
			}
			//cout <<res<<endl;
			add(strNum(res));
			//printS();
			//exit(1);
		}
	}
	return res;
	//VUCHICLENIE POSTFIX VURAGENI9
	//1.dobavit6 NULL v konec postfix. vurajeni9 ny on i tak tam ect6
	//exit(1);
}

//vuvod camogo vurajeni9
void Expr1::print()
{
	cout <<"infix= "<<infix<<endl;

	for(int i=0;postfix[i]!="";i++)
	{
		cout <<i<<' '<<postfix[i]<<endl;
	}
	//string postfix[100];
}

//dobavit6 v konec cpicka
void Expr1::add(string a)
{
	if(firstPtr==0)
	{
		//cout <<"cpicok pyct"<<endl;
		firstPtr=new Node(a);
	}
	else
	{
		//cout <<"cpicok ne pyct"<<endl;
		addHelper(a,&firstPtr->nextPtr);
	}
}

//dobavit6 helper
void Expr1::addHelper(string &a, Node** ptr)
{
	if(*ptr==0)
	{
		//cout <<"pycto"<<endl;
		*ptr=new Node(a);
	}
	else
	{
		//cout <<"req"<<endl;
		addHelper(a,&(*ptr)->nextPtr);
	}
}

//vuvod cpicka
void Expr1::printS()
{
	if(firstPtr==0)
	{
		cout <<"cpicok pyct"<<endl;
	}
	else
	{
		cout <<firstPtr->val<<endl;
		printSHelper(firstPtr->nextPtr);
	}
}

//vuvod cpicka helper
void Expr1::printSHelper(Node* ptr)
{
	if(ptr!=0)
	{
		cout <<ptr->val<<endl;
		printSHelper(ptr->nextPtr);
	}
}

//ydalit6 poclednii element
void Expr1::delLast(string& a)
{
	if(firstPtr==0)
	{
		cout <<"cpicok pyct"<<endl;
	}
	else
	{
		delLastHelper(&firstPtr,a);
	}
}

//ydalit6 helper
void Expr1::delLastHelper(Node** ptr,string& a)
{
	if((*ptr)->nextPtr==0)//naiden poclednii element
	{
		//cout <<"poclednii element"<<endl;
		a=(*ptr)->val;//znachenie elementa
		Node* temp=*ptr;
		*ptr=0;
		delete temp;//vucvobojdaem pam9t6
	}
	else
	{
		//cout <<"req vuzov"<<endl;
		delLastHelper(&(*ptr)->nextPtr,a);//req vuzov
	}
}

//perevod chicla v ctroky int
string Expr1::strNum(int n)
{
    int mass[13]={0};
    for(int i=0;n!=0;n=n/10,i++)
    {
        int r=n%10;
        //cout <<r<<endl;
        mass[i]=r;
    }
    string s="";
    int i=12;
    for(;mass[i]==0;i--);
    for(;i>=0;i--)
    {
        s+=(mass[i]+'0');
        //cout <<mass[i]<<endl;
    }
    //cout <<s<<endl;
    return s;
}

И сама программка pp.cpp:

//klacc dl9 analiza proctux matematicheckix vurajenii
#include <iostream>
using std::cout;
using std::endl;

#include "Expr1.h"

int main()
{
	string s="(6 + 2 ) *5-8/4";
	Expr1 a(s);
	//a.printS();
	cout <<endl;
	a.print();
	cout <<endl<<endl;
	cout <<a.eval()<<endl;

	return 0;
}

И все. Сделал все так как нужно, так как нада, то что нада. :). Кселакс батя про.

  • great blog! the information you provide is quiet helpful, why i was not able to find it earlier. anyways i

  • wow, awesome blog article.Really looking forward to read more. Awesome.

  • admin_kselax

    I do not understand English. I understand some words. Do not know how you can. I use a translator.

  • admin_kselax

    Thank you

  • Evgeny

    This code a little bit easier. Isn’t it? Of course it isn’t exactly the answer to the task, but potentially includes more opportunities, because can process parentheses. This is called Dijkstra’s algorithm and it is described here http://algs4.cs.princeton.edu/13stacks/Evaluate.java.html

    To compute example from Stroustrup’s book the expression should be ( ( ( 123 / 4 ) + ( 123 * 4 ) ) – 3 ) with spaces between numbers, operators and parentheses

    Here is the code:

    expr.h:
    
    class Expr
    {
    	const char* expression;
    	int result;
    public:
    	Expr(const char* expressin);
    	int Eval();
    	void print();
    };
    
    expr.cpp:
    
    #include "expr.h"
    #include 
    #include 
    #include 
    
    using namespace std;
    
    Expr::Expr(const char* expression)
    	: expression(expression)
    {
    	char* str_expr = new char[strlen(expression) + 1];
    	strcpy(str_expr, expression);
    
    	stack ops;
    	stack vals;
    
    	char* pch = strtok (str_expr, " ");
    
    	while (pch != 0)
    	{
    		if (pch[0] == '(') 
    		{
    		}
    		else 
    		{
    			if (pch[0] == '+' || pch[0] == '-' || pch[0] == '*' || pch[0] == '/')
    			{
    				ops.push(pch[0]);
    			}
    			else
    			{
    				if (pch[0] == ')')
    				{
    					char op = ops.top();
    					ops.pop();
    					int v = vals.top();
    					vals.pop();
    
    					switch (op)
    					{
    					case '+':
    						v = vals.top() + v;
    						break;
    					case '-':
    						v = vals.top() - v;
    						break;
    					case '*':
    						v = vals.top() * v;
    						break;
    					case '/':
    						v = vals.top() / v;
    						break;
    					}
    					vals.pop();
    					vals.push(v);
    				}
    				else
    				{
    					vals.push(atoi(pch));
    				}	
    			}
    		}
    	
    		pch = strtok (0, " ");
    	}
    
    	result = vals.top();
    	
    	delete[] str_expr;
    }
    
    int Expr::Eval()
    {
    	return result;
    }
    
    void Expr::print()
    {
    	printf("%s\n", expression);
    }

    Enjoy!!!

    • admin_kselax

      Так у меня также со скобками вычисляет, я вроде сделал так как надо, без Декстры. Честно не смотрел твой алгоритм, щас просто СТЛ учу, надоело уже код разбирать.

  • admin_kselax

    Да это один пост который удался, привлек внимание реально, я сам в шоке, в этом посте само больше комментариев.

rss