sexta-feira, 16 de novembro de 2012

Exercício de C - Estrutura de dados - Lista 5

#include <stdio_ext.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
/*
 *    Área de definição das estruturas
 **/
struct aluno
{
    int matricula;
    char nome[80];
    char endereco[120];
    char telefone[20];
};

// Criando o tipo Aluno que representa a estrutura aluno
typedef struct aluno Aluno;

/*
 *    Área dos protótipos da função
 **/
int show_menu ();
void initializer (Aluno*);
void select_action (int, int*, Aluno*);
void insert_register (int*, Aluno*);
void remove_register (int, Aluno*, int*);
void change_register (int, Aluno*, int*);
void sort_registers (Aluno*, int*);
void show_registers (Aluno*, int*);
void show_register (int, Aluno*, int*);

/*
 * Método principal, start do programa.
 **/
int
main (void)
{
    Aluno alunos[MAX];
    int index = 0; // Essa variável é responsável por controlar os índices do vetor que mantem os alunos

    initializer (alunos);

    while (1)
        select_action (show_menu(), &index, alunos);

    sort_registers (alunos, &index);
    show_registers (alunos, &index);

    return 0;
}

/*
 * Exibe o menu de funcionalidades
 **/
int
show_menu (void)
{
    int option;

    printf ("\n1 -\tInserir novo aluno");
    printf ("\n2 -\tApagar registro de aluno");
    printf ("\n3 -\tModfificar registro");
    printf ("\n4 -\tListar registros");
    printf ("\n5 -\tBuscar registro por matricula");
    printf ("\n0 -\tExit \n.: ");
    scanf("%d", &option);

    return option;
}

/*
 * Inicializa todas as matriculas com o número 9999
 **/
void
initializer (Aluno *a)
{
    int i;
    for (i = 0; i < MAX; i++)
        a[i].matricula = 9999;
}

/*
 * Esse método dita o comportamento do programa. É ele quem chama as funções que são exibidas pelo programa no menu.
 * Ele é a chave central, todas as chamadas principais, passam por ele.
 **/
void
select_action (int option, int *index, Aluno *a)
{
    int number; /* Variável number armazena o número de matricula do aluno que o usuário deseja excluir/alterar/buscar */

    int dialog_option; /* Variável dialog_option tem a função de armazenar a escolha do usuário quando o mesmo entra na tela de encerramento do programa, caso o valor armazenado pela variável seja 1 o encerramento do programa deve ser feito, caso seja 0 o encerramento do programa é abortado */

    int list_option = 0; /* Variável list_option tem a função de selecionar qual a ordem da exibição, caso seja 0 (default) os registros serão dispostos em ordem crescente. Caso contrário os registros serão dispostos em ordem decrescente */

    switch (option)
    {
        case 1:
            insert_register (index, a);
        break;
        case 2:
            printf ("\nInforme o número de matricula do aluno que deseja excluir.: ");
            scanf ("%d", &number);
            remove_register (number, a, index);
        break;
        case 3:
            printf ("\nInforme o número de matricula do aluno que deseja alterar.: ");
            scanf ("%d", &number);
            change_register (number, a, index);
        break;
        case 4:
            show_registers (a, index);
        break;
        case 5:
            printf ("\nInforme o número do registro que deseja buscar.: ");
            scanf ("%d", &number);
            show_register (number, a, index);
        break;
        case 0:
            system ("clear");
            printf ("\nDeseja encerrar o programa? \n[1]Sim \n[0]Não \n");
            scanf ("%d", &dialog_option);
            if (dialog_option == 1)
                exit (0);
        break;
    }
}

/*
 * Esse método é responsável pela inserção de registros existentes na persistencia.
 **/
void
insert_register (int *index, Aluno *a)
{
    int avaliable = 1;
    /* Essa variavel irá responder se o nro de matricula solicitado para novo registro já se encontra cadastrado na persistência de dados.
        Caso o valor de avaliable seja igual a 0 corresponde que o número solicitado já se encontra na persistência de dados, caso seja 1 corresponde que o número está disponível para identificar um novo registro.
     */
    int number; /* variável armazana o número da matricula do aluno depois que ela foi validada */
    do
    {
        int i;

        system("clear");
        printf ("\nInforme o número de matricula.: ");
        scanf ("%d", &number);

        for (i = 0; i < MAX; i++)
        {
            if (number < 0 || number == 9999)
            {
                printf ("\nEsse número não é válido!");
                avaliable = 0;
                break;
            }
            else if (number == a[i].matricula)
            {
                printf("\nEsse número já está cadastrado, informe um número válido!");
                avaliable = 0;
                break;
            }
            else
                avaliable = 1;
        }
    }
    while (avaliable == 0);

    a[*index].matricula = number;
    __fpurge (stdin);
    printf ("\nInforme o nome.: ");
    gets (a[*index].nome);
    __fpurge (stdin);
    printf ("\nInforme o endereço: ");
    gets (a[*index].endereco);
    __fpurge (stdin);
    printf ("\nInforme o telefone: ");
    gets (a[*index].telefone);

    // Incrementando a variável responsável pelo controle do vetor dos alunos
    *index = *index + 1;

    // Reordenando os registros que se encontram na persistencia, já que um novo aluno foi inserido
    sort_registers (a, index);

    printf ("\n\n \t\t -- Registro inserido com sucesso! -- \n");
}

/*
 * Esse método é responsável pela exclusão de registros existentes na persistencia.
 **/
void
remove_register (int number, Aluno *a, int *index)
{
    system ("clear");

    int i;
    int status = 0; /* Variável armazena se foi possível realizar a exclusão, se 0 não se 1 sim */

    for (i=0; i < *index; i++)
    {
        if (a[i].matricula == number)
        {

            /* Exibindo o registro de aluno que foi encontrado, e perguntando ao usuário se realmente deseja efetuar a exclusão */
            int dialog_option = 0; // Se o valor for 0 o registro não será removido, se o valor for igual a 1 o registro será removido

            show_register (number, a, index);

            printf ("\n Deseja realmente excluir o registro? [1] Sim [0] Não.: ");
            scanf ("%d", &dialog_option);

            // Sinalizando que foi encontrado registro com codigo de matricula equivalente
            status = 1;

            if (dialog_option == 1)
            {
                a[i].matricula = 9999;
                strcpy (a[i].nome, "");
                strcpy (a[i].endereco, "");
                strcpy (a[i].telefone, "");

                // Decrementando a variável responsável pelo controle do vetor dos alunos
                *index = *index - 1;

                // Reordenando os registros que se encontram na persistencia, já que um registro de aluno fio removido
                sort_registers (a, index);

                system ("clear");

                printf ("\n\t\t --Registro removido com sucesso!--\n");
                break;
            }
        }
    }
    if (status == 0)
        printf ("\n\t\t -- Nenhum registro foi encontrado!--\n");
}

/*
 * Esse método é responsável pela alteração de registros existentes na persistencia.
 **/
void
change_register (int number, Aluno *a, int *index)
{
    system ("clear");

    int i;
    int status = 0; /* Variável armazena se foi possível realizar a alteração, se 0 não se 1 sim */
    Aluno aux;

    for (i=0; i < *index; i++)
    {
        if (a[i].matricula == number)
        {
            __fpurge (stdin);
            printf ("\nNovo nome.: ");
            gets (aux.nome);
            printf ("\nNovo endereço.: ");
            gets (aux.endereco);
            printf ("\nNovo telefone.: ");
            gets (aux.telefone);

            strcpy (a[i].nome, aux.nome);
            strcpy (a[i].endereco, aux.endereco);
            strcpy (a[i].telefone, aux.telefone);

            // Modificando o valor de status, sinalizando que o registro foi localizado e removido com sucesso!
            status = 1;

            printf ("\n\t\t --Registro alterado com sucesso!--\n");
            break;
        }
    }
    if (status == 0)
        printf ("\n\t\t -- Nenhum registro foi encontrado!--\n");
}

/*
 * Esse método reorganiza a persistencia de dados (vetores) toda vez que o mesmo tem uma alteração, seja uma adição ou subtração de registros.
 **/
void
sort_registers (Aluno *a, int *index)
{
    int i, j;
    Aluno aux;

    for (i = 0; i < *index; i++)
    {
        for (j = 0; j < *index; j++)
        {
            if (a[i].matricula < a[j].matricula)
            {
                aux.matricula = a[i].matricula;
                strcpy (aux.nome, a[i].nome);
                strcpy (aux.endereco, a[i].endereco);
                strcpy (aux.telefone, a[i].telefone);

                a[i].matricula = a[j].matricula;
                strcpy (a[i].nome, a[j].nome);
                strcpy (a[i].endereco, a[j].endereco);
                strcpy (a[i].telefone, a[j].telefone);

                a[j].matricula = aux.matricula;
                strcpy (a[j].nome, aux.nome);
                strcpy (a[j].endereco, aux.endereco);
                strcpy (a[j].telefone, aux.telefone);
            }
        }
    }
}

/*
 * Esse método exibe todos os registros cadastrados na persistencia (vetores)
 **/
void
show_registers (Aluno *a, int *index)
{
    system ("clear");

    int i = 0;

    for (i = 0; i < *index; i++)
    {
        if (a[i].matricula != 9999)
        {
            printf ("\n \t\t -- Registro número %d --", a[i].matricula);
            printf ("\n Nome.: %s", a[i].nome);
            printf ("\n Endereço.: %s", a[i].endereco);
            printf ("\n Telefone.: %s", a[i].telefone);
            puts("");
        }
    }

    if (*index == 0)
        printf ("\n\t\t -- Nenhum registro cadastrado -- \n");
}

/*
 * O método show_register tem um funcionamento parecido com o método show_registers.
 * A diferença é que esse método busca um único registro e caso encontre o exibe.
 **/
void
show_register (int number, Aluno *a, int *index)
{
    system ("clear");

    int i;
    int status = 0;

    for (i = 0; i < *index; i++)
    {
        if (a[i].matricula == number)
        {
            status = 1;
            break;
        }
    }

    if (status == 1)
    {
        printf ("\n \t\t -- Registro número %d", a[i].matricula);
        printf ("\n Nome.: %s", a[i].nome);
        printf ("\n Endereço.: %s", a[i].endereco);
        printf ("\n Telefone.: %s", a[i].telefone);
        puts("");
    }
    else
        printf ("\n\t\t -- Nenhum registro foi encontrado!--\n");
}

Novidade!!! Agora vamos ter canal no Youtube =D

Fala pessoal tudo beleza, estou sumido a correria está forte por aqui. Estou querendo dar um start em um projeto antigo que vem desde o temp...