Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2699 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Procédure et tri de tableau

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Procédure et tri de tableau

n°1442914
exhortae
Membre du Cartel des Médecins
Posté le 15-09-2006 à 11:11:13  profilanswer
 

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. }

mood
Publicité
Posté le 15-09-2006 à 11:11:13  profilanswer
 

n°1442928
_darkalt3_
Proctopathe
Posté le 15-09-2006 à 11:25:22  profilanswer
 

Quelles sont tes erreurs ?
Ton compilo ?

n°1442936
exhortae
Membre du Cartel des Médecins
Posté le 15-09-2006 à 11:39:46  profilanswer
 

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

n°1442952
franceso
Posté le 15-09-2006 à 12:05:01  profilanswer
 

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
n°1442967
exhortae
Membre du Cartel des Médecins
Posté le 15-09-2006 à 12:12:36  profilanswer
 

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

n°1442971
exhortae
Membre du Cartel des Médecins
Posté le 15-09-2006 à 12:15:56  profilanswer
 

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

n°1443112
Sve@r
Posté le 15-09-2006 à 15:26:50  profilanswer
 

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.
n°1443242
exhortae
Membre du Cartel des Médecins
Posté le 15-09-2006 à 19:40:28  profilanswer
 

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. }


 

n°1443263
Emmanuel D​elahaye
C is a sharp tool
Posté le 15-09-2006 à 20:34:36  profilanswer
 

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/
n°1443354
big_dadi_f​at
Posté le 16-09-2006 à 11:41:52  profilanswer
 

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.
 :)  
 

mood
Publicité
Posté le 16-09-2006 à 11:41:52  profilanswer
 

n°1443361
Emmanuel D​elahaye
C is a sharp tool
Posté le 16-09-2006 à 12:42:39  profilanswer
 

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/
n°1443374
exhortae
Membre du Cartel des Médecins
Posté le 16-09-2006 à 13:19:33  profilanswer
 

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 ;)

n°1443375
exhortae
Membre du Cartel des Médecins
Posté le 16-09-2006 à 13:20:51  profilanswer
 

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 .

n°1443380
Emmanuel D​elahaye
C is a sharp tool
Posté le 16-09-2006 à 13:39:59  profilanswer
 

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/
n°1443381
big_dadi_f​at
Posté le 16-09-2006 à 13:44:12  profilanswer
 

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
n°1443396
Sve@r
Posté le 16-09-2006 à 15:12:10  profilanswer
 

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.
n°1443408
big_dadi_f​at
Posté le 16-09-2006 à 15:51:46  profilanswer
 

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  :)  
 
 

n°1443410
Emmanuel D​elahaye
C is a sharp tool
Posté le 16-09-2006 à 15:58:22  profilanswer
 

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/
n°1443419
big_dadi_f​at
Posté le 16-09-2006 à 16:12:30  profilanswer
 

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 ?!
 

n°1443425
Emmanuel D​elahaye
C is a sharp tool
Posté le 16-09-2006 à 16:54:03  profilanswer
 

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/

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Procédure et tri de tableau

 

Sujets relatifs
Créer tableau avec images et descriptifs[Postgres] Procedure stocké
Ecriture dans un fichier txt à partir d'une Procédure Stockée ?[Résolu] Repointer au début du tableau ap un mysql_fetch_array
Tri et recherche des occurences d'un tableau de donnéesprocédure avec renvoi de tableau d'objet
appel procedure ac tableau[Oracle/PL-SQL] Passer un tableau en paramètre d'une procedure stockée
Passage erroné d'un tableau de chaînes de caractères à une procédure..[SQL server] Passer un tableau en parametre d'une procédure stocké?
Plus de sujets relatifs à : Procédure et tri de tableau


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR