Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
B
Boyce-Codd
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
André Machado
Boyce-Codd
Commits
7d972899
Commit
7d972899
authored
Apr 21, 2015
by
André Machado
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Todos os erros corrigidos
Necessário apenas formatar a saída
parent
314dd865
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
57 additions
and
58 deletions
+57
-58
.gitignore
.gitignore
+3
-0
Makefile
Makefile
+1
-1
listas.c
listas.c
+6
-4
listas.h
listas.h
+7
-9
trabalho1.c
trabalho1.c
+40
-44
No files found.
.gitignore
View file @
7d972899
*~
*.o
/bcnf
/teste.in
/teste.out
/testes/
Makefile
View file @
7d972899
msg
=
echo
programa compilado com sucesso.
bcnf
:
trabalho1.c listas.o
gcc
-o
bcnf trabalho1.c listas.o
-I
.
gcc
-o
bcnf trabalho1.c listas.o
-
g
-
I
.
listas.o
:
gcc
-c
listas.c
-I
.
...
...
listas.c
View file @
7d972899
...
...
@@ -3,7 +3,7 @@
void
cria_lDF_vazia
(
lDF
*
lista
){
lista
->
inicio
=
(
apDF
)
malloc
(
sizeof
(
noDF
));
lista
->
fim
=
lista
->
inicio
;
lista
->
inicio
->
prox
=
NULL
;
lista
->
fim
->
prox
=
NULL
;
return
;
}
...
...
@@ -16,8 +16,10 @@ void insere_no_lDF(lDF *lista, apDF no){
apDF
cria_no_DF
(){
apDF
no
=
(
apDF
)
malloc
(
sizeof
(
noDF
));
cria_lAtt_vazia
(
&
(
no
->
df
.
X
));
cria_lAtt_vazia
(
&
(
no
->
df
.
Y
));
no
->
X
=
(
lAtt
*
)
malloc
(
sizeof
(
lAtt
));
no
->
Y
=
(
lAtt
*
)
malloc
(
sizeof
(
lAtt
));
cria_lAtt_vazia
(
no
->
X
);
cria_lAtt_vazia
(
no
->
Y
);
no
->
prox
=
NULL
;
return
no
;
}
...
...
@@ -25,7 +27,7 @@ apDF cria_no_DF(){
void
cria_lAtt_vazia
(
lAtt
*
lista
){
lista
->
inicio
=
(
apAtt
)
malloc
(
sizeof
(
noAtt
));
lista
->
fim
=
lista
->
inicio
;
lista
->
inicio
->
prox
=
NULL
;
lista
->
fim
->
prox
=
NULL
;
return
;
}
...
...
listas.h
View file @
7d972899
#include<stdlib.h>
#include<stdio.h>
#define TAM_ATT 20
...
...
@@ -12,23 +13,20 @@ typedef struct lAtt{
apAtt
inicio
,
fim
;
}
lAtt
,
relacao
;
//DF no formato X->Y
typedef
struct
DF
{
lAtt
X
;
//lista de atributos
lAtt
Y
;
//lista de atributos
}
DF
;
typedef
struct
noDF
*
apDF
;
typedef
struct
noDF
{
DF
df
;
lAtt
*
X
;
//lista de atributos
lAtt
*
Y
;
//lista de atributos
apDF
prox
;
}
noDF
;
typedef
struct
lDF
{
apDF
inicio
,
fim
;
}
lDF
;
void
cria_lDF_vazia
(
lDF
*
);
void
insere_no_lDF
(
lDF
*
,
apDF
);
void
cria_lAtt_vazia
(
lAtt
*
);
void
cria_lDF_vazia
(
lDF
*
);
void
insere_no_lDF
(
lDF
*
,
apDF
);
void
cria_lAtt_vazia
(
lAtt
*
);
apAtt
cria_no_Att
();
apDF
cria_no_DF
();
void
insere_no_lAtt
(
lAtt
*
,
apAtt
);
void
insere_no_lAtt
(
lAtt
*
,
apAtt
);
void
remove_prox_no_lAtt
(
apAtt
);
trabalho1.c
View file @
7d972899
...
...
@@ -5,14 +5,14 @@
#define FALSE 0
void
decompoe
(
relacao
*
,
apDF
,
uint
);
int
contem
(
relacao
,
char
[]
);
int
contem
(
relacao
,
char
*
);
relacao
*
cria_superR
(
lDF
);
void
imprime_relacao
(
relacao
,
uint
);
void
le_nome
(
char
[],
char
);
void
le_nome
(
atributo
,
char
*
);
void
decompoe
(
relacao
*
r0
,
apDF
dependencia
,
uint
id
){
apAtt
att
,
aux
,
aux2
;
relacao
r1
;
relacao
*
r1
=
(
relacao
*
)
malloc
(
sizeof
(
relacao
))
;
//se não existem mais dependencias e id != 0:
if
((
dependencia
->
prox
==
NULL
)
&&
(
id
!=
0
))
//imprime a relacao
...
...
@@ -21,24 +21,24 @@ void decompoe(relacao *r0, apDF dependencia, uint id){
else
if
(
dependencia
->
prox
!=
NULL
){
//decompoe
//cria nova relacao
cria_lAtt_vazia
(
&
r1
);
cria_lAtt_vazia
(
r1
);
//insere os elementos de X e de Y
for
(
att
=
dependencia
->
df
.
X
.
inicio
->
prox
;
att
!=
NULL
;
att
=
att
->
prox
){
for
(
att
=
dependencia
->
X
->
inicio
->
prox
;
att
!=
NULL
;
att
=
att
->
prox
){
aux
=
cria_no_Att
();
sprintf
(
aux
->
nome
,
"%s"
,
att
->
nome
);
insere_no_lAtt
(
&
r1
,
aux
);
insere_no_lAtt
(
r1
,
aux
);
}
//também remove os elementos de Y da super relacao
for
(
att
=
dependencia
->
df
.
Y
.
inicio
->
prox
;
att
!=
NULL
;
att
=
att
->
prox
){
for
(
att
=
dependencia
->
Y
->
inicio
->
prox
;
att
!=
NULL
;
att
=
att
->
prox
){
aux
=
cria_no_Att
();
sprintf
(
aux
->
nome
,
"%s"
,
att
->
nome
);
insere_no_lAtt
(
&
r1
,
aux
);
insere_no_lAtt
(
r1
,
aux
);
for
(
aux2
=
r0
->
inicio
;
aux2
->
prox
!=
NULL
;
aux2
=
aux2
->
prox
)
if
(
strcmp
(
aux2
->
prox
->
nome
,
att
->
nome
)
==
0
)
remove_prox_no_lAtt
(
aux2
);
}
//imprime a nova relacao na BCNF
imprime_relacao
(
r1
,
id
+
1
);
imprime_relacao
(
*
r1
,
id
+
1
);
//se existem atributos que não estao na dependencia
//if()//implementar isto!
//chama a função para a proxima dependencia.
...
...
@@ -48,44 +48,47 @@ void decompoe(relacao *r0, apDF dependencia, uint id){
/*
Função que verifica se uma relação contém um atributo
*/
int
contem
(
relacao
r
,
char
atributo
[]){
apAtt
att
;
int
contem
(
relacao
r
,
char
*
atributo
){
/* apAtt att;
printf("contém? %s\n", atributo);
fflush(stdout);
for(att=r.inicio->prox;att!=NULL;att=att->prox)
if(strcmp(att->nome, atributo)==0)
return TRUE;
*/
return
FALSE
;
}
/*
Função que cria a super relação que contém todos os atributos.
*/
*//*
relacao *cria_superR(lDF lista_DF){
relacao
*
r
;
relacao r;
apAtt no;
cria_lAtt_vazia(r);
apDF df;
apAtt att;
for(df=lista_DF.inicio->prox;df!=NULL;df=df->prox){
//caminha pela lista de dependencias funcionais
for
(
att
=
df
->
df
.
X
.
inicio
->
prox
;
att
!=
NULL
;
att
=
att
->
prox
){
for(att=df->X.inicio->prox;att!=NULL;att=att->prox){
//copia os atributos de X
if
(
!
contem
(
*
r
,
att
->
nome
)){
if(!contem(r, att->nome)){
no = cria_no_Att();
sprintf(no->nome,"%s",att->nome);
insere_no_lAtt(r, no);
}
}
for
(
att
=
df
->
df
.
Y
.
inicio
->
prox
;
att
!=
NULL
;
att
=
att
->
prox
){
for(att=df->Y.inicio->prox;att!=NULL;att=att->prox){
//copia os atributos de Y
if
(
!
contem
(
*
r
,
att
->
nome
)){
if(!contem(r, att->nome)){
no = cria_no_Att();
sprintf(no->nome,"%s",att->nome);
insere_no_lAtt(r, no);
}
}
}
return
r
;
}
return
*
r;
}*/
/*
Saída do programa.
...
...
@@ -105,15 +108,16 @@ Retornará o primeiro caracter após o nome.
Por padrão, esse caracter será:
',', '-' ou '\n'
*/
void
le_nome
(
char
nome
[],
char
terminador
){
u
int
i
=
0
;
void
le_nome
(
atributo
nome
,
char
*
terminador
){
int
i
=
0
;
do
{
nome
[
i
]
=
getchar
();
if
((
nome
[
i
]
<
'A'
)
||
((
nome
[
i
]
>
'Z'
)
&&
(
nome
[
i
]
<
'a'
))
||
(
nome
[
i
]
>
'z'
)){
terminador
=
nome
[
i
];
*
terminador
=
nome
[
i
];
nome
[
i
]
=
'\0'
;
}
}
while
(
nome
[
i
]
!=
'\0'
);
++
i
;
}
while
(
nome
[
i
-
1
]
!=
'\0'
);
return
;
}
...
...
@@ -128,31 +132,23 @@ void insere_na_Relacao(char atributo[], relacao *r){
}
int
main
(){
lDF
lista_DF
;
lDF
*
lista_DF
=
(
lDF
*
)
malloc
(
sizeof
(
lDF
))
;
apDF
no_DF
;
apAtt
atributo
;
relacao
*
R0
;
relacao
*
R0
=
(
relacao
*
)
malloc
(
sizeof
(
relacao
));
cria_lAtt_vazia
(
R0
);
char
terminador
;
//criação da lista de dependencias
cria_lDF_vazia
(
&
lista_DF
);
//Leitura da entrada:
//enquanto não encontrar o fim da entrada
cria_lDF_vazia
(
lista_DF
);
do
{
//leia a relação:
//cria um nodo
no_DF
=
cria_no_DF
();
//le a relacao
//faça
do
{
//cria no de atributo
atributo
=
cria_no_Att
();
//le atributo
le_nome
(
atributo
->
nome
,
terminador
);
if
(
!
contem
(
*
R0
,
atributo
->
nome
))
le_nome
(
atributo
->
nome
,
&
terminador
);
//if(!contem(*R0, atributo->nome))
insere_na_Relacao
(
atributo
->
nome
,
R0
);
//insere na lista X
insere_no_lAtt
(
&
no_DF
->
df
.
X
,
atributo
);
//enquanto encontrar virgula
insere_no_lAtt
(
no_DF
->
X
,
atributo
);
}
while
(
terminador
==
','
);
//le seta
getchar
();
...
...
@@ -161,19 +157,19 @@ int main(){
//cria no de atributo
atributo
=
cria_no_Att
();
//le atributo
le_nome
(
atributo
->
nome
,
terminador
);
if
(
!
contem
(
*
R0
,
atributo
->
nome
))
le_nome
(
atributo
->
nome
,
&
terminador
);
//
if(!contem(*R0, atributo->nome))
insere_na_Relacao
(
atributo
->
nome
,
R0
);
//insere na lista Y
insere_no_lAtt
(
&
no_DF
->
df
.
Y
,
atributo
);
insere_no_lAtt
(
no_DF
->
Y
,
atributo
);
//enquanto encontrar virgula
}
while
(
terminador
==
','
);
//insere o nodo na lista
insere_no_lDF
(
&
lista_DF
,
no_DF
);
insere_no_lDF
(
lista_DF
,
no_DF
);
}
while
(
terminador
!=
EOF
);
//Processamento & impressões
R0
=
cria_superR
(
lista_DF
);
decompoe
(
R0
,
lista_DF
.
inicio
->
prox
,
0
);
//
R0 = cria_superR(lista_DF);
decompoe
(
R0
,
lista_DF
->
inicio
->
prox
,
0
);
return
0
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment