
Gabriel_PDS
Membro Júnior-
Posts
1 -
Cadastrado em
-
Última visita
Reputação
1-
C Resultado do Exercício diário de classe sempre diverge do esperado
Gabriel_PDS postou um tópico em C/C#/C++
Boa noite, pessoal. Estou realizando um trabalho em C, porém estou tendo muitas dificuldades em entender o que fiz de errado, pois sempre que testo meu programa, a saída diverge do esperado. O problema é o seguinte: O Diário de Classe é uma ferramenta utilizada por professores de diversas instituições de ensino, como os da própria UFMG, para manter o controle sobre as informações dos alunos matriculados em suas disciplinas. Este trabalho prático consiste na implementação de um sistema baseado em funcionalidades que podem estar disponíveis em um diário de classe eletrônico, a ser realizada por meio de código escrito na linguagem C. Seu objetivo é treinar, por meio da aplicação práticas, os conceitos de criação de funções, manipulação de arquivos com extensão TXT e uso de registradores vistos em sala. Leia este arquivo até o final para não perder informações importantes! Na nossa adaptação você deverá implementar as seguintes operações, que serão descritas de forma mais detalhada a seguir: 1. Exibir informações do professor 2. Exibir informações de um aluno 3. Inserir um aluno em uma turma 4. Lançar as notas de um aluno 5. Exibir informações de uma turma 6. Exibir a situação dos alunos de uma turma 7. Exportar os dados armazenados no sistema Seu programa sempre será executado passando dois argumentos pela linha de comando. O primeiro será o arquivo TXT com as informações iniciais sobre o professor, suas turmas e os alunos já matriculados em cada turma. Já o segundo será também um arquivo TXT em que deverão ser escritos os dados do professor, turmas e alunos ao solicitar a opção de exportação (7). Em outras palavras, o primeiro argumento é o arquivo de entrada e o segundo argumento é o arquivo de saída. Exemplo de execução: ./tp2 input.txt output.txt O arquivo de entrada preencherá a maioria das informações do professor. Um professor possui um nome com até 100 caracteres, um número de registro que consiste em um inteiro N >= 1 e pelo menos 1 turma, sendo que pode ter no máximo 2 turmas. Uma turma possui um código com até 10 caracteres, um nome com até 100 caracteres e uma lista de alunos, sendo que cada turma terá pelo menos 1 aluno e no máximo 6 alunos. Um aluno possui um nome com até 100 caracteres, um número de matrícula M que consiste em um inteiro M >= 1 e as notas de suas avaliações, sendo que cada aluno realiza exatamente 3 avaliações. Segue o exemplo de um arquivo de entrada: Albert Einstein 1801 2 ESTRUTURAS DE DADOS I ED I ALGORITMOS I ALG I 4 Igor Vinicius 2401 Joaquim Silva 2402 Vitor Santos Silva Andrade 2403 Luciano Neves 2404 3 Andrezinho 2405 Matheus Pereira 2406 Joao Silva 2407 A primeira linha do arquivo de entrada representa o nome do professor e a segunda linha representa seu código de registro. A seguir, há um inteiro N (1 <= N <= 2) que representa a quantidade de turmas desse professor. As próximas 2* N linhas representam, respectivamente, o nome da disciplina e o código da disciplina. Finalmente, para cada disciplina, haverá um inteiro M (1 <= M <= 6) que representa a quantidade de alunos matriculados na disciplina, sendo que a ordem das disciplinas é a mesma ordem dos alunos matriculados. No exemplo acima, os quatro primeiros alunos pertencem à disciplina de Estruturas de Dados I, enquanto os 3 últimos pertencem à disciplina Algoritmos I. Para cada disciplina, seguirão 2 * M linhas, em que a primeira linha representa o nome do aluno e a segunda o número de matrícula do aluno. Após abrir o arquivo de entrada, ler e armazenar os dados, seu programa deve imprimir o seguinte menu: 1 - informações do Professor 2 - informações do Aluno 3 - Inserir Aluno 4 - Lancar Notas 5 - informações da Turma 6 - Situacao dos Alunos 7 - Exportar Dados Ele deve então ler e tratar a opção fornecida pelo usuário. Caso seja escolhida uma das operações entre a 1 e a 6, seu programa deve aguardar uma nova instrução após finalizar a operação atual. O programa encerra-se somente após o usuário escolher a operação 7 e ela terminar de executar. Operação escolhida: 1 Entrada fornecida: nenhuma Saída esperada: Professor xxxxxx Registro numero xxxxxx Para cada turma: Turma COD - NOME, x alunos (x é a quantidade de alunos) Operação escolhida: 2 Entrada fornecida: matrícula do aluno desejado código da turma do aluno Saída esperada: Aluno: xxxxxxx Matricula: xxxxxxxx Prova 1: x1 / Prova 2: x2 / Prova 3: x3 Nota Final: xg - Conceito X (ver cálculo de nota final e do conceito abaixo) Operação escolhida: 3 Entrada fornecida: nome do aluno matrícula do aluno código da turma em que ele entrará Saída esperada: nenhuma (o aluno deve ser inserido na turma correta com os dados informados.) Operação escolhida: 4 Entrada fornecida: matrícula do aluno código da turma em que ele está nota da prova 1 nota da prova 2 nota da prova 3 Saída esperada: nenhuma (o aluno deve ter as notas das respectivas avaliações registradas corretamente.) Operação escolhida: 5 Entrada fornecida: código da turma desejada Saída esperada: informações da turma COD - NOME x alunos Para cada aluno na turma: Aluno: xxxxxxx Matricula: xxxxxxx Operação escolhida: 6 Entrada fornecida: código da turma desejada Saída esperada: Situacao na Turma COD - NOME Para cada aluno: Aluno: xxxxxxxxx Matricula: xxxxxxx Nota Final: x - Conceito X Situacao: xxxxx (ver as situações abaixo) Operação escolhida: 7 Entrada fornecida: nenhuma. Saída esperada: Ver saída esperada abaixo. Deve ser escrita no arquivo de saída, definido pelo argumento de execução do programa. Modelo de Saída Esperada para a Operação 7 (Exportar Dados) DADOS EXPORTADOS Professor xxxxxx - Registro xxxxxx Para cada turma Turma COD - NOME Para cada aluno na turma: Aluno: xxxxxxxx Matricula: xxxxxxxx Nota Final: x - Conceito X - SITUACAO (caso haja mais de uma turma, dê um espaço entre a nota final do último aluno da primeira turma e as informações da próxima turma) Informações Importantes: seu programa deve, obrigatoriamente, implementar pelo menos 7 funções, uma para tratar cada operação escolhida. Você é livre para implementar quaisquer outras funções adicionais que julgar necessárias; a utilização de registradores (estruturas) no programa será levada em conta (positivamente) na avaliação dos trabalhos; todos os alunos, inclusive os inseridos manualmente, iniciam com 0 em todas as avaliações; a nota de cada avaliação será um valor inteiro, bem como a nota final deverá ser um inteiro; a nota final é dada pela média das avaliações. Cada avaliação receberá uma nota que N, tal que 0 <= N <= 100; o conceito de um aluno é representado por um caractere e seguirá a disposição adotada pela UFMG: CONCEITO: “A” para notas de 90 a 100 pontos – situação: “Aprovado” CONCEITO: “B” para notas de 80 a 89 pontos – situação: “Aprovado” CONCEITO: “C” para notas de 70 a 79 pontos – situação: “Aprovado” CONCEITO: “D” para notas de 60 a 69 pontos – situação: “Aprovado” CONCEITO: “E” para notas de 40 a 59 pontos – situação: “Exame Especial” CONCEITO: “F” para notas abaixo de 40 pontos – situação: “Reprovado” A partir disse eu fiz o código abaixo, porém ele não funciona como esperado. #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 numero %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("Matricula: %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 Matricula: %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("Situacao 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 Matricula: %d Nota Final: %d - Conceito %c Situacao: %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("Error opening output file"); 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, "Matricula: %d\n", aluno.matricula); fprintf(outputFile, "Nota Final: %d - Conceito %c - %s\n", notaFinal, conceito, situacao); } if (i < prof->numTurmas - 1) { fprintf(outputFile, "\n"); } } fclose(outputFile); printf("Dados exportados com sucesso.\n"); } int main() { Professor prof; char inputFilename[MAX_NAME_LENGTH]; char outputFilename[MAX_NAME_LENGTH]; printf("Nome do arquivo de entrada: "); scanf("%s", inputFilename); printf("Nome do arquivo de saida: "); scanf("%s", outputFilename); FILE *inputFile = fopen(inputFilename, "r"); if (!inputFile) { perror("Erro ao abrir o arquivo de entrada"); return 1; } fscanf(inputFile, "PROFESSOR %[^\n]\n", prof.nome); fscanf(inputFile, "REGISTRO %d\n", &prof.registro); fscanf(inputFile, "TURMAS %d\n", &prof.numTurmas); for (int i = 0; i < prof.numTurmas; i++) { fscanf(inputFile, "TURMA %[^\n]\n", prof.turmas[i].nome); fscanf(inputFile, "CODIGO %[^\n]\n", prof.turmas[i].codigo); fscanf(inputFile, "ALUNOS %d\n", &prof.turmas[i].numAlunos); for (int j = 0; j < prof.turmas[i].numAlunos; j++) { fscanf(inputFile, "NOME %[^\n]\n", prof.turmas[i].alunos[j].nome); fscanf(inputFile, "MATRICULA %d\n", &prof.turmas[i].alunos[j].matricula); fscanf(inputFile, "PROVA1 %d\n", &prof.turmas[i].alunos[j].notas[0]); fscanf(inputFile, "PROVA2 %d\n", &prof.turmas[i].alunos[j].notas[1]); fscanf(inputFile, "PROVA3 %d\n", &prof.turmas[i].alunos[j].notas[2]); } } fclose(inputFile); int opcao; do { printf("\nMenu:\n"); printf("1. Exibir informações do professor\n"); printf("2. Exibir informações de um aluno\n"); printf("3. Inserir novo aluno\n"); printf("4. Lancar notas de um aluno\n"); printf("5. Exibir informações de uma turma\n"); printf("6. Exibir situacao dos alunos de uma turma\n"); printf("7. Exportar dados\n"); printf("0. Sair\n"); printf("Escolha uma opcao: "); scanf("%d", &opcao); if (opcao == 1) { exibirInformacoesProfessor(&prof); } else if (opcao == 2) { char codigoTurma[MAX_CODE_LENGTH]; int matricula; printf("Codigo da turma: "); scanf("%s", codigoTurma); printf("Matricula do aluno: "); scanf("%d", &matricula); exibirInformacoesAluno(&prof, matricula, codigoTurma); } else if (opcao == 3) { char nome[MAX_NAME_LENGTH]; int matricula; char codigoTurma[MAX_CODE_LENGTH]; printf("Nome do aluno: "); scanf(" %[^\n]", nome); printf("Matricula do aluno: "); scanf("%d", &matricula); printf("Codigo da turma: "); scanf("%s", codigoTurma); inserirAluno(&prof, nome, matricula, codigoTurma); } else if (opcao == 4) { int matricula; char codigoTurma[MAX_CODE_LENGTH]; int nota1, nota2, nota3; printf("Matricula do aluno: "); scanf("%d", &matricula); printf("Codigo da turma: "); scanf("%s", codigoTurma); printf("Nota 1: "); scanf("%d", ¬a1); printf("Nota 2: "); scanf("%d", ¬a2); printf("Nota 3: "); scanf("%d", ¬a3); lancarNotas(&prof, matricula, codigoTurma, nota1, nota2, nota3); } else if (opcao == 5) { char codigoTurma[MAX_CODE_LENGTH]; printf("Codigo da turma: "); scanf("%s", codigoTurma); exibirInformacoesTurma(&prof, codigoTurma); } else if (opcao == 6) { char codigoTurma[MAX_CODE_LENGTH]; printf("Codigo da turma: "); scanf("%s", codigoTurma); exibirSituacaoAlunos(&prof, codigoTurma); } else if (opcao == 7) { exportarDados(&prof, outputFilename); } } while (opcao != 0); return 0; } Agradeço a todos quem puderem me ajudar a corrigi-lo.
Sobre o Clube do Hardware
No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais
Direitos autorais
Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais