Bonjour, je suis entrain de programmer un dictionnaire de mot français->anglais mais j'ai un blocage, en effet, lorsque je décide d'afficher les éléments de mon dictionnaire, il affiche uniquement le dernier mot et sa traduction sans passer par les autres et ça fait au moins 1H que je bloque la dessus alors je viens demander votre aide et votre expertise pour éclairer ma lumière (et sans doute mon cerveau X) ).
Voici le code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LG 50
struct vocable
{
char Lang1[LG];
char Lang2[LG];
struct vocable *pSuivantLang1;
struct vocable *pSuivantLang2;
};
struct vocable *Nouveau;
struct vocable *pCourant;
struct vocable* pTeteLang1=NULL;
struct vocable* pTeteLang2=NULL;
void LireDico(FILE *fptr);
void AfficherFrancaisAnglais();
int main()
{
FILE *fptr;
char filename[]="Dictionnaire.txt";
system("cls");
if ((fptr = fopen(filename,"r"))==NULL)
{
printf("Ouverture de %s impossible \n",filename);
}
else
{
LireDico(fptr);
char Action;
printf("Selectionnez une action en entrant la lettre affectee \n");
printf("a. Afficher tout le dictionnaire Francais - Anglais \n");
printf("b. Afficher tout le dictionnaire Anglais - Francais \n");
printf("c. Chercher la traduction d'un mot Francais en Anglais \n");
printf("d. Chercher la traduction d'un mot Anglais en Francais \n");
printf("e. Inserer un nouveau mot dans le dictionnaire \n");
printf("f. Enregistrer le dictionnaire \n");
printf("Appuyez sur n'importe quelle lettre pour quitter le programme \n");
scanf("%c",&Action);
scanf("%c",&Action);
while (Action == 'a' || Action == 'b' || Action == 'c' || Action == 'd' || Action == 'e' || Action == 'f')
{
if (Action == 'a')
{
AfficherFrancaisAnglais();
scanf("%c",&Action);
}
else if (Action == 'b')
{
AfficherAnglaisFrancais();
}
else if (Action == 'c')
{
//ChercherFrancaisAnglais();
}
else if (Action == 'd')
{
//ChercherAnglaisFrancais();
}
else if (Action == 'e')
{
//InsererMot();
}
else if (Action == 'f')
{
//EnregistrerDictionnaire();
}
printf("Selectionnez une action en entrant la lettre affectee \n");
printf("a. Afficher tout le dictionnaire Francais - Anglais \n");
printf("b. Afficher tout le dictionnaire Anglais - Francais \n");
printf("c. Chercher la traduction d'un mot Francais en Anglais \n");
printf("d. Chercher la traduction d'un mot Anglais en Francais \n");
printf("e. Inserer un nouveau mot dans le dictionnaire \n");
printf("f. Enregistrer le dictionnaire \n");
printf("Appuyez sur n'importe quelle lettre pour quitter le programme \n");
scanf("%c",&Action);
scanf("%c",&Action);
scanf("%c",&Action);
}
}
return 0;
}
void LireDico(FILE *fin)
{
Nouveau = malloc(sizeof(struct vocable));
while((fscanf(fin, "%s %s", Nouveau->Lang1, Nouveau->Lang2))!= EOF)
{
}
pTeteLang1=Nouveau;
pTeteLang2=Nouveau;
}
void AfficherFrancaisAnglais()
{
printf("FRANCAIS: ANGLAIS: \n");
pCourant=pTeteLang1;
while (pCourant != NULL)
{
printf("%s %s \n",pCourant->Lang1,pCourant->Lang2);
pCourant=pCourant->pSuivantLang1;
}
}
void AfficherAnglaisFrancais()
{
printf("ANGLAIS: FRANCAIS: \n");
pCourant=pTeteLang2;
while (pCourant != NULL)
{
printf("%s %s \n",pCourant->Lang2,pCourant->Lang1);
pCourant=pCourant->pSuivantLang2;
}
}
Peux-tu donner un exemple de la forme du fichier dictionnaire.txt ?
Sur le principe ta problématique est d'analyser une ligne de ton fichier, et de le faire pour chaque ligne par la suite avec une boucle.
Peux-tu expliquer les différentes structures en début de programme ? L'objectif de ton travail ne serait pas d'utiliser les listes chaînées ? Si c'est le cas, est-ce obligatoire ?
Pour l'exemple: j'ai le mot en français et la ligne en dessous sa traduction et ainsi de suite
Pour la structure, char Lang1 stock les mots en français et char Lang2 stock les mots en anglais (qui se trouvent dans le fichier)
Oui, les listes chaînées sont obligatoires
structvocable *pSuivantLang1;
structvocable *pSuivantLang2;
Pour ces deux variables de la structure, je suppose qu'elles servent à passer à chaque fois au pointeur suivant dans la structure lors de l'affichage
structvocable *pCourant;
structvocable* pTeteLang1=NULL;
structvocable* pTeteLang2=NULL;
pCourant sert, lors de l'affichage, à afficher les données en fonction du pointeur qui lui est attribué
pTeteLang1 et 2 s'occupe de revenir au départ de la liste lorsque on les appels (J'utilise pTeteLang1 lorsque j'affiche le dictionnaire dans le sens français->anglais et pTeteLang2 dans le sens inverse
(On vient de commencer cette partie de notre cours à l'école, c'est peut être pour ça que je galère et on doit faire ce dictionnaire pour notre examen mais c'est vraiment difficile)
Avant de créer tes listes chaînées, il faudrait commencer par remplir convenablement une structure vocable, et donc lire convenablement une peut-être deux lignes dans ton fichier - ce que tu expliques et ce que tu as écrit étant incompatible.
- Edité par edgarjacobs 18 mai 2018 à 19:00:15
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
(Petit problème d'affichage, je corrigerai ça par la suite quand j'aurai fait tout fonctionner correctement)
Ce qu'il y a, c'est que je ne sais pas si du coup, ça reste des listes chaînées ou non vu que je me contente juste de lire ce qu'il y a dans mon fichier et puis c'est tout (ce qui me parait beaucoup trop facile de faire ainsi et je sent que ça va poser problèmes par la suite de faire comme ça)
Maintenant, je suis face a un dernier soucis (la toute dernière étape avant de pouvoir envoyer tout ça a mon prof hehehe), c'est de classer mes mots par ordre alphabétique et la par contre... Je suis un peu dans la merde on va dire en sachant que je ne vois absolument pas comment faire ça avec... Des pointeurs X)
Pour l'exemple: j'ai le mot en français et la ligne en dessous sa traduction et ainsi de suite
Ce n'est donc pas la forme du fichier spécifié au départ...
- Edité par oldProgrammer il y a 3 minutes
Oups... Enfin bon, j'ai quand même réussi à trouver comment résoudre mon souci et à pouvoir faire tranquillement mon code, me reste plus qu'a tenter de comprendre ce que je dois faire maintenant
EDIT: Merci pour le lien d'ailleurs, ça m'a vachement aidé
Il y a 2 fonctions à faire, l'une qui compare si un mot est avant un autre,
L'autre qui permet d'insérer un élément dans une liste chaînée
Tu peux créer une nouvelle liste chaînée qui vaut null.
Une fonction récursive qui pour chaque mots va : l'insérer si la liste est null
Sinon si le mot est après ( ordre alphabétique ) tu appel récursivement la fonction avec l'élément suivant de ta liste
si est avant, tu l'insère.
T'es pas obligé de faire comme ça mais une fonction pour insérer un élément dans une liste et une fonction pour comparer si un mot est avant ou après un autre sont essentiels. Bonne chance
Il y a 2 fonctions à faire, l'une qui compare si un mot est avant un autre,
L'autre qui permet d'insérer un élément dans une liste chaînée
Tu peux créer une nouvelle liste chaînée qui vaut null.
Une fonction récursive qui pour chaque mots va : l'insérer si la liste est null
Sinon si le mot est après ( ordre alphabétique ) tu appel récursivement la fonction avec l'élément suivant de ta liste
si est avant, tu l'insère.
T'es pas obligé de faire comme ça mais une fonction pour insérer un élément dans une liste et une fonction pour comparer si un mot est avant ou après un autre sont essentiels. Bonne chance
Je veux bien mais le problème est que mon prof veut que je travail sur une seule liste chainée
C'est très loin d'être une solutions très optimale, mais elle marche :
L'idée c'est de juste changer la direction des flèche,
"chat" avant "serpent" tu fais rien
"chat" avant "renard" tu fais rien
"chat" pas avant "abeille" alors abeille -> NULL deviendra abeille -> chat
et renard -> abeille deviendra renard -> NULL
et la fonction renvoie faux ( <=> la liste n'est pas encore triée )
Donc tu l'as rappelle : elle donne maintenant :
abeille -> chat -> serpent -> renard -> NULL
"abeille" avant "chat" touche rien
"abeille" avant "serpent" touche rien
"abeille" avant "renard" touche rien
"abeiile" avant NULL Ok on passe au mot suivant avant de regarder ce qu'il y a dans NULL
"chat" avant "serpent" touche rien
"chat" avant "renard" touche rien
chat .. NULL
"serpent" pas avant "renard" : Idem renard -> NULL devient renard->serpent
et serpent -> renard devient serpent->NULL ( l'élément ou pointe renard avant )
fonction renvoie faux ( <=> pas encore triée )
tu rappelle donc la fonction, on a :
abeille -> chat -> renard -> serpent -> NULL
"abeille" avant ..
..
..
"renard" avant "serpent" touche rien
"serpent" .. NULL
NULL, c'est bon c'est trié on renvoie vrai
Et on ne rappelle pas cette fonction.
Je trouve que c'est un exemple un peu long pour un simple trie mais il marche, tu peux toujours regarder le cours sur les liste chaîné ou quelques algo de tri pour le faire mieux si tu veux
Il est un peu (beaucoup) ridicule de trier une liste chainée APRÈS avoir lu et chaîné tous ses maillons. Il faut trier la liste lors de la création, donc: je lis un mot et je l'insère au bon endroit, ce qui implique de savoir insérer un élément au début, au milieu et en fin de liste. Et pour faire cela (l'insertion), une fonction suffit.
- Edité par edgarjacobs 19 mai 2018 à 22:13:31
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Il est un peu (beaucoup) ridicule de trier une liste chainée APRÈS avoir lu et chaîné tous ses maillons. Il faut trier la liste lors de la création, donc: je lis un mot et je l'insère au bon endroit, ce qui implique de savoir insérer un élément au début, au milieu et en fin de liste. Et pour faire cela (l'insertion), une fonction suffit.
- Edité par edgarjacobs il y a 28 minutes
Le faire directement ans ma fonction LireDico alors ?
Comme dis edgar tu peux directement trier lorsque tu créer ta liste chaînée sinon à partir d'une liste chaînée non triée tu peux :
en créer une deuxième et la remplir en la triant,
ou bien : la triée directement sans créer de deuxième listes :
Pour trier
[1]->[3]->[4]->[2]->[5]
Tu compare les valeurs 2 à deux.
1 < 3 on touche pas etc ....
4 < 2 faux donc tu change la place de 2 et 4 ça devrait donner un truc comme ça : [1]->[3]->[2]->[4]->[5] tu recommence : 1 < 3 ; 3 < 2 faux tu change 2 et 3 ;
tu recommence 1 < 2 ; 2 < 3; 3 < 4 ; 4 < 5 rien a modifier alors c'est triés.
Il est un peu (beaucoup) ridicule de trier une liste chainée APRÈS avoir lu et chaîné tous ses maillons. Il faut trier la liste lors de la création, donc: je lis un mot et je l'insère au bon endroit, ce qui implique de savoir insérer un élément au début, au milieu et en fin de liste. Et pour faire cela (l'insertion), une fonction suffit.
- Edité par edgarjacobs il y a 28 minutes
Le faire directement ans ma fonction LireDico alors ?
Oui.
Enfin, pas vraiment: tu lis dans LireDico, qui appelle une fonction d'insertion à la place des lignes 6 à 9, qui elles, insèrent toujours en tête de liste.
Et je viens de parcourir ta fonction LireDico(). Tu fais une allocation de trop. Déplace la ligne 10 après la 5, et supprime la 3.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Bon, je comprends vraiment pas comment faire ce fichu tri xD je pense que je vais créer un nouveau topic pour avoir + de visibilité sur le sujet et peut être d'autre explications (ou des exemples pour mieux voir le fonctionnement)
Problème de pointeur
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Maintenant, je suis face a un dernier soucis (la toute dernière étape avant de pouvoir envoyer tout ça a mon prof hehehe), c'est de classer mes mots par ordre alphabétique et la par contre... Je suis un peu dans la merde on va dire en sachant que je ne vois absolument pas comment faire ça avec... Des pointeurs X)
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent