Enviado em 15/12/2018 - 18:30h
Pessoal sou iniciante em programação cometi um erro grave ao fazer um trabalho para aula, criei um programa para cadastrar alunos de uma sala e declarei as notas como inteiro (int) e na verdade era pra ser float, tem alguma forma de corrigir isso ?#include <stdio.h>
#include <stdlib.h> // Biblioteca padrão par ausar os comandos exit e system("cls")
#include <stdbool.h> // Biblioteca para utilizar o tipo bool (True e False)
#include <string.h> // Biblioteca para manutenção de strings
#include <locale.h> // Biblioteca necessária para usar setlocale
#define TAM_MAX 40 // Tamanha máximo de estudantes
typedef struct
{
char nome[50];
char matricula[11];
char materia[15];
int notas[4];
int faltas;
int notafinal;
char situacao;
} Estudantes; // guarda os dados dos estudantes
void zeraEstudantes(Estudantes estudante[]){
for (int i = 0; i < TAM_MAX; i++){
for(int j = 0; j < 50; j++)
estudante[i].nome[j] = '\0';
for(int j = 0; j < 11; j++){
estudante[i].matricula[j] = '\0';
estudante[i].materia[j] = '\0';
}for(int j = 0; j < 4; j++)
estudante[i].notas[j] = 0;
estudante[i].faltas = 0;
estudante[i].notafinal = 0;
estudante[i].situacao = '\0';
}
return;
}
void lerTurmaExistente(Estudantes estudante[], char nomeArquivo[], int *estLidos){
char nomeArquivoTemp[] = "\0"; // nome temporario do arquivo
char buf[50] = {'\0'}; // temporário para o nome dos estudantes
FILE *fp = NULL;
printf("\nDigite o nome do arquivo com a turma: ");
scanf("%s", nomeArquivoTemp);
system("cls");
fp = fopen(nomeArquivoTemp, "r+");
if (fp != NULL) {
printf("\nArquivo %s lido com sucesso!\n", nomeArquivoTemp);
for (int j = 0; j < 50; ++j)
nomeArquivo[j] = nomeArquivoTemp[j];
zeraEstudantes(estudante);
int i = 0;
while( !feof(fp) && i < TAM_MAX){ // feof testa se chegou no final do arquivo.
memset(buf, '\0', sizeof(buf)); // Zera o buffer.
// Lê o nome para a string temporária buf.
if (fgets(buf, sizeof(buf), fp) == NULL){
fprintf(stderr, "ATENÇÃO, LISTA VAZIA.\n");
//exit(1);
} else {
// Retira o \n do final da string lida.
buf[strcspn(buf, "\n")] = '\0';
// Copia de buf para o campo nome do i-esimo estudante
strcpy(estudante[i].nome, buf);
}
fscanf(fp, "%s\n", estudante[i].matricula);
fscanf(fp, "%s\n", estudante[i].materia);
for(int j = 0; j < 4; j++)
fscanf(fp, "%d\n", &estudante[i].notas[j]);
fscanf(fp, "%d\n", &estudante[i].faltas);
fscanf(fp, "%d\n", &estudante[i].notafinal);
fscanf(fp, "%c\n", &estudante[i].situacao);
i++;
*estLidos = i;
}
fclose(fp);
}else{
printf("Arquivo %s nao existe!\n", nomeArquivoTemp);
return;
}
return;
}
void criarTurma(char nomeArquivo[]){
char opcao;
FILE *fp = NULL;
char nomeArquivoTemp[50];
printf("\nDigite o nome do arquivo para a nova turma: ");
scanf("%s", nomeArquivoTemp);
system("cls");
fp = fopen(nomeArquivoTemp, "r");
if (fp == NULL){
//fclose(fp);
for (int i = 0; i < 50; ++i)
{
nomeArquivo[i] = nomeArquivoTemp[i];
}
fp = fopen(nomeArquivo, "w");
fprintf(stderr, "\nArquivo %s criado com sucesso!\n", nomeArquivo);
fclose(fp);
}else{
printf("Arquivo %s já existe. Deseja sobrescrevê-lo? (S/N) ", nomeArquivoTemp);
getchar();
scanf("%c", &opcao);
system("cls");
if (opcao == 'S'){
for (int i = 0; i < 50; ++i)
nomeArquivo[i] = nomeArquivoTemp[i];
fp = fopen(nomeArquivo, "w+");
fprintf(stderr, "Arquivo %s criado com sucesso!\n\n", nomeArquivoTemp);
fclose(fp);
}else if (opcao == 'N'){
return;
}else{
printf("Opção Inválida!\nDigite novamente: ");
getchar();
scanf("%c", &opcao);
}
}
return;
}
int lerTurma(Estudantes estudante[], char nomeArquivo[], int *estLidos){
int opcao = 0;
printf("\n#########################################\n");
printf(" Ler Turma\n");
printf("#########################################\n\n");
printf("Opções: \n\n");
printf("1 - Ler turma existente.\n");
printf("2 - Criar nova turma.\n");
printf("3 - Voltar ao menu principal.\n\n");
printf("Digite uma opção: ");
scanf("%d", &opcao);
system("cls");
while(opcao < 1 || opcao > 3){
printf("Opção Inválida!\nDigite novamente:\t");
scanf("%d", &opcao);
system("cls");
}
switch(opcao){
case 1:
lerTurmaExistente(estudante, nomeArquivo, estLidos);
break;
case 2:
criarTurma(nomeArquivo);
break;
default:
break;
}
return opcao;
}
void imprimirEstudantes(Estudantes estudante[], char nomeArquivo[], int *estLidos){
if (*estLidos == 0 || nomeArquivo[0] == '\0'){
if(nomeArquivo[0] == '\0'){
printf("\nNão há turma carregada!\n");
}else{
printf("\nSua lista está vazia!\n");
}
} else {
for(int i = 0; i < *estLidos; i++){
printf("\n##############################################################\n");
printf(" Estudante %d\n", i+1);
printf("##############################################################\n\n");
printf("Nome: %s\n", estudante[i].nome);
printf("Matrícula: %s\n", estudante[i].matricula);
printf("Matéria: %s\n", estudante[i].materia);
for(int j = 0; j < 4; j++){
printf("%d° Bimestre: %d\n", j+1, estudante[i].notas[j]); }
printf("Faltas: %d\n", estudante[i].faltas);
printf("Final: %d\n", estudante[i].notafinal);
printf("Situação: %c\n", estudante[i].situacao);
printf("\n##############################################################\n\n");
}
}
return;
}
void criaEstudante(Estudantes estudante[], int *estLidos){
printf("Digite a matrícula: ");
scanf("%s", estudante[*estLidos].matricula);
printf("Digite a matéria: ");
scanf("%s", estudante[*estLidos].materia);
printf("Digite as quatro notas bimestrais : ");
scanf("%d %d %d %d", &estudante[*estLidos].notas[0],
&estudante[*estLidos].notas[1],
&estudante[*estLidos].notas[2],
&estudante[*estLidos].notas[3]);
printf("Digite o número de faltas: ");
scanf("%d", &estudante[*estLidos].faltas);
estudante[*estLidos].notafinal = estudante[*estLidos].notas[0] +
estudante[*estLidos].notas[1] + estudante[*estLidos].notas[2] +
estudante[*estLidos].notas[3];
printf("Nota final calculada: %d\n", estudante[*estLidos].notafinal);
if(estudante[*estLidos].faltas > 50){
estudante[*estLidos].situacao = 'F';
printf("Situação final: Reprovado por Faltas\n");
}else if(estudante[*estLidos].notafinal < 60 && estudante[*estLidos].faltas <= 50){
estudante[*estLidos].situacao = 'R';
printf("Situação final: Reprovado\n");
}else if(estudante[*estLidos].notafinal > 60 && estudante[*estLidos].faltas <= 50){
estudante[*estLidos].situacao = 'A';
printf("Situação final: Aprovado\n");
}
return;
}
void cadastrarEstudante(Estudantes estudante[], char nomeArquivo[], int *estLidos){
if (estudante[(*estLidos)-1].nome[0] == '\0') {
*estLidos -= 1;
}
if (nomeArquivo[0] == '\0'){
printf("Nao há turma carregada!\n");
} else {
printf("\n#########################################\n");
printf(" Cadastrar Novo Estudante\n");
printf("#########################################\n\n");
printf("Digite o nome: ");
getchar();
if (fgets(estudante[*estLidos].nome, sizeof(estudante[*estLidos].nome), stdin) == NULL){
fprintf(stderr, "Erro ao ler o nome\n");
} else {
// retira o \n do final da string lida
estudante[*estLidos].nome[strcspn(estudante[*estLidos].nome, "\n")] = 0;
} // else
criaEstudante(estudante, estLidos);
*estLidos += 1;
}
return;
}
void calculaNota(Estudantes estudante[], int pos){
estudante[pos].notafinal = estudante[pos].notas[0] +
estudante[pos].notas[1] + estudante[pos].notas[2] + estudante[pos].notas[3];
if(estudante[pos].faltas > 50){
estudante[pos].situacao = 'F';
}else if(estudante[pos].notafinal < 60 && estudante[pos].faltas <= 50){
estudante[pos].situacao = 'R';
}else if(estudante[pos].notafinal > 60 && estudante[pos].faltas <= 50){
estudante[pos].situacao = 'A';
}
return;
}
void menuAlteraEstudante(Estudantes estudante[], int pos){
printf("\n#########################################\n");
printf(" Editar Informações do Estudante\n");
printf("#########################################\n");
printf("\nNome do estudante: %s\n\n", estudante[pos].nome);
printf("Opções: \n\n\n");
printf("1 - Alterar nome.\n");
printf("2 - Alterar matrícula.\n");
printf("3 - Alterar matéria.\n");
printf("4 - Alterar nota do 1° Bimestre.\n");
printf("5 - Alterar nota do 2° Bimestre.\n");
printf("6 - Alterar nota do 3° Bimestre.\n");
printf("7 - Alterar nota do 4° Bimestre.\n");
printf("8 - Alterar numero de faltas.\n");
printf("9 - Voltar ao menu anterior.\n");
printf("\nDigite uma opção: ");
return;
}
int alteraEstudante(Estudantes estudante[], int pos){
int opcao = 0;
menuAlteraEstudante(estudante, pos);
scanf("%d", &opcao);
system("cls");
while(opcao < 1 || opcao > 9){
printf("Opção Inválida!\nDigite novamente: ");
scanf("%d", &opcao);
system("cls");
}
switch(opcao){
case 1:
printf("Digite o nome: ");
getchar();
if (fgets(estudante[pos].nome, sizeof(estudante[pos].nome), stdin) == NULL){
fprintf(stderr, "Erro ao ler o nome\n");
} else {
// retira o \n do final da string lida
estudante[pos].nome[strcspn(estudante[pos].nome, "\n")] = 0;
} // else
break;
case 2:
printf("Digite a matricula: ");
scanf("%s", estudante[pos].matricula);
break;
case 3:
printf("Digite a matéria: ");
scanf("%s", estudante[pos].materia);
break;
case 4:
printf("Digite a nota do 1° Bimestre: ");
scanf("%d", &estudante[pos].notas[0]);
calculaNota(estudante, pos);
break;
case 5:
printf("Digite a nota do 2° Bimestre: ");
scanf("%d", &estudante[pos].notas[1]);
calculaNota(estudante, pos);
break;
case 6:
printf("Digite a nota do 3° Bimestre: ");
scanf("%d", &estudante[pos].notas[2]);
calculaNota(estudante, pos);
case 7:
printf("Digite a nota do 4° Bimestre: ");
scanf("%d", &estudante[pos].notas[3]);
calculaNota(estudante, pos);
break;
case 8:
printf("Digite o número de faltas: ");
scanf("%d", &estudante[pos].faltas);
calculaNota(estudante, pos);
break;
default:
break;
}
return 9;
}
bool buscaMatricula(Estudantes estudante[], int *tam, char alvo[], int *pos){
int i = 0; // indice do arranjo
bool encontrado = false;
i = 0;
while (i < *tam && strcmp(alvo, estudante[i].matricula) != 0)
i++;
*pos = i;
if(strcmp(alvo, estudante[i].matricula) == 0)
encontrado = true;
return encontrado;
}
void selecionarPorMatricula(Estudantes estudante[], int *estLidos){
int opcao = 0;
char mat[11] = {'\0'};
printf("\nDigite o número de matrícula: ");
scanf("%s", mat);
system("cls");
int i = 0;
int pos = 0;
if(buscaMatricula(estudante, estLidos, mat, &pos)){
while(opcao != 9){
opcao = alteraEstudante(estudante, pos);
}
}
else{
printf("Numero de matrícula inválido!\n");
}
return;
}
bool buscaNome(Estudantes estudante[], int *tam, char alvo[], int *pos){
int i = 0; // indice do arranjo
bool encontrado = false;
i = 0;
while (i < *tam && strcmp(alvo, estudante[i].nome) != 0)
i++;
*pos = i;
if(strcmp(alvo, estudante[i].nome) == 0)
encontrado = true;
return encontrado;
}
void selecionarPorNome(Estudantes estudante[], int *estLidos){
int opcao = 0;
char nome[50] = {'\0'};
printf("\nDigite o nome do estudante: ");
getchar();
if (fgets(nome, sizeof(nome), stdin) == NULL){
fprintf(stderr, "Erro ao ler o nome\n");
} else {
// retira o \n do final da string lida
nome[strcspn(nome, "\n")] = 0;
} // else
int i = 0;
int pos = 0;
if(buscaNome(estudante, estLidos, nome, &pos)){
while(opcao != 9){
opcao = alteraEstudante(estudante, pos);
}
}else{
printf("Nome inválido!\n");
}
return;
}
void menuEditaEstudante(void){
printf("\n#########################################\n");
printf(" Editar Informações do Estudante\n");
printf("#########################################\n\n");
printf("Opções: \n\n");
printf("1 - Selecionar por número de matrícula.\n");
printf("2 - Selecionar por nome.\n");
printf("3 - Voltar ao menu principal.\n");
printf("\nDigite uma opção: ");
return;
}
int editarEstudante(Estudantes estudante[], char nomeArquivo[], int *estLidos){
int opcao = 0;
int opcao2 = 0;
int opcao3 = 0;
if (estudante[0].nome[0] == '\0'){
printf("Nao há turma carregada!\n");
opcao = 3;
} else {
menuEditaEstudante();
scanf("%d", &opcao);
system("cls");
while(opcao < 1 || opcao > 3){
printf("Opcão Inválida!\nDigite novamente: ");
scanf("%d", &opcao);
system("cls");
}
switch(opcao){
case 1:
selecionarPorMatricula(estudante, estLidos);
break;
case 2:
selecionarPorNome(estudante, estLidos);
break;
default:
break;
}
}
return opcao;
}
void relerTurma(Estudantes estudante[], char nomeArquivo[], int *estLidos){
char buf[50] = {'\0'}; // temporário para o nome dos estudantes
FILE *fp = NULL;
fp = fopen(nomeArquivo, "r");
if (fp != NULL) {
printf("Arquivo %s lido com sucesso!\n", nomeArquivo);
zeraEstudantes(estudante);
int i = 0;
while( !feof(fp) && i < TAM_MAX){ // feof testa se chegou no final do arquivo.
memset(buf, '\0', sizeof(buf)); // Zera o buffer.
// Lê o nome para a string temporária buf.
if (fgets(buf, sizeof(buf), fp) == NULL){
fprintf(stderr, "ATENÇÃO, LISTA VAZIA.\n");
//exit(1);
} else {
// Retira o \n do final da string lida.
buf[strcspn(buf, "\n")] = '\0';
// Copia de buf para o campo nome do i-esimo estudante
strcpy(estudante[i].nome, buf);
}
fscanf(fp, "%s\n", estudante[i].matricula);
fscanf(fp, "%s\n", estudante[i].materia);
for(int j = 0; j < 3; j++)
fscanf(fp, "%d\n", &estudante[i].notas[j]);
fscanf(fp, "%d\n", &estudante[i].faltas);
fscanf(fp, "%d\n", &estudante[i].notafinal);
fscanf(fp, "%c\n", &estudante[i].situacao);
i++;
*estLidos = i;
}
fclose(fp);
}else{
printf("Arquivo %s não existe!\n", nomeArquivo);
}
return;
}
void salvarSair(Estudantes estudante[], char nomeArquivo[], int *estLidos){
if (nomeArquivo[0] == '\0'){
char op;
char nome[50] = {'\0'};
printf("O arquivo não existe. Deseja criar um novo? (S/N): ");
getchar();
scanf("%c",&op);
system("cls");
if(op == 'S' || op == 's'){
FILE *fp = NULL;
printf("Digite o nome do arquivo: ");
scanf("%s", nome);
system("cls");
fp = fopen(nome, "w");
for(int i = 0; i < *estLidos; i++){
fprintf(fp, "%s\n", estudante[i].nome);
fprintf(fp, "%s\n", estudante[i].matricula);
fprintf(fp, "%s\n", estudante[i].materia);
for(int j = 0; j < 3; j++)
fprintf(fp, "%d\n", estudante[i].notas[j]);
fprintf(fp, "%d\n", estudante[i].faltas);
fprintf(fp, "%d\n", estudante[i].notafinal);
fprintf(fp, "%c\n", estudante[i].situacao);
}
fclose(fp);
printf("Salvo com sucesso\n");
}
else if(op == 'N' || op == 'n')
{
printf("Saindo sem salvar...\n");
return;
}
}
else
{
char op;
printf("O arquivo já existe. Deseja sobrescrevê-lo? (S/N)\n");
getchar();
scanf("%c",&op);
system("cls");
if(op == 'S' || op == 's'){
FILE *fp = NULL;
fp = fopen(nomeArquivo, "w+");
for(int i = 0; i < *estLidos; i++){
fprintf(fp, "%s\n", estudante[i].nome);
fprintf(fp, "%s\n", estudante[i].matricula);
fprintf(fp, "%s\n", estudante[i].materia);
for(int j = 0; j < 3; j++)
fprintf(fp, "%d\n", estudante[i].notas[j]);
fprintf(fp, "%d\n", estudante[i].faltas);
fprintf(fp, "%d\n", estudante[i].notafinal);
fprintf(fp, "%c\n", estudante[i].situacao);
}
fclose(fp);
printf("\nSalvo com sucesso!\n");
}
else if(op == 'N' || op == 'n')
{
printf("Saindo sem salvar...\n");
return;
}
}
return;
}
void exibeMenuPrincipal(void){
printf("\n#########################################\n", setlocale(LC_ALL,""));
printf(" Menu Principal\n");
printf("#########################################\n\n");
printf("Opções: \n\n");
printf("1 - Ler turma de estudantes do arquivo.\n");
printf("2 - Imprimir turma de estudantes.\n");
printf("3 - Cadastrar novo estudante.\n");
printf("4 - Editar informações de um estudante.\n");
printf("5 - Reler turma de estudantes do arquivo.\n");
printf("6 - Salvar e Sair.\n");
printf("7 - Sair sem Salvar.\n\n");
printf("Digite uma opção: ");
return;
}
int menuPrincipal(Estudantes estudante[], char nomeArquivo[], int *estLidos){
int opcao = 0;
int opcao2 = 0;
int opcao3 = 0;
exibeMenuPrincipal();
scanf("%d", &opcao);
system("cls");
while(opcao < 1 || opcao > 7){
printf("Opção Inválida!\nDigite novamente: ");
scanf("%d", &opcao);
system("cls");
}
switch(opcao){
case 1:
while(opcao2 != 3){
opcao2 = lerTurma(estudante, nomeArquivo, estLidos);
}
break;
case 2:
imprimirEstudantes(estudante, nomeArquivo, estLidos);
break;
case 3:
cadastrarEstudante(estudante, nomeArquivo, estLidos);
break;
case 4:
while(opcao3 != 3){
opcao3 = editarEstudante(estudante, nomeArquivo, estLidos);
}
break;
case 5:
relerTurma(estudante, nomeArquivo, estLidos);
break;
case 6:
salvarSair(estudante, nomeArquivo, estLidos);
printf("Até a proxima...\n");
exit(0);
break;
default:
exit(0);
system("pause");
}
return opcao;
}
int main(void){
int opcao = 0;
Estudantes estudante[TAM_MAX] = {{"\0", "\0",0, 0, '\0'}};
char nomeArquivo[50] = {'\0'};
int estLidos = 0;
while(opcao != 7){
opcao = menuPrincipal(estudante, nomeArquivo, &estLidos);
}
system("pause");
return 0;
}