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 :

Modulo et nombre impair/pair


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 76
    Points : 50
    Points
    50
    Par défaut Modulo et nombre impair/pair
    Bonjour,

    je fais un petit programme dans lequel on entre des valeur... en fonction que la valeur soit pair ou impair, elle sera additionné à une variable différente...

    je voulais utiliser la fonction modulo MOD mais elle prend pas et je sais pas trop pourquoi ! Dans mon idée si le modulo d'un nombre était différent de zéro le nombre est impair si non il est pair...

    Voila le programmme merci de votre aide

    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
    /*S3_E01*/
     
    #include <stdlib.h>
    #include <conio.h>
    #include <stdio.h>
    #include <math.h>
     
    #define max 5
     
    int main()
    {
        int tab[max];
        int i,sommep,sommeimp,r,temp;
        for (i=0;i<max;i++)
        {
        printf("enter un nombre entier"); 
        scanf("%d",&tab[i]);
        temp=tab[i];
        r=MOD temp;
        if (r<0)
        sommeimp=sommeimp+temp;
        else 
        sommep=sommep+temp;
        }
        for (i=0;i<max;i++)
        printf("nombre[%d] = %d\n",i+1,tab[i]);
        printf("\nle somme des nombre pair est %d\n",sommep);
        printf("le somme des nombre impair est %d",sommeimp);
        system("pause");
    }

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    parce que modulo en C c'est l'opérateur %

    9 % 2 = 1
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Attention au variables non initialisée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int sommep;
    //....
    sommep=sommep+temp;
    Ce code va te donner un résultat érroné.

  4. #4
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 76
    Points : 50
    Points
    50
    Par défaut
    OK merci pour vos réponses...

    en fait je ne peut donc pas déterminer le parité d'un nombre x avec le modulo !

    comment faire alors ??

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par degseb Voir le message
    OK merci pour vos réponses...

    en fait je ne peut donc pas déterminer le parité d'un nombre x avec le modulo !

    comment faire alors ??

    je viens de te le dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ( (nombre % 2) == 0 )
        fprintf ( stderr, "\n Nombre pair");
    else
        fprintf ( stderr, "\n Nombre impair");
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  6. #6
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 76
    Points : 50
    Points
    50
    Par défaut
    ouppsss désolé ... j'étais distrait

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Normalement ton compilo doit optimiser un iVar%2, mais la parité sera plus performante avec un &. En fait, un %2, ca a tendance à me 'choquer'.

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Normalement ton compilo doit optimiser un iVar%2, mais la parité sera plus performante avec un &. En fait, un %2, ca a tendance à me 'choquer'.


    & fait du bit

    % est pour les nombres
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  9. #9
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Salut,

    Citation Envoyé par souviron34 Voir le message


    & fait du bit

    % est pour les nombres
    Faire :
    ou
    reviens a dire la même chose sauf que je trouve bien plus explicite la première méthode à savoir le % ...peut être que le & est plus performant ,mais le compilateur optimisera c'est clair !

    @++
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ssmario2 Voir le message
    reviens à faire la même chose
    sauf que si tu veux des multiples autres que 2 ça commence à devenir compliqué

    C'est pour ça qu'il y a dans la norme un opérateur bit (&) et un opérateur modulo (%)
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  11. #11
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Oui ça peut vite devenir beaucoup moins clair quand c'est un multiple autre que 2 , je viens de tester rapidement ( gcc 4.1.3 ), avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    char a=5;
     
    int main( void )
    {
    	if( a%2 && a&1 )
    	{
    		a=1;
    	}
     
     
    	return 0;
    }
    j'obtiens :
    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
    <...>
            movzx   %eax, BYTE PTR a
            movzx   %eax, %al
            and     %eax, 1
            test    %al, %al
            je      .L2
            movzx   %eax, BYTE PTR a
            movsx   %eax, %al
            and     %eax, 1
            test    %al, %al
            je      .L2
            mov     BYTE PTR a, 1
    .L2:
            mov     %eax, 0
    <...>
    Moralité pas besoin de se prendre la tête
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ssmario2 Voir le message
    Moralité pas besoin de se prendre la tête
    et comment fais-tu pour faire

    nombre modulo 247 ??
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  13. #13
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    et comment fais-tu pour faire

    nombre modulo 247 ??
    Je ne sais pas ...247 n'est pas un multiple de 2 donc je vois mal comment on pourrait traduire l'opération rien qu'avec des opérateurs bit à bit ...
    ce que j'ai déjà dit juste en haut :
    Citation Envoyé par ssmario2
    Oui ça peut vite devenir beaucoup moins clair quand c'est un multiple autre que 2 ...
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    L'intérêt du & est uniquement pour les multiples de 2. Je trouve que cela est plus 'élégant'. Donc, c'est uniquement une question de point de vue, car effectivement, dans 95% des cas le compilo fait l'optimisation. D'ailleurs, ca a l'avantage de correspondre au code généré...

  15. #15
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    Citation Envoyé par ssmario2 Voir le message
    Salut,



    Faire :
    ou
    reviens a dire la même chose
    Pas pour les nombres négatifs impairs a priori. Pour le modulo 127 tu peux faire comme ça :
    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
    ; Entrée dans edi, sortie dans edi
            xor ecx, ecx
     
            mov eax, edi
            mov edx, 0x81020409
            imul edx
     
            add edx, edi
     
            sar edx, 6
     
            test edx, edx
            sets cl
            add edx, ecx
     
            imul edx, 127
            sub edi, edx
    Edit : erf c'était modulo 247 au départ.
    :wq

  16. #16
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Citation Envoyé par dapounet
    Pas pour les nombres négatifs impairs a priori...
    Pourquoi cela ?
    Avec un % le résultat sera -1 tandis qu'avec un & c'est 1, sachant que toutes valeurs autre que 0 est VRAI c'est ok je pense .


    P.S : Ceci s'applique aux nombres négatifs représentés par un complément à 2
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  17. #17
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    Avec le code de l'auteur ça m'étonnerait que ça donne la même chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        r=MOD temp;
        if (r<0)
        sommeimp=sommeimp+temp;
        else 
        sommep=sommep+temp;
    Le fait que le truc du & n'est pas équivalent au modulo 2^k dans la plupart des cas est une bonne raison pour l'éviter.
    :wq

  18. #18
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Attention, le ET bit-à-bit dans ce cas de figure ne s'applique pas aux multiples de deux mais aux puissances de deux !

    Pour le reste, j'ai effectivement tendance à extraire le bit de poids faible avec &1 pour tester une parité. Non seulement parce que c'est beaucoup plus efficace en l'absence d'optimisation, mais également parce que l'on reste toujours dans le domaine de solution {0;1} quelque soit le signe du nombre testé.

  19. #19
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Attention, le ET bit-à-bit dans ce cas de figure ne s'applique pas aux multiples de deux mais aux puissances de deux !
    Oui, effectivement, je voulais dire puissance de deux, mais mes doigts ont fourchés... Je maintient que je préfère faire le & dans ce cas, mais j'avoue que ça reste une question de 'goût' et que je n'en ferais pas une règle.

Discussions similaires

  1. savoir si un nombre est pair ou impair?
    Par bubulle29 dans le forum MATLAB
    Réponses: 3
    Dernier message: 05/06/2009, 15h39
  2. Réponses: 6
    Dernier message: 27/05/2009, 22h14
  3. savoir si un nombre est pair ou non
    Par shirya dans le forum C++
    Réponses: 25
    Dernier message: 23/11/2005, 17h53
  4. Réponses: 4
    Dernier message: 30/06/2002, 20h23

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