Iae, Gabriel.
Vou te apontar alguns detalhes, antes de tudo, segue o código.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LENGTH 100
#define MAX_CODE_LENGTH 10
#define MAX_TURMAS 2
#define MAX_ALUNOS 6
typedef struct {
char nome[MAX_NAME_LENGTH];
int matricula;
int notas[3];
} Aluno;
typedef struct {
char nome[MAX_NAME_LENGTH];
char codigo[MAX_CODE_LENGTH];
int numAlunos;
Aluno alunos[MAX_ALUNOS];
} Turma;
typedef struct {
char nome[MAX_NAME_LENGTH];
int registro;
int numTurmas;
Turma turmas[MAX_TURMAS];
} Professor;
void exibirInformacoesProfessor(Professor *prof) {
printf("Professor: %s\n", prof->nome);
printf("Registro número: %d\n", prof->registro);
for (int i = 0; i < prof->numTurmas; i++) {
printf("Turma %s - %s, %d alunos\n", prof->turmas[i].codigo, prof->turmas[i].nome, prof->turmas[i].numAlunos);
}
}
void exibirInformacoesAluno(Professor *prof, int matricula, char *codigoTurma) {
for (int i = 0; i < prof->numTurmas; i++) {
if (strcmp(prof->turmas[i].codigo, codigoTurma) == 0) {
for (int j = 0; j < prof->turmas[i].numAlunos; j++) {
if (prof->turmas[i].alunos[j].matricula == matricula) {
Aluno aluno = prof->turmas[i].alunos[j];
int notaFinal = (aluno.notas[0] + aluno.notas[1] + aluno.notas[2]) / 3;
char conceito;
if (notaFinal >= 90) {
conceito = 'A';
} else if (notaFinal >= 80) {
conceito = 'B';
} else if (notaFinal >= 70) {
conceito = 'C';
} else if (notaFinal >= 60) {
conceito = 'D';
} else if (notaFinal >= 40) {
conceito = 'E';
} else {
conceito = 'F';
}
printf("Aluno: %s\n", aluno.nome);
printf("Matrícula: %d\n", aluno.matricula);
printf("Prova 1: %d / Prova 2: %d / Prova 3: %d\n", aluno.notas[0], aluno.notas[1], aluno.notas[2]);
printf("Nota Final: %d - Conceito %c\n", notaFinal, conceito);
return;
}
}
}
}
printf("Aluno não encontrado.\n");
}
void inserirAluno(Professor *prof, char *nome, int matricula, char *codigoTurma) {
for (int i = 0; i < prof->numTurmas; i++) {
if (strcmp(prof->turmas[i].codigo, codigoTurma) == 0) {
if (prof->turmas[i].numAlunos < MAX_ALUNOS) {
Aluno novoAluno;
strcpy(novoAluno.nome, nome);
novoAluno.matricula = matricula;
novoAluno.notas[0] = 0;
novoAluno.notas[1] = 0;
novoAluno.notas[2] = 0;
prof->turmas[i].alunos[prof->turmas[i].numAlunos] = novoAluno;
prof->turmas[i].numAlunos++;
printf("Aluno inserido com sucesso.\n");
} else {
printf("Turma cheia.\n");
}
return;
}
}
printf("Turma não encontrada.\n");
}
void lancarNotas(Professor *prof, int matricula, char *codigoTurma, int nota1, int nota2, int nota3) {
for (int i = 0; i < prof->numTurmas; i++) {
if (strcmp(prof->turmas[i].codigo, codigoTurma) == 0) {
for (int j = 0; j < prof->turmas[i].numAlunos; j++) {
if (prof->turmas[i].alunos[j].matricula == matricula) {
prof->turmas[i].alunos[j].notas[0] = nota1;
prof->turmas[i].alunos[j].notas[1] = nota2;
prof->turmas[i].alunos[j].notas[2] = nota3;
printf("Notas lançadas com sucesso.\n");
return;
}
}
}
}
printf("Aluno não encontrado.\n");
}
void exibirInformacoesTurma(Professor *prof, char *codigoTurma) {
for (int i = 0; i < prof->numTurmas; i++) {
if (strcmp(prof->turmas[i].codigo, codigoTurma) == 0) {
Turma turma = prof->turmas[i];
printf("Informações da turma %s - %s\n", turma.codigo, turma.nome);
printf("%d alunos\n", turma.numAlunos);
for (int j = 0; j < turma.numAlunos; j++) {
printf("Aluno: %s Matrícula: %d\n", turma.alunos[j].nome, turma.alunos[j].matricula);
}
return;
}
}
printf("Turma não encontrada.\n");
}
void exibirSituacaoAlunos(Professor *prof, char *codigoTurma) {
for (int i = 0; i < prof->numTurmas; i++) {
if (strcmp(prof->turmas[i].codigo, codigoTurma) == 0) {
Turma turma = prof->turmas[i];
printf("Situação na Turma %s - %s\n", turma.codigo, turma.nome);
for (int j = 0; j < turma.numAlunos; j++) {
Aluno aluno = turma.alunos[j];
int notaFinal = (aluno.notas[0] + aluno.notas[1] + aluno.notas[2]) / 3;
char conceito;
char situacao[20];
if (notaFinal >= 90) {
conceito = 'A';
strcpy(situacao, "Aprovado");
} else if (notaFinal >= 80) {
conceito = 'B';
strcpy(situacao, "Aprovado");
} else if (notaFinal >= 70) {
conceito = 'C';
strcpy(situacao, "Aprovado");
} else if (notaFinal >= 60) {
conceito = 'D';
strcpy(situacao, "Aprovado");
} else if (notaFinal >= 40) {
conceito = 'E';
strcpy(situacao, "Exame Especial");
} else {
conceito = 'F';
strcpy(situacao, "Reprovado");
}
printf("Aluno: %s Matrícula: %d Nota Final: %d - Conceito %c Situação: %s\n", aluno.nome, aluno.matricula, notaFinal, conceito, situacao);
}
return;
}
}
printf("Turma não encontrada.\n");
}
void exportarDados(Professor *prof, char *outputFilename) {
FILE *outputFile = fopen(outputFilename, "w");
if (!outputFile) {
perror("Erro ao abrir o arquivo de saída");
return;
}
fprintf(outputFile, "DADOS EXPORTADOS\n");
fprintf(outputFile, "Professor %s - Registro %d\n", prof->nome, prof->registro);
for (int i = 0; i < prof->numTurmas; i++) {
Turma turma = prof->turmas[i];
fprintf(outputFile, "Turma %s - %s\n", turma.codigo, turma.nome);
for (int j = 0; j < turma.numAlunos; j++) {
Aluno aluno = turma.alunos[j];
int notaFinal = (aluno.notas[0] + aluno.notas[1] + aluno.notas[2]) / 3;
char conceito;
char situacao[20];
if (notaFinal >= 90) {
conceito = 'A';
strcpy(situacao, "Aprovado");
} else if (notaFinal >= 80) {
conceito = 'B';
strcpy(situacao, "Aprovado");
} else if (notaFinal >= 70) {
conceito = 'C';
strcpy(situacao, "Aprovado");
} else if (notaFinal >= 60) {
conceito = 'D';
strcpy(situacao, "Aprovado");
} else if (notaFinal >= 40) {
conceito = 'E';
strcpy(situacao, "Exame Especial");
} else {
conceito = 'F';
strcpy(situacao, "Reprovado");
}
fprintf(outputFile, "Aluno: %s\n", aluno.nome);
fprintf(outputFile, "Matrícula: %d\n", aluno.matricula);
fprintf(outputFile, "Notas: %d %d %d\n", aluno.notas[0], aluno.notas[1], aluno.notas[2]);
fprintf(outputFile, "Nota Final: %d - Conceito %c\n", notaFinal, conceito);
fprintf(outputFile, "Situação: %s\n\n", situacao);
}
}
fclose(outputFile);
printf("Dados exportados com sucesso.\n");
}
void carregarDados(Professor *prof, char *inputFilename) {
FILE *inputFile = fopen(inputFilename, "r");
if (!inputFile) {
perror("Erro ao abrir o arquivo de entrada");
return;
}
// Adicione a lógica para carregar os dados do arquivo conforme necessário
fclose(inputFile);
printf("Dados carregados com sucesso.\n");
}
int main() {
Professor prof;
strcpy(prof.nome, "Rodrigo");
prof.registro = 1234;
prof.numTurmas = 2;
Turma turma1;
strcpy(turma1.nome, "Matematica");
strcpy(turma1.codigo, "MAT101");
turma1.numAlunos = 0;
Turma turma2;
strcpy(turma2.nome, "Portugues");
strcpy(turma2.codigo, "POR202");
turma2.numAlunos = 0;
prof.turmas[0] = turma1;
prof.turmas[1] = turma2;
exibirInformacoesProfessor(&prof);
inserirAluno(&prof, "Aluno1", 1001, "MAT101");
inserirAluno(&prof, "Aluno2", 1002, "MAT101");
inserirAluno(&prof, "Aluno3", 1003, "POR202");
exibirInformacoesTurma(&prof, "MAT101");
exibirInformacoesTurma(&prof, "POR202");
lancarNotas(&prof, 1001, "MAT101", 85, 90, 88);
lancarNotas(&prof, 1002, "MAT101", 75, 80, 78);
lancarNotas(&prof, 1003, "POR202", 65, 70, 68);
exibirInformacoesAluno(&prof, 1001, "MAT101");
exibirInformacoesAluno(&prof, 1003, "POR202");
exibirSituacaoAlunos(&prof, "MAT101");
exibirSituacaoAlunos(&prof, "POR202");
exportarDados(&prof, "dados.txt");
return 0;
}
Algumas funções não estavam corretamente declaradas antes de serem usadas no main ou em outras funções.
As funções inserirAluno, lancarNotas e outras não verificavam os limites de alunos por turma ou a existência de turmas e alunos.
Correção: Adicionei verificações para garantir que não se ultrapassem os limites de alunos e que as turmas/alunos existam antes de tentar acessá-los ou modificá-los.
O uso de strcpy para copiar strings não estava sendo realizado corretamente, especialmente na função inserirAluno.
Correção: Ajustei o uso de strcpy para copiar as strings primeiro para uma variável temporária e depois inseri-las na estrutura de dados correta.
O cálculo da nota final e a determinação do conceito estavam corretos, mas não estavam sendo utilizados adequadamente nas funções exibirInformacoesAluno e exibirSituacaoAlunos.
Correção: Ajustei as funções para utilizar e exibir corretamente essas informações.
A função exportarDados não estava implementada corretamente e não verificava a abertura do arquivo de saída.
Correção: Implementei a lógica completa para abrir o arquivo, verificar erros e escrever as informações estruturadas dos professores, turmas e alunos no arquivo de saída.
Algumas funções estavam com a lógica mal estruturada ou faltando, como a necessidade de retornar mensagens apropriadas caso um aluno ou turma não fossem encontrados.
Correção: Adicionei mensagens de erro apropriadas e reestruturei a lógica das funções para melhor clareza e funcionalidade.
Espero que de tudo certo, abraços.