Cadastro de Alunos
Publicado por João Neto 01/09/2007
[ Hits: 17.308 ]
Programa que cadastra alunos em um arquivo chamado notas.txt usando structs.
Ordena as notas decrescentemente e as imprime nas estatisticas
Devolve tambem a quantidade de alunos, media e mediana das notas.
/****************************************************************************
* Joao Neto *
* juaumn@gmail.com Ter Ago 21 2007 *
* *
* Centro Federal de Educacao tecnologica do Ceara - CEFET *
* Disciplina: Desenvolvimento de Algoritmos *
* Prof. Glauber Cintra *
***************************************************************************/
#define LIMPA_TELA system("clear");
#include <stdio.h>
#include <stdlib.h> //para a funcao exit()
#include <string.h> //para a funcao strlen() e strcmp()
//-----------------------------------------------------
// Definicao de um novo tipo de dados usado pelo progra
// ma - Cadastro - Que armazena uma string para o nome
// do aluno e a nota.
//-----------------------------------------------------
typedef
struct {
char nome[20];
double nota;
} Cadastro;
//-----------------------------------------------------
//Assinatura das Funcoes usadas pelo programa
//-----------------------------------------------------
int menu(char opcao);
int cadastraAluno();
int contaTotal();
int gravaNoArquivo (char nome[], double nota);
int pegaNotas();
int estatisticas();
char apresentacao();
void abreArquivo();
void testaArq(FILE *arq);
void mostraNotas(int total, Cadastro *aluno);
void calculaModas();
void programa ( );
void relatorio ( Cadastro *aluno, int total );
void ordenaArquivo ( Cadastro *aluno, int total );
void tela ( char str[] );
//-----------------------------------------------------
//Funcao principal (contem a chamada a todas as funcoes)
//-----------------------------------------------------
int
main(int argc, char *argv[]) {
abreArquivo(); //cria o arquivo notas.txt
programa(); // fluxo de execucao do programa
}
//-----------------------------------------------------
// Funcao para facilitar a chamada ao inicio do programa
//-----------------------------------------------------
void
programa() {
char opcao;
do{
opcao = apresentacao();
menu(opcao);
}while(opcao != 's' && opcao != 'S');
}
void
abreArquivo() {
FILE *arq;
arq = fopen("notas.txt", "a+");
testaArq(arq);
fclose(arq);
}
//-----------------------------------------------------
// Chama as funcoes de acordo com a preferencia do usu
// ario -
// Chama funcao para cadastrar alunos, ver relatorios
// @sai do programa
//-----------------------------------------------------
int
menu(char opcao) {
switch(opcao) {
case 'C':
case 'c':
cadastraAluno();
break;
case 'E':
case 'e':
estatisticas();
break;
default:
printf("saindo do programa [TECLE ENTER]");
getchar();
exit(1);
}
}
//-----------------------------------------------------
// Funcao para cadastrar alunos e armazenar informacoes
// no arquivo de texto "notas.txt"
// @chama a funcao gravaNoArquivo();
//-----------------------------------------------------
int
cadastraAluno() {
int i = 0, tamanho;
char nome[21];
double nota;
FILE *arq;
do {
LIMPA_TELA
tela( " CADASTRO " );
printf("\n\n");
printf( "\n\n\n\tDigite o nome do aluno: " );
gets( nome );
tamanho = strlen( nome ); //pega a qntd de caracteres do nome
if( tamanho > 20 || tamanho == 0 ) {
printf( "\n\tEntrada Invalida [PRESSIONE ENTER]" );
return 1;
}
//coloca um '_' caso o nome possua espacos ou tabs
for( ; nome[ i ] != '{FONTE}'; i++ ) {
if( nome[ i ] == ' ' || nome[ i ] == '\t' )
nome[ i ] = '_';
}
}while(comparaNome(arq, nome));
getchar();
do{
printf( "\n\n\tDigite a nota do aluno <entre 0 e 10>: " );
scanf( "\n%lf", ¬a );
}while(nota < 0.0 || nota > 10.0);
gravaNoArquivo(nome, nota);
}
//-----------------------------------------------------
// Funcao para comparar se o nome digitado pelo usuario
// no cadastro do aluno ja existe
// se existe -> return 1
// se nao existe -> return 0
//-----------------------------------------------------
int
comparaNome(FILE *arq, char nome[21]) {
char n[21];
double notaTmp;
int cont = 0;
int a;
arq = fopen("notas.txt", "r");
testaArq(arq); //testa a operacao com o arquivo
for( ; fscanf( arq, "%s \t %lf\n", n, ¬aTmp ) != EOF ; cont++ ) {
testaArq(arq); //testa a operacao com o arquivo
if( strcmp( n, nome ) == 0 ) {
printf("\nEsse aluno ja Foi cadastrado\n");
getchar();
fclose( arq );
estatisticas();
programa();
}
}
fclose(arq);
//aluno ainda nao cadastrado no arquivo
return 0;
}
//-----------------------------------------------------
// Funcao para gravar dados para arquivo
// recebe como parametros o nome e a nota do aluno digi
// tadas na funcao cadastraAluno() e as grava em disco
// no arquivo "notas.txt"
//-----------------------------------------------------
int
gravaNoArquivo (char *nome, double nota) {
FILE *arq;
arq = fopen("notas.txt", "a+");
testaArq(arq); //testa a operacao com o arquivo
fprintf(arq, "%s\t%.1lf\n", nome, nota);
testaArq(arq); //testa a operacao com o arquivo
printf( " \n\n\t Aluno Cadastrado com sucesso [Tecle Enter]" );
getchar();
fclose(arq);
}
//-----------------------------------------------------
// Funcao para contar quantos alunos foram cadastrados
// serve para alocar o vetor de Cadastro e armazenar as
// informacoes na memoria e gerar o relatorio na tela
//-----------------------------------------------------
int
contaTotal() {
char nome[21];
double nota;
int total = -1;
FILE *arq;
arq = fopen( "notas.txt", "r" );
testaArq(arq); //testa a operacao com o arquivo
while(!feof(arq)) {
fscanf(arq, "%s %lf", nome, ¬a);
testaArq(arq); //testa a operacao com o arquivo
total++;
}
fclose(arq);
return total;
}
//-----------------------------------------------------
// Funcao para ->
// Ordenar as notas decrecentemente
// Imprimir as notas na tela
// Gerar as informacoes de Media, Mediana, Modas
//-----------------------------------------------------
int
estatisticas() {
int i = 0;
int total = contaTotal();
Cadastro aluno [total + 1];
FILE *arq;
if(total == 0) {
printf("Nao existem alunos no cadastro");
return 0;
}
arq = fopen("notas.txt", "r");
testaArq(arq); //testa a operacao com o arquivo
for(i = 0; i <= total; i++) {
fscanf( arq, "%s %lf\n", aluno[i].nome, &aluno[i].nota );
testaArq(arq);
}
ordenaArquivo(aluno, total);
// Chama as funcoes de relatorio: Medianas, Modas, media e total de alunos
mostraNotas(total, aluno);
relatorio(aluno, total);
fclose(arq);
}
//-----------------------------------------------------
// Funcao para mostrar as notas dos alunos no relatorio
// e apresenta-las na tela NOME NOTA
//-----------------------------------------------------
void
mostraNotas(int total, Cadastro *aluno) {
int a = 0;
LIMPA_TELA
tela ( " ESTATISTICAS" );
printf("\n\n");
printf( "\t\t%-20s\t\t%s\n", "NOME", "NOTA" );
printf("\t\t_____________________________________\n");
for(a = 0;a < total; a++) { //laco para imprimir toda a struct Cadastro
if(aluno[a].nota == 10)
printf("\t%d->\t%-20s\t\t%.1lf\n",a+1, aluno[a].nome, aluno[a].nota);
else //imprime um zero antes da nota caso ela seja menor que 10
printf("\t%d->\t%-20s\t\t0%.1lf\n",a+1, aluno[a].nome, aluno[a].nota);
}
printf("\n");
}
//-----------------------------------------------------
// Funcao que imprime na tela o relatorio do cadastro ->
// + numero de alunos cadastrados
// + media das notas dos alunos
// + medianas das notas dos alunos
// + modas das notas dos alunos
//-----------------------------------------------------
void
relatorio(Cadastro *aluno, int total) {
int index = 0, index1 = 0;
double soma = 0;
double sub;
int aux;
double mediana[2];
double modas[ total ][ 2 ];
/*Apresenta o total de alunos cadastrados no arquivo*/
printf("\t%-20s %d\n", "Total de alunos:", total);
/*calculo da media aritmetica das notas cadastradas*/
for(; index1 < total; index1++) {
soma += aluno[index1].nota;
}
printf("\t%-20s %2.1lf\n", "Media:", soma/total);
/*Calculo da mediana - media dos valores centrais de um conjunto*/
if(total%2 == 0) { //caso o num de alunos seja par (duas medianas)
mediana[0] = aluno[total/2].nota;
mediana[1] = aluno[total/2 - 1].nota;
printf("\t%-20s %2.1lf\n","Mediana:",(mediana[1] + mediana[0])/2);
} else { //caso o num de alunos seja impar (uma mediana)
sub = total/2 + 0.5;
aux = (int)sub;
mediana[0] =aluno[aux].nota;
printf("\t%-20s %2.1lf\n", "Mediana:", mediana[0]);
}
/* Calculo das modas - valor mais frequente em um conjunto*/
//calculaModas();
}
//-----------------------------------------------------
// nao sei implementar uma funcao que calcule as modas!
//-----------------------------------------------------
void
calculaModas () {
printf("\t%-20s ", "Modas");
printf("ERRO\n");
}
//-----------------------------------------------------
// Essa funcao e´ chamada cada vez que uma operacao no
// arquivo e´ realizada, verificando se a operacao foi
// realizada com sucesso ou entao o programa sera abor
// tado.
//-----------------------------------------------------
void
testaArq(FILE *arq) {
//apresenta os possiveis problemas que podem ter acontecido
if(arq == NULL) {
LIMPA_TELA
printf("\n\tErro 001: Arquivo nao pode ser aberto\n");
printf("\tErro 002: Erro na leitura/escrita no arquivo\n");
printf("\tErro 003: O arquivo notas.txt foi apagado ou nao existe\n\n");
printf("\tAbortando programa\n");
printf("\tPressione Enter para Sair\n");
getchar();
exit(0);
}
}
//-----------------------------------------------------
// Funcao para ordenar de forma decrescente as notas dos
// alunos para serem exibidas no relatorio
//-----------------------------------------------------
void
ordenaArquivo(Cadastro *aluno, int total) {
int z = 0, w = 0;
for( ; z < total; z++ ) {
for( w = z + 1; w < total; w++ ) {
if( aluno[ z ].nota < aluno[ w ].nota ) {
Cadastro aux = aluno[ z ];
aluno[ z ] = aluno[ w ];
aluno[ w ] = aux;
}
}
}
}
//-----------------------------------------------------
// Funcao que imprime na tela as opcoes do menu princi-
// pal do programa.
//-----------------------------------------------------
char
apresentacao() {
char opcao;
do{
printf("\n");
LIMPA_TELA
printf("\n\n");
tela ( "CADASTRO DE ALUNOS" );
printf("\n\n");
printf("\t(C) Cadastra alunos\n\n\n");
printf("\t(E) Estatisticas\n\n\n");
printf("\t(S) Sair\n\n\n");
printf(">> Digite a opcao: >> ");
scanf("%c",&opcao);
getchar();
if(opcao != 'C' && opcao != 'c' && opcao != 'S' && opcao != 's' &&
opcao != 'E' && opcao != 'e') {
printf("\n\t\tOpcao Invalida! Tente novamente [tecle enter]" );
getchar();
}
}while(opcao != 'C' && opcao != 'c' && opcao != 'S' && opcao != 's' &&
opcao != 'E' && opcao != 'e');
return (opcao);
}
//----------------------------------------------------
// imprime a moldura do nome dos menus
//----------------------------------------------------
void
tela(char str[]) {
printf("\t_____________________________________________________________\n");
printf("\t %s \n", str);
printf("\t_____________________________________________________________\n");
}
Programa para inversăo de colunas
Nenhum comentário foi encontrado.
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Eu queria adicionar a incon do wifi e deixa transparente no fluxbox no... (0)









