Ir ao conteúdo

C++ Atividade do curso sobre algoritmos


Ir à solução Resolvido por junglerfullclear,

Posts recomendados

Postado

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
Postado

@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
Postado

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

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

Mostrar 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

Mostrar mais  
×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!