Cadastro de Alunos

Publicado por João Neto 01/09/2007

[ Hits: 17.055 ]

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

Comandos de um Shell

Logger

Programa para inversăo de colunas

Arquivos em C

Transformando uma sequencia de binário em executável


  

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