Error: expected Expression before 'dadosaluno'

Asked

Viewed 346 times

0

I’m doing a student registration 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 'dadosaluno'

  • Did you check which line is the bug on? The compiler usually tells you the line in which the error occurred. I noticed that you used dadosaluno.matricula[i] instead of dadosaluno[i].matricula twice.

1 answer

1

The problem starts right at the first typedef:

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

This did not do what you imagine. Here makes a typedef defining that dadosaluno corresponds to an array of 20 structures equal to the one specified above, but you did not create any such object. Remember that typedef it’s like creating an alternate type, but it doesn’t create variables on its own.

In addition to the typedef as an array generates a lot of confusion, so I advise you to follow what is normal and make only one typedef to the structure and then create the array of these 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

While it’s not very good to use global variables, this is the way to keep the code working with what you’ve already written. Pay attention to the difference. Now you have a typedef to give an alternative name to the aluno, and then there is the creation of an array of 20 elements of that structure.

Only with this change most build errors have already disappeared getting only a few typos:

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

  • memset(&dadosalun[i].n1,0,sizeof(dadosaluno[i].n1)); - here lacked a o in the word &dadosalun

  • int i,; - one more comma before the ;

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

I was guided only by the 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 mistakes but also to warnings that are almost always mistakes.

This is not to say that there are no more logic problems but at least there are no compilation problems.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.