Manipulação de dados entre estruturas [RESOLVIDO]

1. Manipulação de dados entre estruturas [RESOLVIDO]

Wilson
wilsonppjr

(usa Ubuntu)

Enviado em 13/09/2010 - 14:33h

Tenho duas estruturas aluno e disciplina, onde dentro da estrutura aluno existe a estrutura disciplina. Queria inserir os dados na disciplina pela estrutura aluno, e não encontrei meios para tal. Se alguém puder ajudar, grato desde já. Segue o código:

/*Wilson Pedroso email: wilsonppjr@gmail.com*/

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

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

struct aluno *inicio; //Primeiro Matricula

////////////////////////////////////////////////////////////////////////////////
struct disciplina
{
int codigod, n_creditos, periodod;
char nomed[50];
struct disciplina *esq, *dir;
};
struct disciplina *pinicio;

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


//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 disciplina **pinicio, int codigod);
void insereDepois_Disciplina(struct disciplina *p, int codigod);
void removeInicio_Disciplina(struct disciplina **pinicio);
void removeDepois_Disciplina(struct disciplina *p);
void percorreLista_Disciplina(struct disciplina *pinicio);
void insereOrdenado_Disciplina(struct disciplina **pinicio, int codigod);
void remove_ordenado_Disciplina(struct disciplina **pinicio, int codigod);
void buscaAluno(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....................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 uma nova matrícula 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 Ordenadamente
{
printf("Digite o 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: ");
scanf("%d", &codigod);
fflush(stdin);
insereOrdenado_Disciplina(&pinicio,codigod);

//printf("Digite o Codigo do Aluno: ");
//scanf("%d", &codigo);
}
if(x == 5)//Remove Uma Disciplna
{

printf("Digite o codigo: ");
scanf("%d", &codigod);
remove_ordenado_Disciplina(&pinicio,codigod);

}
if(x == 6)//Imprime Lista de Disciplinas de um Alunos
{
percorreLista_Disciplina(pinicio);
}

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

}
if(x<1||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);
//Inserção no Arquivo
FILE *f1;
if((f1 = fopen("C:\\Cadastro_Alunos.txt","w")) == NULL)
{
printf("Arquivo nao pode ser aberto.");
getch();
}

//Definindo atributos com base na chave código
aux ->codigo = codigo;
fprintf(f1, "%d\n" ,codigo); //Insere No arquivo

printf("Digite o Nome: ");
gets(aux->nome); //Insere Na Estrutura aluno
fprintf(f1, "Nome = %s\n" ,aux->nome); //Insere No arquivo
fflush(stdin);

printf("Digite o Curso: ");
gets(aux->curso); //Insere Na Estrutura aluno
fprintf(f1, "Curso = %s\n" ,aux->curso); //Insere No arquivo
fflush(stdin);

printf("Digite o Endereco: ");
gets(aux->endereco); //Insere Na Estrutura aluno
fprintf(f1, "Endereco = %s\n" ,aux->endereco); //Insere No arquivo
fflush(stdin);

printf("Digite o Periodo: ");
gets(aux->periodo); //Insere Na Estrutura aluno
fprintf(f1, "Periodo = %s\n" ,aux->periodo); //Insere No arquivo
fflush(stdin);

system("cls"); //Limpa Tela
aux->proximo = inicio;
inicio = aux;


}

void removeInicio(){ // Remove o primeiro registro
struct aluno *aux;
aux = inicio;
inicio = inicio->proximo;
free(aux);
}


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

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;
}

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);
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 nao Cadastrado!");
getch();
system("cls"); //Limpa a Tela
}
}
////////////////////////////////////////////////////////////////////////////////
/*Estrutura disciplina*/
void insereInicio_Disciplina(struct disciplina **pinicio, 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;
}

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

void insereDepois_Disciplina(struct disciplina *p, int codigod)
{
struct disciplina *aux;
aux=(struct disciplina *)malloc(sizeof(struct disciplina));
aux ->codigod = codigod;
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;
}

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

void removeInicio_Disciplina(struct disciplina **pinicio)
{
struct disciplina *aux;
aux = *pinicio;
*pinicio=(*pinicio)->dir;
if(*pinicio != NULL)
(*pinicio)->esq=NULL;
free(aux);
}
////////////////////////////////////////////////////////////////////////////////
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);
}

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

void percorreLista_Disciplina(struct disciplina *pinicio)
{
struct disciplina *p;
p = pinicio;
while(p != NULL)
{
printf("Codigo: %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" , p->n_creditos);
p = p->dir;
getch();
system("cls"); //Limpa a Tela
}
getch();
}
////////////////////////////////////////////////////////////////////////////////

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

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

void remove_ordenado_Disciplina(struct disciplina **pinicio, int codigod)
{
struct disciplina *p,*q;
p =*pinicio;

if (p==NULL)
{
printf("lista vazia");
getch();
return;
}

if (codigod == p->codigod)
{
removeInicio_Disciplina(pinicio);
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 nao Cadastrado");
getch();
}
}





  


2. MELHOR RESPOSTA

Ezequias Rocha
Ezequias Rocha

(usa Ubuntu)

Enviado em 13/09/2010 - 15:30h

Boa tarde wilson,

Primeiramente, aconselho a utilizar declarações de tipo:

typedef struct//Declaração de um novo tipo de variável estruturada - disciplina
{
int codigod, n_creditos, periodod;
char nomed[50];
}disciplina;

typedef struct //Declaração de um novo tipo de variável estruturada - aluno
{
int codigo;
char nome[50], endereco[50], curso[50], periodo[50];
disciplina disciplinad; //Um dos elementos desta estrutura é uma variável do tipo //"disciplina", chamada de "disciplinad"
}aluno;

aluno *inicio; //Primeiro Matricula

/* Faltam alocações de memória */

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

No momento de acessar elementos de "disciplinad", pertencentes a "inicio", você provavelmente irá utilizar:

inicio->disciplinad.codigod = FIRSTCODE;//Como exemplo, dando o valor do macro FIRSTCODE ao
//campo "codigod" pertencente à variável "disciplinad", que é do tipo "disciplina", dentro da estrutura da variável "inicio", que é do tipo "aluno".

Enfim, para melhor entendimento, procure pelo tópico "estruturas" dentro de tutoriais de C.

Embraces!





Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts