wendev 0 Denunciar post Postado Fevereiro 6, 2013 Pessoal, sou novo no fórum e gostaria da ajuda de vcs, tenho um trabalho da faculdade, em que eu preciso cadastrar: ALUNOS, DISCIPLINAS, CURSOS, NOTAS, de forma que tenha uma lista encadeada de cada um dos itens e que eu possa inserir um dado aluno de um dado curso em uma determinada disciplina, o problema é: não estou conseguindo de maneira alguma uma forma que eu insira um aluno em uma disciplina ja cadastrada, se alguem puder me ajudar fico grato, segue o código que ja fiz: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> //ESTRUTURA PARA ALUNO typedef struct Listaluno{ char aluno[50]; struct Listaluno* prox; }Listaluno, *Noaluno; //ESTRUTURA PARA DISCIPLINAS typedef struct Listadisc{ char disc[50]; struct Listadisc* prox; }Listadisc, *Nodisc; //######################// //FUNÇÕES PARA ALUNO void cria (Noaluno *l){ (*l) = NULL; } _Bool busca(Noaluno *l,char v[50]){ Listaluno *q; int i=0; //for(i=0;i<50;i++){ for (q=*l; q!=NULL; q=q->prox){ //if(q->info[i] == v[i]){ if(!(strcmp(q->aluno,v))){ puts(q->aluno); //printf("\n\nachou %d\n\n\n",i); return q; } i++; } return false; } void imprime (Noaluno* l){ Listaluno *p; for (p=*l; p!=NULL; p=p->prox){ puts(p->aluno); } } _Bool insere_ordenado (Noaluno *l, char v[50]){ Listaluno *p; if(busca(l,v)){ printf("Ja existe\n"); return false; } p = (Listaluno*) malloc(sizeof(Listaluno)); strcpy(p->aluno,v); Listaluno* ant = NULL; Listaluno *r = *l; while (r != NULL && (strcmp(v,r->aluno) > 0)) { ant = r; r= r->prox; } if (ant == NULL) { p->prox = *l; *l = p; } else { p->prox = ant->prox; ant->prox = p; } return l; } _Bool retira (Noaluno* l, char v[50]) {//Em qualquer posicao Listaluno *ant = NULL; Listaluno *p; p = *l; while (p != NULL && (strcmp(p->aluno, v)!=0)) { ant = p; p = p->prox; } if (p == NULL) return l; if (ant == NULL) { *l = p->prox; } else { ant->prox = p->prox; } free(p); return l; } //FUNÇÕES PARA DISCIPLINA //FUNÇÕES PARA ALUNO void crialistadisc (Nodisc *l){ (*l) = NULL; } _Bool buscadisc(Nodisc *l,char v[50]){ Listadisc *q; int i=0; //for(i=0;i<50;i++){ for (q=*l; q!=NULL; q=q->prox){ //if(q->info[i] == v[i]){ if(!(strcmp(q->disc,v))){ puts(q->disc); //printf("\n\nachou %d\n\n\n",i); return q; } i++; } return false; } void imprimedisc (Nodisc* l){ Listadisc *p; for (p=*l; p!=NULL; p=p->prox){ puts(p->disc); } } _Bool insere_ordenado_disc (Nodisc *l, char v[50]){ int i=0; Listadisc *p; if(buscadisc(l,v)){ printf("Ja existe\n"); return false; } p = (Listadisc*) malloc(sizeof(Listadisc)); strcpy(p->disc,v); Listadisc* ant = NULL; Listadisc *r = *l; while (r != NULL && r->disc[i] < v[i]) { ant = r; r= r->prox; } if (ant == NULL) { p->prox = *l; *l = p; } else { p->prox = ant->prox; ant->prox = p; } return l; } _Bool retiradisc (Nodisc* l, char v[50]) {//Em qualquer posicao Listadisc *ant = NULL; Listadisc *p; p = *l; int i=0; while (p != NULL && p->disc[i] != v[i]) { ant = p; p = p->prox; } if (p == NULL) return l; if (ant == NULL) { *l = p->prox; } else { ant->prox = p->prox; } free(p); return l; } void menualuno(){ Listaluno *l; //Listadisc *d, *r; cria(&l); int op; char dado[50]/*, disc[50]*/; do{ printf("1)Insere, 2)Imprime, 3)Busca ou 4)Remove? "); scanf("%d",&op); if(op==1){ //system("cls"); printf("Digite o nome: "); scanf(" %50[^\n\t]",dado); insere_ordenado(&l,dado);//system("cls"); /*printf("Insira a disciplina: "); scanf(" %20[^\n\t]",disc); if(disc==r->disc) insere_ordenado_disc(&d,disc);*/ } if(op==2){ printf("Dados:\n"); imprime(&l); } if(op==3){ printf("Qual nome: "); scanf(" %50[^\n\t]",dado); busca(&l,dado); } if(op==4){ printf("Qual nome: "); scanf(" %50[^\n\t]",dado); //30 tamanho do char retira(&l,dado); } }while(op!=0); } void menudisc(){ Listaluno *l; Listadisc *d; cria(&l); crialistadisc(&d); int op; char disc[20]; do{ printf("1)Insere, 2)Imprime, 3)Busca ou 4)Remove? "); scanf("%d",&op); if(op==1){ //system("cls"); printf("Insira a disciplina: "); scanf(" %20[^\n\t]",disc); insere_ordenado_disc(&d,disc); } if(op==2){ printf("Dados:\n"); imprimedisc(&d); } if(op==3){ printf("Qual nome: "); scanf(" %50[^\n\t]",disc); buscadisc(&d,disc); } if(op==4){ printf("Qual nome: "); scanf(" %50[^\n\t]",disc); retiradisc(&d,disc); } }while(op!=0); } int main(int argc, char **argv) { //menualuno(); //menudisc(); char op; printf("a) aluno d) disciplina "); scanf("%c",&op); switch (op){ case 'a': menualuno(); case 'd': menudisc(); } return 0; } Compartilhar este post Link para o post Compartilhar em outros sites
Renato Utsch 24 Denunciar post Postado Fevereiro 7, 2013 Olá! Os problemas estão relacionados a ponteiros, você está cometendo vários erros. Sugiro estudar um material bom sobre ponteiros, você vai conseguir fazer o exercício depois. O guidjos tinha um guia que eu considerava muito bom para isso, mas parece que ele retirou a página, então você via ter que procurar pela internet. Ah, e nada de apostilas, normalmente elas tem coisas muito erradas, procure por livros renomados na área. Por exemplo, se sabe ler inglês, pegue o "C Programming: a modern approach, 2nd edition", K.N.King ou então o K&R C, ambos são bem famosos e vão te ensinar como usar ponteiros da maneira estritamente correta. Abraços :D @edit: Ah, e outra coisa, lembre-se do "break" em cases de switches, do jeito que está, se o usuário digitar "a, vai executar as funções menualuno() e menudisk(), pois está faltando um break no "case 'a':". Compartilhar este post Link para o post Compartilhar em outros sites