Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Mauricio de Wallau

Template<class>

Recommended Posts

Amigos sei o básico em c++, mas nunca ouvi falar em "Template<class>" gostaria da ajuda de alguem para modificar este código sem a utilização dos Template<class> para auxiliar no meu estudo tambem não entendi o que faz #define TAM 255

#define upper© ( © + 'A' - 'a' )

 

estas declarações acima.

 

Obrigado.

 

 

 

 

 

 

 

#include <iostream>

#include <stdlib.h>

#include <math.h>

 

#define TAM 255

#define upper© ( © + 'A' - 'a' )

 

using namespace std;

 

//---------------------- Prototipos

int get_prioridade( char );

float avalia( char, float, float );

 

//---------------------- Classes

 

template <class T>

class Pilha{

int topo;

T p[TAM];

public:

Pilha( void );

int vazia( void );

int insere( T );

int retira( T * );

};

 

template <class T>

class Lista{

int inicio;

int fim;

int num;

T l[TAM];

public:

Lista( void );

int vazia( void );

int insere( T );

int retira( T * );

};

 

//--------------- Metodos da Classe

 

template <class T> Pilha<T>::Pilha( void )

{

topo = 0;

}

 

template <class T> int Pilha<T>::vazia( void )

{

if( topo == 0 ) return 1;

else return 0;

}

 

template <class T> int Pilha<T>::insere( T x )

{

if( topo == TAM ) return 0; // Pilha esta cheia

topo++;

p[topo] = x;

return 1;

}

 

template <class T> int Pilha<T>::retira( T *x )

{

if( topo == 0 ) return 0; // Pilha vazia

*x = p[topo];

topo--;

return 1;

}

 

template <class T> Lista<T>::Lista( void )

{

inicio = 0;

fim = -1;

num = 0;

}

 

template <class T> int Lista<T>::vazia( void )

{

if( num == 0 ) return 1;

else return 0;

}

 

template <class T> int Lista<T>::insere( T x )

{

if( num == TAM ) return 0; // Lista cheia

fim = (fim+1 == TAM) ? 0 : fim+1;

l[fim] = x;

num++;

return 1;

}

 

template <class T> int Lista<T>::retira( T *x )

{

if( num == 0 ) return 0; // Lista vazia

*x = l[inicio];

inicio = (inicio+1 == TAM) ? 0 : inicio+1;

num--;

return 1;

}

 

 

 

//-------------------Procedimentos

 

inline int is_operando( char ch )

{

if( ( ch >= 'a' && ch <= 'z' ) || ( ch >= 'A' && ch <= 'Z' ) )

return 1; // Eh letra

else

if( ch >= '0' && ch <= '9' )

return 1; // Eh digito

else

return 0; // Nao eh letra nem digito

}

 

inline int is_operador( char ch )

{

if( ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '^' ||

ch == '(' || ch == ')' )

return 1;

else

return 0;

}

 

int get_prioridade( char ch )

{

switch( ch ){

case '+': return 1;

case '-': return 2;

case '*': return 3;

case '/': return 3;

case '^': return 4;

case '(': return 5;

}

return 0;

}

 

float avalia( char ch, float n1, float n2 )

{

switch( ch ){

case '-': return (n2 - n1);

case '+': return (n2 + n1);

case '*': return (n2 * n1);

case '/': return (n2 / n1);

case '^': return pow(n2, n1);

}

return 0;

}

 

int main()

{

char expr[TAM], pol[TAM], vet[43], ch;

Lista <char> lista;

Pilha <char> pilha;

Pilha <float> aval;

int i, val;

float vet_num[36], total, n1, n2;

 

cout << "\nDigite a expressao (sem espacos): ";

cin >> expr;

 

for( i = 0; i<43; i++ ) vet = -1; // Vetor de presencas

 

i = 0;

while( expr != '\0' ){

 

if( is_operando( expr ) ){

if( !lista.insere( expr ) ){

cout << "Erro => Espaco insuficiente na lista!\n";

exit( 1 );

}

if( expr >= 97 ) expr = upper(expr);

vet[expr-48] = 1; // Indica presenca

}

else{

if( !is_operador( expr ) ){

cout << "Erro => Simbolo desconhecido na expressao: "

<< expr << "\n";

exit( 1 );

}

if( expr == ')' ){

while( !pilha.vazia() ){

pilha.retira( &ch );

if( ch == '(' ) break;

lista.insere( ch );

}

if( ch != '(' ){

cout << "Erro => Casamento de parenteses!\n";

exit( 1 );

}

}

else{

if( pilha.vazia() )

pilha.insere( expr );

else{

do{

if( !pilha.retira( &ch ) ){

pilha.insere( expr );

break;

}

if( ch == '-' && expr == '-' ){

pilha.insere( ch );

lista.insere( ch );

break;

}

if( ch == '(' ||

get_prioridade( ch ) < get_prioridade( expr ) ){

pilha.insere( ch );

pilha.insere( expr );

break;

}

else lista.insere( ch );

}while(1);

}

}

} // else isletra

 

i++;

 

} // While

while( pilha.retira( &ch ) ){

if( ch == '(' ){

cout << "Erro => Casamento de parenteses!\n";

exit( 1 );

}

else lista.insere( ch );

}

 

i = 0;

while( lista.retira( &ch ) )

pol[i++] = ch;

pol = '\0';

 

cout << "Expressao em notacao poloneza:\t";

cout << pol << "\n";

 

cout << "Digite os valores das variaveis para solucao:\n";

val = 0;

for( i=0; i<43; i++ )

if( vet == 1 ){

if( i >= 17 ){

ch = i+48;

cout << "\t " << ch << " = ";

vet = val++;

cin >> vet_num[vet];

}

else{

vet = val++;

vet_num[vet] = (float)i;

}

}

 

// Soluciona o problema

i = 0;

while( ( ch = pol[i++] ) != '\0' ){

if( is_operando( ch ) ){

if( ch >=97 ) ch = upper(ch);

aval.insere( vet_num[vet[ch-48]] );

}

else{

if( !aval.retira( &n1 ) || !aval.retira( &n2 ) ){

cout << "\nErro => Nao foi possivel avaliar a expressao!\n";

exit( 1 );

}

total = avalia( ch, n1, n2 );

aval.insere( total );

}

}

if( !aval.retira( &total ) )

cout << "Erro => Nao foi possivel avaliar a expressao!\n";

else

cout << "Avaliacao da expressao: " << total << "\n";

system( "PAUSE" );

 

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

#define TAM 255
Sempre que você chamar TAM no código ele vai substituir por 255

 

#define upper© ( © + 'A' - 'a' )
Acho que seria #define upper(x) ( x + 'A' - 'a')

Simplesmente diria que sempre que chamarmos upper(x) ele vai retornar ( x + 'A' - 'a') (que nada mais é do que o valor de x só que maiúsculo)

Por exemplo: upper(d) vai retornar D

Compartilhar este post


Link para o post
Compartilhar em outros sites

os templates, dizendo a grosso modo, correspondem às functions da programação estruturada. Tb como structs..

#include <iostream>#include <stdlib.h> #include <math.h>#define TAM 255#define upper( c ) ( ( c ) + 'A' - 'a' )#define typedef char T;  // implementei este typedef para você poder utilizar o tipo T using namespace std;//---------------------- estruturas// definos atraves do typedef as structs Pilha e Lista como sendo tipo de dadostypedef struct TPilha{int topo;T p[TAM];}Pilha; typedef struct TLista{int inicio;int fim;int num;T l[TAM];}Lista;//--------------- funçoesvoid Pilha( Pilha p ){   p.topo = 0;	   // a variavel topo pertence a estrutura Pilha, 							   // entao devo referenciar a ela}int PilhaVazia( Pilha p ){   if( p.topo == 0 ) return 1;   else return 0;}int PilhaInsere( T x, Pilha P ){   if( P.topo == TAM ) return 0; // Pilha esta cheia   P.topo++;   P.p[topo] = x;   return 1;}int PilhaRetira( T *x , Pilha P){   if( P.topo == 0 )		 return 0; // Pilha vazia   *x = P.p[topo];   P.topo--;		 return 1;}void Lista( Lista L ){   L.inicio = 0;   L.fim = -1;   L.num = 0;}int ListaVazia( Lista L ){   if( L.num == 0 ) return 1;   else return 0;}int ListaInsere( T x, Lista L ){  if( L.num == TAM ) return 0; // Lista cheia  L.fim = (L.fim+1 == TAM) ? 0 : L.fim+1;  L.l[fim] = x;  L.num++;  return 1;}int ListaRetira( T *x,Lista L ){  if( L.num == 0 ) return 0; // Lista vazia  *x = l[inicio];  L.inicio = (Lista.inicio+1 == TAM) ? 0 : L.inicio+1;  L.num--;  return 1;}//-------------------Procedimentosint int is_operando( char ch ){  if( ( ch >= 'a' && ch <= 'z' ) || ( ch >= 'A' && ch <= 'Z' ) )	  return 1; // Eh letra  else if( ch >= '0' && ch <= '9' )	  return 1; // Eh digito  else	  return 0; // Nao eh letra nem digito}int is_operador( char ch ){  if( ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '^' ||	   ch == '(' || ch == ')' )	return 1;  else	return 0;}int get_prioridade( char ch ){   switch( ch ){	   case '+' : return 1;	   case '-' : return 2;	   case '*' : return 3;	   case '/' : return 3;	   case '^' : return 4;	   case '(' : return 5;   }   return 0;}float avalia( char ch, float n1, float n2 ){   switch( ch ){	  case '-' : return (n2 - n1);	  case '+' : return (n2 + n1);	  case '*' : return (n2 * n1);	  case '/' : return (n2 / n1);	  case '^' : return pow(n2, n1);   }   return 0;}int main(){  char expr[TAM], pol[TAM], vet[43], ch;  Lista lista;  Pilha pilha;  Pilha aval;  int i, val;  float vet_num[36], total, n1, n2;  cout << "\nDigite a expressao (sem espacos): ";  cin >> expr;  for( i = 0; i<43; i++ ) vet[i] = -1; // Vetor de presencas  i = 0;  while( expr[i] != '\0' ){	if( is_operando( expr[i] ) ){	  if( !ListaInsere( expr[i] ) ){		cout << "Erro => Espaco insuficiente na lista!\n";		exit( 1 );	  }	  if( expr[i] >= 97 ) expr[i] = upper(expr[i]); // verificar se existe a funçao 																  // upper nas bibliotecas 	  vet[expr[i]-48] = 1; // Indica presenca	}	else{	  if( !is_operador( expr[i] ) ){		cout << "Erro => Simbolo desconhecido na expressao: "			   << expr[i] << "\n";	  exit( 1 );	  }	  if( expr[i] == ')' ){		while( !PilhaVazia() ){		  PIlhaRetira( &ch );		  if( ch == '(' ) break;		  ListaInsere( ch );		}		if( ch != '(' ){		  cout << "Erro => Casamento de parenteses!\n";		  exit( 1 );		}	  }	  else{		if( PilhaVazia(pilha) )		  PilhaInsere( expr[i], pilha );		else{		  do{			if( !PilhaRetira( &ch , pilha) ){			  PilhaInsere( expr[i] , pilha);			  break;			}			if( ch == '-' && expr[i] == '-' ){			  PilhaInsere( ch , pilha);			  ListaInsere( ch , lista);			  break;			}			if( ch == '(' ||				get_prioridade( ch ) < get_prioridade( expr[i] ) ){			  PilhaInsere( ch, pilha );			  PilhaInsere( expr[i] , pilha);			  break;			}			else Listainsere( ch ,lista);		  }while(1);		}	  }	} // else isletra	i++;  } // While  while( PilhaRetira( &ch , pilha) ){	if( ch == '(' ){	  cout << "Erro => Casamento de parenteses!\n";	  exit( 1 );	}	else ListaInsere( ch ,lista );  }  i = 0;  while( ListaRetira( &ch ,lista) )	pol[i++] = ch;  pol[i] = '\0';  cout << "Expressao em notacao poloneza:\t";  cout << pol << "\n";  cout << "Digite os valores das variaveis para solucao:\n";  val = 0;  for( i=0; i<43; i++ ){	if( vet[i] == 1 ){	  if( i >= 17 ){		ch = i+48;		cout << "\t " << ch << " = ";		vet[i] = val++;		cin >> vet_num[vet[i]];	  }	  else{		vet[i] = val++;		vet_num[vet[i]] = (float)i;	  }	}  }// Soluciona o problema  i = 0;  while( ( ch = pol[i++] ) != '\0' ){	if( is_operando( ch ) ){	  if( ch >=97 ) ch = upper(ch);		PilhaInsere( vet_num[vet[ch-48]] , aval );	}	else{	  if( !PilhaRetira( &n1,aval ) || !PilhaRetira( &n2 , aval ) ){		cout << "\nErro => Nao foi possivel avaliar a expressao!\n";		exit( 1 );	  }	  total = avalia( ch, n1, n2 );	  PilhaInsere( total , aval );	}  }  if( !Pilhaetira( &total ,aval ) )	cout << "Erro => Nao foi possivel avaliar a expressao!\n";  else	cout << "Avaliacao da expressao: " << total << "\n";  system( "PAUSE" );  return 0;}
Agora você podia mto bem ter raciocinado soh um poukinho pra poder fazer este programa..

Que tipo de profissional você vai ser.. Soh copia.. naum pensa em nada

Bom.. se eu for concorrer com você numa vaga eu ja sei quem eh q estará mais preparado..

 

Um conselho.. Faça você SOZINHO, e depois compare com este q você copiou de algum canto ai na net..

 

ACEITE ISTO COMO UMA CRITICA CONSTRUTIVA

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.