Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

wendev

Cadastro de aluno Universidade em C

Recommended Posts

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.