Cadastro de Alunos

Publicado por João Neto 01/09/2007

[ Hits: 17.040 ]

Download cadastro.c




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.

  



Esconder código-fonte

/****************************************************************************
 *  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");
}


Scripts recomendados

Compactando arquivos de log *.txt

Leitura de arquivo texto separando as colunas

Programa CONSULTA/ PESQUISA/ ADICIONA/ EXCLUI registros em arquivos

Cadastro de arquivo usando ncurses como menu

Mexendo com arquivos em C


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts