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.
#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 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.