Cadastro de Alunos
Publicado por João Neto 01/09/2007
[ Hits: 17.055 ]
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
Transformando uma sequencia de binário em executável
Nenhum comentário foi encontrado.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
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
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Arch Linux - Guia para Iniciantes (2)
Problemas ao instalar o PHP (11)
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (15)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)