Cadastro de Alunos
Publicado por João Neto 01/09/2007
[ Hits: 17.039 ]
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"); }
Alfabeto escrito 30 vezes e operaçăo XOR
Controle de Funcionários (Básico)
Números de caracteres em arquivo
Nenhum comentário foi encontrado.
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituiçăo
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Melhorando a precisăo de valores flutuantes em python[AJUDA] (7)
SysAdmin ou DevOps: Qual curso inicial pra essa área? (4)
É cada coisa que me aparece! - năo é só 3% (4)
[Python] Automaçăo de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas ŕs imagens de uma pasta