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 :

besoin d'aide comparaison nombres


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 18
    Points : 16
    Points
    16
    Par défaut besoin d'aide comparaison nombres
    bonjour à tous!
    voilà je débute dans le c et j'ai réalisé un code qui compare trois nombres,ce que je désire savoir c'est si j'ai géré toutes les possibilités dans mes conditions if car j'ai quelque doutes..merci d'avance ...voiçi le 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    int main()
    {
        int a = 0,b = 0,c = 0;
     
        printf("entrer la valeur de a \n");
        scanf("%d",&a);
        printf("entrer la valeur de b \n");
        scanf("%d",&b);
        printf("entrer la valeur de c \n");
        scanf("%d",&c);
     
        if (a<b && b<c)
        {
          printf("a est plus petit, c est plus grand \n");
     
        }
     
         else if (a>b && b>c)
         { 
            printf("c est plus petit, a est plus grand \n");
     
          }
     
          else if (a<b && b>c && c<a)
          {
           printf("b est plus grand; a est plus petit \n");
           }   
     
           else if (a<b && b<c && c>a)
          {
           printf("b est plus grand; c est plus petit \n");
           }                 
     
     
           else if (a>b && b<c && c>a)
           {
             printf("a est plus grand; b est plus petit \n");
             }
     
             else
             {
                 printf("erreur");    
             }
             system("pause");
             return 0;
     }

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 49
    Points : 155
    Points
    155
    Par défaut
    D'abord, il manque les égalités (a == b c==a b==c)
    De plus, cette implémentation ne serait-elle pas plus simple?
    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
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int min ( int x , int y )
    {
        int i_retVal;
        if ( x > y )
       {
           i_retVal = y;
       }
       else
       {
           i_retVal = x;
       }
       return i_retVal;
    }
     
    int main()
    {
        int a = 0,b = 0,c = 0;
     
        printf("entrer la valeur de a \n");
        scanf("%d",&a);
        printf("entrer la valeur de b \n");
        scanf("%d",&b);
        printf("entrer la valeur de c \n");
        scanf("%d",&c);
     
        switch ( min ( c , min ( a , b) ) )
        {
            case a:
                if ( c < b )
                {
                    fprintf ( stdout , "a plus petit que c plus petit que b\n" );
                }
                else
                {
                    fprintf ( stdout , "a plus petit que b plus petit que c\n" );
                }
                break;
             case b:
                 if ( c < a )
                 {
                     fprintf ( stdout , "b plus petit que c plus petit que a\n" );
                 }
                 else
                 {
                      fprintf ( stdout , "b plus petit que a plus petit que c\n" );
                 }
                 case c:
                     if ( b < a )
                     {
                         fprintf ( stdout , "c plus petit que b plus petit que a\n" );
                     }
                     else
                     {
                         fprintf ( stdout , "c plus petit que a plus petit que b\n" );
                     }
                     default:
                         break;
    	}
    	return 0;

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Tu dois avoir 6 possibilités (pour des nombres différents) :
    a<b<c
    a<c<b
    b<a<c
    b<c<a
    c<a<b
    c<b<a
    Comme tu n'en as testé que 5, de toute façon c'est incomplet.

    - Le premier if : if (a<b && b<c)teste pour a<b<c
    - Le deuxième : if (a>b && b>c) teste pour c<b<a
    - Le troisième if : if (a<b && b>c && c<a) teste pour c<a<b . Mais c<a && a< b suffit. La condition b>c est inutile :
    c<a && a<b => c<b
    - Le quatrième if : if (a<b && b<c && c>a) teste aussi, comme le premier if(), pour a<b<c. la condition c>a étant inutile :
    a<b && b<c => a<c
    ....

    Il faut être plus systématique. Par exemple, la condition if (a<b && b<c) teste pour a<b<c. Pour tester a<c<b, on peut utiliser cette expression en échangeant simplement b et c : if (a<c && c<b) et ainsi de suite.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Moi, j'aime assez l'implémentation de Kurk49.
    Par contre, naturellement on peut lui reprocher de donner la réponse, sans explication et surtout assez difficile à comprendre pour un débutant et évidemment impossible à justifier auprès du professeur.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 49
    Points : 155
    Points
    155
    Par défaut
    D'une manière générale, si tu as beaucoup de cas à gérer, évite l'accumulation des if au profit des switch case

  6. #6
    Invité
    Invité(e)
    Par défaut
    100% d'accord pour les switch case.
    Je vais même renchérir, dans certains cas où au moment de l'écriture, si il n'y a qu'une condition, mais qui n'est pas du genre SI ... ALORS mais du genre CE CAS, il n'arrive d'utiliser sxitch case , avec une seule case. Il est possible que dans 15 jours il y ait un autre cas à rajouter, sans pour autant qu'il y ait d'erreur d'analyse. Par contre un if aurait été une erreur d'analyse.
    Mais dans le cas présent, 6 conditions strictement exclusives, le switch ne me parait pas une bonne solution.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 49
    Points : 155
    Points
    155
    Par défaut
    Tout à fait d'accord. Pour relancer le débat, et pour élargir les opinions, enrichir les connaissances de chacun, laquelle des deux notations suivantes préférrez-vous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    if ( condition_1)
    {
        /* traitement */
    }
    else if ( condition_2 )
    {
        /* des choses à faire */
    }
    else
    {
    ...
    }
    ou bien:
    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
     
    if ( condition_1 )
    { 
        /* blabla */
    }
    else
    {
        if ( condition_2 )
        {
            /* des choses */
        }
        else
        {
            ....
        }
    }
    Personnellement, je conseille la deuxième notation à un débutant, car, si le code est plus long, il m'a toujours paru moins ambigu à la lecture.

    Y'a -t-il d'autres opinions à ce sujet?

  8. #8
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    402
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 402
    Points : 337
    Points
    337
    Par défaut
    Le deuxième code est strictement identique à la seul différence que le else et le if sont séparés par une parenthèse {.

    Dans la plupart des cas je préfère bien discerner certains blocs avec des parenthèses. Mais dans ce cas ci, je trouve qu'il y en a trop.

    Donc, en ce qui me concerne je choisi le premier code

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 49
    Points : 155
    Points
    155
    Par défaut
    Merci d'avoir répondu!

    C'est toujours très sympa d'avoir de la participation.

    Dans ce cas, aurais-tu un exemple ou l'emploi du "else if" pour toi manque de clarté?

  10. #10
    Invité
    Invité(e)
    Par défaut
    Je ne pense pas qu'il faille chercher à généraliser.
    J'ai des cas où j'ai des pages et des pages de else if, je pense par exemple à la lecture de certains fichiers qui sont constitués d'une commande suivie de données, en gros comme les balises d'un fichier XML, la seconde forme correspond plutôt à une organisation en arbre des conditions.
    Tant au point de vue clarté que rapidité de traitement, les deux cas sont différents.
    C'est mon avis.
    Dernière modification par Melem ; 29/10/2010 à 03h30.

  11. #11
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    402
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 402
    Points : 337
    Points
    337
    Par défaut
    Comment la rapidité de traitement peut-elle être différente ? Dans les deux codes, une fois la condition trouvée, on ne passe plus dans les else ? Comment se font les exécutions sinon ?

    EDIT : désolé je n'ai pas d'exemple, je ne trouve pas de situation où il y aurait manque de clarté

  12. #12
    Invité
    Invité(e)
    Par défaut
    Je m'explique pour la rapidité de traitement.
    Dans le second cas pour tester la condition à la nième position hiérarchique, il faut être passé par les test précédents. Chaque couple d'accolade correspond à un bloc, donc un branchement. Mais ne polémiquons pas sur ce point, c'est mineur.
    Le côté logique (séquentiel ou arborescent) me parait beaucoup plus important.

  13. #13
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    402
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 402
    Points : 337
    Points
    337
    Par défaut
    Merci :]

    Si j'ai bien compris, le premier cas reflète la logique séquentielle alors que le second correspond à l'arborescence

    C'est la première fois que je vois ces else if de manière arborescente justement. Ça doit forcement être utile dans certains cas, mais je n'en ai apparemment jamais rencontré

    Ceci dit, la "comparaison" de ces deux logiques est tout de même intéressante.

    Merci pour les informations en tous cas.

  14. #14
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par kurk49 Voir le message
    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
    int main()
    {
        int a = 0,b = 0,c = 0;
     
        /* ... */
     
        switch ( min ( c , min ( a , b) ) )
        {
            case a:
                 /* ... */
            case b:
                 /* ... */
            case c:
                 /* ... */
        }
     
        return 0;
    }
    a, b et c sont des variables. Ces "case" sont donc incorrects (case requiert en argument un expression constante), et tout le switch aussi du coup. Il faut utiliser if-else.

  15. #15
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    100% d'accord pour les switch case.
    Je vais même renchérir, dans certains cas où au moment de l'écriture, si il n'y a qu'une condition, mais qui n'est pas du genre SI ... ALORS mais du genre CE CAS, il n'arrive d'utiliser sxitch case , avec une seule case. Il est possible que dans 15 jours il y ait un autre cas à rajouter, sans pour autant qu'il y ait d'erreur d'analyse. Par contre un if aurait été une erreur d'analyse.
    Mais dans le cas présent, 6 conditions strictement exclusives, le switch ne me parait pas une bonne solution.
    Le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    switch(n)
    {
    case a:
        case_a();
        break;
     
    case b:
        case_b();
        break;
     
    default:
        case_default();
    }
    Fait la même chose que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (n == a)
        case_a();
    else if (n == b)
        case_b();
    else
        case_default();
    Où est-ce que se manifeste l'erreur d'analyse dans le deuxième cas ? De plus, le switch-case du C a beaucoup trop de limitations :

    - case n'accepte que des expressions constantes
    - la seule comparaison supportée est la stricte égalité
    - on ne peut comparer que des scalaires.

    Chez certains langages, ces restrictions n'existent pas.

  16. #16
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Je suppose que la question m'est posée, donc je vais essayer de répondre.
    D'abord puis qu'on est en dehors de tout logique de développement, je ne peus répondre que concernant la programmation.
    Les deux codes présentés font la même chose,où est le problème ?
    Ou pourrait-il y avoir une erreur d'analyse, puisqu'il n'y a pas d'analyse. Il y a deux codes qui font la même chose, avec chacun une syntaxe différente, il sont aussi valable l'un que l'autre, sinon, on en aurait supprimé un, mais suivant la logique de ce qu'on veut faire (sous-entendu développement par opposition à programmation), personnellement, je choisirai l'un ou l'autre, mais pas au hasard.

    Le switch-case a "beaucoup trop" de limitation. Est-ce une raison pour le proscrire de la panoplie des outils ?

    Dans mes réponses précédentes, j'ai dit ce que je préférais et surtout que je n'excluais rien et que si un langage permet différentes syntaxes pour (en simplifiant) un même code machine, c'est parce que c'est un langage destiné à être utilisé par des humains et pas seulement à être expliqué par des théoriciens.

  17. #17
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Les deux codes présentés font la même chose,où est le problème ?
    Le problème est ici : l'un compilera, l'autre ne compilera pas. Comme cela a été dit, case ne fonctionne qu'avec des constantes (littérales).

    EDIT :

    Compilera :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    switch (valeur)
    {
      case 123:
         ...
      default:
         ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #define CONSTANTE 123
    ...
    switch (valeur)
    {
      case CONSTANTE:
         ...
      default:
         ...
    }
    Ne compilera pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int variable = 123;
    ...
    switch (valeur)
    {
      case variable:
         ...
      default:
         ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    const int variable = 123;
    ...
    switch (valeur)
    {
      case variable:
         ...
      default:
         ...
    }

  18. #18
    Invité
    Invité(e)
    Par défaut
    Bonjour jeroman,
    Lorsque Melem a posé la question, et surtout à écrit "fait ma même chose que" il paraissait sous entendu que le code présenté était correct, donc que le termes "a" "b" étaient par exemple des enum.
    Si ce n'est pas le cas, alors le code proposé n'a pas de sens, mais c'est sans importance, je ne mettrai pas de note négative pour si peu. Si le code ne se compile pas, alors c'est que la syntaxe l'est pas bonne, et il y a encore moins de problème.
    Mois je voulais seulement parler de logique. La bonne syntaxe est un préalable incontournable et ne présente pas vraiment d'intérêt de discussion.

    PS il est toujours déconseillé de donner des exemples faux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      switch (Button)
      {
        case mbLeft:
          switch (DrawingTool)
          {
            case dtPolyL:   // création d'une polyline
    C'est le début et oh miracle, il compile

  19. #19
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    Le switch-case a "beaucoup trop" de limitation. Est-ce une raison pour le proscrire de la panoplie des outils ?
    Je n'ai jamais dit cela. Dans ton message précédent par contre, tu disais bien :
    100% d'accord pour les switch case.
    (...)
    Il est possible que dans 15 jours il y ait un autre cas à rajouter, sans pour autant qu'il y ait d'erreur d'analyse. Par contre un if aurait été une erreur d'analyse.
    Alors je me suis demandé quand est-ce que l'usage d'un if-else peut être une erreur. C'est switch-case qui n'est pas très flexible, if-else l'est. Quand donc utiliser switch-case et quand utiliser if-else ? La réponse que je propose est : tant que c'est possible, utiliser switch-case parce que c'est plus facile à écrire, sinon utiliser if-else.

  20. #20
    Invité
    Invité(e)
    Par défaut
    Bonjour Melem,
    D'abord sur les termes, quand je parle d'erreur, cela n'a rien à voir avec une faute, disons que c'est un erreur de choix de logique.

    Pour la question du choix du switch-case et du else if, pour moi, la souplesse serait plutôt un inconvénient.
    Si "dans 15 jours ....", dans cette hypothèse j'aurai un nouveau cas, donc un nouveau traitement à faire, donc la souplesse n'est pas un avantage. Les 6 lignes citées en exemple étaient le début d'une série de 78 case. Ce sont les actions faites avec le bouton gauche de la souris.
    D'une part, il est bien évident que je n'ai pas prévu ces 78 cas le même jour et encore moins écrits. D'autre part, je n'ose pas imaginer le temps de traitement s'il y avait 78 else if.
    D'ailleurs de mémoire cette logique existait en fortran.
    Je ne sais pas si un switch-case est plus facile à écrire, je ne me suis jamais posé la question.
    Par contre, ce n'est que la logique de l'analyse qui me fait choisir, dans le cas de comparaison de nombres du sujet, je préfèrerais else if.
    Mais je me souviens d'un traitement, où je devais faire un opération pour les 48 pixels qui sont dans une graille de 7x7 (autour du centre). J'ai fait une boucle de 0 à 48, et suivant un cheminement en colimaçon, j'ai traité les 48 cas.
    Je dirais même, puisque le switch-case est plus strict que le else il il devrait être préféré quand c'est possible.

    Cordialement.
    Dernière modification par Melem ; 30/10/2010 à 13h32.

Discussions similaires

  1. besoin d'aide (nombre complexe)
    Par matrix-men dans le forum C
    Réponses: 2
    Dernier message: 07/03/2011, 23h01
  2. besoin d aide pour trier des nombres
    Par flexi2202 dans le forum Excel
    Réponses: 2
    Dernier message: 15/11/2010, 08h47
  3. Réponses: 5
    Dernier message: 17/03/2010, 17h11
  4. Besoin d'aide pour bloquer un nombre sur une TextBox
    Par Torrent74 dans le forum Flash
    Réponses: 2
    Dernier message: 24/10/2007, 20h14
  5. Réponses: 1
    Dernier message: 23/04/2007, 10h59

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