/*----------------------------------------------------------*/ /* */ /* AUTHOR : Eric VIOLARD */ /* E-MAIL : violard@icps.u-strasbg.fr */ /* ORGANISM : Université Louis Pasteur (Strasbourg) */ /* CREATION : 28/12/02 */ /* */ /* ---------------------------------------------------------*/ /* Définition de quelques fonctions de manipulation des mots du dictionnaire et petit programme de test de ces fonctions */ /* --- Définition du type des mots --- */ #define NB_MAX_CHAR 255 typedef char string[NB_MAX_CHAR]; /* --- Définition du type des booléens --- */ typedef int bool; #define true 1 #define false 0 /* --- tout d'abord quelques petites fonctions bien utiles --- */ void swap(string s, int i, int j) /* échange les valeurs de 2 éléments de s aux indices i et j (par effet de bord) */ { char tmp; /* pour sauvegarder une des valeurs */ tmp=s[i]; s[i]=s[j]; s[j]=tmp; } int presence(char c, string s) /* teste la présence du caractère c dans la chaine s */ /* retourne le plus petit indice i tel que s[i]==c ou -1 si c n'est pas un caractère de s */ { bool trouve=false; /* à vrai si c a été trouvé dans s (initialement faux) */ int r=-1; /* résultat (initialement on suppose que c n'est pas un caractère de s) */ int i=0; /* pour parcourir s */ while(!trouve && s[i]!='\0') /* parcours de s tant que c n'a pas été trouvé et qu'il reste un caractère */ { if(s[i]==c) /* on a trouvé */ { trouve=true; r=i; } i++; /* on passe au caractère suivant */ } return r; } void suppression(int i, string s) /* ote le caractère à l'indice i de la chaîne s (par effet de bord) */ { int j; /* pour parcourir s */ /* on opère un décalage d'une position */ for(j=i;j=(int)'a' && (int)mot_[i]<=(int)'a') mot_[i]=(char)((int)mot_[i]+(int)'A'-(int)'a'); /* on ne garde que les lettres majuscules */ if((int)mot_[i]>=(int)'A' && (int)mot_[i]<=(int)'Z') { mot_[j]=mot_[i]; j++; } i++; } mot_[j] = '\0'; /* --- on affecte à inv_m_ le mot m_ renversé --- */ strcpy(inv_mot_,mot_); renversement(inv_mot_); /* le résultat est à vrai si m_ et identique à inv_m_ */ return(strcmp(inv_mot_,mot_)==0); } void separe(char sep, string phrase, string mot_prem, string reste) /* sépare dans une phrase le premier mot du reste */ /* la fin du premier mot est marquée par le séparateur sep ou bien le caractère de fin de chaîne */ /* post-conditions : phrase = (mot_prem ++ sep ++ reste) où ++ note la concaténation */ { int i=0; /* pour parcourir phrase */ int l; /* longueur du premier mot */ /* --- copie du premier mot --- */ while(phrase[i]!='\0' && phrase[i]!=sep) { mot_prem[i]=phrase[i]; i++; } mot_prem[i]='\0'; /* --- copie du reste --- */ if(phrase[i]!='\0') /* si un reste */ { i++; /* on passe le séparateur */ l = strlen(mot_prem); /* copie du reste */ while(phrase[i]!='\0') { reste[i-l-1]=phrase[i]; i++; } reste[i-l-1]='\0'; } else /* sinon */ reste[0]='\0'; } void verlan_mot(string mot, string traduction) /* traduit en verlan un mot dont les syllabes sont séparées par un tiret */ /* post-condition: traduction contient la traduction en verlan de mot */ { string reste; /* ce qui reste à traduire */ string syllabe; /* syllabes du mot */ string reste_; /* temporaire */ int l; /* longueur du résulat */ strcpy(traduction,""); /* initialement le résultat est la chaine vide */ strcpy(reste,mot); /* et il reste tout à traduire */ do /* pour toutes les syllabes */ { separe('-',reste,syllabe,reste_); /* on prend la première syllabe */ strcat(strcat(syllabe,"-"),traduction); /* on l'ajoute au début du résultat */ strcpy(traduction,syllabe); strcpy(reste,reste_); /* on met à jour ce qui reste */ } while(strcmp(reste,"")!=0); /* tant qu'il reste des syllabes */ /* on supprime le tiret de trop */ l=strlen(traduction); traduction[l-1]='\0'; } void verlan(string phrase, string traduction) /* traduit en verlan tout une phrase */ /* post-condition: traduction contient la traduction en verlan de phrase */ { string reste; /* ce qui reste à traduire */ string mot; /* mot à traduire */ string mot_; /* traduction d'un mot */ string reste_; /* temporaire */ int l; /* longueur du résulat */ strcpy(traduction,""); /* initialement le résultat est la chaine vide */ strcpy(reste,phrase); /* et il reste tout à traduire */ do { separe(' ',reste,mot,reste_); /* on prend le premier mot */ verlan_mot(mot,mot_); /* on le traduit en verlan */ strcat(strcat(traduction,mot_)," "); /* on l'ajoute à la fin du résultat */ strcpy(reste,reste_); /* on met à jour ce qui reste */ } while(strcmp(reste,"")!=0); /* tant qu'il reste des mots */ /* on supprime l'espace en trop */ l=strlen(traduction); traduction[l-1]='\0'; } void conjugue(string verbe) /* conjugue au présent un verbe régulier en "er" */ { string racine; /* racine du verbe */ int l=strlen(verbe)-2; /* longueur de la racine */ strcpy(racine,verbe); /* on prend la racine */ /* on affiche pour toutes les personnes */ racine[l]='\0'; printf("je %s \n",strcat(racine,"e")); racine[l]='\0'; printf("tu %s \n",strcat(racine,"es")); racine[l]='\0'; printf("il %s \n",strcat(racine,"e")); racine[l]='\0'; printf("nous %s \n",strcat(racine,"ons")); racine[l]='\0'; printf("vous %s \n",strcat(racine,"ez")); racine[l]='\0'; printf("ils %s \n",strcat(racine,"ent")); racine[l]='\0'; } main() /* petit programme de test */ { string phrase="pru-den-ce est mè-re de sû-re-té",new_phrase; string mot1="élu par cette crapule"; string mot2="marie"; string mot3="aimer"; if(est_palindrome(mot1)) printf(" \"%s\" est un palindrome \n",mot1); else printf(" \"%s\" n'est pas un palindrome \n",mot1); if(est_anagramme(mot2,mot3)) printf(" %s est l'anagramme de %s \n",mot2,mot3); else printf(" %s n'est pas l'anagramme de %s \n",mot2,mot3); verlan(phrase,new_phrase); printf("en verlan \"%s\" \n se dît \"%s\" \n",phrase,new_phrase); conjugue("travailler"); }