Discussion: Programme de tri

  1. #1
    Invité
    Invité(e)

    Par défaut Programme de tri

    Bonjour,

    J'aimerais coder un programme qui dit d'entrer 3 nombres dans le désordre et le programme doit remettre les nombres dans un ordre croissant.

    Voila mon bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include<stdio.h>
     
    int main ()
     
    {
        int a = 0, b = 0, c = 0;
     
        printf("afficher 3 entier\n");
        scanf("%d", &a, b, c);
     
        if((b < a) || (c < b) || (c < a)){
            printf("afficher %d %d %d", a, b, c);
        }else if((b < a) || (c < b) || (c < a)){
            printf("afficher %d %d %d", c, b, a);
        }else((a < b) || (b < c) || (c < a) || (b > a));{
            printf("afficher %d %d %d", a, b, c);
        }
     
        return 0;
    }
    Malheureusement le programme me retourne 3 0...

    Quelqu'un peut m'aider ?

    Merci d'avance !
    Dernière modification par Bktero ; 24/07/2017 à 09h18. Motif: Balises CODE

  2. #2
    Membre averti Avatar de emixam16
    Homme Profil pro
    Étudiant quasiment normal
    Inscrit en
    juin 2013
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant quasiment normal

    Informations forums :
    Inscription : juin 2013
    Messages : 98
    Points : 315
    Points
    315

    Par défaut

    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int a, b, c;
    scanf("%d", &a, b, c);
    Es-tu vraiment sûr de toi?

    PS: Par la suite, pour poster un code utilise la balise CODE et indente ton code. Ce sera plus lisible pour nous mais aussi pour toi.

  3. #3
    Invité
    Invité(e)

    Par défaut

    Désolé, j ai ci sur la faq qui fallait utiliser les balises codés et je ne les ai pas trouver hier.

    Pour répondre à ta question; voudrais tu dire qu' il faut que je fasse:

    Scanf ("%d %d %d", &a, b, c); ?

    Désolé, je suis sur mon natel, je ne trouve pas les balises car je sais qu' il existe aussi une balise pour mettre une ligne de code.

    Excusez moi d avance.

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    4 947
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 4 947
    Points : 16 426
    Points
    16 426

    Par défaut

    C'est déjà mieux, mais encore invalide.
    pourquoi traites-tu différemment a, b et c?

    Pour les balises, c'est [code] et [c]. La première est mise par le bouton #.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Invité
    Invité(e)

    Par défaut

    Merci.
    Je traite a b et c parce que c est mes entier que je veux afficher dans mon scanf.
    Cela veut dire que je peut faire trois printf en traitant chaque lettre individuellement ?
    Et sa ira mieux ?

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    4 947
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 4 947
    Points : 16 426
    Points
    16 426

    Par défaut

    Non, je dis juste que ton scanf ("%d %d %d", &a, b, c); est forcément faux si a, b et c sont du même type.

    Les trois variables sont des entiers, donc, pour les modifier, scanf doit recevoir leurs trois adresses, en plus d'une chaine de format pour trois entiers.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf ("%d %d %d", &a, &b, &c);
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #7
    Invité
    Invité(e)

    Par défaut

    Ok merci, je vais essayer ça maintenant. Je posterai le résultat.

  8. #8
    Membre expérimenté

    Homme Profil pro
    Responsable des études
    Inscrit en
    mars 2009
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2009
    Messages : 528
    Points : 1 530
    Points
    1 530

    Par défaut

    ALERTE AU POINT-VIRGULE sur cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    else((a < b) || (b < c) || (c < a) || (b > a));{

  9. #9
    Invité
    Invité(e)

    Par défaut

    Voila
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     printf("afficher 3 entier\n");
        scanf("%d %d %d", &a, &b, &c
    Maintenant passons à la suite svp car le pogramme me répond bien mes nombres entier mais dans un ordre décroisant et moi je veux les mettre dans un ordre croissant !

    Es ce que mettre des < entre les entier dans mes if va t'il changer la solution, je n'en suis pas certain mais je préfère demander, merci d'avance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if((b < a) || (c < b) || (c < a)){
            printf("afficher %d %d %d\n", a < b < c);
        }else if((b < a) || (c < b) || (c < a)){
            printf("afficher %d %d %d\n", c < b > a);
        }else((a < b) || (b < c) || (c < a) || (b > a));{
            printf("afficher %d %d %d\n", a < b < c);
        }
    Ou soyons plus clair. Es ce que mes if sont tous faux et ne veulent rien dire ?

    Merci d'avance.

  10. #10
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    4 947
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 4 947
    Points : 16 426
    Points
    16 426

    Par défaut

    Non, ca ne fonctionnera pas.
    Tu n'as pas l'air d'avoir compris ce qu'est printf, ni ce que sont les arguments d'un appel de fonction.


    Rappelle-toi que le code permet d'expliquer la solution d'un problème à l'ordinateur, c'est à toi de créer.
    Sans parler de code, juste en français (ou pseudo-code), comment résouds-tu ton problème?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  11. #11
    Membre expérimenté

    Homme Profil pro
    Responsable des études
    Inscrit en
    mars 2009
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2009
    Messages : 528
    Points : 1 530
    Points
    1 530

    Par défaut

    Maintenant, les "if" sont faux et les "printf" le sont devenus aussi...

    Premier problème: tu ne traites pas tous les cas de figure. Prend un papier et un stylo, et cherche toutes les combinaisons possibles pour ordonner trois nombres 'a', 'b' et 'c'. Tu obtiens:
    a - b - c
    a - c - b
    b - a - c
    b - c - a
    c - a - b
    c - b - a

    Donc, logiquement, tu devrais avoir 5 'if' et 1 'else'.

    Second problème: à ce stade, logiquement, tu devrais te rendre compte que ce n'est pas du tout efficace de procéder de cette manière. Surtout si, plus tard, tu veux trier 4 nombres au lieu de 3. Il faudrait envisager de passer tout de suite aux tableaux et étudier les algorithmes de tri usuels.

    Accessoirement, ton 'else' est juste du point de vue du langage, mais ne fera absolument pas ce que tu espérais.

  12. #12
    Membre éprouvé Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    mai 2010
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : mai 2010
    Messages : 324
    Points : 1 099
    Points
    1 099

    Par défaut

    Bonjour,
    Mise à part ce que les autres membres du forum en avancer, j’ajouterais ceci. Certes, le choix de la fonction est justifié, mais il est important de ne pas oublier que la fonction scanf est source de bug dans son utilisation future, je m’explique : si vous ne saisissez que des nombres la fonction marche à merveille, mais en revanche si vous saisissez autre chose que des nombres, c’est la panique totale ; surtout que cette fonction est sujette à caution il faut donc veillez "également" à ce que l’ont ne fasse pas des saisies trop longues pour éviter un dépassement de mémoire (en clair faire une saisie sécurisée et il existe des astuces pour cela).

    Citation Envoyé par morror Voir le message
    Voila
    Maintenant passons à la suite svp car le pogramme me répond bien mes nombres entier mais dans un ordre décroisant et moi je veux les mettre dans un ordre croissant !
    .......
    Merci d'avance.
    Si votre programme ne tri rien où effectue un trie en ordre décroissant, il faut tout simplement revoir votre code en particulier votre algorithme de tri l’idée plus simple serait d'utiliser la fonction qsort ce qui donnerait une variante de ce type:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    /*
    *	Fonction de comparaison
    *	utiliser avec qsort
    */
    static int f_comp( const void *pVar_a, 
    	const void *pVar_b ){
     
    	const int *p = pVar_a;
    	const int *pp = pVar_b;
    	return *p - *pp;
    }
     
    /*
    *	fonction saisie des
    *	nombres
    */
    long f_get_nb( void ){
     
    	long ret = 0;
    	char buffer[BUFSIZ];
    	do{
    		(void)fprintf(stdout, "Saisissez un nombre\t:");
    		if( NULL == fgets(buffer, BUFSIZ, stdin) )
    			return EXIT_FAILURE;
    	}while( 1 != sscanf(buffer, "%ld", &ret) );
    	(void)fprintf(stdout, "\n");
    	return ret;
    }
     
     
    int main( void ){
     
    	short i = 0;
    	int itab[3];
     
    	/*
    	*	Acquisition des saisie
    	*/
    	for( i = 0; i < 3; i++ )
    		itab[i] = (int)f_get_nb();
     
    	/*
    	*	Affichage du résultat
    	*/
    	for( i = 0; i < 3; i++ )
    		(void)fprintf(stdout, "%d\t", itab[i] );
    	(void)fprintf(stdout, "\n" );
     
    	/*
    	*	appel de la fonction 
    	*	pour effectue un tri
    	*/
    	qsort(itab, sizeof itab/ sizeof *itab, 
    		sizeof * itab, f_comp);
     
    	/*
    	*	Affichage du résultat tri
    	*/
    	for( i = 0; i < 3; i++ )
    			(void)fprintf(stdout, "%d\t", itab[i] );
    		(void)fprintf(stdout, "\n" );
     
    	return EXIT_SUCCESS;
    }

    à bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  13. #13
    Invité
    Invité(e)

    Par défaut

    Ok.
    Je vais vérifier mes printf des if et faire les combinaisons nécessaires pour que les if fasse leur job, avec les variables. Je veux juste dire que je viens de commencer ma formation en informatique et je ne comprends pas le message de Sambia. Je ne connais pas cette fonction et je préfère pas m'y aventurer mais cependant j'ai bien compris que ce programme est bien limité et que ce n'est qu'un exercice de if finalement.

    Je le bosse tout à l'heure et je vous transmet le code que j'ai fait !

    Merci à vous tous.

  14. #14
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    5 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 5 846
    Points : 16 117
    Points
    16 117
    Billets dans le blog
    1

    Par défaut

    Bonsoir
    Citation Envoyé par morror Voir le message
    et je ne comprends pas le message de Sambia. Je ne connais pas cette fonction et je préfère pas m'y aventurer
    Normal, Sambia vient régulièrement ici étaler sa science sans jamais ni prendre en compte la population à qui il s'adresse ni essayer de comprendre le contexte du topic (ici clairement un exercice d'école de logique et de manipulation de if/else).

    Tu as 3 nombres "a", "b" et "c". La première chose déjà est de vérifier si ta saisie est correcte, en affichant justement ces nombres.

    Ensuite ben regarde le post de nnovic. Tu as 6 possibilités à évaluer donc il te faut les évaluer une à une. Ex: if (a < b && b < c) ... else if (a < c && c < b) ......
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  15. #15
    Invité
    Invité(e)

    Par défaut

    Merci c est exactement ce que je vais faire, merci beaucoup à tous. Je vous joins le code des que j ai réussi à le faire fonctionner.

  16. #16
    Membre éprouvé Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    mai 2010
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : mai 2010
    Messages : 324
    Points : 1 099
    Points
    1 099

    Par défaut

    Bonsoir;
    désolé, si je me suis précipité à fournir un code source vous avez tout fait raison @morror.
    @Sve@r: Je tiens juste à te préciser une chose; sache que je ne viens pas sur ce forum étaler ma science contrairement à ce que tu penses ou tu sous-entends. J’admets que je ne fais pas souvent attention, mais il n’est pas moins que ce que j’avance n’est pas erroné même s’il est hors contexte.
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  17. #17
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    5 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 5 846
    Points : 16 117
    Points
    16 117
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par morror Voir le message
    Merci c est exactement ce que je vais faire, merci beaucoup à tous. Je vous joins le code des que j ai réussi à le faire fonctionner.
    A la réflexion je ne suis pas certain que cette méthode d'énumérer toutes les possibilités soit la meilleure. Parce qu'avec 3 nombres t'as 6 cas distincts mais avec 4 t'en aurais 24.
    Et donc il y a aussi une autre façon de faire (par dichotomie)
    1) commencer par évaluer a et b
    2) ensuite, selon le cas, partir sur une branche qui évaluera a et c puis qui regardera éventuellement enfin b et c ; ou sur une autre qui évaluera b et c et éventuellement en final a et c

    Bon ça dépend bien entendu aussi de ton prof parce que sur chacune des deux méthodes les avis peuvent diverger et chaque opinion aura en sa faveur tout autant de qualités que de défauts. Donc peut-être que tu pourrais présenter à ton prof les deux méthodes (toutes les possibilités ou la dichotomie) et le laisser ensuite t'expliquer laquelle il préfère et pourquoi...
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  18. #18
    Invité
    Invité(e)

    Par défaut

    Oui, bonne idée

  19. #19
    Invité
    Invité(e)

    Par défaut

    Voici l'énoncé:
    Saisir 3 nombres entiers (dans les variables val1, val2 et val3) et imprimer les dans l’ordre
    croissant.
    (Échanger les valeurs des variables val1, val2 et val3 pour obtenir : val1 < val2 < val3)

  20. #20
    Membre expérimenté

    Homme Profil pro
    Responsable des études
    Inscrit en
    mars 2009
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2009
    Messages : 528
    Points : 1 530
    Points
    1 530

    Par défaut

    Citation Envoyé par morror Voir le message
    Échanger les valeurs des variables val1, val2 et val3
    C'est quand même une précision d'importance ! Pourquoi n'as-tu pas essayé de faire ça, alors ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 5 12345 DernièreDernière

Discussions similaires

  1. besoin d'aide pour une requête
    Par Damien69 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 31/03/2004, 15h38
  2. besoin d'aide pour le composant DBComboBox
    Par jane2002 dans le forum Bases de données
    Réponses: 8
    Dernier message: 28/02/2004, 19h01
  3. [Kylix] besoin d'aide pour installer kylix3
    Par Sph@x dans le forum EDI
    Réponses: 3
    Dernier message: 11/02/2004, 13h53
  4. [TP]besoin d'aide pour commandes inconnues
    Par Upal dans le forum Turbo Pascal
    Réponses: 15
    Dernier message: 03/10/2002, 10h48
  5. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo