📄 yacc36.y
字号:
}
int insert(char *name4,char *id3)
{
int h=0;
chaine *courant1;
while(table_name[h].name!=NULL)
{
if (strcmp(name4,table_name[h].name)==0)
{
courant1=table_name[h].point;
while(courant1->suiv!=NULL)
courant1=courant1->suiv;
table_id=(chaine *)malloc(225*sizeof(chaine));
table_id->id=id3;
table_id->suiv=NULL;
courant1->suiv=table_id;
return comp_nom;
}
else
h++;
}
if (table_name[h].name==NULL)
{
table_name[h].name=name4;
comp_nom++;
table_id=(chaine *)malloc(225*sizeof(chaine));
table_id->id=id3;
table_id->suiv=NULL;
table_name[h].point=table_id;
}
return comp_nom;
}
creation_table()
{
int i=0;
char *name3;
chaine *courant1;
table_name=(struct t_name *)malloc(225*sizeof(struct t_name));
for(i=0;i<nb_personne;i++)
{
name3=link_string(personne[i].prenom,personne[i].nom);
comp_nom=insert(name3,personne[i].id);
}
}
void generer_genealogie(int size)
{
int i,num2,num3;
int pass;
geneal temp;
char str3[10],*name4;;
for (pass=1;pass<size;pass++)
{
for (i=0;i<size-pass;i++)
{
if (gene[i].val>gene[i+1].val)
{
temp=gene[i];
gene[i]=gene[i+1];
gene[i+1]=temp;
}
}
}
for(i=0;i<size;i++)
{
sprintf(str3, "%d", i+1);
if (strcmp(str3,"1")==0)
{
strcat(str3,"er");
}
else
{
strcat(str3,"e");
}
num2=cherche_donnee(gene[i].id);
name4=link_string(personne[num2].prenom,personne[num2].nom);
name4=link_string(name4,str3);
personne[num2].note=name4;
}
}
cherche_gene(int num2)
{
char *tempo,*name3;
int i,k;
if(personne[num2].date_naissance!=NULL)
{
name3=link_string(personne[num2].prenom,personne[num2].nom);
name3=link_string(name3,personne[num2].date_naissance);
personne[num2].note=name3;
}
else
{
gene[compt].id=personne[num2].id;
gene[compt].val=0;
while (personne[num2].fam_parents!=NULL)
{
k=0;
while((strcmp(personne[num2].fam_parents,head_node[k].id_fam)!=0)&&(k<nb_node))
{
k++;
}
gene[compt].val++;
tempo=head_node[k].vertex;
num2=cherche_donnee(tempo);
}
compt++;
}
}
main()
{
int i=0,j,total_ligne;
int comp2=0,num1;
FILE *file_prolog,*fp;
char *pers1,*pers2,*tempo;
char *name1,*name2,*name3;
rela *courant;
chaine *courant2;
yyparse();
total_ligne=comp;
personne=(struct donnee *)malloc(225*sizeof(struct donnee));
head_node=(struct head *)malloc(225*sizeof(struct head));
for(i=0;i<total_ligne;i++)
{
if (strcmp(line_gedcom[i].iden,"INDI")==0) /*creer les informations de personnes*/
{
personne[num_personne].id=line_gedcom[i].refe;
i++;
i=creation_personne(i); /* retourne la ligne de line_gedcom*/
i--;
num_personne++;
}
if (strcmp(line_gedcom[i].iden,"FAM")==0)/*creer graphe*/
{
head_node[num_node].id_fam=line_gedcom[i].refe;
i++;
i=creation_graphe(i);
i--;
num_node++;
}
}
nb_node=num_node;
/*---creer une table ----*/
nb_personne=num_personne;
creation_table();
/*---chercher les personnes de meme nom ---*/
gene=(geneal *)malloc(225*sizeof(geneal));
for(i=0;i<comp_nom;i++)
{
compt=0;
if (table_name[i].point->suiv!=NULL)
{
courant2=table_name[i].point;
while(courant2->suiv!=NULL)
{
num1=cherche_donnee(courant2->id);
comp2=cherche_gene(num1);
courant2=courant2->suiv;
}
num1=cherche_donnee(courant2->id);
cherche_gene(num1);
generer_genealogie(compt);
} //
}
/*-----------------------------------------partie de prolog-----------------------------------*/
fp=fopen("file_prolog.pl","a+");
if(fp==NULL)
{
printf("erreur d'ouverture de la fichier 'prolog'");
exit(2);
}
nb_personne=num_personne;
num_personne=0;
nb_node=num_node;
/*----------------------creer 'homme()'-----------------------*/
for(num_personne=0;num_personne<nb_personne;num_personne++)
{
if((personne[num_personne].sex!=NULL)&&(strcmp(personne[num_personne].sex,"M")==0))
{
if((personne[num_personne].note)==NULL)
fprintf(fp,"%s %s %s %s %s\n","homme(",personne[num_personne].prenom," ",personne[num_personne].nom,").");
else
fprintf(fp,"%s %s %s\n","homme(",personne[num_personne].note,").");
}
}
/*-----------------------creer 'mari()' et 'pere()'------------------*/
for (num_node=0;num_node<nb_node;num_node++)
{
pers1=head_node[num_node].vertex;
j=cherche_donnee(pers1);
if((personne[j].note)==NULL)
name1=link_string(personne[j].prenom,personne[j].nom);
else
name1=personne[j].note;
pers2=head_node[num_node].firstnode->id;
j=cherche_donnee(pers2);
if((personne[j].note)==NULL)
name2=link_string(personne[j].prenom,personne[j].nom);
else
name2=personne[j].note;
if (strcmp(head_node[num_node].firstnode->relation,"WIFE")==0)
{
fprintf(fp,"%s %s %s %s %s\n","mari(",name1,",",name2,").");
courant=(rela *)malloc (225*sizeof(rela));
courant=head_node[num_node].firstnode;
while (courant->suiv!=NULL)
{ courant=courant->suiv;
if (strcmp(courant->relation,"CHIL")==0)
{
pers2=courant->id;
j=cherche_donnee(pers2);
if((personne[j].note)==NULL)
name2=link_string(personne[j].prenom,personne[j].nom);
else
name2=personne[j].note;
fprintf(fp,"%s %s %s %s %s\n","pere(",name1,",",name2,").");
}
}
}
if (strcmp(head_node[num_node].firstnode->relation,"CHIL")==0)
{
courant=(rela *)malloc (225*sizeof(rela));
courant=head_node[num_node].firstnode;
fprintf(fp,"%s %s %s %s %s\n","pere(",name1,",",name2,").");
while (courant->suiv!=NULL)
{ courant=courant->suiv;
if (strcmp(courant->relation,"CHIL")==0)
{
pers2=courant->id;
j=cherche_donnee(pers2);
if((personne[j].note)==NULL)
name2=link_string(personne[j].prenom,personne[j].nom);
else
name2=personne[j].note;
fprintf(fp,"%s %s %s %s %s\n","pere(",name1,",",name2,").");
}
}
}
}
fprintf(fp,"
femme(F) :- mari(_,F).
femme(F) :- pere(_,F), not(homme(F)),not(mari(_,F)).
mere(M,E) :- pere(P,E),mari(P,M).
mere(X) :- mere(X,_).
pere(X) :- pere(X,_).
enfant(E,P) :- pere(P,E).
enfant(E,M) :- mere(M,E).
enfant(X) :- enfant(X,_).
descendant(D,A) :- enfant(D,A).
descendant(D,A) :- enfant(D,X),descendant(D,X).
aff :- homme(X),write('Homme : '),write(X),nl,fail.
aff :- femme(X),write('Femme : '),write(X),nl,fail.
aff :- pere(X),write('Pere : '),write(X),nl,fail.
aff :- mere(X),write('Mere : '),write(X),nl,fail.
aff :- enfant(X),write('Enfant : '),write(X),nl,fail.
aff :- descendant(D,A),write(D),write(' descend de '),write(X),nl,fail.");
fclose(fp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -