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

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:
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:
if (remover(num_aluno, numero[], *nalunos)==1)
tens de passar qual a posição do vector do numero, isto assim não funciona!

shift_esquerda_alunos(indice, *nalunos, numero[], name[][MAX_ALUNOS]);
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
 
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
 
Back
Topo