Bonjour a tous, voici le but de mon exercice : Ecrire une fonction de comparaison qui prend en paramètre deux chaines et retourne un entier dont la valeur vaut :
1 si la premiere chaine suit la deuxieme dans l'ordre alphabétique
0 si les deux chaines sont identiques
-1 si la premiere chaine precede la deuxieme.
Seulement, voila mon probleme dans mon code : lorsque il y a plus d'un caractere dans ma chaine, j'obtiens forcement 1 en retour.
Par exemple, lorsque j'écris comme chaine de caractere : "p" et "p", j'ai 0 en retour. Mais si j'écris : "pa" et "pa", j'obtiens 1. Je ne comprend pas.
Le problême c'est que ta fonction reçoit en paramêtre des tableaux, or on ne peut pas passer des tableaux par arguments comme ça, il faut utiliser des pointeurs.
Si tu veut poursuivre ton programme, il va falloir que tu poursuive les cours de Mateo21 sur les pointeurs ^^.
En fait les chaines de caractere et les tableaux contiennent plusieurs valeurs mis bout a bout en mémoire, si tu passe en paramêtre un tableau, il ne va pas reçevoir les valeurs que contiennent ton tableau.
Il faut que tu passe par une variable qui va stocker le numéro de son emplacement dans la mémoire RAM et l'envoyer à ta fonction, dans cette fonction tu pourra manipuler les données de ton tableau grâce au fait que cette variable sais ou se trouve ton tableau en mémoire !
ça s'appelle le passage par référence, c'est a dire que au lieu de donner directement ta variable à ta fonction (ce qui s'appelle le passage par valeur) tu va devoir passer par une variable de type pointeur .
C'est une exlication un peut courte pour quelqu'un qui n'a jamais entendu parlé des pointeurs, c'est pour ça qu'il est préférable que tu poursuive le cours de Mateo21 sur le langace C
Et pour l'hitoire du fait que ta fonction renvoie 1 et pas 0 c'est que, si je ne me trompe pas, quand tu écris cela :
maFonction(tableau);
Pour commencer il faut savoir que les variables sont stocké dans un tableau gigantesque, celui de ta mémoire vive (RAM) ! Et chaque variables qui s'y trouvent sont associé à un numéro unique, on l'appelle l'adresse, il fait office d'id !
Tu n'envoie pas a la fonction maFonction, la valeur de ton tableau, mais son emplacement dans la mémoire, ce qu'on appelle l'adresse. Ducoup comme tu crée d'abord mot1 puis mot2 l'adresse de mot1 est plus petite que celle de mot2 (l'adresse c'est comme une id, elle est différente pour chaque variable et, sous code::blocks les variables que tu crée se suivent dans la mémoire, donc si tu crée une variable qui sera a l'adresse 25 en mémoire, la prochaine sera à l'adresse 26, c'est plus ou moin vrai sur code blocks), ducoup dans ta fonction, chaine1 et chaine2 reçoivent l'adresse de mot1 et mot2 et c'est cela qu'ils comparent ducoup et c'est pour ça qu'il renvoie 1, car l'adresse de mot1 est superieur a l'adresse de mot2 parce que mot2 a été déclaré après ! Je sais pas si c'est bien clair alors si ta des questions n'hésite pas
Cependant, j'ai encore un soucis que je n'arrive pas résoudre. L'objectif est de renvoyer une valeur selon son ordre alphabétique. Or le programme me renvoie 0 aussi lorsque la premiere d'un mot est la meme. Exemple : je rentre "cube" et "cool", la valeur renvoyée est 0. Comment faire pour ne pas renvoyer 0 dans ce cas la et passer a la comparaison de la lettre suivante ?
ne déclarent pas des chaînes de caractères (qui sont des tableaux de char en C), mais bien des char, soit 1 caractère.
Si tu veux que mot1 et mot2 soient des chaînes de caractères, tu dois donc les déclarer comme tableau de char:
#define TAILLE 100 // Par exemple
....
int main(void) {
char mot1[TAILLE];
char mot2[TAILLE];
....
return(0);
}
Tu devras adapter ton scanf() et l'appel à comparaison() en fonction des ces déclarations.
Ensuite, dans ta fonction de comparaison, il n'y a que 3 cas à prendre en compte: *s1=*s2, *s1<*s2 et (c'est implicite, pas besoin de test) *s1>*s2. Pas besoin de tester *s1<>*s2.
A+
Edgar;
- Edité par edgarjacobs 7 août 2014 à 21:02:05
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Normal. Tes scanf() ne sont plus codés convenablement: mot1 et mot2 sont des chaines de caractères, et donc mot1 et mot2 sont déjà des pointeurs.... pas besoin de donner leur adresse à scanf:
Les parenthèses dans la condition du for() ne sont pas nécessaires, de même que mettre i à 0 lorsque tu le déclares n'est pas nécessaire non plus (puisque tu l'initialises dans le for()).
Si ton compilateur ne t'a pas sorti une warning pour 1) le fait que comparer() ne renvoie rien et 2) le fait que main() ne renvoie rien, c'est qu'il est mal réglé au niveau des warning (si c'est gcc, mets l'option -Wall).
Et pour bien faire, la compilation d'un programme ne devrait sortir aucune warning!
Bon courage à toi, tu y es presque!
A+
Edgar;
EDIT: je viens de relire ton bout de code. Tu emploie *chaine1 et *chaine2, qui ne varient jamais. Tu devrais employer chaine1[i] et chaine2[i], ou alors écrire
× 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
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent