en langage c et je dois comprendre un code portant sur la methode des concensus.Mais le probleme c'est que mes bases sont "faibles" c'est pour cela que je fais appel a vous ainsi je pourrai mieux comprendre ce langage et ce programme.Si il vous est possible d'inserer des commentaires sur le code a chaque ligne/groupe de ligne(hormis include ou printf ...)
#include<stdio.h>
#include<stdlib.h>
struct elementliste{
int *valeur;
struct elementliste *suivant,*precedent;
};
typedef struct elementliste ElementListe, *Liste;
typedef struct file{
Liste premier;
Liste dernier;
int longueur;
} *MONOMES;
MONOMES creerFileVide()
{
MONOMES f=(MONOMES)malloc(sizeof(struct file));
Liste elt=(Liste)malloc(sizeof(ElementListe));
elt->suivant=NULL;
elt->precedent=NULL;
f->premier=elt;
f->dernier=elt;
f->longueur=0;
return f;
}
MONOMES enfile(MONOMES f, int *x)
{
Liste elt=f->dernier;
elt->valeur=x;
Liste elt_suiv=(Liste)malloc(sizeof(ElementListe));
elt_suiv->suivant=NULL;
elt_suiv->precedent=elt;
elt->suivant=elt_suiv;
f->dernier=elt_suiv;
f->longueur++;
return f;
}
MONOMES defile(MONOMES f, Liste a)
{
a->precedent->suivant=a->suivant;
a->suivant->precedent=a->precedent;
free(a);
return f;
}
/*
a=1
!a=-1
sinon 0
*/
int *creerConsensus(int nb, int* A, int* B)
{
int i,diff=0;
int *res=(int*)malloc(nb*sizeof(int));
for(i=0;i<nb;i++)
{
if((A[i]!=0) || (B[i]!=0))/**/
{
if(A[i]!=B[i])
{
diff+=1;
if(diff>1)
return NULL;
res[i]=0;
}
else
res[i]=A[i];
}
else
res[i]=(A[i]==0)?B[i]:A[i];
}
return res;
}
Liste Absorption(int nb, Liste A, Liste B)
{
int i,n;
Liste tmp,tmp_prec=NULL;
for(i=0;i<nb;i++)
{
n=(A->valeur[i]*B->valeur[i]);
if(n<0)
return NULL;
else if(!n)
{
tmp=(A->valeur[i]==0)?A:B;
if(tmp==tmp_prec)
return NULL;
tmp_prec=tmp;
}
}
return tmp;
}
MONOMES creerMonome (int nb_monome, int nb_var)
{
int i,var,*tab,j;
MONOMES monomes=creerFileVide();
for(i=0;i<nb_monome;i++)
{
printf("\nmonome %d (1 si a, -1 si !a, 0 sinon)\n",i+1);
tab=(int*)malloc(nb_var*sizeof(int));
for(j=0;j<nb_var;j++)
{
printf("valeur var %d : ",j+1);
scanf("%d",&var);
tab[j]=var;
}
monomes=enfile(monomes,tab);
}
return monomes;
}
MONOMES methodeConsensus (int nb_monome, int nb_var)
{
int i,j,k;
MONOMES monome;
int *new;
Liste new2;
Liste first,second,avantcons;
monome=creerMonome(nb_monome,nb_var);
do
{
nb_monome=monome->longueur;
i=0;
/* creation consensus */
avantcons=monome->dernier;
first=monome->premier;
second=first->suivant;
for(j=0;j<nb_monome-1;j++)
{
for(k=j+1;k<nb_monome;k++);
{
new=creerConsensus(nb_var,first->valeur,second->valeur);
if(new)
{
i++;
monome=enfile(monome,new);
}
second=second->suivant;
}
first=first->suivant;
}
if(i)
{
/* absorption */
first=monome->premier;
second=avantcons->suivant;
for(j=0;j<nb_monome-1;j++)
{
while(second!=monome->dernier)
{
new2=Absorption(nb_var,first,second);
if(new2)
{
monome=defile(monome,new2);
}
second=second->suivant;
}
first=first->suivant;
}
}
}while(i!=0);
return monome;
}
void afficheMonomes(MONOMES f, int nb_var)
{
int i,j;
Liste courant=f->premier;
for(i=0;i<f->longueur;i++)
{
for(j=0;j<nb_var;j++)
{
printf("%d ",courant->valeur[j]);
}
printf("+ ");
courant=courant->suivant;
}
}
int main ()
{
int nb_cons,nb_var;
MONOMES f;
printf("Entrer le nb de cons :");scanf("%d",&nb_cons);
printf("Entrer le nb de var :");scanf("%d",&nb_var);
f=methodeConsensus(nb_cons,nb_var);
afficheMonomes(f,nb_var);
return 1;
}