Ir ao conteúdo
  • Cadastre-se

C++ Atividade do curso sobre algoritmos


junglerfullclear
Ir à solução Resolvido por junglerfullclear,

Posts recomendados

Boa noite pessoal!!

Tem alguma coisa que eu poderia melhorar nesse código?

 

#include <iostream>

using namespace std;

// classe para nodo da pilha
class nodoPilha
{
public:
    string data;
    nodoPilha *proximo;
};

nodoPilha *novoNodo(string data)
{
    nodoPilha *nodo = new nodoPilha();
    nodo->data = data;
    nodo->proximo = NULL;
    return nodo;
}

int isEmpty(nodoPilha *base)
{
    return !base;
}
void push(nodoPilha **base, string novoItem)
{
    nodoPilha *nodo = novoNodo(novoItem);
    nodo->proximo = *base;
    *base = nodo;
}
string pop(nodoPilha **base)
{
    if (isEmpty(*base))
        return NULL;
    nodoPilha *temp = *base;
    *base = (*base)->proximo;
    string popped = temp->data;
    free(temp);

    return popped;
}
string peek(nodoPilha *base)
{
    if (isEmpty(base))
        return NULL;
    return base->data;
}
int imprimePilha(nodoPilha* base)
{
    if (isEmpty(base)){
        return -1;
    }
    else {
        cout << "Os itens da pilha são: "<<endl ;
        while (base != NULL) {
            cout<< base->data << endl;
            base = base->proximo;
        }
    }
    cout << endl;
    return 0;
}

void esvaziaPilha(nodoPilha** base)
{
    while(!isEmpty(*base))
    {
        nodoPilha* temp = *base;
        *base = (*base)->proximo;
        free(temp);
    }
    cout << "A pilha foi esvaziada :/" << endl;
}
bool checker(string a)
{
    char url[] = "http";
    int count = 0;
    for (int i = 0; i < 4; i++)
    {
        if (a[i] == url[i])
        {
            count++;
        }
    }
    if (count == 4)
    {
        return true;
    }
    else
    {
        return false;
    }
}
int main()
{
    cout << "SELECIONE A OPÇÃO DESEJADA:" << endl
         << "digite 1 para ADICIONAR uma URL ao registro " << endl
         << "digite 2 para REMOVER o último registro " << endl
         << "digite 3 para IMPRIMIR todas as URLs salvas " << endl
         << "digite 4 para EXCLUIR várias URLs registradas (defina a quantidade) " << endl
         << "digite 5 para FINALIZAR o programa. " << endl;
    int selec = 0;
    int NError = 0;
    nodoPilha *base = NULL;
    while (selec != 5)
    {
        cout << "-----------------------------" << endl;
        cout << "ESCOLHA UMA OPCAO" << endl;
        cin >> selec;
        switch (selec)
        {
        case 1:
        {
            cout << "digite uma URL a ser adicionada" << endl;
            string value;
            cin >> value;
            cout << "------------------------" << endl;
            if (checker(value) == true)
            {
                cout << "url adicionada!" << endl;
                push(&base, value);
                NError++;
            }
            else
            {
                cout << "insira uma url válida " << endl;
            }
        }
        break;

        case 2:
        {
            if (NError > 0)
            {
                cout << "Removendo item do topo da pilha" << endl;
                pop(&base);
            }
            else
            {
                cout << "não ha nada para remover" << endl;
            }
        }
        break;

        case 3:
        {
            if (NError > 0)
            {
                if (!isEmpty(base))
                {
                    imprimePilha(base);
                }
            }
            else
            {
                cout << "pilha vazia" << endl;
            }
        }
        break;
        case 4:
        {
            cout << "Quantas urls serao removidas: " << endl;
            int remove = 0;
            cin >> remove;
            if (remove > NError)
            {
                esvaziaPilha(&base);
                NError = 0;
            }
            else
            {
                for (int i = 0; i < remove; i++)
                {
                    NError--;
                    pop(&base);
                }
                cout << "removido" << endl;
            }
        }
        break;
        case 5:
        {
        }
        break;
        default:
            cout << "insira valor válido" << endl;
            return selec = 5;
            break;
        }
    }
}

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@junglerfullclear    

   algumas coisas  ,  

* não use acentuações , 

* pular linhas em branco não ajuda em nada ,

* não precisa das chaves { }  ,  nos case's do switch  ,

* a função checker  , pode ser reduzida e ter menos linhas ,

* pediu para digitar de novo , no case 1 , mas sem nenhum comando para isso, 

#include <iostream>
using namespace std;
int cls();
// classe para nodo da pilha
class nodoPilha
{
 public:
  string data;
  nodoPilha *proximo;
};
nodoPilha *novoNodo(string data)
{
  nodoPilha *nodo = new nodoPilha();
  nodo->data = data;
  nodo->proximo = NULL;
  return nodo;
}
int isEmpty(nodoPilha *base)
{
  return ! base;
}
void push( nodoPilha **base , string novoItem )
{
  nodoPilha *nodo = novoNodo( novoItem );
  nodo->proximo = *base;
  *base = nodo;
}
string pop( nodoPilha **base )
{
  if ( isEmpty( *base ) )
    return NULL;
  nodoPilha *temp = *base;
  *base = ( *base )->proximo;
  string popped = temp->data;
  free( temp );
  return popped;
}
string peek( nodoPilha *base )
{
  if ( isEmpty( base ) )
    return NULL;
  return base->data;
}
int imprimePilha( nodoPilha* base )
{
  if ( isEmpty( base ) )
  {
    return -1;
  }
  else
  {
    cout << "Os itens da pilha são: "<<endl ;
    while ( base != NULL )
    {
      cout<< base->data << endl;
      base = base->proximo;
    }
  }
  cout << endl;
  return 0;
}
void esvaziaPilha( nodoPilha** base )
{
  while( ! isEmpty( *base ) )
  {
    nodoPilha* temp = *base;
    *base = ( *base )->proximo;
    free( temp );
  }
  cout << "A pilha foi esvaziada :/" << endl;
}
bool checker( string a )
{
  char url[] = "http";
  for ( int i = 0; i < 4; i++ )
  {
    if ( a[i] != url[i] )
    {
      return false;
    }
  }
  return true;
}
int main()
{
  int selec       = 0   ;
  int NError      = 0   ;
  string value    = ""  ;
  int remove      = 0   ;
  int flg         = 1   ;
  nodoPilha *base = NULL;
  while ( selec  != 5   )
  {
    cout << " --------------------------------------------" << endl
         << " SELECIONE A OPCAO DESEJADA :                " << endl
         << " digite 1 para ADICIONAR uma URL ao registro " << endl
         << " digite 2 para REMOVER o Ultimo registro     " << endl
         << " digite 3 para IMPRIMIR todas as URLs salvas " << endl
         << " digite 4 para EXCLUIR vArias URLs registradas (defina a quantidade) " << endl
         << " digite 5 para FINALIZAR o programa .        " << endl
         << " --------------------------------------------" << endl
         << " ESCOLHA UMA OPCAO ";
    cin  >> selec;
    cls();
    switch ( selec )
    {
    case 1:
      do
      {
        cout << "digite uma URL a ser adicionada ";
        cin  >> value;
        cout << "------------------------" << endl;
        if ( checker( value ) == true )
        {
          cout << "url adicionada!" << endl;
          push( & base, value );
          NError++;
          flg  = 0;
        }
        else
        {
          cout << "insira uma url vAlida " << endl;
        }
      } while( flg ); /// vai repetir até que esteja certo
      break;
    case 2:
      if ( NError > 0 )
      {
        cout << "Removendo item do topo da pilha" << endl;
        pop( & base );
      }
      else
      {
        cout << "não ha nada para remover" << endl;
      }
      break;
    case 3:
      if ( NError > 0 )
      {
        if ( ! isEmpty( base ) )
        {
          imprimePilha( base );
        }
      }
      else
      {
        cout << "pilha vazia" << endl;
      }
      break;
    case 4:
      cout << "Quantas urls serao removidas: " << endl;
      cin  >> remove;
      if ( remove > NError )
      {
        esvaziaPilha(&base);
        NError = 0;
      }
      else
      {
        for (int i = 0; i < remove; i++)
        {
          NError--;
          pop( & base );
        }
        cout << "removido" << endl;
      }
      break;
    case 5:
      {
      }
      break;
    default:
      cout << "insira valor válido" << endl;
    }
  }
}
int cls()
{
  for(int f=0; f<10; f++)printf("\n");
  return 0;
}

 

  • Curtir 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

Considerando a maneira comum de escrever isso (e pilha está na biblioteca padrão do `C++` no include `stack`) eis o que eu diria

  • O programa trata uma Pilha mas não tem uma classe  `Pilha`. Difícil de entender
     
  • A pilha aqui é de `string`. Mas se sabe que a pilha é um container, como map, list, set e tal. E assim a pilha é de nós e não de `strings`.
     
  • a abstração da pilha está aqui  :   
// classe para nodo da pilha
class nodoPilha
{
   public:
    string     data;
    nodoPilha* proximo;
};


mas não está bom: isso é um nó e não a pilha. Falta uma simples composição, encapsulamento, e se deve escrever a pilha como o container em que cada nó aponta para ou contém um dado. A pilha ou qualquer outro container.
 

  • evite esses comentários óbvios. 
     
  • tem muita repetição de nodo e pilha pra todo lado e fica ruim de ler. Use nomes melhores
     
  • entenda que `novoNodo()` só existe em `push()` afinal é uma pilha. Então não há razão para ser um método separado
     
  • não é razoável não ter na pilha um elemento dizendo o tamanho dela
     
  • não há razão para a pilha não ter um construtor. É muito mais simples assim. Vou mostrar um exemplo mínimo
     
  • `novoNodo()` (que não devia existir) usa `new` e cria uma instância de `nodoPilha` e em `pop` você usa `free` para apagar um `nodoPilha` e claro está **errado**. Use ``delete`...
     
  • `a` não é assim um bom nome para `url`. Que tal `url` mesmo?
     
  • em `C++` use `nullptr` e não `NULL`. Está errado.
     
  • não use `endl` em `cout`. Muito menos 6 dúzia na mesma chamada a `cout`. E se é uma string só escreva assim. É muito mais fácil de ler e entender.
     
  • se tem um menu use uma função e retorne a opção. É muito mais simples. `C++` não é java. Deve usar free-functions. Veja um exemplo simples:
int menu()
{
    int opt = 0;
    cout << "\n\
    SELECIONE A OPÇÃO DESEJADA:\n\
\n\
        digite 1 para ADICIONAR uma URL ao registro\n\
        digite 2 para REMOVER o último registro\n\
        digite 3 para IMPRIMIR todas as URLs salvas\n\
        digite 4 para EXCLUIR várias URLs registradas\n\
            (defina a quantidade)\n\
\n\
        digite 5 para FINALIZAR o programa:_  ";
    std::cin >> opt;
    return opt;
}

 

  • não escreva um programa interativo. Nunca. Termine antes o código.
     
  • não use `{ }` onde não precisa. E não use `else` depois de `return`. Só complica a leitura do código. Ao invés de 

 

    if (isEmpty(base)) { return -1; }
    else
    {
        cout << "Os itens da pilha são: " << endl;
        while (base != NULL)
        {
            cout << base->data << endl;
            base = base->proximo;
        }
    }

 

prefira o simples
 

    if (isEmpty(base)) return -1;
    cout << "Os itens da pilha são: \n";
    while (base != nullptr)
    {
        cout << base->data << endl;
        base = base->proximo;
    }


### um exemplo do simples: Pilha.h ###
 

#include <iostream>
using namespace std;

class Nodo
{
   public:
    string data;
    Nodo*  prox;
};

class Pilha
{
   public:
    Nodo*    topo;
    unsigned size;

    void   esvazia();
    int    imprime(const char *);
    bool   isEmpty();
    string peek();
    string pop();
    void   push(const string& novoItem);

    Pilha();   // cria uma pilha
    ~Pilha();  // apaga
};


Esse seria um modo comum. sem valores `private` e com as funções esperadas DENTRO da classe. Essa é a razão de `C++` existir afinal. Pode trocar class por struct

Todas as funções, chamadas aqui de instâncias, acessam as variáveis da classe, que são o simples e conveniente `size` e o `topo`.
 

As funções são mais simples:

### `push()` e `pop()` por exemplo ###
 

void Pilha::push(const string& item)
{
    cout << "PUSH(" << item << ")\n";
    Nodo* nodo      = new Nodo();
    nodo->data      = item;
    nodo->prox   = topo;
    topo = nodo;
    size += 1;
    return;
}

string Pilha::pop()
{
    cout << "POP()\n";
    if (isEmpty()) return "";
    string popped   = topo->data;
    Nodo*  temp   = topo->prox;
    delete(topo);
    topo = temp;
    --size; // um a menos na pilha
    return popped;
}


 

### `imprime()` ###    
 

aceita um título e ajuda a testar, e tendo o tamanho fica tudo mais simples:
 

int Pilha::imprime(const char* tit)
{
    if (isEmpty()) return -1;
    if (tit != nullptr) cout << tit;
    std::cout << "Pilha tem " << size << " itens:\n\n";
    Nodo* p = topo;
    while (p != nullptr)
    {
        cout << p->data << "\n";
        p = p->prox;
    }
    cout << "\n";
    return size;
};


### um teste main1.cpp ###
 

Um teste, claro que **NÃO interativo**
 

int main(void)
{
    //int   selec = menu();
    //cout << "menu() retornou " << selec << "\n";

    Pilha pilha; // a pilha de teste
    cout << std:: boolalpha << "isEmpty() retornou " << pilha.isEmpty() << "\n";

    pilha.push("Hardware");
    pilha.push("do");
    pilha.push("Clube");
    pilha.push("Forum");

    cout << "isEmpty() retornou " << pilha.isEmpty()
         << " size = " << pilha.size
         << "\n";
    pilha.imprime("\n(Titulo de Teste)    ");
    pilha.esvazia();
    cout << "isEmpty() retornou " << pilha.isEmpty()
         << " size = " << pilha.size << "\n";
    return 0;
}


### saída do teste ###
 

Criada uma Pilha
isEmpty() retornou true
PUSH(Hardware)
PUSH(do)
PUSH(Clube)
PUSH(Forum)
isEmpty() retornou false size = 4

(Titulo de Teste)    Pilha tem 4 itens:

Forum
Clube
do
Hardware

POP()
POP()
POP()
POP()
A pilha foi esvaziada
isEmpty() retornou true size = 0
Apagada a Pilha


Compare com o modo que usou e vai ajudar a entender as diferenças entre `C` e `C++`. `C++` é uma linguagem enorme e complexa, mas é muito mais simples representar coisas em `C++` que em `C`.
 

### as funçoes todas em `Pilha.cpp` ###

#include "Pilha.h"

bool  Pilha::isEmpty() { return size == 0; }

void Pilha::push(const string& item)
{
    cout << "PUSH(" << item << ")\n";
    Nodo* nodo      = new Nodo();
    nodo->data      = item;
    nodo->prox   = topo;
    topo = nodo;
    size += 1;
    return;
}

string Pilha::pop()
{
    cout << "POP()\n";
    if (isEmpty()) return "";
    string popped   = topo->data;
    Nodo*  temp   = topo->prox;
    delete(topo);
    topo = temp;
    --size; // um a menos na pilha
    return popped;
}

string Pilha::peek()
{
    if (isEmpty()) return "";
    return topo->data;
}

int Pilha::imprime(const char* tit)
{
    if (isEmpty()) return -1;
    if (tit != nullptr) cout << tit;
    std::cout << "Pilha tem " << size << " itens:\n\n";
    Nodo* p = topo;
    while (p != nullptr)
    {
        cout << p->data << "\n";
        p = p->prox;
    }
    cout << "\n";
    return size;
};

void Pilha::esvazia()
{
    while (!isEmpty()) pop();
    cout << "A pilha foi esvaziada\n";
}

bool checker(string url)
{
    const char arg[] = "http";
    for (int i = 0; i < 4; i=1)
        if (url[i] != arg[i]) return false;
    return true;
}

// cria uma pilha vazia
Pilha::Pilha() : size(0), topo(nullptr)
{
    cout << "Criada uma Pilha\n";
};

// destroi uma pilha quando não estiver mais em uso
Pilha::~Pilha()
{
    while (not isEmpty()) pop();
    cout << "Apagada a Pilha\n";
};


Em um arquivo só:

 

Não deve escrever assim, só atrapalha, mas de todo modo podia ser `v2.cpp`

 

#include <iostream>
using namespace std;

class Nodo
{
   public:
    string data;
    Nodo*  prox;
};

class Pilha
{
   public:
    Nodo*    topo;
    unsigned size;

    void   esvazia();
    int    imprime(const char*);
    bool   isEmpty();
    string peek();
    string pop();
    void   push(const string& novoItem);

    Pilha();   // cria uma pilha
    ~Pilha();  // apaga
};

int menu();


int main(void)
{
    // int   selec = menu();
    // cout << "menu() retornou " << selec << "\n";

    Pilha pilha;  // a pilha de teste
    cout << std::boolalpha << "isEmpty() retornou "
         << pilha.isEmpty() << "\n";

    pilha.push("Hardware");
    pilha.push("do");
    pilha.push("Clube");
    pilha.push("Forum");

    cout << "isEmpty() retornou " << pilha.isEmpty()
         << " size = " << pilha.size << "\n";
    pilha.imprime("\n(Titulo de Teste)    ");
    pilha.esvazia();
    cout << "isEmpty() retornou " << pilha.isEmpty()
         << " size = " << pilha.size << "\n";
    return 0;
}

bool Pilha::isEmpty() { return size == 0; }

void Pilha::push(const string& item)
{
    cout << "PUSH(" << item << ")\n";
    Nodo* nodo = new Nodo();
    nodo->data = item;
    nodo->prox = topo;
    topo       = nodo;
    size += 1;
    return;
}

string Pilha::pop()
{
    cout << "POP()\n";
    if (isEmpty()) return "";
    string popped = topo->data;
    Nodo*  temp   = topo->prox;
    delete (topo);
    topo = temp;
    --size;  // um a menos na pilha
    return popped;
}

string Pilha::peek()
{
    if (isEmpty()) return "";
    return topo->data;
}

int Pilha::imprime(const char* tit)
{
    if (isEmpty()) return -1;
    if (tit != nullptr) cout << tit;
    std::cout << "Pilha tem " << size << " itens:\n\n";
    Nodo* p = topo;
    while (p != nullptr)
    {
        cout << p->data << "\n";
        p = p->prox;
    }
    cout << "\n";
    return size;
};

void Pilha::esvazia()
{
    while (!isEmpty()) pop();
    cout << "A pilha foi esvaziada\n";
}

bool checker(string url)
{
    const char arg[] = "http";
    for (int i = 0; i < 4; i = 1)
        if (url[i] != arg[i]) return false;
    return true;
}

// cria uma pilha vazia
Pilha::Pilha() : size(0), topo(nullptr)
{
    cout << "Criada uma Pilha\n";
};

// destroi uma pilha quando não estiver mais em uso
Pilha::~Pilha()
{
    while (not isEmpty()) pop();
    cout << "Apagada a Pilha\n";
};

int menu()
{
    int opt = 0;
    cout << "\n\
    SELECIONE A OPÇÃO DESEJADA:\n\
\n\
        digite 1 para ADICIONAR uma URL ao registro\n\
        digite 2 para REMOVER o último registro\n\
        digite 3 para IMPRIMIR todas as URLs salvas\n\
        digite 4 para EXCLUIR várias URLs registradas\n\
            (defina a quantidade)\n\
\n\
        digite 5 para FINALIZAR o programa:_  ";
    std::cin >> opt;
    return opt;
}

 

  • Curtir 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

  • Solução
13 horas atrás, junglerfullclear disse:

@arfneto@devair1010 Muito bom! Agora não tenho tempo livre, já está muito tarde, mas amanhã vou sentar a ***** na cadeira e recomeçar esse código. Muito obrigado pelas informações e conselhos, elucidou muita coisa. Abraço!

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!