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

Apontadores (poucos erros, estruturalmente correcto) - Alguem pode corrigir-me isto?

Discussão em 'Programação' iniciada por S|N, 23 de Abril de 2005. (Respostas: 3; Visualizações: 777)

  1. S|N

    S|N Power Member

    Por favor ajudem-me sou bosta em c mas tenho que aprender isto!
    Código (os erros estão identificados a vermelho):

    #include <stdio.h>
    #include <string.h>
    #define MAX_ALUNOS 30
    #define MAX_NOME 60

    /*Estruturas de dados*/
    /*char nome[MAX_ALUNOS][MAX_NOME]; para dentro do main*/
    /*int numero[Max_Alunos]; para dentro do main*/
    /*int nalunos; para dentro do main*/

    /*----------------------------------------------------------------------------*/
    /* PROTOTIPOS */
    /*----------------------------------------------------------------------------*/
    void op_inscrever_aluno(int *nalunos, int numero[], char nome[][MAX_ALUNOS]);
    void op_listar_alunos(char nome[][MAX_ALUNOS]);
    void op_remover_aluno(int numero[], int *nalunos);
    int remover(int aluno, int numero[], int *nalunos);
    void shift_esquerda_alunos(int posicao, int *nalunos, int numero[], char name[][MAX_ALUNOS]);
    void carregar_ficheiro(void);
    void guardar_ficheiro(void);

    /*---------------------------------------------------*/
    /* Inscreve um aluno, fornecidos o nome e o numero */
    /*---------------------------------------------------*/
    void inscrever_aluno(int *nalunos, int numero[], char nome[][MAX_ALUNOS])
    {
    fflush(stdin);
    printf("Qual o nome do aluno?");
    scanf("%s",nome[*nalunos]);
    printf("Que numero deseja atribuir?");
    scanf("%d",&numero[*nalunos]);
    (*nalunos)++;
    }

    /*-------------------*/
    /* Lista os alunos */
    /*-------------------*/
    void op_listar_alunos(char nome[][MAX_ALUNOS])
    {
    int indice;
    for (indice=0; indice<MAX_ALUNOS; indice++)
    {
    printf("%d%s\n",indice+1,nome[indice]);
    }
    }

    /*----------------------------------------------------------------------------*/
    /* Pede o número do aluno e remove o aluno, reorganizando a lista de alunos */
    /*----------------------------------------------------------------------------*/
    void op_remover_aluno(int numero[], int *nalunos)
    {
    int num_aluno;
    printf("Numero de aluno a remover = ");
    scanf("%d", &num_aluno);

    if (remover(num_aluno, numero[], *nalunos)==1)
    printf("\n ALUNO REMOVIDO COM SUCESSO");
    else
    printf("\n ALUNO A REMOVER NAO EXISTE");
    }

    /*----------------------------------------------------------------------------*/
    /* Remove um aluno dado o seu número. Retorna 1 se removeu, 0 caso contrário */
    /*----------------------------------------------------------------------------*/
    int remover(int aluno, int numero[], int *nalunos)
    {
    int indice;

    /* pesquisa */
    indice=0;
    while ((indice<*nalunos) && (aluno != numero[indice]))
    indice++;

    /* remove se encontrou */
    if (aluno == numero[indice])
    {
    shift_esquerda_alunos(indice, *nalunos, numero[], name[][MAX_ALUNOS]);
    return 1;
    }
    else
    return 0;
    }

    /*----------------------------------------------------------------------------*/
    /* Desloca os registos dos alunos para a esquerda esmagando a posicao dada */
    /*----------------------------------------------------------------------------*/
    void shift_esquerda_alunos(int posicao, int *nalunos, int numero[], char name[][MAX_ALUNOS])
    {
    int indice;

    if (*nalunos==0)
    return;

    for (indice=posicao; indice<*nalunos-1; indice++)
    {
    &numero[indice] = numero[indice+1];
    strcpy(&name[indice],name[indice+1]);
    }

    *nalunos--;
    }

    /*----------------------------------------------------------------------------*/
    /* Carrega a matriz de alunos a partir do ficheiro turno.txt */
    /*----------------------------------------------------------------------------*/
    void carregar_ficheiro(void)
    {
    FILE *fich;
    char dummy;

    if ((fich = fopen("turno.txt", "r")) == NULL) {
    printf("\n\nERRO AO ABRIR FICHEIRO turno.txt\n");
    return;
    }

    while (!feof(fich))
    {
    if(fscanf(fich,"%d", &numeros[nalunos])!=1)
    break;

    fscanf(fich,"%c", &dummy);
    fgets(nomes[nalunos], MAX_NOME, fich);
    /* martelada para remover o \n do fim de cada nome */
    nomes[nalunos][strlen(nomes[nalunos])-1] = '\0';


    printf("\n\t ALUNO %5d\t%s", numeros[nalunos], nomes[nalunos]);

    nalunos++;
    }
    }


    /*----------------------------------------------------------------------------*/
    /* Guarda para o ficheiro os dados já trabalhados */
    /*----------------------------------------------------------------------------*/
    void guardar_ficheiro(int *nalunos int numero[])
    {
    FILE *fich;
    int i;

    /* ordenar_alunos(); */

    if ((fich = fopen("turno.txt", "w")) == NULL) {
    printf("\n\nERRO AO CRIAR FICHEIRO turno.txt\n");
    return;
    }

    for(i=0; i<nalunos; i++)
    fprintf(fich,"%5d %s\n", numeros, nomes);

    fclose(fich);
    }

    /*----------------------------------------------------------------------------*/
    /* Função principal */
    /*----------------------------------------------------------------------------*/
    void main(void)
    {
    int nalunos;
    int numero[MAX_ALUNOS];
    char nome[MAX_NOME][MAX_ALUNOS];
    int opcao;
    nalunos=0;
    carregar_ficheiro();
    do
    {
    menu();
    scanf("%d",&opcao);
    switch (opcao)
    {
    case 1: op_inscrever_aluno(&nalunos,numero,nome); break;
    case 2: op_remover_aluno(&nalunos,numero); break;
    case 3: op_listar_alunos(nalunos,numero,nome); break;
    }
    while(opcao!=0);
    guardar_ficheiro();
    }
    }




    Erros (GCC):

    Exercício12.c: In function `op_remover_aluno':
    Exercício12.c:56: error: parse error before ']' token
    Exercício12.c: In function `remover':
    Exercício12.c:77: error: parse error before ']' token
    Exercício12.c: In function `shift_esquerda_alunos':
    Exercício12.c:96: error: invalid lvalue in assignment
    Exercício12.c:97: warning: passing arg 1 of `strcpy' from incompatible pointer type
     
    Última edição: 23 de Abril de 2005
  2. xanatos

    xanatos To fold or to FOLD?

    Dois avisos para que te possamos ajudar melhor:
    1- Numera as linhas do codigo, ninguém as vai contar para ver os erros
    2- muda a cor, com esse azul não se vê nada!

    ainda assim acho que consegui descobrir um dos erros:
    tens de passar qual a posição do vector do numero, isto assim não funciona!

    o mesmo aqui, o numero[], recebe um valor nas [], para aceder a uma posição do vector.

    isto é num olhar rápido, se estiver enganado alguém que diga
     
  3. Karmack

    Karmack Power Member

    S|N Lê o outro post. Acho que precisas de ler com mais calma a resposta dos utilizadores.
     
  4. S|N

    S|N Power Member

    sim, o txt tem razão. so na funcao e que devo por [] obviamente. ao chamar tenho que indicar a posicao. faz sentido.
    Obrigado txt
     

Partilhar esta Página