Salut
Voila mon probleme. On m'a filé un prog en c et j'y connais rien a ce langage. Et mon boulot est de le transposer en caml et c'est super urgent.Et pour que je réussisse, il me faut juste comprendre les étapes de ce programme.Et c'est pour cela que je fais appel a vous car je sais que la plupart des personnes de ce site se débrouille pas trop mal.Perso en C je connais uniquement l'affichage à l'écran et c'est tout.C'est super urgent les gars. Merci pour tout.Par contre pour ceux qui auraient voulu me poser des questions je suis désolé mais les réponses seront longues car je n'ai pas l'adsl et donc pas de d'internet illimité.Et oui on oublie la campagne( g quand meme du 56k c'est toujours ca on pourra dire lol)
Donc voici la source(je m'en rends bien compte que c'est un peu long désolé) :
#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;
}