Skip to content

Commit c7eae0f

Browse files
committed
commit
1 parent 0e4474c commit c7eae0f

File tree

4 files changed

+314
-0
lines changed

4 files changed

+314
-0
lines changed

MT_2/PROG2_1819_MT2/prob1/ex1.1

21.6 KB
Binary file not shown.

MT_2/PROG2_1819_MT2/prob1/ex1.1.c

+228
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <string.h>
4+
#include "heap.h"
5+
#include "tabdispersao.h"
6+
7+
char *get_freguesia(char *rua);
8+
9+
// ------------ a implementar ----------------
10+
//1.1
11+
// Adiciona a casa comercial de nome designacao e atividade comercial atividade na tabela comercio_zona.
12+
// Se a casa comercial a inserir possui atividade ainda nao presente na zona (nao existe em atividades_zona),
13+
// esta atividade é inserida na tabela atividades_zona e a classe da casa comercial é �top�.
14+
// Caso contrario, a classe é �normal�.
15+
// A funcao retorna 0 se a casa comercial ja existe ou 1 se nao.
16+
int adiciona_comercio(char *designacao, char *atividade, tabela_dispersao *comercio_zona,
17+
tabela_dispersao *atividades_zona)
18+
{
19+
if (!designacao || !atividade || !comercio_zona || !atividades_zona)
20+
{
21+
return -1;
22+
}
23+
if (tabela_valor(comercio_zona, designacao)!=NULL)
24+
{
25+
return 0;
26+
}
27+
if (tabela_valor(atividades_zona, atividade)!=NULL)
28+
{
29+
if (tabela_insere(comercio_zona, designacao, "normal")!=TABDISPERSAO_OK)
30+
{
31+
return -1;
32+
}
33+
34+
}
35+
else{
36+
if (tabela_insere(comercio_zona, designacao, "top")!=TABDISPERSAO_OK)
37+
{
38+
return -1;
39+
}
40+
if (tabela_insere(atividades_zona, atividade, atividade)!=TABDISPERSAO_OK)
41+
{
42+
return -1;
43+
}
44+
45+
}
46+
return 1;
47+
}
48+
49+
// ------------ a implementar ----------------
50+
// 1.2
51+
// remove a rua com menor numero de casas comerciais na freguesia freg da heap ruas
52+
// retorna essa string
53+
// retorna NULL em caso de erro
54+
char *remove_rua_menos_comercio(heap *ruas, char *freg)
55+
{
56+
if (!ruas || !freg)
57+
{
58+
return NULL;
59+
}
60+
heap *h_aux=heap_nova(ruas->tamanho);
61+
if (!h_aux)
62+
{
63+
return NULL;
64+
}
65+
int tam=heap_num_elementos(ruas);
66+
int min=__INT8_MAX__;
67+
char *res;
68+
for (int i = 1; i < tam+1; i++)
69+
{
70+
if (strcmp(freg, get_freguesia(ruas->elementos[1]->valor))==0 && min>ruas->elementos[1]->prioridade)
71+
{
72+
res=heap_remove(ruas);
73+
min=ruas->elementos[1]->prioridade;
74+
}
75+
else{
76+
heap_insere(h_aux, ruas->elementos[1]->valor, ruas->elementos[1]->prioridade);
77+
heap_remove(ruas);
78+
}
79+
}
80+
int tam2=heap_num_elementos(h_aux);
81+
for (int i = 1; i < tam2+1; i++)
82+
{
83+
heap_insere(ruas, h_aux->elementos[1]->valor, h_aux->elementos[1]->prioridade);
84+
heap_remove(h_aux);
85+
}
86+
heap_apaga(h_aux);
87+
h_aux=NULL;
88+
return res;
89+
}
90+
91+
// ------------ a completar ----------------
92+
//1.3
93+
/*Comentar a complexidade da funcao 1.2
94+
95+
96+
*/
97+
98+
/********************************************************************/
99+
/********************************************************************/
100+
// retorna referencia para a substring nome_freguesia na string "nome_rua_nome_freguesia"
101+
char *get_freguesia(char *rua)
102+
{
103+
char *b;
104+
b = strchr(rua, '_') + 1;
105+
return b;
106+
}
107+
108+
void verifica_valor(tabela_dispersao *td, char *ch, char *v)
109+
{
110+
int n = 0;
111+
objeto *vtab;
112+
vtab = tabela_elementos(td, &n);
113+
for (int i = 0; i < n; i++)
114+
{
115+
if (strcmp(vtab[i].chave, ch) == 0)
116+
{
117+
if (strcmp(vtab[i].valor, v) != 0)
118+
printf("\nERRO - %s deveria ser classe '%s'\n", ch, v);
119+
break;
120+
}
121+
}
122+
free(vtab);
123+
}
124+
125+
void teste_adiciona_comercio()
126+
{
127+
tabela_dispersao *comercio = tabela_nova(101, hash_djbm);
128+
tabela_dispersao *atividades = tabela_nova(47, hash_djbm);
129+
130+
char nome[30], ativ[30];
131+
int res = 0;
132+
strcpy(nome, "Casa comercial Desp1");
133+
strcpy(ativ, "Desporto");
134+
res = adiciona_comercio(nome, ativ, comercio, atividades);
135+
if (res == 1)
136+
printf("\nCasa comercial adicionada com sucesso: %s\n", nome);
137+
else
138+
printf("\nERRO - Casa comercial nao adicionada: %s\n", nome);
139+
verifica_valor(comercio, nome, "top");
140+
141+
strcpy(nome, "Casa comercial Desp2");
142+
strcpy(ativ, "Desporto");
143+
res = adiciona_comercio(nome, ativ, comercio, atividades);
144+
if (res == 1)
145+
printf("\nCasa comercial adicionada com sucesso: %s\n", nome);
146+
else
147+
printf("\nERRO - Casa comercial no adicionada: %s\n", nome);
148+
149+
strcpy(nome, "Casa comercial Ocul1");
150+
strcpy(ativ, "Oculista");
151+
res = adiciona_comercio(nome, ativ, comercio, atividades);
152+
if (res == 1)
153+
printf("\nCasa comercial adicionada com sucesso: %s\n", nome);
154+
else
155+
printf("\nERRO - Casa comercial nao adicionada: %s\n", nome);
156+
verifica_valor(comercio, nome, "top");
157+
158+
strcpy(nome, "Casa comercial Desp2");
159+
strcpy(ativ, "Desporto");
160+
res = adiciona_comercio(nome, ativ, comercio, atividades);
161+
if (res == 1)
162+
printf("\nERRO - Casa comercial ja existente, adicionada erradamente: %s\n", nome);
163+
verifica_valor(comercio, nome, "normal");
164+
165+
if (tabela_numelementos(atividades) == 2)
166+
printf("\nTabela 'atividades_zona' tem 2 elementos - ok\n");
167+
else
168+
printf("\nERRO - Tabela 'atividades_zona' deveria ter 2 elementos\n");
169+
if (tabela_numelementos(comercio) == 3)
170+
printf("\nTabela 'comercio_zona' tem 3 elementos - ok\n");
171+
else
172+
printf("\nERRO - Tabela 'comercio_zona' deveria ter 3 elementos\n");
173+
174+
tabela_apaga(comercio);
175+
tabela_apaga(atividades);
176+
}
177+
178+
heap *init_ruas_comercio()
179+
{
180+
heap *h = heap_nova(20);
181+
if (!h)
182+
return NULL;
183+
heap_insere(h, "Rua do Amial_Paranhos", 14);
184+
heap_insere(h, "Rua Dom Joao IV_Bonfim", 20);
185+
heap_insere(h, "Rua Pinto Bessa_Bonfim", 5);
186+
heap_insere(h, "Rua da Telheira_Paranhos", 7);
187+
heap_insere(h, "Rua do Campo Lindo_Paranhos", 13);
188+
heap_insere(h, "Rua Latino Coelho_Bonfim", 12);
189+
heap_insere(h, "Rua do Vale Formoso_Paranhos", 18);
190+
heap_insere(h, "Rua de Augusto Lessa_Paranhos", 10);
191+
heap_insere(h, "Rua Sao Roque da Lameira_Campanha", 17);
192+
return h;
193+
}
194+
195+
void teste_rua_menos_comercio()
196+
{
197+
heap *ruas_porto = init_ruas_comercio();
198+
char *rua1;
199+
rua1 = remove_rua_menos_comercio(ruas_porto, "Paranhos");
200+
201+
if (rua1 != NULL)
202+
printf("\nRua com menos comercio em Paranhos: %s\n", rua1);
203+
else
204+
printf("\nERRO: existem ruas com casas comerciais na freguesia de Paranhos\n");
205+
206+
rua1 = remove_rua_menos_comercio(ruas_porto, "Bonfim");
207+
if (rua1 != NULL)
208+
printf("\nRua com menos comercio em Bonfim: %s\n", rua1);
209+
else
210+
printf("\nERRO: existem ruas com casas comerciais na freguesia de Bonfim\n");
211+
212+
rua1 = remove_rua_menos_comercio(ruas_porto, "Se");
213+
if (rua1 == NULL)
214+
printf("\nNao existem ruas comerciais na freguesia da Se\n");
215+
else
216+
printf("\nERRO: nao existem ruas com casas comerciais na freguesia da Se\n");
217+
218+
printf("\nRUAS:\n");
219+
heap_imprime(ruas_porto, 1);
220+
heap_apaga(ruas_porto);
221+
}
222+
223+
int main()
224+
{
225+
teste_adiciona_comercio();
226+
teste_rua_menos_comercio();
227+
return 1;
228+
}

MT_2/PROG2_1819_MT2/prob2/ex2.2

21.5 KB
Binary file not shown.

MT_2/PROG2_1819_MT2/prob2/ex2.2.c

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <string.h>
4+
#include "grafo.h"
5+
#include "avl.h"
6+
7+
//2.1
8+
//Sugere ao utilizador u um conjunto de amizades, que sao:
9+
//amigos dos amigos do utilizador u que ainda nao sao amigos deste.
10+
//Retorna as sugestoes numa arvore avl.
11+
//Em caso de erro retorna NULL (grafo nao existe ou utilizador u nao existe)
12+
arvore_avl *sugestao_amizade(grafo *g, int u)
13+
{
14+
if (g == NULL || u < 0 || u > g->tamanho)
15+
return NULL;
16+
int n, n_aux;
17+
int *vec = grafo_adjacentes(g, u, &n);
18+
int *v_aux;
19+
arvore_avl *avl = avl_nova();
20+
if (!avl)
21+
{
22+
return NULL;
23+
}
24+
25+
for (int i = 0; i < n; i++)
26+
{
27+
v_aux = grafo_adjacentes(g, vec[i], &n_aux);
28+
for (int j = 0; j < n_aux; j++)
29+
{
30+
if (grafo_aresta(g, u, v_aux[j]) == 0 && u != v_aux[j])
31+
{
32+
avl_insere(avl, v_aux[j]);
33+
}
34+
}
35+
}
36+
37+
return avl;
38+
}
39+
40+
/********************************************************************/
41+
/********************************************************************/
42+
grafo *init_rede()
43+
{
44+
grafo *g = grafo_novo(10, NAODIRECIONADO);
45+
if (!g)
46+
return NULL;
47+
grafo_adiciona(g, 1, 2);
48+
grafo_adiciona(g, 1, 3);
49+
grafo_adiciona(g, 2, 3);
50+
grafo_adiciona(g, 2, 4);
51+
grafo_adiciona(g, 2, 5);
52+
grafo_adiciona(g, 3, 5);
53+
grafo_adiciona(g, 3, 6);
54+
grafo_adiciona(g, 3, 7);
55+
grafo_adiciona(g, 7, 6);
56+
return g;
57+
}
58+
59+
int main()
60+
{
61+
grafo *rede = init_rede();
62+
arvore_avl *sugestoes = NULL;
63+
64+
sugestoes = sugestao_amizade(rede, 2);
65+
if (sugestoes == NULL)
66+
printf("\nUtilizador '2' ou rede nao existe\n");
67+
else
68+
{
69+
printf("\nSugestoes de amizade para '2': ");
70+
avl_imprime(sugestoes);
71+
avl_apaga(sugestoes);
72+
}
73+
74+
sugestoes = sugestao_amizade(rede, 12);
75+
if (sugestoes == NULL)
76+
printf("\nUtilizador '12' ou rede nao existe\n");
77+
else
78+
{
79+
printf("\nSugestoes de amizade para '9': ");
80+
avl_imprime(sugestoes);
81+
avl_apaga(sugestoes);
82+
}
83+
84+
grafo_apaga(rede);
85+
return 1;
86+
}

0 commit comments

Comments
 (0)