Commit 7d972899 authored by André Machado's avatar André Machado

Todos os erros corrigidos

Necessário apenas formatar a saída
parent 314dd865
*~
*.o
/bcnf
/teste.in
/teste.out
/testes/
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.
......
......@@ -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;
}
......
#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);
......@@ -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){
uint 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment