1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Problema em C

Discussão em 'Programação' iniciada por jorijo, 29 de Maio de 2007. (Respostas: 6; Visualizações: 796)

  1. jorijo

    jorijo Power Member

    Boas!

    Nao consigo meter o seguinte programa a funcionar por erros na indicacao do caminho para aceder aos dados da estrutura alguem em sabe dizer como resolver isso?[​IMG]


    //3.a
    struct struct_dados
    {
    int num_aluno, ano;
    char nome[50], curso[3];
    };


    //3.b
    struct struct_dados pede_dados()
    {

    struct_dados aluno;

    printf("Introduza o numero de aluno: ");
    scanf("%d",&aluno.num_aluno);
    printf("Introduza o nome do aluno: ");
    gets(aluno.nome);
    printf("Introduza o curso do aluno: ");
    gets(aluno.curso);
    printf("Introduza o ano do aluno: ");
    scanf("%d",&aluno.ano);

    return aluno;
    }

    //funcao nao pedida
    mostra_alunos(struct struct_dados *alunof, int num)
    {
    int i;

    for(i=0;i<num;i++)
    printf("%d - %s - %s - %d\n",*(alunof+i).num_aluno,*(alunof+i).nome,*(alunof+i).curso,*(alunof+i).ano);
    }

    //3.c
    main()
    {
    int i,n;
    struct struct_dados *alunos;

    printf("Quantos alunos deseja introduzir?");
    scanf("%d",&n);

    if(!(alunos=(struct_dados*)malloc(n*sizeof(struct_dados))))
    {
    printf("Memoria insuficiente!");
    exit(1);
    }

    for(i=0;i<n;i++)
    *(alunos+i)=pede_dados();

    mostra_alunos(alunos,n);

    free(alunos);
    }
     
  2. Myth

    Myth Power Member

    Código:
    
    //3.a
    typedef struct struct_dados
    {
        int num_aluno, ano;
        char nome[50], curso[3];
    };
    
    
    //3.b
    struct struct_dados pede_dados()
    {
        struct struct_dados aluno;
    
        printf("\n###########\nIntroduza o numero de aluno: ");
        scanf("%d",&aluno.num_aluno);
        printf("Introduza o nome do aluno: ");
        scanf("%s",aluno.nome);
        printf("Introduza o curso do aluno: ");
        scanf("%s",aluno.curso);
        printf("Introduza o ano do aluno: ");
        scanf("%d",&aluno.ano);
    
        return aluno;
    }
    
    //funcao nao pedida
    mostra_alunos(struct struct_dados *alunof, int num)
    {
        int i;
    
        for(i=0;i<num;i++)
        printf("%d - %s - %s - %d\n",alunof[i].num_aluno,alunof[i].nome,alunof[i].curso,alunof[i].ano);
    }
    
    //3.c
    main()
    {
        int i,n;
        struct struct_dados *alunos;
    
        printf("Quantos alunos deseja introduzir?");
        scanf("%d",&n);
        alunos = (struct struct_dados*) malloc( n * sizeof(struct struct_dados) );
        if( alunos == 0 )
        {
            printf("Memoria insuficiente!");
            exit(1);
        }
    
        for(i=0;i<n;i++)
            alunos[i]=pede_dados();
    
        mostra_alunos(alunos,n);
    
        free(alunos);
    }
    
    Em principio isto deve funcionar :P
    Para a proxima sê mais claro com o erro (faz copy paste do compilador) e tenta usar pontuação, caso contrário o que escreves pode tornar-se incompreensivel.
     
  3. jorijo

    jorijo Power Member

    myth obrigado pela ajuda, mas n consigo correr o programa ah mesma!

    o erro de compilacao foi:
    D:\ISCAC\Algoritmos e Programação 2\Aulas\Ficha 5\exercicio3.cpp(37) : error C2228: left of '.num_aluno' must have class/struct/union type
    D:\ISCAC\Algoritmos e Programação 2\Aulas\Ficha 5\exercicio3.cpp(37) : error C2228: left of '.nome' must have class/struct/union type
    D:\ISCAC\Algoritmos e Programação 2\Aulas\Ficha 5\exercicio3.cpp(37) : error C2228: left of '.curso' must have class/struct/union type
    D:\ISCAC\Algoritmos e Programação 2\Aulas\Ficha 5\exercicio3.cpp(37) : error C2228: left of '.ano' must have class/struct/union type
     
  4. Myth

    Myth Power Member

    Que versão do VS estás a usar? Experimenta mudar a extenção de cpp, para c. É que, ficheiros com extenção cpp são compilados como se estivesses a usar C++ e não C, o que faz sentido. ;)

    De qualquer das formas:
    printf("%d - %s - %s - %d\n",alunof.num_aluno,alunof.nome,alunof.curso,alunof.ano);
    julgo que deveria ser alunof->num_aluno uma vez que é ponteiro. Mas como há uns 10 anos que não uso structs (só uso classes), posso estar enganado. Estranhamente, o meu VS compila e corre bem com o '.' e com o -> dá erro de struct.
     
  5. jorijo

    jorijo Power Member

    yap myth tinhas razao!

    nao pode ser:
    printf("%d - %s - %s - %d\n",*(alunof+i).num_aluno,*(alunof+i).nome,*(alunof+i).curso,*(alunof+i).ano);

    tem q ser:
    printf("%d - %s - %s - %d\n",alunof.num_aluno,alunof.nome,alunof.curso,alunof.ano);

    Nao faz muito sentido uma vez q existem a notacao offset é mais utilizada e deveria funcionar com estruturas mas... quem manda é a maquina!

    obrigado! e ja agora se alguem souber explicar a razao agradecia deste conflito agradecia
     
  6. dam

    dam Power Member

    A razão para isso acontecer é simples: o operador . tem mais prioridade que o operador * (ver http://www.cppreference.com/operator_precedence.html).

    Para que funcionasse da maneira que querias fazer inicialmente, terias de ter assim:
    Código:
    printf("%d - %s - %s - %d\n",(*(alunof+i)).num_aluno,(*(alunof+i)).nome,(*(alunof+i)).curso,(*(alunof+i)).ano);
    Alternativamente, ainda poderias fazer assim:
    Código:
    printf("%d - %s - %s - %d\n",(alunof+i)->num_aluno,(alunof+i)->nome,(alunof+i)->curso,(alunof+i)->ano);
     
  7. jorijo

    jorijo Power Member

    ok bugg3d tas la! gracias
     

Partilhar esta Página