#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");
}
sexta-feira, 16 de novembro de 2012
Exercício de C - Estrutura de dados - Lista 5
Assinar:
Postagens (Atom)
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...
-
Olá pessoal, vamos atualizar nosso blog? :-) Depois de um longo período sem postagens novas resolvi liberar 2 novos assuntos para o pessoa...
-
Olá pessoal, hoje vamos entender para que servem as bibliotecas que importamos para o programa C. Com certeza a primeira coisa que você...