Procédure et tri de tableau

Procédure et tri de tableau - C - Programmation

Marsh Posté le 15-09-2006 à 11:11:13    

Bonjour,
 
Voilà je cherche à faire en c un programme qui utilise une procédure pour faire la saisie et trier le tableau, cette procédure doit renvoyer le résultat au main qui se charge ensuite d'afficher le tableau.
 
j'ai des erreurs dans la compilation que je n'arrive pas à résoudre (je débute)
 
Un ptit coup de main serait le bienvenue
 
merci
 

Code :
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. void saisie_tri(int *n, int *t);
  5. void saisie_tri(int *n, int *t)    //Procédure pour la saisie et le tri d'un tableau
  6. {
  7. int i, j, aux;
  8. clrscr();
  9. printf("\t\t\tSAISIE ET TRI D'UN TABLEAU\n\n\n" );
  10. printf("Entrez le nombre d'éléments du tableau : " );
  11. scanf("%d", n);
  12. /*Saisie*/
  13. for (i = 0; i < *n; i++)
  14. {
  15.  printf("T[%d] = ", i+1);
  16.  scanf("%d", t[i]);
  17. }
  18. /*Tri croissant*/
  19.     for (i = 0; i < *n - 1; i++)
  20.  for (j = i + 1; j < *n; j++)
  21.   if (*t[i] > *t[j]);
  22.   {
  23.    aux = *t[j];
  24.    *t[j] = *t[i];
  25.    *t[i] = aux;
  26.   }         
  27. }
  28. int main()
  29. {
  30. int i, t[100], n;
  31. clrscr();
  32. saisie_tri(&n, &t);
  33. /*affichage*/
  34.     printf("\n\n" );
  35. for (i = 0; i < n; i++)
  36.  printf("T[%d] = %d\n", i+1, t[i]);
  37. getch();
  38. _exit(0);
  39.     return 0;
  40. }

Reply

Marsh Posté le 15-09-2006 à 11:11:13   

Reply

Marsh Posté le 15-09-2006 à 11:25:22    

Quelles sont tes erreurs ?
Ton compilo ?

Reply

Marsh Posté le 15-09-2006 à 11:39:46    

http://img171.imageshack.us/img171/7163/cjo9.jpg
 
http://img134.imageshack.us/img134/2316/c2ty0.jpg
 
le compilo c'est borland c++, j'ai pas de compilateur c sur cette machine

Reply

Marsh Posté le 15-09-2006 à 12:05:01    

il faut remplacer tes *t[i] par t[i]
 
Par ailleurs, dans le main, tu déclares t comme un tableau (t[100]) donc c'est déjà un pointeur. Il faut que tu passes directement t (en pas &t) à ta fonction : saisie_tri (&n, t)
 
 
EDIT: visiblement, tu as quelques problèmes avec les pointeurs et les tableaux (normal, puisque tu débutes ;)). Je ne saurais trop te conseiller d'étudier bien à fond les chapitres concernant ce genre de sujet dans ton bouquin de C préféré.
 
Par ailleurs, pour prendre directement de bonens habitudes, il y a un certain nombre de points que tu devrais corriger dans ton programme: les entrées (scanf n'est pas si facile que ça à utiliser), la taille du tableau t (que se passe t'il si l'utilisateur entre plus de 100 nombres ?)

Message cité 2 fois
Message édité par franceso le 15-09-2006 à 12:09:33

---------------
TriScale innov
Reply

Marsh Posté le 15-09-2006 à 12:12:36    

franceso a écrit :

il faut remplacer tes *t[i] par t[i]
 
Par ailleurs, dans le main, tu déclares t comme un tableau (t[100]) donc c'est déjà un pointeur. Il faut que tu passes directement t (en pas &t) à ta fonction : saisie_tri (&n, t)
 
 
EDIT: visiblement, tu as quelques problèmes avec les pointeurs et les tableaux (normal, puisque tu débutes ;)). Je ne saurais trop te conseiller d'étudier bien à fond les chapitres concernant ce genre de sujet dans ton bouquin de C préféré.
 
Par ailleurs, pour prendre directement de bonens habitudes, il y a un certain nombre de points que tu devrais corriger dans ton programme: les entrées (scanf n'est pas si facile que ça à utiliser), la taille du tableau t (que se passe t'il si l'utilisateur entre plus de 100 nombres ?)


 
Merci,  
 
faut dire que j'étais pas encore arrivé au chapitre des pointeurs, va falloir que j'attende d'y arriver avant de jouer avec les fonctions
 
merci

Reply

Marsh Posté le 15-09-2006 à 12:15:56    

franceso a écrit :


la taille du tableau t (que se passe t'il si l'utilisateur entre plus de 100 nombres ?)


 
j'essaie surtout d'avoir quelque bases, les contrôles de saisie je ne les fait du moment que c'est moi qui effectue la saisie pour les test ;)
 
mais bon je pense que je vais attendre que le bouquin que j'ai commandé débarque parceque j'ai l'impression que je fais pas mal de conneries avec le cours sur lequel je bosse en ce moment
 
merci

Reply

Marsh Posté le 15-09-2006 à 15:26:50    

exhortae a écrit :

Merci,  
 
faut dire que j'étais pas encore arrivé au chapitre des pointeurs, va falloir que j'attende d'y arriver avant de jouer avec les fonctions
 
merci


Tu peux déjà t'amuser à condition de maitriser les notions suivantes
- un tableau contient l'adresse de son premier élément
ex: int t[100] => tu obtiens t[0], t[1], ..., t[99] PLUS "t" qui vaut "&t[0]"
- si tu incrémentes "t" de "n", tu obtiens l'adresse de l'élément "t[n]" autrement dit "t + n" <=> "&t[n]"
- si tu demandes "*(t + n)", tu obtiens "*&t[n]" donc "t[n]" (le & et le * s'annulant mutuellement)
 
Ensuite, avec ton bouquin, tu pourras regarder les détails plus poussés des manip pointeurs...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 15-09-2006 à 19:40:28    

Sve@r a écrit :

Tu peux déjà t'amuser à condition de maitriser les notions suivantes
- un tableau contient l'adresse de son premier élément
ex: int t[100] => tu obtiens t[0], t[1], ..., t[99] PLUS "t" qui vaut "&t[0]"
- si tu incrémentes "t" de "n", tu obtiens l'adresse de l'élément "t[n]" autrement dit "t + n" <=> "&t[n]"
- si tu demandes "*(t + n)", tu obtiens "*&t[n]" donc "t[n]" (le & et le * s'annulant mutuellement)
 
Ensuite, avec ton bouquin, tu pourras regarder les détails plus poussés des manip pointeurs...


 
Merci
 
voilà j'ai changer le code, si quelqu'un pouvait me dire si c'est correct maintenant (en tout cas le programme marche), j'ai quelque question à posé par la suite ;)
 

Code :
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. void saisie_tri(int *n, int *t);
  5. int fusion(int a, int b);
  6. void saisie_tri(int *n, int *t)    //Procédure pour la saisie et le tri d'un tableau
  7. {
  8. int i, j, aux;
  9. clrscr();
  10. printf("\t\t\tSAISIE ET TRI D'UN TABLEAU\n\n\n" );
  11. printf("Entrez le nombre d'éléments du tableau : " );
  12. scanf("%d", n);
  13. /*Saisie*/
  14. for (i = 0; i < *n; i++)
  15. {
  16.  printf("T[%d] = ", i+1);
  17.  scanf("%d", t+i);
  18. }
  19. /*Tri croissant*/
  20.     for (i = 0; i < *(n - 1); i++)
  21.  for (j = i + 1; j < *n; j++)
  22.   if (t[i] > t[j])
  23.   {
  24.    aux = t[j];
  25.    t[j] = t[i];
  26.    t[i] = aux;
  27.   }                 
  28. }
  29. int main()
  30. {
  31. int i, t[100], n;
  32. clrscr();
  33. saisie_tri(&n, t);
  34. /*affichage*/
  35.     printf("\n\n" );
  36. for (i = 0; i < n; i++)
  37.  printf("T[%d] = %d\n", i+1, t[i]);
  38. getch();
  39. _exit(0);
  40.     return 0;
  41. }


 

Reply

Marsh Posté le 15-09-2006 à 20:34:36    

exhortae a écrit :

voilà j'ai changer le code, si quelqu'un pouvait me dire si c'est correct maintenant (en tout cas le programme marche), j'ai quelque question à posé par la suite ;)


C'est correct, mais je recommande une meilleure organisation du code en 3 fonctions :  

saisie()
tri()
affichage()


Chaque fonction doit faire une chose et la faire bien.
 
La saisie devrait s'assurer qu'on ne dépasse pas le nombre d'éléments du tableau (un cinglé pourrait vouloir rentrer 101 ou plus éléments à la main !)
 
Pour savoir si le tri est correct, il faudrait prévoir des jeux de tests qui couvrent tous les cas, y compris les cas tordus (doublons, valeurs négatives etc.).


Message édité par Emmanuel Delahaye le 16-09-2006 à 08:57:13

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 16-09-2006 à 11:41:52    

Salut
Enfait, je ne comprend pas pourquoi tu mais les deux argument de ta fonction void saisie_tri(int *n, int *t) avec des pointeur !
Je pourais bien comprendre pour le *t, mais là avec le *n Je dirai que ce sera mieu de passé un simple int n, la transmission se fera par valeur : void saisie_tri(int n, int *t)  .
Ensuite quand tu fait apel a ta fonction dans le mais() , tu fait saisie_tri(n, t) , sans avoire a ce soussier de passé l'adresse de n (&n) dans l'appel.  
( La trensmision se fera par valeur, càd la valeur de n qui se trouve dans ton main() se copie dans la variable n de ta fonction saisie_tri (l'argument de la fonction) ).
Mais c'est déja correcte et bien ce que tu a fait.
 :)  
 

Reply

Marsh Posté le 16-09-2006 à 11:41:52   

Reply

Marsh Posté le 16-09-2006 à 12:42:39    

big_dadi_fat a écrit :

Salut
Enfait, je ne comprend pas pourquoi tu mais les deux argument de ta fonction void saisie_tri(int *n, int *t) avec des pointeur !


Parce que la fonction saisie le nombre d'élements...
L'affichage en a besoin après. C'est pour ça que j'ai suggéré un redesign...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 16-09-2006 à 13:19:33    

big_dadi_fat a écrit :

Salut
Enfait, je ne comprend pas pourquoi tu mais les deux argument de ta fonction void saisie_tri(int *n, int *t) avec des pointeur !
Je pourais bien comprendre pour le *t, mais là avec le *n Je dirai que ce sera mieu de passé un simple int n, la transmission se fera par valeur : void saisie_tri(int n, int *t)  .
Ensuite quand tu fait apel a ta fonction dans le mais() , tu fait saisie_tri(n, t) , sans avoire a ce soussier de passé l'adresse de n (&n) dans l'appel.  
( La trensmision se fera par valeur, càd la valeur de n qui se trouve dans ton main() se copie dans la variable n de ta fonction saisie_tri (l'argument de la fonction) ).
Mais c'est déja correcte et bien ce que tu a fait.
 :)


 
 
Voir post d'Emmanuel Delahaye ci dessus ;)

Reply

Marsh Posté le 16-09-2006 à 13:20:51    

Emmanuel Delahaye a écrit :

. C'est pour ça que j'ai suggéré un redesign...


 
 
Je suis d'accord que le design est pas bon, mais c'était voulu, pour pouvoir travailler en transmission des données par adresse et non par valeur .

Reply

Marsh Posté le 16-09-2006 à 13:39:59    

exhortae a écrit :

Je suis d'accord que le design est pas bon, mais c'était voulu, pour pouvoir travailler en transmission des données par adresse et non par valeur .


Il faut le faire quand c'est nécessaire... pas besoin d'en rajouter...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 16-09-2006 à 13:44:12    

Oups j'ai parlais trop vite , lol , Je croyai qu'il a fait la saisi dans le main .     :p
 
EDIT: Mais, je pense que s'il fesai la saisi de (n) dans le main ce sera plus pratique (pourquoi vouloir compliquer les chose ? )
 
ou alors si tu tien vraiment a ce que ta fonction s'occupe aussi de la saisi de n , alors tu peut faire une fonction qui ne prend qu'un seul argument , et qui retourne le nombre d'élélent (càd le n qui a été saisi) :
int saisie_tri (int *t);
et dans l'appel:
n = saisie_tri (t);
 
mais bon  :p  
 

Message cité 1 fois
Message édité par big_dadi_fat le 16-09-2006 à 13:52:19
Reply

Marsh Posté le 16-09-2006 à 15:12:10    

big_dadi_fat a écrit :

EDIT: Mais, je pense que s'il fesai la saisi de (n) dans le main ce sera plus pratique (pourquoi vouloir compliquer les chose ? )


Parce que, d'un point de vue organisationnel, le tableau est associé au nombre d'éléments qui le composent. Donc il est "naturel" que la fonction "saisie" s'occupe de tout ce qui concerne la saisie du tableau (à la fois le nombre d'éléments et à la fois chaque élément)
 

big_dadi_fat a écrit :

ou alors si tu tien vraiment a ce que ta fonction s'occupe aussi de la saisi de n , alors tu peut faire une fonction qui ne prend qu'un seul argument , et qui retourne le nombre d'élélent (càd le n qui a été saisi) :
int saisie_tri (int *t);
et dans l'appel:
n = saisie_tri (t);


C'est faisable... mais cela gènera le "puriste". Déjà, il faut bien te dire que celui qui écrit une fonction et celui qui l'utilise ne sont pas forcément la même personne. Tu te vois écrire une fonction "saisie()" pour un programmeur avec qui tu travailles et lui dire "écoute, la fonction saisie() que je te file remplit toutes les valeurs du tableau mais ne fait que renvoyer son nb d'éléments - Si tu veux stocker ce nb, il faudra que tu le fasses toi-même" => Le programmeur te dira "ben zut, j'aurais bien aimé qu'elle fasse tout cette fonction comme ça je n'aurais pas eu à me préoccuper de quoi que ce soit...".
Par ailleurs, tu décides qu'une des valeurs sera renvoyée. Là ça va parce qu'il n'y en n'a qu'une en plus du tableau. Mais que feras-tu le jour où ta fonction doit stocker 4 valeurs. Tu en stockeras 3 et tu renverras la 4° ? Et sur quel critère tu décideras de la valeur qu'il faut renvoyer.
Enfin, dernier argument, il peut être judicieux de garder à ta fonction la possibilité de renvoyer un code "ok/erreur". Si tu utilises le "return" pour renvoyer le nb d'éléments, tu perds cette possibilité...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 16-09-2006 à 15:51:46    

Sve@r a écrit :

Parce que, d'un point de vue organisationnel, le tableau est associé au nombre d'éléments qui le composent. Donc il est "naturel" que la fonction "saisie" s'occupe de tout ce qui concerne la saisie du tableau (à la fois le nombre d'éléments et à la fois chaque élément)


 
Je n'ai jamais dis que la fonction ne s'ocupera pas du nombre d'éléments du tableau, mais je parlais de la maniére de transmission de cette valeur a la fonction de saisi...  :sweat:  
 

Sve@r a écrit :


C'est faisable... mais cela gènera le "puriste". Déjà, il faut bien te dire que celui qui écrit une fonction et celui qui l'utilise ne sont pas forcément la même personne. Tu te vois écrire une fonction "saisie()" pour un programmeur avec qui tu travailles et lui dire "écoute, la fonction saisie() que je te file remplit toutes les valeurs du tableau mais ne fait que renvoyer son nb d'éléments - Si tu veux stocker ce nb, il faudra que tu le fasses toi-même" => Le programmeur te dira "ben zut, j'aurais bien aimé qu'elle fasse tout cette fonction comme ça je n'aurais pas eu à me préoccuper de quoi que ce soit...".
Par ailleurs, tu décides qu'une des valeurs sera renvoyée. Là ça va parce qu'il n'y en n'a qu'une en plus du tableau. Mais que feras-tu le jour où ta fonction doit stocker 4 valeurs. Tu en stockeras 3 et tu renverras la 4° ? Et sur quel critère tu décideras de la valeur qu'il faut renvoyer.
Enfin, dernier argument, il peut être judicieux de garder à ta fonction la possibilité de renvoyer un code "ok/erreur". Si tu utilises le "return" pour renvoyer le nb d'éléments, tu perds cette possibilité...


 
Bon ok, tu ma convaincu  :)  
 
 

Reply

Marsh Posté le 16-09-2006 à 15:58:22    

big_dadi_fat a écrit :

Je n'ai jamais dis que la fonction ne s'ocupera pas du nombre d'éléments du tableau, mais je parlais de la maniére de transmission de cette valeur a la fonction de saisi...  :sweat:  


Ces problèmes de conception d'interface de fonctions sont intéressants et méritent discussion.
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 16-09-2006 à 16:12:30    

Emmanuel Delahaye a écrit :

Ces problèmes de conception d'interface de fonctions sont intéressants et méritent discussion.


 
 :)  J'ai pas bien compris  :p  , comment ca intéressants , du point de vu transmition de valeurs ?!
 

Reply

Marsh Posté le 16-09-2006 à 16:54:03    

big_dadi_fat a écrit :

:)  J'ai pas bien compris  :p  , comment ca intéressants , du point de vu transmition de valeurs ?!


Je veux dire que la conception des interfaces des fonctions est un sujet qui mérite d'être approfondi, c'est tout.
 
C'est ce qui fait qu'une APi est facile à utiliser ou non, par exemple... ou qu'elle est plus ou moins performante. C'est un sujet qui, à ma connaissance, n'est pas enseigné et qui est, en général, laissé à l'appréciation de chacun sans véritable reflexion sur les conséquences de tel ou tel type d'interface.
 
On peut déjà passer en revue l'existant et faire la critique des fonctions de la bibliothèque standard, pour voir quelles sont les fonctions bien conçues et celles qui laissent à désirer (fgets() vs gets(), par exemple, mais il y en a d'autres comme localtime() etc....)


Message édité par Emmanuel Delahaye le 16-09-2006 à 16:57:17

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed