Error: expected expression before 'data'

0

I'm doing a student enrollment program:

#include <stdio.h>
#include <stdlib.h>
#include<string.h>

/*Elabore um programa em linguagem C, que seja capaz registrar um conjunto de dados de uma turma de programação de computadores em memória RAM.
Esta turma possui no máximo 20 alunos.
Cada aluno é representado por uma struct, que é composta por matrícula, nome, nota 1, nota 2 e média.
O conjunto de alunos da turma deve ser estruturado na memória RAM através de um vetor, que será manipulado através das operações
"Incluir aluno", "Excluir aluno", "Consultar aluno", "Listar alunos da turma". Além destas opções, que comporão um menu, também é necessária uma opção para finalizar o programa.*/

typedef struct{
int matricula;
char nome [100];
float n1,n2,media;
}dadosaluno[20];

void incluir(void);
void exlcuir(void);
void consultar(void);
void listar(void);

int main(void){
int i,aux,media;
char opcao;
printf("|=============================================|\n");
printf("|SELECIONE UMA OPCAO|\n");
printf("A->INCLUIR ALUNOS\n");
printf("B->EXCLUIR ALUNOS\n");
printf("C->CONSULTAR ALUNOS\n");
printf("D->LISTAR ALUNOS\n");
printf("E->ENCERRAR O PROGRAMA\n");
printf("|=============================================|");
printf("\nInforme uma opcao(A,B,C,D,E): ");
opcao = getch();
switch(opcao){
    case 'A':
    case 'a':
        incluir();
        break;
    case 'B':
    case 'b':
        excluir();
        break;
    case 'C':
    case 'c':
        consultar();
        break;
    case 'D':
    case 'd':
        listar();
        break;
    case 'E':
    case 'e':
        printf("\n\n*PROGRAMA ENCERRADO*\n\n");
        break;
    default:
        printf("\n\n*ESCOLHEU OPCAO INVALIDA*\n\n");
        break;
    }
return 0;
}
void incluir(void){
int i,media = 0,n1 = 0,n2 = 0;
for(i=0;i<20;i++){
        printf("\n\nInsira a matricula do aluno: ");
        scanf("%d",&dadosaluno[i].matricula);
        printf("Insira o nome do aluno: ");
        scanf(" %[^\n]s",&dadosaluno[i].nome);
        printf("Insira a nota 1 do aluno: ");
        scanf("%f",&dadosaluno[i].n1);
        printf("Insira a nota 2 do aluno: ");
        scanf("%f",&dadosaluno[i].n2);
        media = (n1 + n2)/2;
        dadosaluno[i].media = media;
    }
}
void excluir(void){
int i,aux;
printf("Digite a matricula do aluno que deseja excluir: ");
scanf("%d",&aux);
for(i=0;i<20;i++){
        if(aux == dadosaluno.matricula[i]){
            memset(&dadosaluno[i].nome,0,sizeof(dadosaluno[i].nome));
            memset(&dadosalun[i].n1,0,sizeof(dadosaluno[i].n1));
            memset(&dadosaluno[i].n2,0,sizeof(dadosaluno[i].n2));
            memset(&dadosaluno[i].media,0,sizeof(dadosaluno[i].media));
            memset(&dadosaluno[i].matricula,0,sizeof(dadosaluno[i].matricula));
        }
    }
}
void consultar(void){
int i,aux;
printf("Digite a matricula do aluno que deseja consultar: ");
scanf("%d",&aux);
for(i=0;i<20;i++){
        if(aux == dadosaluno.matricula[i]){
            printf("Matricula do aluno: %d\n",dadosaluno[i].matricula);
            printf("Nome do aluno: %s\n",dadosaluno[i].nome);
            printf("Nota 1 do aluno: %.2f\n",dadosaluno[i].n1);
            printf("Nota 2 do aluno: %.2f\n",dadosaluno[i].n2);
            printf("Media do aluno: %.2f\n",dadosaluno[i].media);
        }
    }
}
void listar(void){
int i,;
for(i=0;i<20;i++){
        printf("Matricula do aluno: %d\n",dadosaluno[i].matricula);
        printf("Nome do aluno: %s\n",dadosaluno[i].nome);
        printf("Nota 1 do aluno: %.2f\n",dadosaluno[i].n1);
        printf("Nota 2 do aluno: %.2f\n",dadosaluno[i].n2);
        printf("Media do aluno: %.2f\n",dadosaluno[i].media);
    }
}

but the program is returning the error:

  

error: expected expression before 'dataaluno'

    
asked by anonymous 15.11.2018 / 07:34

1 answer

1

The problem starts immediately on the first% of_co_de%:

typedef struct{
    int matricula;
    char nome [100];
    float n1,n2,media;
} dadosaluno[20];
//           ^-----

This did not do what you think. Here it does a typedef defining that typedef corresponds to an array of 20 structures equal to the one specified above, but you ended up creating no such objects. Remember that dadosaluno is like creating an alternate type, but ends up not creating variables by itself.

In addition, typedef as an array causes a lot of confusion, so I advise you to follow what is normal and just make a typedef to the structure and then create the array of those structures:

typedef struct{
    int matricula;
    char nome [100];
    float n1,n2,media;
} aluno;

aluno dadosaluno[20]; //criação do array de estruturas com 20 elementos

Although it is not very good to use global variables, this is the way to keep the code working with what you have already written. Look carefully at the difference. Now it has a typedef to give an alternative name to the structure of typedef , and then has to create an array of aluno elements of that structure.

Only with this change most of the compilation errors have disappeared with only a few typos:

  • 20 - the index was in the wrong place because it should be in if(aux == dadosaluno.matricula[i]){ , thus dadosaluno

  • if(aux == dadosaluno[i].matricula){ - missing memset(&dadosalun[i].n1,0,sizeof(dadosaluno[i].n1)); in word o

  • &dadosalun - one more comma before int i,;

  • ; - The scanf(" %[^\n]s",&dadosaluno[i].nome); is over as the & field will already be interpreted as a pointer.

I've only been guided by errors and compilation warnings to show you the problems. And it is very important that you do the same, giving extreme relevance not only to errors but also to warnings that are almost always mistakes.

This does not mean that you do not have any more logic problems, but at least you do not have any builds.

    
15.11.2018 / 12:01