Cadastro de Alunos
Publicado por João Neto 01/09/2007
[ Hits: 17.385 ]
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");
}
Arquivo com números aleatórios.
Programa para inversão de colunas
Ajustando o sincronismo da legenda com o filme
Função readConf. Ler arquivos de configuração.
Nenhum comentário foi encontrado.
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
[Resolvido] VirtualBox can't enable the AMD-V extension
Como verificar a saúde dos discos no Linux
Como instalar , particionar, formatar e montar um HD adicional no Linux?
Como automatizar sua instalação do Ubuntu para desenvolvimento de software.
Não consigo instalar distro antiga no virtualbox nem direto no hd (14)
Quais os códigos mais dificeis que vcs sabem fazer? (12)
systemd-resol... precisa ser reiniciado periodicamente [RESOLVIDO] (7)









