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 */
}
}
Pergunta
mmorcor
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.
Editado por kuroiAdicionar tag CODE
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
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.