-2
PROGRAM
The program highlights memory as more students or more grades are added, but in certain tests depending on the number of students or grades it takes "dirty" values from memory and plays for the first values already allocated.
ERROR
1 - Register two students in option 1 of the menu, each with 2 grades;
2 - Shows the average in menu option 2 (up to here OK);
3 - Register two more students in option 1 of the menu, each with 2 grades;
4 - Here there is error in the value of student’s grade 2 1, consequently the values of the highest grade and general average are also incorrect.
#include <stdio.h>
#include <stdlib.h>
struct Aluno
{
int matricula;
int *nota;
};
void cadastraAluno(struct Aluno* cadastro, int aluno)
{
printf("\nAluno(%d)\n- Informe a matricula: ", aluno + 1);
scanf("%d", &cadastro[aluno].matricula);
}
void cadastraNotas(struct Aluno* cadastro, int aluno, int *qtdNotas)
{
printf("- Informe a quantidade de notas para cadastrar: ");
scanf("%d", &qtdNotas[aluno]);
cadastro[aluno].nota = malloc(qtdNotas[aluno] * sizeof(struct Aluno));
for(int i = 0; i < qtdNotas[aluno]; i++)
{
printf("- Informe a nota %d: ", i + 1);
scanf("%d", &cadastro[aluno].nota[i]);
}
}
void verificaNotas(struct Aluno* cadastro, int alunosTotal, int *maiorNt, int *menorNt, int *qtdNotas)
{
for(int i = 0; i < alunosTotal; i++)
{
for(int j = 0; j < qtdNotas[i]; j++)
{
if(cadastro[i].nota[j] > *maiorNt)
{
*maiorNt = cadastro[i].nota[j];
}
if(cadastro[i].nota[j] < *menorNt)
{
*menorNt = cadastro[i].nota[j];
}
}
}
}
void mediaNotas(struct Aluno* cadastro, int alunosTotal, int *qtdNotas, float *media)
{
float somaNotas = 0, somaTotal = 0, qtdNt = 0;
for(int i = 0; i < alunosTotal; i++)
{
printf("\n-> Aluno(%d)\nMatricula %d", i + 1, cadastro[i].matricula);
somaNotas = 0;
for(int j = 0; j < qtdNotas[i]; j++)
{
printf("\nNota %d: %d", j + 1, cadastro[i].nota[j]);
somaNotas = somaNotas + cadastro[i].nota[j];
qtdNt++;
}
somaTotal = somaNotas + somaTotal;
printf("\n");
}
*media = somaTotal / qtdNt;
}
void imprimirInfo(float media, int maiorNt, int menorNt, int alunos)
{
printf("\n------------------------------\n");
printf("- Total de Alunos: %d\n", alunos);
printf("- Menor Nota: %d\n", menorNt);
printf("- Maior Nota: %d\n", maiorNt);
printf("- Media Geral: %.0f", media);
printf("\n------------------------------\n");
}
int main()
{
int alunos = 0, op, maiorNota = 0, menorNota = 10, aux = 0, alunosTot = 0, pos = 0, *qtdNotas, *qtdNotas1;
struct Aluno *cadastro;
struct Aluno *cadastro1;
float mediaTotal;
do
{
printf("\nEscolha uma opcao abaixo:");
printf("\n0 - Encerrar o Programa\n");
printf("1 - Cadastrar Aluno\n");
printf("2 - Calcular Media da Turma\n");
scanf("%d", &op);
switch (op)
{
case 1:
printf("Informe o numero de alunos: ");
scanf("%d", &alunos);
if (aux == 0)
{
qtdNotas = (int*) malloc(alunos * sizeof(int));
cadastro = (struct Aluno*) malloc(alunos * sizeof(struct Aluno));
}
else
{
qtdNotas1 = (int*) realloc(qtdNotas, alunos * sizeof(int));
cadastro1 = (struct Aluno*) realloc(cadastro, alunos * sizeof(struct Aluno));
if (qtdNotas1 != NULL)
{
qtdNotas = qtdNotas1;
}
if (cadastro1 != NULL)
{
cadastro = cadastro1;
}
}
for(int i = 0; i < alunos; i++)
{
cadastraAluno(cadastro, pos);
cadastraNotas(cadastro, pos, qtdNotas);
pos++;
}
aux++;
alunosTot += alunos;
break;
case 2:
if(alunos == 0)
{
printf("\nVoce precisa cadastrar um ou mais alunos\n\n");
}
else
{
printf("\n------------------------------");
verificaNotas(cadastro, alunosTot, &maiorNota, &menorNota, qtdNotas);
mediaNotas(cadastro, alunosTot, qtdNotas, &mediaTotal);
imprimirInfo(mediaTotal, maiorNota, menorNota, alunosTot);
}
break;
}
}
while(op != 0);
free(cadastro);
free(qtdNotas);
return 0;
}
If
nota
is a pointer to int what the sense of doing:cadastro[aluno].nota = malloc(qtdNotas[aluno] * sizeof(struct Aluno));
? Why do you make onerealloc
but assigns a different pointer?– anonimo
The meaning of malloc would be to register more than one grade, because for each student can see one or more grades. This is asked in the system to each student who is registered. The realloc pointing to another pointer would be to avoid losing data from the first pointer in case of error.
– DevDnl
But why multiply by
sizeof(struct Aluno)
?– anonimo
I get it, the correct would be sizeof(int), would that be it? Because note is type int.
– DevDnl