IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Programme de tri


Sujet :

C

  1. #21
    Membre chevronné
    Avatar de emixam16
    Homme Profil pro
    Chercheur en sécurité
    Inscrit en
    Juin 2013
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Chercheur en sécurité

    Informations forums :
    Inscription : Juin 2013
    Messages : 333
    Points : 1 828
    Points
    1 828
    Par défaut
    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)
    Tu as deux manières de résoudre ça :

    • Statique : tu auras toujours 3 entiers. Tu peux faire des permutations statiques pour résoudre le problème. Dans ce cas essaye de voir lesquelles te semblent pertinentes.
    • Dynamique : Tu peux avoir plus ou moins de 3 entiers : tu dois donc chercher une approche simple qui résolve ton problème pour N entiers (et donc aussi pour 3 entiers). Tu peux regarder du côté du Tri à bulles

    La méthode dynamique est plus flexible car elle te permet de gérer des cas (un peu) plus complexe et pourra donc être réutilisée mais elle est aussi (un peu) plus dure à mettre à place. C’est deux stratégies différentes pour résoudre le même problème, à toi de voir midi à 14 heures ta porte.

  2. #22
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    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 : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Mieux qu'un tri à bulle, il y a qsort.
    Cela dit, l'exercice est explicitement à 3 nombres.
    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

  3. #23
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par morror Voir le message
    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)
    Je n'ai pas trop bien compris si l'échange des 3 valeurs constitue une suite de l'exercice ; ou bien si c'est la méthode à employer pour pouvoir les afficher dans l'ordre croissant.

    C'est un détail très important (enfin pas ici parce qu'en fait tes 3 valeurs on s'en tape tous un peu) mais plus tard, tu seras confronté à des situations où tu devras décider si tu as le droit de modifier les données reçues pour obtenir ton résultat. Car c'est ce qui se passe quand tu échanges tes valeurs, tu perds alors les valeurs telles qu'elles ont été entrées donc conceptuellement c'est ce qu'on nomme une "perte d'information". Et dans certains cas, ça peut avoir son importance...
    Mon Tutoriel sur la programmation «Python»
    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
    Et on poste ses codes entre balises [code] et [/code]

  4. #24
    Invité
    Invité(e)
    Par défaut
    Oui tout à fait, je suis partie sur un travail en alors que je pourrais alterner mes scanf tout simplement ?

  5. #25
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    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 : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    non, alterner scanf n'a aucun intéret.

    Ton programme doit se présenter ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main() {
        //obtenir les trois nombres
        //trier les trois nombres
        //afficher les nombres triés
        return 0;
    }
    Je t'invite très vivement à définir une petite fonction pour échanger deux nombres (attention, passage par pointeurs requis).
    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

  6. #26
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Je pense que l'énoncé du problème est clair :
    Citation Envoyé par morror
    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)
    Il n'est donc pas question ici de parler d’algorithme de tri de tableau, de trier 4 ou 100 ou n valeurs. Il faut saisir 3 nombres et les afficher dans l'ordre croissant. Une fois que morror aura réussi et compris cet exercice, il sera possible d'aller plus loin et de faire une version 2 avec n valeurs. D'ici là, concentrons-nous sur le problème initial.


    Citation Envoyé par morror
    je pourrais alterner mes scanf tout simplement ?
    Il faut distinguer 2 parties à ton programme : une partie où l'utilisateur va saisir 3 nombres et une partie où ton programme va comparer ces nombres et déterminer ce qu'il doit afficher.

    Pour réaliser cette première partie, tu peux effectivement te servir de scanf(). Sache que scanf() n'est une fonction si simple que cela, elle peut se révéler "dangereuse" comme l'a dit sambia39). Il existe une entrée de la FAQ qui explique pourquoi https://c.developpez.com/faq/?page=B...utiliser-scanf Sache aussi que pour un tel exercice simple, scanf() est quand même une bonne solution. Il te suffit de l'utiliser de la manière adéquate et cela fonctionnera bien. Au passage, Developpez.com propose un tutoriel très complet sur l'utilisation de cette fonction http://xrenault.developpez.com/tutoriels/c/scanf/

    Pour acquérir 3 nombres, tu as deux façons de faire :
    1. les demander les 3 d'un coup
    2. les demander un par un

    Tu peux donc faire un seul scanf() ou en faire 3. Tu peux essayer de faire les 2 solutions, cela te permettra de mieux comprendre comment fonctionner cette fonction.

    Pour vérifier que ton acquisition fonctionne, tu peux simplement afficher les valeurs, avant même de les trier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        int val1 = 0, val2 = 0, val3 = 3;
     
        // acquisition avec scanf a faire ici
     
        printf("Valeurs lues: %d %d %d\n", val1, val2, val3);
    Quand tu auras réussi à faire ça, montre nous ton code et on pourra s'attaquer à la partie 2 : le tri et l'affichage

  7. #27
    Invité
    Invité(e)
    Par défaut
    Voila le bout de code, merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include<stdio.h>
     
    int main ()
     
    {
        int a = 0, b = 0, c = 0;
     
        printf("afficher 3 entier, %d %d %d\n", a, b, c);
     
     
    return 0;
    }

  8. #28
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Ouais enfin bon là c'était pas la peine parce que concrètement il n'y a rien. C'est concrètement le code de Bktero que t'as recopié et même sans ça, vu ce que tu as déjà écrit jusqu'à présent, on se doute tous que tu sais au-moins afficher 3 variables.
    Toutefois Bktero avait mis un truc en plus dans son code // acquisition avec scanf a faire ici qui signifie que tu as de ton coté une action à coder à cet endroit précisément...
    Mon Tutoriel sur la programmation «Python»
    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
    Et on poste ses codes entre balises [code] et [/code]

  9. #29
    Invité
    Invité(e)
    Par défaut
    Pardon mais il m'explique comment faire, je vais attendre qu'il me réponde. En effet je pense que les if pour ce genre de problème n'est pas approprié.
    Mais j'ai essayé de mon côté à faire l'inverse, d'abord le printf et ensuite le scanf et de refaire un printf comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%d %d %d", a, b, c)
    mais cela me donne des entier qui n'ont rien à voir avec mes scanf.

    Je vais attendre ces explications, merci à vous !
    Dernière modification par Bktero ; 25/07/2017 à 15h38. Motif: Mise en forme

  10. #30
    Invité
    Invité(e)
    Par défaut
    J'ai réussi.

    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
    #include<stdio.h>
     
    int main ()
     
    {
        int a = 0, b = 0, c = 0;
     
        scanf("%d %d %d", &a, &b, &c);
     
        printf("afficher 3 entier, %d %d %d\n", a, b, c);
     
        printf("afficher a, b, c dans l ordre croissant %d < %d < %d", a, b, c);
     
    return 0;
    }
    Merci à vous tous !

  11. #31
    Invité
    Invité(e)
    Par défaut
    ha non j'ai mal lu, je me suis emballé

  12. #32
    Membre chevronné
    Avatar de emixam16
    Homme Profil pro
    Chercheur en sécurité
    Inscrit en
    Juin 2013
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Chercheur en sécurité

    Informations forums :
    Inscription : Juin 2013
    Messages : 333
    Points : 1 828
    Points
    1 828
    Par défaut
    Tu as "réussi" à saisir les 3 trois nombres et les afficher. Il ne te manque plus qu’à les trier maintenant (j’ai décrit la méthode dans mon dernier message).

    Il faut que ça te paraisse logique. Comment ferais-tu pour trier 3 nombres sur un bout de papier ? Si tu sais répondre à ça tu pourras répondre à ton problème (sinon j’abandonne...).

    Citation Envoyé par ternel Voir le message
    Mieux qu'un tri à bulle, il y a qsort.
    Cela dit, l'exercice est explicitement à 3 nombres.
    De toute évidence c’est un grand débutant. Donc oui qsort est plus puissante mais aussi très largement hors de sa portée puisqu’elle prend en paramètre un pointeur sur fonction (cela dit, même mon bubble sort devait être un peu limite, ou alors il trolle).

    Arrêtez de lui parler de pointeurs, de pointeurs sur fonction, des limites de scanf, vous voyez bien que c’est aussi abstrait pour lui que la philosophie pour un labrador.

  13. #33
    Invité
    Invité(e)
    Par défaut
    Les pointeurs, entendu parlé mais jamais utilisé. En effet, je débute en langage C. Je sais faire des exercices de type, faire des calculs, des if mais j admet en faire quelques erreurs. Les boucles, Je suis en train de les reviser...bon pour exemple, je sais qu un void est un type sans valeur...mais void [2], je ne comprends pas. Je suis venu sur ce forum pour pouvoir avoir des réponses mais aussi parce qu' il me paraissait très pro mais je suis un débutant. Merci.

  14. #34
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Maintenant que l'acquisition des nombres est faite, on peut passer à la partie 2 : le tri et l'affichage.

    Avant de se lancer dans du code, il faut réfléchir à un algorithme. C'est-à-dire qu'il faut définir la méthode (au sens mathématique, logique) pour résoudre le problème qui est ici "connaissant 3 nombres a, b et c, comment faire pour les afficher dans l'ordre croissant ?". Un algorithme s'écrit très bien en français. Tu peux aussi utiliser du pseudo code. Pour résoudre le problème énoncé, il y a plusieurs solutions possibles. A toi d'en imaginer quelques unes et de trouver celle qui te parait la "meilleure". "Meilleure", c'est très subjectif bien sûr mais c'est souvent la façon la plus simple, la plus compréhensible (sauf si, par exemple, des contraintes importantes de performances sont nécessaires, mais ce n'est pas le cas ici).

    Propose nous au moins une solution, en français ou en pseudo-code. On la traduira alors en C (mais ça devrait te venir naturellement si ton algorithme est clair).

    Pour finir, je souhaite revenir sur ce point de ton énoncé et sur le cadre de l'exercice :
    (Échanger les valeurs des variables val1, val2 et val3 pour obtenir : val1 < val2 < val3)
    Si ton exercice est demandé par un prof et que tu es obligé de respecter cette partie de partie de l'énoncé, alors tu devras faire ce que dit ternel et écrire une méthode qui inverse les valeurs de 2 variables. Et cela passe effectivement par des pointeurs. Si tel est le cas, tu peux imaginer une première solution sans respecter cette contrainte et dans une deuxième temps une seconde solution qui la respectera.

  15. #35
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par morror Voir le message
    Je suis venu sur ce forum pour pouvoir avoir des réponses mais aussi parce qu' il me paraissait très pro mais je suis un débutant. Merci.
    Oui oui, la majorité d'entre nous avons compris, pas de souci. Laisse tomber tout ce qui te parait incompréhensible et concentre-toi sur l'essentiel. Maintenant tu as tes 3 valeurs. Alors comment les afficher ??? On en revient au début sauf qu'il y a maintenant cette histoire de permutation en plus. Donc ça ne change pas vraiment l'algorithme par rapport à au début. Au début, on disais grosso-modo "si b est plus petit que a alors afficher b puis afficher a". Maintenant, ça devient "si b est plus petit que a alors permuter a et b". Bref les tests ne changent pas, seule l'action qui en résulte change...
    Mon Tutoriel sur la programmation «Python»
    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
    Et on poste ses codes entre balises [code] et [/code]

  16. #36
    Invité
    Invité(e)
    Par défaut
    Donc cela veut dire que par exemple je dois dire utiliser le if et dire si :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (a < b){
    }
    printf("%b, a)
    Et je fais ça avec tout mes nombres. Enfin je veux dire toute les actions possibles ?

    Sinon un pointeur c'est quoi ? Je peux demander à mon prof de m'envoyer un cours la dessus mais je ne suis pas sûr qu'il sera chaud pour le faire, il me dira que on en est pas là dans le cours...

    Je réponds en même temps à bktero sur l'algorythme à trouver !

    Merci

  17. #37
    Invité
    Invité(e)
    Par défaut
    En fait je pourrais le faire en un seul if, bktero ?

  18. #38
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par morror Voir le message
    Donc cela veut dire que par exemple je dois dire utiliser le if et dire si :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (a < b){
    }
    printf("%b, a)
    printf("%b" ????? b est une variable, pas un format d'affichage.
    Concentre toi. ternel a proposé un bon chemin de réflexion
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main() {
        //obtenir les trois nombres
        //trier les trois nombres
        //afficher les nombres triés
        return 0;
    }
    Donc tu as obtenu les 3 nombres. Maintenant,il faut les trier. Soit en énumérant tous les cas possibles if (a < b && b < c), soit en découpant le problème en "évaluer a et b" puis, si a est le plus petit, "évaluer a et c" et etc...

    Citation Envoyé par morror Voir le message
    Sinon un pointeur c'est quoi ? Je peux demander à mon prof de m'envoyer un cours la dessus mais je ne suis pas sûr qu'il sera chaud pour le faire, il me dira que on en est pas là dans le cours...
    Exactement, chaque chose en son temps. Si tu veux avoir une idée, c'est une variable prévue pour stocker l'adresse d'un truc (le plus souvent l'adresse d'une autre variable).

    Citation Envoyé par morror Voir le message
    En fait je pourrais le faire en un seul if, bktero ?
    Rien n'a changé depuis le début. Tu as 6 cas à évaluer, tu penses vraiment pouvoir les évaluer avec une seule alternative ??? Es-tu capable, avec un seul verbe, de décrire en français une évaluation de 3 nombres ???
    Mon Tutoriel sur la programmation «Python»
    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
    Et on poste ses codes entre balises [code] et [/code]

  19. #39
    Invité
    Invité(e)
    Par défaut
    ok j'ai compris je fais le code et vous l'envoi.

    Merci

  20. #40
    Invité
    Invité(e)
    Par défaut
    Voila mon 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
    21
    22
    23
    24
    25
    26
    27
    28
    #include<stdio.h>
     
    int main ()
     
    {
    int a = 0, b = 0, c = 0;
     
    scanf("%d %d %d", &a, &b, &c);
     
    printf("afficher 3 entier, %d %d %d\n", a, b, c);
     
    if((a < b && a < c && b < c)){
        printf("%d %d %d", c, b, c);
    }else if((a < c) && (a < b) && (c > b)){
        printf("%d %d %d", c, b, a);
    }else if((b > a) && (b < c) && (b > a)){
        printf("%d %d %d", c, b, a);
    }else if((b > a) && (c > a) && (c > a)){
        printf("%d %d %d", c, b, a);
    }else if((c > a) && (c > b) && (b > a)){
        printf("%d %d %d", c, b, a);
    }else((c > b) && (c > a) && (b > a));{
        printf("%d %d %d", c, b, a);
    }
     
     
    return 0;
    }
    Merci à vous tous !

+ Répondre à la discussion
Cette discussion est résolue.

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