Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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" );
}
Carregando comentários...