Ir para conteúdo
Fórum Script Brasil
  • 0

ajuda em algoritmo


mmorcor

Pergunta

amigos, preciso de uma ajuda, estou com o seguinte codigo abaixo em implementaçao

preciso que ele além de inserir e listar por nome, consiga listar por SALA e MATRICULA, o que não estou conseguindo.

não sai de jeito nenhum. Do jeito atual que o codigo está a parte de listarsala está com algum problema ,não mostra todos os dados armazenados. E a parte listarmat eu nem soube começar, o que está no codigo é só um rascunho que deixei para compilar os testes.

Por favor quem puder ajudar agradeço imensamente, é um trabalho para entregar nesta segunda.

Qualquer ajuda e conselho para melhorar é muito bem vinda.

#include<iostream>
#include<cstdlib>
#include <string>
using namespace std;

struct aluno
{
 char matricula[10];
 char nome[50];
 int sala; 
 char sexo[2];
 int idade;
 aluno *proximo;
 aluno *anterior;
 };

 aluno *inicio=NULL, *ultimo=NULL; //ponteiro para primeiro e ultimo item da lista
 int sala;
 void sls_store(struct aluno *i, struct aluno **inicio, struct aluno **ultimo);
 void sls_retrieve(struct aluno *i, struct aluno **inicio, struct aluno **ultimo);
 void inserir ();
 void listarmenu (aluno *inicio);
 void listarnome (aluno *inicio);
 void listarsala (aluno *inicio);
 void listarmat (aluno *inicio);
 void retirar ();
 int main ()
 {
     char q;
     aluno item;
     cout<<"\n\n        Programa para inserir, ordenar e listar alunos \n";
     do {
         cout<<"\n\n     Escolha uma opcao:";
         cout<<"\n   I -> para Inserir novo aluno";
         cout<<"\n   L -> para Listar os alunos;";
         cout<<"\n   R -> para Remover os alunos";
         cout<<"\n   S -> para sair \n\n   ->";
         cin>>q; /* Le a opcao do usuario */
         switch(q) {
            case 'i': case 'I': inserir(); break;
            case 'l': case 'L': listarmenu(inicio); break;
            case 'r': case 'R': retirar(); break;
            case 's': case 'S': break;
            default: cout <<"\n\n Opcao não valida";
            }           
            getchar(); /* Limpa o buffer de entrada */
     }while ((q != 's') && (q != 'S') );
 }

 void inserir()
 {
      aluno *item;
      item=new aluno;
      fflush(stdin);
      cout<<"\n     Insira o nome do aluno: ";
      gets(item->nome);
      fflush(stdin);
      cout<<"\n     Insira a matricula (nnnnnnnnn) do aluno: ";
      gets(item->matricula);
      fflush(stdin);
      do {
      cout<<"\n     Insira a sala do aluno (1, 2 ou 3): ";
      cin >> sala;
      if ((sala<1 || sala>3)) {
      cout <<"\n   somente salas 1, 2 ou 3 estao disponiveis";
      getchar(); /* Limpa o buffer de entrada */
        }}while ((sala<1 || sala>3));
      item->sala=sala;
      fflush(stdin);
      cout<<"\n     Informe o sexo do aluno (M ou F) : ";
      gets(item->sexo);
      fflush(stdin);
      cout<<"\n     Informe a idade (nn) do aluno: ";
      cin >>item->idade;
      sls_store( item, &inicio, &ultimo);
 }
  void sls_store(struct aluno *i, struct aluno **inicio, struct aluno **ultimo)
 {
      aluno *velho, *p;
      p=*inicio;
      if(!*ultimo){//primeiro elemento da lista
          i->proximo=NULL;
          *ultimo=i;
          *inicio=i;
          return;
          }
      velho=NULL;
      while (p) 
          {
          if(strcmp(p->nome, i->nome)<0){
              velho=p;
              p=p->proximo;
              }
      else{
           if(p->anterior){ // meio da lista
              p->anterior->proximo=i;
              i->proximo=p;
              i->anterior=p->anterior;
              p->anterior=i;
              return;
              }
           i->proximo=p; //novo primeiro elemento
           i->anterior=NULL;
           p->anterior=i;
           *inicio=i;
           return;
           }
      } //fim do loop while
      velho->proximo=i; // se for final da lista
      i->proximo=NULL;
      i->anterior=velho;
      *ultimo=i;
 }

  void sls_retrieve(struct aluno *i, struct aluno **inicio, struct aluno **ultimo)
  {
      if(i->anterior) i->anterior->proximo=i->proximo;
      else{ //novo primeiro item
           *inicio=i->proximo;
           if(inicio) i->anterior=NULL;
          }
      if(i->proximo) 
        {i->proximo->anterior=i->anterior;}  //delete i->anterior;
      else 
          {// apaga o ultimo elemento delete ultimo;
          *ultimo=i->anterior;
          }
  }

 void retirar () //retirar pelo número de matrícula
 {
      char  matricula[6];
      aluno *noatual;
      noatual=inicio;
      cout << "\n\nInsira o Numero de matricula do aluno que deseja remover: ";
      fflush(stdin);
      gets(matricula);
      int i=0;
      while( noatual != NULL) /* Enquanto não chega no fim da lista */
         {       
         if(strcmp(noatual->matricula, matricula)==0)
            {
             sls_retrieve(noatual, &inicio, &ultimo);
             cout<<"\n Inscriçao No:"<<matricula<< " removida";
             return;
            }
         noatual = noatual->proximo; /* Faz noatual apontar para o proximo no */
         }
      cout<<"\n\n aluno inexistente";
      return;
 }

 void listarmenu (aluno *noatual)
 {
      int i=0;
      char q;
      do {
         cout<<"\n\n        Escolha uma opcao de listagem:";
         cout<<"\n      C -> listar por nome (ordem Crescente)";
         cout<<"\n      S -> listar por numero da Sala";
         cout<<"\n      M -> listar por numero de Matricula";
         cout<<"\n      D -> listar por nome (ordem Decrescente)";
         cout<<"\n      R -> Retornar ao menu principal\n      ->";
         cin>>q; /* Le a opcao do usuario */
         switch(q) {
            case 'c': case 'C': listarnome(inicio);;break;
            case 's': case 'S': listarsala(inicio); break;
            case 'm': case 'M': listarmat(inicio); break;
            case 'd': case 'D': listarnome(ultimo); break;
            case 'r': case 'R': return;
            default: cout <<"\n\n Opcao não valida";
            }           
     getchar(); /* Limpa o buffer de entrada */
     }while ((q != 'r') && (q != 'R') );
      while( noatual != NULL) /* Enquanto não chega no fim da lista */
         {
         i++;
         cout<<"\n\naluno numero "<< i<<"\nmatricula: " <<noatual->matricula<<"\nNome:";
         cout<<noatual->nome<<" \nsala:"<<noatual->sala<<" \nsexo:"<<noatual->sexo<<" \nidade:"<<noatual->idade;   
         noatual = noatual->proximo; /* Faz noatual apontar para o proximo no */
         }
 }

 void listarnome (aluno *noatual)   //lista por nome Crescente ou Decrescente
 {
      int i=0;
      if (noatual==inicio) {
      cout<<"\n\n   Listagem por Nome (Crescente) ";
      while( noatual != NULL) /* Enquanto não chega no fim da lista */
         {
         i++;
         cout<<" \n\n   Nome: "<<noatual->nome<<"    sexo:"<<noatual->sexo<<"    idade:"<<noatual->idade;   
         cout<<" \n   sala:"<<noatual->sala<<"       matricula: "<<noatual->matricula;
         noatual = noatual->proximo; /* Faz noatual apontar para o proximo no */
         }}
         else {
          cout<<"\n\n   Listagem por Nome (Decrescente) ";
          while( noatual != NULL) /* Enquanto não chega no inicio da lista */
         {
         i++;
         cout<<" \n\n   Nome: "<<noatual->nome<<"    sexo:"<<noatual->sexo<<"    idade:"<<noatual->idade;   
         cout<<" \n   sala:"<<noatual->sala<<"       matricula: "<<noatual->matricula;
         noatual = noatual->anterior; /* Faz noatual apontar para o anterior no */
         }}
 }


void listarsala (aluno *noatual)
 {
         int i=0;
         cout<<"\n\nSala numero 1";
     while((noatual != NULL) && (noatual->sala==1)) /* Enquanto não chega no fim da lista */
         {
         i++;
         cout<<"\n\n     Nome:"<<noatual->nome<<"   sexo:"<<noatual->sexo<<"   idade:"<<noatual->idade;   
         cout<<"\n     matricula: " <<noatual->matricula;
         noatual = noatual->proximo; /* Faz noatual apontar para o proximo no */
         }
         noatual=inicio;
         i=0;
         cout<<"\n\nSala numero 2";
      while((noatual != NULL) && (noatual->sala==2)) /* Enquanto não chega no fim da lista */
         {
         i++;
         cout<<"\n\n     Nome:"<<noatual->nome<<"   sexo:"<<noatual->sexo<<"   idade:"<<noatual->idade;   
         cout<<"\n     matricula: " <<noatual->matricula;
         noatual = noatual->proximo; /* Faz noatual apontar para o proximo no */
         }
         noatual=inicio;
         i=0;
         cout<<"\n\nSala numero 3";
      while((noatual != NULL) && (noatual->sala==3)) /* Enquanto não chega no fim da lista */
         {
         i++;
         cout<<"\n\n     Nome:"<<noatual->nome<<"   sexo:"<<noatual->sexo<<"   idade:"<<noatual->idade;   
         cout<<"\n     matricula: " <<noatual->matricula;
         noatual = noatual->proximo; /* Faz noatual apontar para o proximo no */
         }
 }

void listarmat (aluno *noatual)
 {
      int i=0;
      while( noatual != NULL) /* Enquanto não chega no fim da lista */
         {
         i++;
         cout<<"\n\naluno numero "<< i<<"\nmatricula: " <<noatual->matricula<<"\nNome:";
         cout<<noatual->nome<<" \nsala:"<<noatual->sala<<" \nsexo:"<<noatual->sexo<<" \nidade:"<<noatual->idade;   
         noatual = noatual->proximo; /* Faz noatual apontar para o proximo no */
         }
 }

Editado por kuroi
Adicionar tag CODE
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...