Boa tarde pessoal, poderiam me ajudar? Por que o programa não está conseguindo mostrar a matrícula, nome, e media do aluno?
Aqui o code: http://pastebin.com/1Y8m1uj3
Boa tarde pessoal, poderiam me ajudar? Por que o programa não está conseguindo mostrar a matrícula, nome, e media do aluno?
Aqui o code: http://pastebin.com/1Y8m1uj3
Na linha 98, você passa por referência a variável nAluno (quantidade de alunos) da Struct tDisciplina chamada pc1 dentro da função preencherDisciplina.
Dentro desta função, você cria uma outra Struct tDisciplina chamada d1 e usa um loop com o tamanho igual a pc1.nAluno. No loop, você chama a função que preenche d1 com uma quantidade de alunos igual pc1.nAluno. No final dessa função, ela está retornando a Struct tDisciplina d1.
Note que na linha 98, o valor retornado da função preencherDisciplina não é armazenado em lugar nenhum. pc1 ainda continua vazio. Este foi um dos seus erros no código. Você poderia ter resolvido com:
pc1 = preencheDisciplina(&pc1.nAlunos);
Mas, ainda assim, não estaria bom. Outro erro é que a função preencherDisciplina armazena os alunos em uma outra Struct. Essa sua função poderia receber como parâmetro uma Struct tDisciplina e armazenar os input referente aos alunos diretamente nela.
void preencheDisciplina(tDisciplina &d1)
{
for(int i = 0; i < d1.nAlunos; i++){
d1.aluno[i] = preencheAluno1();
}
}
int main(){
setlocale(LC_ALL, "Portuguese");
tDisciplina pc1;
printf("Digite a quantidade de alunos: ");
scanf("%d", &pc1.nAlunos);
while(pc1.nAlunos > 50)
{
printf("Número de alunos ultrapassado! Por favor digite no máx 50 alunos: ");
scanf("%d", &pc1.nAlunos);
}
preencheDisciplina(pc1);
mostraDisciplina(pc1);
return 0;
}
Tome ciência também no uso de passagem por referência em funções void. Facilita bastante para não ficarmos perdidos com tantas variáveis e você ganha em performance. Visto que não precisa criar uma nova variável e nem precisará realizar uma cópia depois. Veja o exemplo a seguir:
pc1 = preencheDisciplina(&pc1.nAlunos);
tDisciplina preencheDisciplina(int numAlunos)
{
tDisciplina d1;
int i;
for(i = 0; i < numAlunos; i++){
d1.aluno[i] = preencheAluno1();
}
return d1;
}
Seu código acabou criando mais uma variável e, após o retorno da Struct, ainda teve que trabalhar realizando uma cópia. Você poderia evitar isso.
Não procurei outros erros no seu código. Se ainda assim houver erros, volte a comentar aqui que eu e outros usuários iremos te ajudar.
Um outro erro muito importante que eu esqueci de comentar é que você tem uma função que recebe um inteiro.
tDisciplina preencheDisciplina(int numAlunos) // Espera receber "int";
E você está passando a referência de uma variável inteiro.
preencheDisciplina(&pc1.nAlunos); // Está recebendo "int*";
Atenção a isso, pois ele vai acabar transformando “int*” num “int” com um tamanho enorme (6536678 - ocorreu aqui).