Petite erreu de code

Fermé
divx78 Messages postés 115 Date d'inscription dimanche 11 mars 2007 Statut Membre Dernière intervention 21 mars 2009 - 11 nov. 2008 à 00:44
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 11 nov. 2008 à 10:56
Bonjour,

Je ne compren ce que me retourne mon programme il me classe bien par ordre alpha me maffiche des trucs bizard voir plus bas ce quil me retourne :

void rev_alpha(char *str, int size)
{
char temp;
char *str2;

if(str[size + 1])
{
if(str[size] > str[size + 1])
{
temp = str[size];
str[size] = str[size + 1];
str[size + 1] = temp;
if(str[size + 1] != '\0')
{
size = size + 1;
rev_alpha(str, size);
}
else
{
size = 0;
rev_alpha(str, size);
}
}
//size = size + 1;
rev_alpha(str, size+1);
}
}

me retourn :
a???bcd
POURQOI ?

Merci de vos reponces

6 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 817
11 nov. 2008 à 01:05
Salut,
Que dois faire ce programme ?
Quels valeurs as-tu donné aux arguments avant d'appeler la fonction ?
Cdlt
0
divx78 Messages postés 115 Date d'inscription dimanche 11 mars 2007 Statut Membre Dernière intervention 21 mars 2009 3
11 nov. 2008 à 01:13
salut,

il affiche par ordre alphabetique une chaine
mes parametres sont : "dcba"

0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 817
11 nov. 2008 à 01:56
En fait, tu souhaites que ta fonction classe les caractères de ta chaîne par ordre alphabétique ?
Sinon, tu as deux arguments dans ta fonction.
Que signifie le second ? Tu appelles ta fonction avec les paramètres "abcd",0 ou avec "abcd",4 ?
0
divx78 Messages postés 115 Date d'inscription dimanche 11 mars 2007 Statut Membre Dernière intervention 21 mars 2009 3
11 nov. 2008 à 02:12
le second permet de rendre la fonction ecursive ses juste un compteur initialiser :)
voila mon main :

int main(int argc, char **argv)
{
char tab[5] = "dcba";

rev_alpha(tab, 0);
printf("%s", tab);
}
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 817
11 nov. 2008 à 02:43
J'ai du mal à suivre ton algo.
if(str[size + 1])
if(str[size + 1]!='\0') sont pareils.
Donc les imbriquer comme tu as fait t'apportera rien.
J'ai corrigé ton code. Mais attention, les cas particuliers comme str="" vont faire bobo à l'exécution. Donc à traiter.
Comme l'algo est faux, (en fait il manque une itération, sinon t'aurais réussi à inventer un algo de meilleure complexité ^^), tu devras relancer la fonction jusqu'à ce que str soit inchangé. A ce moment-là, le tri aura était accompli. Donc, si tu veux rester avec cette fonction, tu peux en créer une autre, qui l'appellera autant de fois que nécessaire, ou le faire dans le main.
void rev_alpha(char *str, int size)
{
    char temp;

    if(str[size + 1])
    {
        if(str[size] > str[size + 1])
        {
            temp = str[size];
            str[size] = str[size + 1];
            str[size + 1] = temp;
        } 
        rev_alpha(str,size+1);
    }
}



Sinon, tu peux par exemple implémenter le tri sélectif ou le tri à bulle. Ca sera une version itérative, cas d'école.
Sur google, tu devrais trouver comment ça marche ces algos.

A noter que le C implémente le tri rapide (qsort). Après tout dépend du contexte (exercice d'école, ou programme à toi, ou entraînement cérébral ^^)
Cdlt
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
divx78 Messages postés 115 Date d'inscription dimanche 11 mars 2007 Statut Membre Dernière intervention 21 mars 2009 3
11 nov. 2008 à 02:52
Deja je te remercie pour ton code je me permet de donner mon code qui je travaille et il est plutot pas mal il lui manque juste une boucle suplemantaire sur lui meme pour marcher degouter :s
me jen suis content :)

void rev_alpha(char *str, int size)
{
char temp;
char *str2;

if(str[size + 1] != '\0')
{
if(str[size] > str[size + 1])
{
temp = str[size];
str[size] = str[size + 1];
str[size + 1] = temp;
size = size + 1;
if(str[size + 1])
rev_alpha(str, size);
else
{
size = 0;
rev_alpha(str, size);
}
}
else
{
size = size + 1;
rev_alpha(str, size);
}
//size = size + 1;
}
}

Merci a toi.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 817
11 nov. 2008 à 10:56
Re,
Bah, je te fais une fois de plus les même remarques sur ton code.
Cdlt
0