Você está na página 1de 15

Universidade Federal de São João del-Rei

Departamento de Ciência da Computação - DCOMP

Trabalho Prático
Sistema de Gerenciamento Cultural

Dener Alves
Ítalo Magalhães
Lucas Monteiro

São João del Rei Outubro/2014


Universidade Federal de São João del-Rei
Departamento de Ciência da Computação - DCOMP

Sumário
1. Introdução …................................... 2
2. Implementação …........................... 3
3. Analise de Complexidade …..........11
4. Testes ….......................................... 13
5. Conclusão …................................... 14
6. Referências …................................. 15
Universidade Federal de São João del-Rei
Departamento de Ciência da Computação - DCOMP

1. Introdução

Este trabalho tem como objetivo desenvolver uma solução para o problema de
Sistema de Gerenciamento Cultural para a cidade de São João del Rei, com objetivo de
organizar melhor tais eventos,na qual uma pessoa participa. A solução proposta foi
implementada utilizando-se de Tipos Abstratos de Dados(TAD) ARRAYS e STRUCTS para
a manipulação da Agenda.
A implementação do algoritmo é baseada em conceitos de ordenação utilizando
vetores estáticos,devido a maior facilidade de implementação. Apesar de ser mais
trabalhoso manipular arrays estáticos, o trabalho já estipulava uma certa quantidade de
agendas, além de permitir ao programador definir o número de compromisso que cada
agenda iria possuir.
Universidade Federal de São João del-Rei
Departamento de Ciência da Computação - DCOMP

2.Implementação
Nesta secção destina-se a esclarecer a lógica implementada no programa e todas as
estratégias adotadas. Primeiramente traçamos uma metodologia de programar e testar,
acada parte do programa finalizada, eram realizados uma série de testes para a verificação
do funcionamento do sistema.

Estruturas de Dados

Nessa subseção, estão as características dos Tipos Abstratos de Dados


implementados no algoritmo.

1.Vetor Agendas

Foi criado um vetor denominado “Agendas” contendo 5 agendas, uma para cada
usuário como proposto no Trabalho. Em cada posição do Vetor seria salvo um
Espetáculo composto por uma estrutura denominada “t_espetaculo”.Ao todo cada
agenda possui 12 espetáculos, totalizando 60 espetáculos nas 5 agendas. A figura
abaixo explicita melhor o Sistema.

Vetor Agendas “agenda[5]”

12-Espetáculos em cada Agenda 12-Espetáculos em cada Agenda

12-Espetáculos em cada Agenda 12-Espetáculos em cada Agenda

12-Espetáculos em cada Agenda

2.Estrutura Agenda

É a estrutura que define as características da agenda, ela só define o


comportamento da estrutura.
Universidade Federal de São João del-Rei
Departamento de Ciência da Computação - DCOMP

typedef struct t_agenda


{
int id_user, ano_ag; //Identificador de Usuário e Ano da Agenda
char nome_user[100]; //Nome Usuário Agenda
t_espetaculo espetaculo[12]; //Quantidade de Espetáculos em Cada Agenda
int max_compromissos; //Número Máximo de Compromissos(Espetáculos) em cada Agenda
int ordenacao; //Flag (1-Ordenado 0-Desordenado)
int conflito; //Flag (1-Sem conflito 0-Com conflito)

}t_agenda;

Figura2: Estrutura Agenda.

3.Estrutura Espetáculo

A estrutura Espetáculo que define as características do espetáculo, ela só define o


comportamento da estrutura. E após isso ela é passada para ser salva no vetor
Agendas.

typedef struct t_espetaculo


{
int flag; //0-Vazia, 1-Cheia, 2-Excluída
int id_esp,gp,status,duracao; //Identificador de Espetáculo,Satus do espetáculo e Duração
de um Espetáculo.

float valor; //Valor de um espetáculo


char nome[100]; //Nome de um Espetáculo
int tipo; //1-show,2-teatro,3-cinema,4-evento
int hora, min; //Hora de um espetáculo
int dia, mes, ano; //Data do Espetáculo

}t_espetaculo;

4.Funções e Procedimentos

Nessa subseção, estão as características das funções implementadas no algoritmo.

4.1 AGENDA:
Universidade Federal de São João del-Rei
Departamento de Ciência da Computação - DCOMP

4.1.1) int criaAgenda (t_agenda *agenda, int id, char *nome, int ano)

Cria uma nova agenda com o nome do usuário e o ano da agenda e não retorna

nada.

4.1.2) int recuperaAgenda (t_agenda *agenda, int dia, int mes, int ano)

É passado uma data e também a agenda para função,ela percorre em cada agenda
os 12 espetáculos ou (Compromissos), e retorna a partir de uma data digitada pelo
usuário a quantidade de compromissos que esta na Agenda.

4.1.3) int insereCompromisso (t_agenda *agenda, int tipo, int dia, int mes,
int ano,int hora, int min, int duracao, float valor, char *nome)

É passado para função a agenda com o tipo,data(dia,mes,ano),horário


(hora,min),duração do espetáculo,valor e o nome do espetáculo. Ela chama uma
outra função “inicializaEspetaculo” para criar um espetáculo para ser colocado no
vetor Agenda. Atribuindo através de outras duas funções a prioridade e o status do
espetáculo.

4.1.4) int removeCompromisso (t_agenda *agenda, int id)

A função recebe a agenda com espetáculos e o id do espetáculo a ser removido.


Caso não possua nenhum espetáculo inserido na agenda ela retorna uma
mensagem. Se possuir algum espetáculo, ela retorna uma mensagem de exclusão
além de atribuir a uma “flag” o valor 2,que servirá futuramente para procurar
espetáculos(compromissos) cancelados.

4.1.5) int imprimeAgenda (t_agenda *agenda)

Essa função recebe a Agenda e imprime todos os espetáculos(Compromissos)


agendados pelo usuário,isso de acordo com a flag que mostra se há espetáculo na
agenda ou não.Logo após ela chama a função ”imprimeEspetaculo” pois através
dela é que são mostrados todos dados do espetáculo.

4.1.6) int resolveConflito (t_agenda *agenda)

Ela recebe a Agenda com todos os compromisso(espetáculos) e verifica se há


conflitos de data e horários entres esses compromissos chamando a função
Universidade Federal de São João del-Rei
Departamento de Ciência da Computação - DCOMP

“RetornaStatus” para ver quais status está com a opção ”Deu Ruim”,após isso ela
atribui prioridade aos compromissos que iniciam primeiro.

4.1.7) int retornaNCancelamentos (t_espetaculo *espetaculo )

Ela retorna o numero de espetáculos que possui “status 0=DEU RUIM” ,ou seja os

espetáculos que com incidiram em alguma coisa.

4.1.8)int retornaNCompromissos (t_agenda *agenda, t_espetaculo *espetaculo)

Recebe Agenda e os espetáculos e retorna o número total de compromissos da


agenda verificando a “flag” se ela possui valor igual a 1.Na qual indica que possui
compromissos na Agenda.

4.1.9)int imprimeCompromissosCancelados(t_espetaculo *espetaculo)

Essa função imprime compromissos cancelados devido a conflitos,ela conta


quantos compromissos foram cancelados e imprime-os.

4.1.10)int imprimeCompromissosACumprir(t_espetaculo *espetaculo)

A função imprime compromissos a cumprir ela mostra todos compromissos que


estão com “Status=1” ou seja “TA GARRADO”

4.1.11)imprimeCustoTotal()

A função Imprime Custo faz a impressão de todos os compromissos que estão na


agenda. Retornando o valor total de todos os compromissos.

4.2 ESPETÁCULO:

4.2.1) int inicializaEspetaculo (t_espetaculo *espetaculo, int tipo, int dia, int
mes, int ano, int hora, int min, int duracao, float valor, char *nome)

Cria um espetáculo para ser inserido na Agenda,faz a chamada de duas funções a


“InserePrioridade” que faz o espetáculo receber um prioridade especificada pelo
Trabalho e a função ”atribuiStatus” que faz com que quando for criado um
compromisso(espetáculo) ele fique com status “TO GARRADO”.
Universidade Federal de São João del-Rei
Departamento de Ciência da Computação - DCOMP

4.2.2) int alteraPrioridade (t_espetaculo *espetaculo, int novaPrioridade)

Recebe o espetáculo e a nova prioridade de um espetáculo,altera o grau de


prioridade do espetáculo e exibe uma mensagem na tela.

4.2.3)float retornaValorIngresso (t_espetaculo *espetaculo)

Recebe um espetáculo e retorna valor do espetáculo.

4.2.4)int temConflito (t_espetaculo *espetaculo1, t_espetaculo


*espetaculo2, int *tempo1, int *tempo2)

Recebe dois espetáculos e confere se há conflito de data ou hora entre os dois

4.2.5) int atribuiStatus (t_espetaculo *espetaculo, int flag)

Recebe um espetáculo e uma “flag” 1-”TO GARRADO” ou 0-”DEU RUIM”

4.2.6)int retornaStatus (t_espetaculo *espetaculo1, t_espetaculo


*espetaculo2, int *tempo1, int *tempo2)

Retorna um status após fazer a chamada da função “resolveConflito” que chama a


função “TrocaStatus”.

4.2.7)int imprimeEspetaculo (t_espetaculo *espetaculo)

Imprime todas informações de um espetáculo,além disso ela chama a função


“ImprimeStatus” que mostra se o usuário vai poder ir ou não no compromisso.

4.3)AUXILIARES

As funções auxiliares foram funções que foram utilizadas para ajudar a manipular as
funções que compõem “ESPETACULO.C” e “AGENDA.C”.

4.3.1) int zerarAgenda (t_agenda *agenda)

Essa função recebe a agenda e zera todos os campos da agenda antes de criar uma
agenda,fazendo com que na criação de uma agenda não fique guardado lixo de
memória no vetor.
Universidade Federal de São João del-Rei
Departamento de Ciência da Computação - DCOMP

4.3.2)int zeraAno_ag (t_agenda *agenda)

A função “zerarAno_ag”, tem a mesma finalidade da função “zerarAgenda” isso faz

com que quando uma agenda for criada, na opção “Digite um ano para agenda” ela
não armazene um lixo de memória.

4.3.3) int verificaIDagenda (t_agenda *agenda, int id)

Esta função tem objetivo de fazer com que o usuário digite um id válido para
agenda,fazendo isso quando for solicitado uma das outras opções que necessite do
“id” o usuário não corre o risco de digitar algo inválido.

4.3.4)int verificaAno (int ano_agenda, int ano)

Essa função é utilizada quando você chama a função “insereCompromisso” pois


assim o usuário só consegue inserir um compromisso se seu ano do compromisso
for o mesmo do ano da sua agenda.

4.3.5)int cadastrarDuracao (int *duracao, int tipo)

Essa função cadastra a duração de acordo com o tipo de espetáculo definindo. A


duração de um espetáculo pode ser em horas,dias ou minutos .

4.3.6)int imprimirDuracao (int duracao, int tipo)

Essa função apenas mostra na tela o tipo de duração cadastrado.

4.3.7)int imprimirTipo (int tipo)

Como o tipo de um espetáculo é armazenado em uma variável do tipo “integer”,a


função “imprimirTipo” só faz mostrar o tipo de acordo com o número digitado .EX:
(1-SHOW,2-TEATRO,3-CINEMA,4-EVENTO)

4.3.8)int imprimirHorario (int min)

Faz com que imprima um horário em minutos .

4.3.9) int imprimirStatus (int status)

A função “imprimirStatus” possui a mesma ideia da função “imprimirTipo”.Como o


status é armazenado em uma variável do tipo “integer” a função apenas mostra o
Universidade Federal de São João del-Rei
Departamento de Ciência da Computação - DCOMP
status do compromisso. EX: “1-TO GARRADO” e “0-DEU RUIM”.

4.3.10) int inserePrioridade (int *gp, int tipo)

Insere prioridade de de acordo com o tipo do compromisso. As prioridades foram


explicitadas no Trabalho no TAD Espetáculo como :

• TEATRO 1
• SHOW 2
• CINEMA 2
• EVENTO 3

4.3.11)int trocaValores (t_espetaculo *vetor1, t_espetaculo *vetor2)

Ela troca os valores de um espetáculo com outro na qual ela é chamada dentro da
função “ResolveConflito”.

4.3.12)int converteTempo (t_espetaculo *espetaculo, int *duracao)

Converte a duração de um espetáculo na forma de como foi explicitado no “TP”.

4.3.13)int trocaStatus (t_espetaculo *espetaculo1, t_espetaculo


*espetaculo2, int tempo1, int tempo2)

Para resolver um conflito de espetáculo a função “trocaStatus” que fica localiza


dentro da resolve conflito compara grau de prioridade,a soma da conversão do
tempo e o tipo do compromisso. Caso esses campos sejam iguais ela realiza a opção
de escolha do mais importante de acordo com a decisão do usuário.

4.3.14)int PonteiroSort (t_agenda *agenda)

A função realiza a conferencia se a agenda estiver ordenada, recebendo um valor


igual a (0-desordenada) ou (1-ordenada) caso for 0 ela confere se existe
espetáculo,caso exista ela compara alguns dados mais significativos e chama a
função “troValores”. Se os compromissos estiverem ordenados ela não realiza
nenhuma comparação.

4.3.15)int verificaCompromisso (t_espetaculo *espetaculo, int


id_compromisso)

A função apenas verifica se o usuário digitou o id de um compromisso existente.


Universidade Federal de São João del-Rei
Departamento de Ciência da Computação - DCOMP
Caso sim,ela retorna o valor do id.

5.Programa Principal

O programa principal inicializa criando uma variável do tipo vetor com 5


posições,e aguarda o cadastro de cada usuário.
O primeiro passo é ler do teclado as informações de cadastro do vetor . Uma
lista é criada para essa posição desejada do vetor, e a partir daí será essa agenda
que o usuário irá inserir os seus compromisso. O programa principal só é
responsável por chamar as funções, todo desenvolvimento estão dentro dos
módulos, Agenda.c e Compromisso.c.

6.Organização do Código, Decisões de Implementação e


Detalhes Técnicos

O código está dividido em seis arquivos principais: compromisso.c ,


compromisso.h , agenda.c , agenda.h ,auxiliar.c, auxiliar.h que implementam o Tipo
Abstrato de Dados enquanto o arquivo main.c implementa o programa principal.

O compilador utilizado foi o GNU Compiler Collection(GCC) no sistema


operacional Linux Mint 15 e Ubuntu 12.04 LTS. Para executá-lo, utiliza-se compilasse
o arquivo main.c e o executa-o, todas
essas ações no terminal do Linux.

3.Análise de Complexidade
A análise de complexidade será feita em função da variável n que representa o
número de elementos do vetor.

3.1)Funções de Impressão e Listagem

3.1.1) imprimeEspetaculo

A função possui basicamente um loop que faz a pesquisa do elemento na lista. No


melhor caso, o elemento está na primeira posição da lista e apenas um uma
comparação é feita. Portanto O(1). No pior caso, o elemento está na última posição
ou não está presente na lista. Nesse caso, o loop faz n iterações até terminar
resultando em uma complexidade linear O(n).

3.1.2) imprimeAgenda e recuperaAgenda


Universidade Federal de São João del-Rei
Departamento de Ciência da Computação - DCOMP

Essas funções possuem apenas um loop que executa n vezes. Em cada interação
são executados apenas comandos de impressão, que tem ordem de complexidade
constante. Logo O(n).

3.1.3) criaAgenda

Essa função é da ordem de complexidade O(n) = 5 ,pois ela executa n vezes a


criação de uma agenda até atingir o limite máximo de agendas, na qual é 5.No
melhor caso ela é O(n)=1 para criação de uma única agenda e no pior caso é n.

3.1.4)imprimirDuracao,imprimirHorario,imprimirTipo,imprimirStatus, imprim
eCompromissosCancelados,imprimeCompromissosACumprir,
retornaNCompromissos .

Essas funções apenas imprimem informações sobre um espetáculo ela é da ordem


O(n)=n, no melhor caso e no pior caso ela é O(n)=1 pois o usuário só irá mostrar
apenas um espetáculo a cada busca.

3.1.5) recuperaAgenda

A função recupera agenda como dita anteriormente busca todos compromissos


que estão cadastrados nas agendas. No pior caso ela é O(n)=60 que representa a
quantidade máxima de compromissos que as agendas possuem no melhor caso ela
é O(n)=1 que busca apenas um compromisso cadastrado.

3.2)Funções de Conflito e Pesquisa

3.2.1)insereCompromisso

Essa função é da ordem de complexidade O(n)=n, na qual n representa o número


de compromissos inseridos na agenda.

3.2.2)removeCompromisso

A ordem de complexidade dessa função é O(n)=0 para o melhor caso ou seja


quando ele não consegue encontrar nenhum compromisso na agenda,no pior caso
ele é da ordem O(n)=n fazendo busca até n agendas.

3.2.3) imprimeAgenda, imprimeCustoTotal


Universidade Federal de São João del-Rei
Departamento de Ciência da Computação - DCOMP
Essas fuções imprime os compromissos que estão cadastrados na
agenda e

também o custo desses compromissos,isso faz com que ela possui uma ordem de
complexidade O(n)=n na qual n é a quantidade de compromissos cadastrados.

3.2.4) resolveConflito, PonteiroSort, trocaStatus, retornaNCancelamentos, ,


inicializaEspetaculo , alteraPrioridade,

Tais funções possuem uma ordem de complexidade O(n)=2(n) na qual “n” é o


numero total de compromissos e 2 é a comparação de “dois a dois” compromissos.

3.2.5)retornaValorIngresso,temConflito,atribuiStatus,imprimeEspetaculo, zer
arAgenda,verificaIDagenda,zeraAno_ag,verificaIDagenda,verificaAno,cadastr
arDuracao,inserePrioridade,trocaValores,converteTempo,trocaStatus,
verificaCompromisso

Essas funções possuem uma ordem de complexidade constante O(n)=n


dependendo de n na qual é o número de compromissos que estão na agenda.

4.Testes

Vários testes foram realizados com o programa de forma a verificar o seu


funcionamento.
Universidade Federal de São João del-Rei
Departamento de Ciência da Computação - DCOMP

5.Conclusão

Ao desenvolver esse “Tp” aprendemos a tomar uma decisão no momento da


escolha de listas ou vetores, quais são as principais vantagens e desvantagens de
cada um destes e qual a importância dessa escolha na implementação de um
algoritmo.
Optamos por escolher vetor pela facilidade de implementação. Nesse
trabalho foi implementado um algoritmo que gerencia um sistema de agendas de
compromissos para os moradores de SJDR. Foram usados conceitos da Linguagem
C, que reunidos proporcionam uma grande quantidade de soluções para problemas
e desafios.
Universidade Federal de São João del-Rei
Departamento de Ciência da Computação - DCOMP

6-Referências

Apostila “A NÁLISE DE C OMPLEXIDADE”, Antonio Alfredo Ferreira Loureiro.


Livro Análise de Algoritmos,Ziviane Nivio.
Apostilas TAD Lista e Pilhas,Sachetto Rafael.

Você também pode gostar