[C] Tri d'un tableaux à deux dimensions
Résolu/Fermé
A voir également:
- [C] Tri d'un tableaux à deux dimensions
- Fusionner deux tableaux excel - Guide
- Trier un tableau excel - Guide
- Comment faire un tableau - Guide
- Tableaux croisés dynamiques - Guide
- Deux ecran pc - Guide
6 réponses
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
5 déc. 2007 à 23:15
5 déc. 2007 à 23:15
Je reconnais bien la les règles débiles de programmation de l'epitech. Pas de for, pas le droit d'utiliser des fonctions standards... enfin passons, c'est un débat que j'ai eu avec un de tes confrères (marinaris, je ne sais pas si tu le connais...)
Je confirme ce que dit le père au sujet de la fonction swap : à l'exécution l'adresse c n'est pas initialisée, donc écrire à cette adresse (*c = ...) entraînera une seg fault. Si le but c'est de permuter les valeurs situées aux adresses a et b tu peux faire :
Pour résoudre ton exercice tu devrais aborder le problème proprement en t'inspirant des fonctions standards, qui en fait forment le découpage logique de ton problème :
1) définir l'équivalent de strcmp pour implémenter une relation d'ordre total sur les chaînes.
2) définir une fonction de tri générique sur un tableau et prenant en paramètre un pointeur sur la fonction implémentant ta relation d'ordre, à l'image de la fonction qsort.
Bonne chance
Je confirme ce que dit le père au sujet de la fonction swap : à l'exécution l'adresse c n'est pas initialisée, donc écrire à cette adresse (*c = ...) entraînera une seg fault. Si le but c'est de permuter les valeurs situées aux adresses a et b tu peux faire :
void swap(int *a,int *b){ int c = *a; *a = *b; *b = c; }
Pour résoudre ton exercice tu devrais aborder le problème proprement en t'inspirant des fonctions standards, qui en fait forment le découpage logique de ton problème :
1) définir l'équivalent de strcmp pour implémenter une relation d'ordre total sur les chaînes.
2) définir une fonction de tri générique sur un tableau et prenant en paramètre un pointeur sur la fonction implémentant ta relation d'ordre, à l'image de la fonction qsort.
Bonne chance
voici le code de my_swap, ça peut etre utile
int my_swap(int *a, int *b)
{
int c;
int d;
c = *b;
d = *a;
*a = c;
*b = d;
}
int my_swap(int *a, int *b)
{
int c;
int d;
c = *b;
d = *a;
*a = c;
*b = d;
}
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
5 déc. 2007 à 20:52
5 déc. 2007 à 20:52
Sur la forme :
1) Moi j'utiliserais qsort et strcmp. Ton programme serait beaucoup plus lisible avec des boucles for qu'avec des while.
2) Pourquoi ne pas utiliser les fonctions standards (genre strlen au lieu de my_strlen) ? Tu es à l'epita ?
Sur le fond :
1) L'instruction flag == 1 ne fait rien.
2) Il n'y a pas besoin de parenthèse autour de tab dans la ligne "return tab" (return n'est pas une fonction mais une instruction).
3) A priori il faut passer tab[i] et non *tab[i] à strlen.
4) La fonction my_swap ne retourne rien alors qu'elle est sensée retourner un entier (ou alors il faut écrire void my_swap(...))
5) Les pointeurs passés à my_swap ne sont pas du bon type.
Bonne chance
1) Moi j'utiliserais qsort et strcmp. Ton programme serait beaucoup plus lisible avec des boucles for qu'avec des while.
2) Pourquoi ne pas utiliser les fonctions standards (genre strlen au lieu de my_strlen) ? Tu es à l'epita ?
Sur le fond :
1) L'instruction flag == 1 ne fait rien.
2) Il n'y a pas besoin de parenthèse autour de tab dans la ligne "return tab" (return n'est pas une fonction mais une instruction).
3) A priori il faut passer tab[i] et non *tab[i] à strlen.
4) La fonction my_swap ne retourne rien alors qu'elle est sensée retourner un entier (ou alors il faut écrire void my_swap(...))
5) Les pointeurs passés à my_swap ne sont pas du bon type.
Bonne chance
mype
Messages postés
2435
Date d'inscription
jeudi 1 novembre 2007
Statut
Membre
Dernière intervention
16 août 2010
436
5 déc. 2007 à 20:53
5 déc. 2007 à 20:53
il faut que c et d soit des pointeurs aussi
et tu est pas obligé d'utiliser deux variables temporaires une suffit pour faire l'echange d'adresses
et tu est pas obligé d'utiliser deux variables temporaires une suffit pour faire l'echange d'adresses
int *c; *c = *a; *a = *b; *b = *c;
mype
Messages postés
2435
Date d'inscription
jeudi 1 novembre 2007
Statut
Membre
Dernière intervention
16 août 2010
436
>
le père
5 déc. 2007 à 22:28
5 déc. 2007 à 22:28
en effet je me suis trompé...
merci pour ton attention le pere
merci pour ton attention le pere
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
>Sur la forme :
>
>1) Moi j'utiliserais qsort et strcmp. Ton programme serait beaucoup plus lisible avec des boucles for qu'avec des while.
>2) Pourquoi ne pas utiliser les fonctions standards (genre strlen au lieu de my_strlen) ? Tu es à l'epita ?
>
>Sur le fond :
>
>1) L'instruction flag == 1 ne fait rien.
>2) Il n'y a pas besoin de parenthèse autour de tab dans la ligne "return tab" (return n'est pas une fonction mais une instruction).
>3) A priori il faut passer tab[i] et non *tab[i] à strlen.
>4) La fonction my_swap ne retourne rien alors qu'elle est sensée retourner un entier (ou alors il faut écrire void my_swap(...))
>5) Les pointeurs passés à my_swap ne sont pas du bon type.
>
>Bonne chance
1 et 2) Epitech ;)
1 bis) si flag dit si le tableau a besoin d'étre trié et reste a 0 si le tableau n'a plus besoin d'etre trié
4) en effet merci
5) c'est à dire? my_swap prend deux ints soit deux adresses de pointeurs
>
>1) Moi j'utiliserais qsort et strcmp. Ton programme serait beaucoup plus lisible avec des boucles for qu'avec des while.
>2) Pourquoi ne pas utiliser les fonctions standards (genre strlen au lieu de my_strlen) ? Tu es à l'epita ?
>
>Sur le fond :
>
>1) L'instruction flag == 1 ne fait rien.
>2) Il n'y a pas besoin de parenthèse autour de tab dans la ligne "return tab" (return n'est pas une fonction mais une instruction).
>3) A priori il faut passer tab[i] et non *tab[i] à strlen.
>4) La fonction my_swap ne retourne rien alors qu'elle est sensée retourner un entier (ou alors il faut écrire void my_swap(...))
>5) Les pointeurs passés à my_swap ne sont pas du bon type.
>
>Bonne chance
1 et 2) Epitech ;)
1 bis) si flag dit si le tableau a besoin d'étre trié et reste a 0 si le tableau n'a plus besoin d'etre trié
4) en effet merci
5) c'est à dire? my_swap prend deux ints soit deux adresses de pointeurs
Bonsoir,
5) c'est à dire? my_swap prend deux ints soit deux adresses de pointeurs
tu appelles my_swap avec des char*, alors qu'il faut des int*
5) c'est à dire? my_swap prend deux ints soit deux adresses de pointeurs
tu appelles my_swap avec des char*, alors qu'il faut des int*
Bien sûr que ça refuse encore. Visiblement, tu n'as pas compris pourquoi c'est refusé
my_swap attebd toujours des int * si tu n'as pas changé sa définition, et maintenant tu lui passes des char **. ça n'est guère mieux qu'avant.
Soit tu passes à ta fonction des int * (mais alors là lesquels ? tu ne manipules pas des int), soit tu modifies my_swap pour qu'elle travaille avec des char *. ça passera en compilation à ce niveau là. De là à dire que ça fait ce que tu voudrais...
my_swap attebd toujours des int * si tu n'as pas changé sa définition, et maintenant tu lui passes des char **. ça n'est guère mieux qu'avant.
Soit tu passes à ta fonction des int * (mais alors là lesquels ? tu ne manipules pas des int), soit tu modifies my_swap pour qu'elle travaille avec des char *. ça passera en compilation à ce niveau là. De là à dire que ça fait ce que tu voudrais...
6 déc. 2007 à 00:13
Merci pr ton aide ;)