Você está na página 1de 12

TP1: Rede Social AEDs II

Pedro Andre Aguiar da Silveira


Belo Horizonte 8 de novembro de 2016

Sum
ario
1 Introdu
c
ao

2 Modelagem e Funcionamento
2.1 Estrutura geral . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Estrategia . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3
3
3

3 Implementa
c
ao
3.1 Listas . . . . . . .
3.2 TADs . . . . . . .
3.3 Func
oes . . . . . .
3.4 Programa principal

4
4
5
6
8

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

4 Estudo de Complexidade

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

5 Compila
c
ao e Execu
c
ao

11

6 Conclus
ao

11

A Bibliografia

12

Introdu
c
ao

O trabalho aqui descrito visa a implementacao em linguagem C de uma


rede social simplificada similar a rede social Twitter. Utilizando os conceitos
e implementac
oes de Listas, Filas ou Pilhas aprendidos na segunda parte do
curso de AEDS II.
A estrutura do c
odigo faz uso somente do conceito de Listas, para criar
listas de mensagens e amigos, alem disso foram usados tambem TADs para
os usu
arios e mensagens.
O programa le um arquivo .txt de entrada com dados sobre acontecimentos de uma rede social entre um n
umero restrito de amigos e suas respectivas
ac
oes, e gera um arquivo .txt de sada com as exibicoes da Timeline de alguns usu
arios.

2
2.1

Modelagem e Funcionamento
Estrutura geral

A princpio foram criadas duas estruturas que seriam os blocos fundamentais da rede social, a struct mensagem e a struct usuario. Dentro do
bloco usuario existem o nome e o id , duas listas, que sao a Timeline e a
lista de amigos. O bloco mensagem contem o id da mensagem, o corpo e o
n
umero de curtidas.
A estrutura do programa foi organizada em funcoes que executam as
ac
oes da rede social, como por exemplo exibir Timeline e postar mensagem,
alem disso foi criada uma funcao especial para ler o arquivo de texto e iniciar
os usu
arios, como tambem realizar as acoes ocorridas em um determinado
evento. Lembrando que como sada o programa deve gerar um arquivo de
texto com as visualizac
oes de Timeline requeridas pelos usuarios.

2.2

Estrat
egia

A estrategia seguida foi inicializar uma quantidade arbitraria de usuarios para testes e a partir disso construir as funcoes exigidas, como iniciar
amizade, cancelar amizade, ver amigos e etc. Apos construir todas essas
func
oes foi criada uma funcao le arquivo que extrai as informacoes do .txt,
e simultaneamente escolhe e executa as acoes contidas no .txt de entrada
usando as func
oes criadas previamente.

Implementa
c
ao

3.1

Listas

Foi usado o conceito de listas para a implementacao da rede social, segue


abaixo o TAD lista utilizado:
typedef struct c e l u l a t apontador ;
typedef struct
{
t apontador primeiro , ultimo ;
} t lista ;
typedef struct
{
usuario user ;
mensagem msg ;
} t item ;
typedef struct celula
{
t i t e m item ;
t a p o n t a d o r prox ;
} t celula ;
Foi implementada uma lista de encadeamento simples, decidiu-se utilizar
uma mesma implementac
ao para lista que sera usada como Timeline, e como
lista de amigos. Para isso bastou incluir na struct t-item uma variavel para
mensagem e outra para armazenar o endereco de um amigo. Quando for
usado para mensagem, a variavel para o usuario fica vazia, e vice versa.
Agora ser
ao definidas os blocos mensagem e usuario, para um melhor
entendimento do mecanismo das listas.

3.2

TADs

Foram criadas dois TADs que sao fundamentais para a implementacao


da rede social, usu
ario e mensagem:
typedef struct
{
int id ;
c h a r nome [ 5 0 ] ;
t l i s t a amigos ;
t l i s t a timeline ;
} usuario ;
Na estrutura usu
ario foi includo uma string de tamanha maximo 50 pois
pareceu suficiente para a maioria dos nomes. Inclui uma lista para os amigos
e outra para as mensagens, alem de tambem um capo para o identificador
do usu
ario.
typedef struct
{
int id ;
i n t tempo ;
char corpo [ 1 4 0 ] ;
int curtidas ;
} mensagem ;
Para a estrutura mensagem, existe tambem um identificador da mesma,
um tempo de postagem, n
umero de curtidas recebidas e um corpo que armazena o texto, com um tamanho maximo requerido de 140 caracteres.

3.3

Func
oes

void FLVazia(t_lista *lista)


Essa func
ao cria as listas vazias Timeline e lista de amigos, para que
assim possam ser inseridos os dados.
void InsereAmigo(usuario *user1, usuario *user2)
Essa func
ao e uma funcao auxiliar da funcao iniciar amizade que adiciona
user2 `
a lista de amigos de user1, mas nao o contrario.
void iniciarAmizade(usuario *user1, usuario *user2)
Essa func
ao faz o uso da funcao InsereAmigo duas vezes, para que dessa
forma a ac
ao de iniciar amizade seja bilateral, se user1 esta na lista de amigos
de user2, o recproco e verdadeiro.
void verAmigos(usuario user1)
Essa func
ao mostra todos os amigos atuais de um determinado usuario
de entrada user1.
void cancelarAmizade1(usuario *user1, usuario *user2)
Essa func
ao foi criada para auxiliar a funcao cancela amizade, ela usa
adaptac
oes das func
oes remove-c e retira-p de listas aprendidas no curso.
O que ela faz e buscar na lista de amigos do user1 o user2 atraves do id
e dessa forma excluir essa celula da lista de amigos.
void cancelarAmizade (usuario *user1, usuario *user2)
Essa func
ao usa anterior como auxiliar, pois cancelar uma amizade exige
que user1 n
ao tenha o user 2 em sua lista de amigos e o recproco tambem.
Logo basta chamar a func
ao anterior duas vezes, somente trocando a ordem
dos usu
arios em cada chamada.
void insereMensagem(char*mensagem, usuario *user1,int id1)
Essa func
ao e auxiliar da funcao postar mensagem, ela recebe um corpo
de mensagem, o seu identificador numerico e qual usuario postou, dessa
forma ela adiciona essa mensagem na Timeline de user1 somente. Lembrando que essa func
ao j
a inicia a mensagem postada com o n
umero de
curtidas igual a zero, para posteriormente pode ser incrementado quando
solicitado.
6

void postarMensagem(char* mensagem, usuario *user1,int id1)


Essa func
ao utiliza a funcao anterior para adicionar a mensagem na
Timeline de quem postou e tambem na Timeline de todos os seus amigos
de sua lista atraves de um loop.
void exibirTimeline(usuario user1)
Essa func
ao sofreu algumas alteracoes para escrever a Timeline do user1
em um arquivo .txt de sada. Um problema que houve e que essa funcao
exibia as mensagem na ordem da mais antiga para a mais atual.
Para sanar isso foi criado internamente `a funcao um vetor de tamanho
arbitrariamente suficiente do tipo mensagem que armazenava toda a Timeline do user1 e depois imprimia na ordem reversa, do mais novo para o mais
antigo.
Foi pedido na orientacao do TP que no arquivo de sada, quando fosse
exibir a Timeline de cada usuario que solicitou imprimisse a mensagem,
seguido do n
umero de curtidas. Porem no meu programa a mensagem e
impressa e na pr
oxima linha e impresso a palavra Curtidas= n
umero de
curtidas.
void atualizaMensagem(usuario *user1, int id1)
Essa func
ao serve para auxiliar a funcao curtir mensagem, ela basicamente procura na Timeline do user1 a mensagem de id1, remove essa celula
e a insere no final da lista, dessa forma, atualiza a mensagem em sua Timeline. Lembrando que como essa funcao serve pra auxiliar a funcao de curtir
mensagem, ela tambem incrementa o n
umero de curtidas da mensagem em
1 para cada chamada.
void curtirMensagem(usuario *user1, int id1)
Essa func
ao utiliza a funcao atualiza mensagem para primeiramente atualizar a mensagem a ser curtida na Timeline de user1, e apos isso utilizando
um loop atualiza a mensagem na Timeline de todos os amigos do user1, e
incrementa a curtida em 1 em todos os casos.
void escolheAcao(char*str, usuario *user)
Essa func
ao e a primeira a integralizar todas as outras funcoes anteriores,
ela faz o papel de decis
ao entre qual acao o usuario quer realizar e chamar a
respectiva func
ao para tal. Ela faz uso de ferramentas de analise de strings,
que ser
ao melhor descritas na funcao le arquivo.
7

usuario *leArquivo ()
Essa func
ao foi desenvolvida para ler o arquivo .txt de entrada utilizando
as func
oes da biblioteca string.h fgets() e strtok() e retornar um endereco de
mem
oria para armazenar os usuarios criados, e foi criada para seguir alguns
passos consecutivos que s
ao:
1. Abrir o arquivo de entrada que esta na pasta
2. Ler o n
umero de usu
arios na primeira linha do arquivo e criar memoria
suficiente para o n
umero de usuarios.
3. Criar listas de amigos e Timeline vazia para cada usuario para inserc
oes futuras.
4. Atraves de um loop de tamanho igual `a quantidade de usuarios inicializa cada usu
ario, com nome, id, e insere na lista de amigos de cada
um os amigos indicados no arquivo.
5. Le todas as linhas de acoes atraves de um loop e executa atraves da
func
ao escolhe ac
ao.
6. Fecha o arquivo de texto, retorna o endereco de memoria com todos
os usu
arios em um vetor e apos isso libera a memoria criada dentro da
func
ao para os usu
arios.

3.4

Programa principal

Na main, existe somente um ponteiro para o tipo usuario que recebe


o valor da func
ao leArquivo, o programa roda, gera o arquivo de sada e
retorna 0. Todos os dados de todos os usuarios podem ser acessados atraves
das func
oes posteriormente se necessario.

Estudo de Complexidade

As complexidades das funcoes foram consideradas com base no n


umero
de usu
arios, pois a complexidade cresce em geral com o n
umero de usuarios.
Em outros casos algumas funcoes dependem do n
umero de mensagens,
que ent
ao e considerado como parametro de entrada para o estudo da complexidade.
Fun
c~
ao FLVazia
Essa func
ao cria uma celula e aponta dois apontadores para a mesma,
s
ao ac
oes O(1), e n
ao dependem do n
umero de usuarios, logo a funcao e
O(1).
Fun
c~
ao InsereAmigo
Essa func
ao s
o realiza operacoes O(1) que e insercao de celula e troca de
apontadores, logo a func
ao e O(1)
Fun
c~
ao iniciarAmizade
Essa func
ao utiliza a funcao anterior que e O(1) duas vezes, logo sua
ordem de complexidade total tambem e O(1).
Fun
c~
ao verAmigos
Essa func
ao tem uma complexidade dependente do n
umero de amigos
que um usu
ario pode fazer, porem, considerando o pior caso, ele pode ser
amigo de todos os outros usuarios. Dessa forma para n usuarios a funcao
para visualizar amigos imprime n 1 vezes, como imprimir e O(1) a complexidade da func
ao seria (n 1)O(1) que e O(n).
Fun
c~
ao cancelarAmizade1
Essa func
ao busca na lista de amigos do user1 o user2 atraves do id e
dessa forma exclui essa celula da lista de amigos.
No pior caso user1 e amigo de todos os outros n 1 usuarios, e na busca
do id, pode acontecer do o amigo com o id procurado seja o u
ltimo da lista,
e assim, realiza n 1 comparacoes. Dessa forma a busca do id e O(n), como
todas as outras ac
oes s
ao O(1), a complexidade da funcao e O(n).
Fun
c~
ao cancelarAmizade
9

Essa func
ao chama a funcao anterior duas vezes, para que user2 nao
conste na lista de amigos de user1 e vice versa. Logo no pior caso, temos
duas chamadas de uma funcao O(n), dessa forma a funcao em si continua
sendo O(n).
Fun
c~
ao insereMensagem
Essa func
ao apenas insere uma mensagem no fim da Timeline de um
usu
ario, e inicializa o n
umero de curtidas da mesma como 0, realizando
assim apenas operac
oes O(1).
Dessa forma a ordem de complexidade dessa funcao e O(1).
Fun
c~
ao postarMensagem
Essa func
ao adiciona uma mensagem na Timeline do usuario que a postou e tambem, na Timeline de todos os seus amigos.
No pior caso, um usu
ario tem n 1 amigos, e logo a acao de postar mensagem gera n inserc
oes, dessa forma a funcao tem ordem de complexidade
de O(n).
Fun
c~
ao exibirTimeline
Como a Timeline de um usuario a princpio nao depende diretamente
do n
umero de usu
arios na Rede Social, foi usado como variavel de entrada
o n
umero de mensagens da Timeline.
Dessa forma, para exibir a Timeline de um usuario, considerando m
mensagens, s
ao feitas m impressoes, e entao a complexidade da funcao e
O(m).
Fun
c~
ao atualizaMensagem
Essa func
ao tambem possui uma complexidade baseada no n
umero de
mensagens de uma determinada Timeline.
Sendo m mensagens existentes na Timeline, no pior caso a mensagem a
ser atualizada est
a na u
ltima posicao, as operacoes de remocao e insercao
s
ao O(1), logo a busca e consequentemente a funcao e O(m).
Fun
c~
ao curtirMensagem

10

Essa func
ao atualiza uma mensagem na Timeline do usuario que curtiu,
e na Timeline de todos os seus amigos.
No pior caso a complexidade seria O(n), pois seriam atualizacoes em n
usu
arios, porem essa func
ao faz uso da funcao anterior que possui complexidade indeterminada. Se a complexidade de atualizaMensagem fosse O(1),
a complexidade da func
ao seria O(n).
Fun
c~
ao escolheAcao
Essa func
ao faz o papel de decisao pra escolher a acao a ser tomada
dentre a maioria das func
oes anteriores, considerando que foi escolhida a
func
ao que possui complexidade de ordem maior.
Por exemplo a func
ao postarMensagem, que e O(n), Dessa forma as
outras ac
oes s
ao O(1) e assim a funcao escolheAcao teria ordem de complexidade O(n).
Fun
c~
ao *leArquivo
A complexidade da funcao depende do n
umero de usuarios a serem includos na rede social e tambem do n
umero de acoes. A rigor nao e possvel
saber o n
umero de ac
oes que podem ocorrer, porem no pior caso todas as
func
oes acima s
ao O(n) ou O(m). Dessa forma para um n
umero constante
de ac
oes, a complexidade da funcao e O(n) se n > m.

Compila
c
ao e Execuc
ao

O c
odigo est
a dividido em tres arquivos principais, funcoes.h e funcoes.c
implementam o Tipo Abstrato de Dados, enquanto main.c implementa o
programa principal.
O c
odigo foi criado no CodeBlocks 16.01 no sistema operacional Windows
10, para execut
a-lo pode ser usado o proprio ambiente.

Conclus
ao

O trabalho pr
atico foi bastante desafiador e trabalhoso, porem com o uso
de TADs e Listas, a tarefa foi mais facilmente executada. Ler o arquivo .txt
rendeu um bom trabalho pois eu utilizava a funcao fscanf que se mostrou
ineficiente, ap
os descobrir o uso da funcao fgets e strtok, tudo foi mais
facilmente resolvido.

11

Necessitou tambem bastante reflexao a criacao das funcoes curtirMensagem e postarMensagem, pois o nvel de profundidade de busca e os loops
foram um pouco nebulosos de serem implementados.

Bibliografia

Muitas func
oes foram melhor entendidas e implementadas com o auxlio
das fontes abaixo:
www.stackoverflow.com
www.cprogressivo.net
www.tutorialspoint.com

12