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

Programa com duas estruturas em C


Pedroso de Paula

Pergunta

Galera, eu estou com esse trabalho, e ele está com erros ainda, e preciso de um auxílio. Eu tenho as estruturas aluno e disciplina, com isso eu preciso cadastrar o aluno(isso já funciona) e uma lista de disciplinas para cada aluno, a questão é que eu não encontrei o meio para referenciá-las para cada aluno, sei que usa ponteiros mas não tive a visão ainda.

Se alguém tiver uma dica de como se resolve isso, sou grato desde já. Abraço!

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
struct disciplina
{
 int codigod, n_creditos, periodod;
 char nomed[50];
 struct disciplina *esq, *dir;
};
struct disciplina *pinicio;

struct aluno //Declaração da estrutura aluno
{
 int codigo;//Atributos da estrutura aluno
 char nome[50], endereco[50], curso[50], periodo[50];
 struct aluno *proximo; 
 struct disciplina *piniciodisciplina;
};

struct aluno *inicio; //Primeiro Matricula

////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////


//SubRotinas Utilizadas
//Aluno
void insereInicio(int codigo);
void removeInicio();
void insereDepois(struct aluno *a, int codigo);
void remove_depois(struct aluno *a);
void percorreLista();
void insereOrdenado(int codigo);
void remove_ordenado(int codigo);
//Disciplina
void insereInicio_Disciplina(struct aluno **piniciodisciplina, int codigod);
void insereDepois_Disciplina(struct disciplina *p, int codigo, int codigod);
void removeInicio_Disciplina();
void removeDepois_Disciplina(struct disciplina *p);
void percorreLista_Disciplina(int codigo);
void insereOrdenado_Disciplina(struct aluno **piniciodisciplina, int codigod);
void remove_ordenado_Disciplina(int codigo, int codigod);
void busca_aluno(int codigo);



////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

main(){
int x = 1, codigo, codigod;
while(x != 7)
{
printf("\n***************   Matricula de Aluno   ***************\n\n\n"); 
//Menu
printf("Para cadastrar um novo aluno.....................Digite 1:\n\n");
printf("Para imprimir a lista de alunos..................Digite 2:\n\n");
printf("Para remover um Aluno............................Digite 3:\n\n");
printf("Para adicionar uma Disciplina para um aluno......Digite 4:\n\n");
printf("Para remover uma Disciplina......................Digite 5:\n\n");
printf("Para imprimir lista de disciplinas de um Aluno...Digite 6:\n\n");
printf("Para sair........................................Digite 7:\n\n");

printf("Escolha: ");
scanf("%d", &x);
system("cls"); //Limpa a Tela

if(x == 1) //Insere um novo cadastro ordenadamente
{
     printf("\n***************   Matricula de Aluno   ***************\n\n\n"); 
     fflush(stdin);
     printf("Digite o codigo:   ");
     scanf("%d", &codigo);
     fflush(stdin);
     insereOrdenado(codigo);    
}     
     
if(x == 2)//Imprime a lista de alunos
percorreLista();

if(x == 3)// Remove Aluno
{
printf("Digite o codigo:   "); //Remova o aluno pelo codigo
scanf("%d", &codigo);
remove_ordenado(codigo);
}

if(x == 4)//Adiciona uma Disicplina
{
     printf("\n***************   Cadastro de Disciplinas   ***************\n\n\n"); 
     fflush(stdin);
     printf("Digite o codigo do Aluno:  ");
     scanf("%d", &codigo);
     busca_aluno(codigo);         
}
if(x == 5)//Remove Uma Disciplna
{
printf("Digite o Codigo do Aluno"); 
scanf("%d", &codigo);
printf("\nDigite o codigo:   ");
scanf("%d", &codigod);
remove_ordenado_Disciplina(codigo, codigod);
     
}
if(x == 6)//Imprime Lista de Disciplinas de um Alunos
{
fflush(stdin);
printf("\n\nDigite o Codigo do Aluno: ");
scanf("%d", &codigo);
percorreLista_Disciplina(codigo);
    
}

if(x == 7)// Sair
{
system("cls"); //Limpa a Tela
printf("\n\nPressione qualquer tecla para sair....");
getch();

}
if(x != 1 && x != 2 && x != 3 && x != 4 && x != 5 && x != 6 && x != 7) //Verifica se foi digitado um valor valido de 1 a 7
{
system("cls"); //Limpa a Tela
printf("\n\nValor Invalido!\n\nDigite Novamente\n\n");
}
}//Fim do While
}//Fim do Main

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////


void insereInicio(int codigo){// Insere um novo Aluno no ínicio da Fila, Passando todos atributos por referência
      struct aluno *aux;
      aux =(struct aluno*)malloc(sizeof(struct aluno));  //Aloca Espaço na Memoria
      fflush(stdin);         
      //Definindo atributos com base na chave código
      aux ->codigo = codigo;         //Insere Codigo na Estrutura aluno 
      printf("Digite o Nome:     ");
      gets(aux->nome);               //Insere Nome na Estrutura aluno      
      fflush(stdin);      
      printf("Digite o Curso:    ");
      gets(aux->curso);              //Insere Curso na Estrutura aluno      
      fflush(stdin);      
      printf("Digite o Endereco: ");
      gets(aux->endereco);           //Insere Endereço na Estrutura aluno
      fflush(stdin);      
      printf("Digite o Periodo:  ");
      gets(aux->periodo);            //Insere Periodo na Estrutura aluno
      fflush(stdin);
      
      system("cls");  //Limpa Tela
      aux->proximo = inicio;
      inicio = aux;
      
      printf("Aluno Inserido com sucesso");
      getch();
      system("cls"); //Limpa a Tela 
      printf("\n\nPressione qualquer tecla para voltar ao menu");
        
            
}

void removeInicio(){ // Remove o primeiro registro
     struct aluno *aux;
     aux = inicio;
     inicio = inicio->proximo;
     free(aux);
     printf("Aluno removido com sucesso");
     system("cls"); //Limpa a Tela 
     printf("\n\nPressione qualquer tecla para voltar ao menu");
     getch();    
}
////////////////////////////////////////////////////////////////////////////////

void insereDepois(struct aluno *a, int codigo){  //Insere uma matrícula após outra matrícula específica
      struct aluno *aux,c;
      aux =(struct aluno*)malloc(sizeof(struct aluno)); //Aloca Espaço na Memoria
      aux->codigo = codigo;
      
      //Definindo atributos com base na chave código
      printf("Digite o Nome:     ");
      gets(aux->nome);
      fflush(stdin);
      printf("Digite o Curso:    ");
      gets(aux->curso);
      fflush(stdin);
      printf("Digite o Endereco: ");
      gets(aux->endereco);
      printf("Digite o Periodo:  ");
      gets(aux->periodo);
      fflush(stdin);
      system("cls");
      aux->proximo = a->proximo;
      a->proximo = aux;
      printf("Aluno Inserido com sucesso");
      getch();
      system("cls"); //Limpa a Tela 
}

void remove_depois(struct aluno *a){ // Remove uma matrícula após outra matrícula específica
     struct aluno *aux;
     aux = a->proximo;
     a->proximo = aux->proximo;
     free(aux);
     printf("Aluno removido com sucesso");
     getch();
     system("cls"); //Limpa a Tela 
}

////////////////////////////////////////////////////////////////////////////////
void percorreLista() //Faz a listagem de todas matriculas da Estrutura, e as imprimem
{ 
struct aluno *p;
p = inicio;
printf("\n***************   Alunos Matriculados   ***************\n\n\n"); 
while(p != NULL)
{
fflush(stdin);

printf("Codigo = %d \n\n", p->codigo);
fflush(stdin);
printf("Nome = %s\n\n" ,p->nome);
fflush(stdin);
printf("Endereco = %s \n\n" , p->endereco);
fflush(stdin);
printf("Curso = %s \n\n", p->curso);
fflush(stdin);
printf("Periodo = %s \n\n\n\n\n", p->periodo);
fflush(stdin);
p = p->proximo;

}
getch();
system("cls"); //Limpa a Tela
}

////////////////////////////////////////////////////////////////////////////////

void insereOrdenado(int codigo)
/*Insere um valor na lista de alunos de acordo com seu código*/
{
struct aluno *p, *q;
p = inicio;
if((p == NULL)||(codigo < p->codigo))
{
insereInicio(codigo);
return;
}

q = p;
while((q != NULL) && (q->codigo < codigo))
{
p = q;
q = p->proximo;
}
if((q == NULL) || (q->codigo > codigo))
insereDepois(p,codigo);
else
printf("\nElemento já Existe");
}
////////////////////////////////////////////////////////////////////////////////


void remove_ordenado(int codigo)
{
 struct aluno *p, *q;
 p = inicio;
 if (p == NULL)
{
 printf("\n\nLista Vazia!");
 getch();
 system("cls"); //Limpa a Tela
 return;
}
 if (codigo == p->codigo)
{
 removeInicio();
 return;
}
q = p;
while(q != NULL && q->codigo < codigo)
{
p = q;
q = p->proximo;
}
if (q!=NULL && q->codigo == codigo)
remove_depois(p);
else
{
printf("\n\nElemento não Cadastrado!");
getch();
system("cls"); //Limpa a Tela
}
}
////////////////////////////////////////////////////////////////////////////////

void insereInicio_Disciplina(struct disciplina **piniciodisciplina, int codigod)
{ 
  struct disciplina *aux;
  aux=(struct disciplina *)malloc(sizeof(struct disciplina));
  aux->codigod = codigod;
  fflush(stdin);
  printf("\nDigite o Nome: ");
  gets(aux->nomed);
  fflush(stdin);
  printf("\nDigite o Periodo: ");
  scanf("%d", &aux->periodod);
  fflush(stdin);
  printf("\nDigite o Numeros de Creditos: ");
  scanf("%d", &aux->n_creditos); 
  system("cls"); //Limpa a Tela 
  aux->dir = pinicio;
  aux->esq = NULL;
  if (pinicio != NULL)
  (pinicio)->esq = aux;
  pinicio=aux;
  printf("Disciplina Inserida com sucesso");
  getch();
  system("cls"); //Limpa a Tela 
}

////////////////////////////////////////////////////////////////////////////////
     
void insereDepois_Disciplina(int codigod, struct disciplina *p)
{ 
     struct disciplina *aux;
     aux=(struct disciplina *)malloc(sizeof(struct disciplina));
     aux ->codigod = codigod;
     fflush(stdin);
     printf("\nDigite o Nome: ");
     gets(aux->nomed);
     fflush(stdin);
     printf("\nDigite o Periodo: ");
     scanf("%d", &aux->periodod);
     fflush(stdin);
     printf("\nDigite o Numeros de Creditos: ");
     scanf("%d", &aux->n_creditos); 
     system("cls"); //Limpa a Tela
     aux ->dir=p->dir;
     aux ->esq=p;
     if (p->dir!=NULL)
     (p->dir)->esq = aux;
     p->dir=aux;
     printf("\n\n\nDisciplina Inserida com sucesso");
     getch();
     system("cls"); //Limpa a Tela 
}

////////////////////////////////////////////////////////////////////////////////

void removeInicio_Disciplina()
{ 
     struct disciplina *aux;
     aux = pinicio;
     pinicio=(pinicio)->dir;
     if(pinicio != NULL)
     (pinicio)->esq=NULL;
     free(aux);
     printf("Disciplina Removida com sucesso");
     getch();
     system("cls"); //Limpa a Tela 
}
////////////////////////////////////////////////////////////////////////////////
void removeDepois_Disciplina(struct disciplina *p)
{ 
     struct disciplina *aux;
     aux = p->dir;
     p->dir = aux->dir;
     if (aux->dir != NULL)
     (aux->dir)->esq=p;
     free(aux);
     printf("Disciplina Removida com sucesso");
     getch();
     system("cls"); //Limpa a Tela 
}

////////////////////////////////////////////////////////////////////////////////

void percorreLista_Disciplina(int codigo)
{ 
     struct disciplina *p;
     p = pinicio;
     printf("***********Disciplinas Cadastradas**********\n");
     
     while(p != NULL)
     { 
     {     
     printf("\n\nCodigo: %d \n\n" , p->codigod);
     printf("Nome: %s \n\n" , p->nomed);
     printf("Periodo: %d \n\n" , p->periodod);
     printf("Numero de Creditos: %d \n\n\n\n" , p->n_creditos);
     printf("____________________________________________________________");
     }       
     p = p->dir;          
     }
getch();
system("cls"); //Limpa a Tela 
}
////////////////////////////////////////////////////////////////////////////////

void insereOrdenado_Disciplina(struct aluno *s, int codigod)
{ 
     struct disciplina *p, *q;
     p = pinicio;
     if((p == NULL)||(codigod < p->codigod))
     { 
     insereInicio_Disciplina(&(s->piniciodisciplina),codigod);
     return; 
     }
     q=p;
     while((q!=NULL) && (q->codigod < codigod))
     {
     p=q;
     q=p->dir;
     }
     if((q == NULL) || (q->codigod > codigod))
     insereDepois_Disciplina(codigod, p);
     else
     printf("\nElemento já Existe");
}

////////////////////////////////////////////////////////////////////////////////

void remove_ordenado_Disciplina(int codigo, int codigod)
{ 
     struct disciplina *p,*q;
     p = pinicio;
    
     if (p==NULL)
     {
     printf("lista vazia");
     getch();
     return;
     }
     
     if (codigod == p->codigod)
     { 
     removeInicio_Disciplina();
     return;
     }
     q = p;
     
     while (q !=NULL && q->codigod < codigod )
     { 
     p = q;
     q = p->dir;
     }
     if (q != NULL && q->codigod == codigod)
     removeDepois_Disciplina(p);
     else
     { 
         printf("\nElemento não Cadastrado");
     getch();
}
}
////////////////////////////////////////////////////////////////////////////////

void busca_aluno(int codigo)
{
 int codigod;
 struct aluno *p;
 p = inicio;
  while(p != NULL)
{
if(codigo == p->codigo)
{
     printf("\nDigite o Codigo da Disciplina: ");
     scanf("%d", &codigod); 
     insereOrdenado_Disciplina(p,codigod);
     break;
}
p = p->proximo;

}
getch();
}

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Olá, estude este código e veja se ajuda:

struct dado aluno[2];

int i,j;

float aux,soma,media;

clrscr();

for(i=0;i<2;i++){

printf("\n\Digite o nome do %d§ aluno: ",i+1);

gets(aluno.nome);

for(j=0;j<4;j++){

printf("Digite o valor da %d¦ nota do aluno:",j+1);

scanf("%f",&aux);

aluno.nota[j]=aux;

fflush(stdin);

}

}

Minha sugestão :

......

for(j=0;j<50;j++){

printf("Digite a disciplina do aluno:");

scanf("%s",&nomed);

aluno.disciplina[j]=nomed;

fflush(stdin);

}

Link para o comentário
Compartilhar em outros sites

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,4k
×
×
  • Criar Novo...