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 :

Exercice fonction nombre premier


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 12
    Points : 4
    Points
    4
    Par défaut Exercice fonction nombre premier
    bonjour a tous ,

    Voila j'ia un exercice a faire qui consiste a créer une fonction qui affiche tous les nombre premier inferieur a un nombre n (entré par l'utilisateur )

    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
    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
     int premier (int x)
    {
       int i,y;
     
       y=sqrt(x)+1;
       if (x%2==0)
          {
          return 0;
          }
        else
          {
          for (i = 3 ; i < y; i+=2)
            if (y % i != 0)
              {
               return 0;
              }
            else
              {
               return 1;
              }
          }
    }
    // Fonction qui affiche les nombres premiers inferieur à n
    int premier2 (int x)
    {
        int j,a;
     
        // Boucle permettant de scanner les nombres entre 0 et n
        for (j=1; j<x;j++)
        {
            a = premier(j);
            // Affichage des nombres si ils sont premiers
            if (a == 1)
            {
                printf("%d ",j);
            }
        }
        printf("\n\n");
    }
     
     
    int main(int argc, char *argv[])
    {
    int c;
     
        // Menu de sélection du programme
        printf("******** Exercire I ********\n\n");
        printf("1. Tester si le nombre saisi est premier\n");
        printf("2. Afficher les nombres premiers inferieurs a un nombre n\n");
        printf("3. Afficher les n premiers nombres premiers\n");
        printf("0. Quitter\n");
        scanf("%d",&c);
     
        int n,y;
     
        switch (c)
        {
               case 1 :
                    {
                        printf("\n******** Tester si le nombre saisi est premier ********\n\n");
     
                        // Saisie de la valeur par l'utilisateur
                        printf("Saisissez n : ");
                        scanf("%d",&n);
     
                        y = premier(n);
     
                        // Affichage du message (traduction de la réponse de la fonction
                        if (y == 0)
                            printf("\n%d n'est pas premier\n\n",n);
                        else
                            printf("%d est premier !!\n",n);
                        system("PAUSE");
                        break;
                    }
                    case 2 :
                    {
                        printf("\n******** Afficher les nombres premiers inferieurs a un nombre n ********\n\n");
     
                        // Saisie de la valeur par l'utilisateur
                        printf("Saisissez n : ");
                        scanf("%d",&n);
                        printf("\n");
     
                        y = premier2 (n);
     
                        system("PAUSE");
                        break;
                    }
        }
    }
    Quand j'execute mon programme il ne me donne que quelque nombre premier , si quelqu'un peut m'aider a trouver le probleme ca serait cool , merci d'avance

  2. #2
    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
    Deux erreurs dans premier() :

    1- if (y % i != 0) au lieu de if (x % i == 0) : y ->x et != -> ==

    2- Dans la boucle for, on sort de la fonction avec 0 ou 1 dès le premier passage pour i = 3

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int premier (int x)
    {
       int i,y; 
       if (x % 2 == 0) return 0;
       y = sqrt(x)+1;
       for (i = 3 ; i < y; i += 2)
            if (x % i == 0) return 0;
       return 1;
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Merci pour ton aide , voila ma fonction corriger , le probleme c'est qu'il me laisse encore quelque nombre non premier dans la liste sans que je sache pk ...

    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
     int premier (int x)
    {
       int i,y;
     
       y=sqrt(x)+1;
       if (x%2==0)//permet de voir si le nombre est paire ou non
          {
          return 0;
          }
        else
          {
          for (i = 1 ; i < y; i+=2)//boucle sans les diviseurs paires
          {
            if (x % i == 0)
               return 0;
            else
               return 1;
          }
          }

  4. #4
    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 n'as pas corrigé la seconde erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
          for (i = 1 ; i < y; i+=2)//boucle sans les diviseurs paires
          {
            if (x % i == 0)
               return 0;
          }
          return 1;
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    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
     int premier (int x)
    {
       int i,y;
     
       y=sqrt(x)+1;
       if (x%2==0)//permet de voir si le nombre est paire ou non
          {
          return 0;
          }
        else
          {
          for (i = 1 ; i < y; i+=2)//boucle sans les diviseurs paires
          {
            if (x % i == 0)
               return 1;
          }
               return 0;
          }
     
    }
    meme corriger ainsi , il m'affiche des nombre terminant par 5 ( comme 165 ou 195) qui ne sont pas premier

  6. #6
    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
    les return sont incorrects
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
          for (i = 1 ; i < y; i+=2)//boucle sans les diviseurs paires
          {
            if (x % i == 0)
               return 0;
          }
               return 1;
          }
    Attention à ne pas confondre les balises de citation [ quote]...[ /quote] (sans les blancs) et les balises de code [ code]....[ /code] (sans les blancs) (bouton #)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Mais si j'inverse les return , la fonction ne marche plus quand je compil le programme.

    Le return 1 , c'est pour quand le nombre est premier , Pourquoi le mettre en dehors du if , vu que hors du if , cest pour que le nombre n'est pas premier ?

    Je viens de comprendre mon probleme par rapport au return , je l'ai reglé , mais il m'affiche encore certains nombre qui ne sont pas premier et je ne comprends pas pourquoi

    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
    int premier (int x)
    {
       int i,y;
     
       y=sqrt(x)+1;
       if (x%2==0)//permet de voir si le nombre est paire ou non
          {
          return 0;
          }
        else
          {
          for (i = 1 ; i < y; i+=2)//boucle sans les diviseurs paires
          {
            if ((x%i)==0)
               return 0;
          else
               return 1;
          }
          }

  8. #8
    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
    On ne sait qu'il est premier que lorsque tous les diviseurs possibles (ici i) ont été testés sans succès, donc en sortie de la boucle for
    Le return 1 est mal placé et devrait être en dehors de la boucle for
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Quand je sors le retourn 1 de la boucle for , il m'affiche tous les nombres .

    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 premier (int x)
    {
       int i,y;
     
       y=sqrt(x)+1;
       if (x%2==0)//permet de voir si le nombre est paire ou non
          {
          return 0;
          }
        else
          {
          for (i = 1 ; i < y; i+=2)//boucle sans les diviseurs paires
          {
            if ((x%i)==0)
               return 0;
          }
           return 1;
          }
    Surement que je le place mal , mais je vois pas comment rédiger sa autrement .

  10. #10
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Lai,

    C'est typiquement le genre de problème qu'on résout très facilement : papier + crayon, et tu suis l'exécution de ton programme instruction par instruction, en notant l'évolution des variables.

    Quand je dis "tu suis l'exécution de ton programme instruction par instruction", ça signifie : "effectivement le suivre pas à pas", pas faire ce que tu penses qu'il fait !
    Si les cons volaient, il ferait nuit à midi.

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Bon , j'ai fais se que tu m'a dis , mais voil j'ai toujours pas trouver comment résoudre le problème je ne vois ps se qui cloche dans ma fonction ...

  12. #12
    Membre actif Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Points : 223
    Points
    223
    Par défaut
    Comme dit précédemment, dans l'initialisation de ta boucle for:
    for (i = 1 ; i < y; i+=2)//boucle sans les diviseurs paires
    {
    if ((x%i)==0)
    return 0;
    }
    return 1;
    }
    il faut mettre i=3

  13. #13
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hoa,
    Citation Envoyé par kreuk801 Voir le message
    Bon , j'ai fais se que tu m'a dis , mais voil j'ai toujours pas trouver comment résoudre le problème je ne vois ps se qui cloche dans ma fonction ...
    Donc, tu n'as fait ce que j'ai dit : tu as suivi le programme en faisant ce que tu penses qu'il fait, pas ce qu'il fait réellement, sinon tu aurais vu le problème rappelé par quetzacoatl.
    Si les cons volaient, il ferait nuit à midi.

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Peut etre que je ne resonne pas comme il le faut , mais je commence le C donc je n'ai pas l'habitude .

    Enfin bref ecris comme ceci cela me donne tout les nombre combris entre 3 et la valeur entrée :

    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
     int premier (int x)
    {
       int i,y;
     
       y=sqrt(x)+1;
       if (x%2==0)//permet de voir si le nombre est paire ou non
          {
          return 0;
          }
        else
          {
        for (i = 3 ; i < y; i+=2)//boucle sans les diviseurs paires
            {
            if ((x%i)==0)
                return 0;
            }
            return 1;
        }
    }

  15. #15
    Membre actif Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Points : 223
    Points
    223
    Par défaut
    Tu pourrais être plus précis?
    Dis nous ce que tu as rentré et ce que le programme t'affiche exactement

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    voila mes deux fonctions avec le main . Quand je rentre 199 a pour la 2e fonction , il m'affiche des nombres compris entre 2 et 199 , mais qui ne sont pas premiers .

    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    int premier (int x)
    {
       int i,y;
     
       y=sqrt(x)+1;
       if (x%2==0)//permet de voir si le nombre est paire ou non
          {
          return 0;
          }
        else
          {
        for (i = 3 ; i < y; i+=2)//boucle sans les diviseurs paires
            {
            if ((x%i)==0)
                return 0;
            }
            return 1;
        }
    }
     
     
     
    // Fonction qui affiche les nombres premiers inferieur à n
    int premier2 (int x)
    {
        int j,a;
     
        // Boucle permettant de scanner les nombres entre 0 et n
        for (j=1; j<x;j++)
        {
            a = premier(j);
            // Affichage des nombres si ils sont premiers
            if (a == 0)
            {
            printf("%d ",j);
            }
        }
        printf("\n\n");
    }
    int main(int argc, char *argv[])
    {
    int c;
     
        // Menu de sélection du programme
        printf("******** Exercire I ********\n\n");
        printf("1. Tester si le nombre saisi est premier\n");
        printf("2. Afficher les nombres premiers inferieurs a un nombre n\n");
        printf("3. Afficher les n premiers nombres premiers\n");
        printf("0. Quitter\n");
        scanf("%d",&c);
     
        int n,y;
     
        switch (c)
        {
               case 1 :
                    {
                        printf("\n******** Tester si le nombre saisi est premier ********\n\n");
     
                        // Saisie de la valeur par l'utilisateur
                        printf("Saisissez n : ");
                        scanf("%d",&n);
     
                        y = premier(n);
     
                        // Affichage du message (traduction de la réponse de la fonction)
                        if (y == 0)
                            printf("\n%d n'est pas premier\n\n",n);
                        else
                            printf("%d est premier !!\n",n);
                        system("PAUSE");
                        break;
                    }
                    case 2 :
                    {
                        printf("\n******** Afficher les nombres premiers inferieurs a un nombre n ********\n\n");
     
                        // Saisie de la valeur par l'utilisateur
                        printf("Saisissez n : ");
                        scanf("%d",&n);
                        printf("\n");
     
                        y = premier2 (n);
     
                        system("PAUSE");
                        break;
                    }

  17. #17
    Membre actif Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Points : 223
    Points
    223
    Par défaut
    Oui donc l'erreur est dans ta fonction premier2()
    Si tu regardes ta nouvelle fonction premier(), elle retourne 1 en cas de succès(donc si son argument est premier).
    Or dans ta fonction tu fais:
    if (a == 0)
    {
    printf("%d ",j);
    }
    ainsi tu afficheses tous les nombres non-premiers!

  18. #18
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Merci , ca marche enfin , merci a tous de votre aide , a charge de revanche

    Juste une petite question , si je voulais inclure un affichage page par page , il faut que je mette un compteur dans ma deuxieme fonction , et si il est egale a 25 , par exemple , je fais un getchar , c'est bien ca ?

  19. #19
    Membre confirmé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Points : 455
    Points
    455
    Billets dans le blog
    1
    Par défaut
    pense à la balise

    (sinon, on lit tout le thread avant de s'en apercevoir )
    Captain'Flam
    anciennement Sopsag, aka Hadrien
    Win seven x64 & Win 10 / Visual 2017 / Python 2.7 / Eclipse

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

Discussions similaires

  1. Une fonction implémentée en Java pour afficher les nombres premiers
    Par autran dans le forum Codes sources à télécharger
    Réponses: 2
    Dernier message: 01/05/2015, 16h45
  2. Réponses: 6
    Dernier message: 30/03/2015, 15h20
  3. Réponses: 2
    Dernier message: 23/05/2011, 21h47
  4. Problème fonction nombre premier
    Par alex2746 dans le forum Débuter
    Réponses: 13
    Dernier message: 29/09/2009, 21h48
  5. premier nombre premier superieur à m=10^100+1
    Par azman0101 dans le forum Mathématiques
    Réponses: 4
    Dernier message: 17/04/2003, 03h23

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