Por que meu programa não está funcionando?

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).