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 :

Programmes : Nombre premier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 14
    Par défaut Programmes : Nombre premier
    Bonsoir à toutes et à tous,

    Je suis actuellement en train de bloquer () sur un programme, avec des fonctions optimisées, qui devrait m'afficher ceci :
    • Qui détermine si un nombre est premier ou non,
    • Afficher les nombres premiers inférieur à un N,
    • Afficher les N premiers nombres premiers.


    N est saisie par l'utilisateur
    Voici mon programme qui stagne :

    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    #include <stdio.h>
     #include <stdlib.h>
     #include <conio.h>
     #include <math.h>
     
    	int premier_1(int n)
     	{
    	 int d,b;
     
     	 b = 1;
    	 if (n == 0 || n == 1)
     {
     b = 0;
     } else if (n == 2)
     {
     b = 2;
     }
     if (b == 0)
     {
     return 0;
     } else if (b == 2)
     {
     printf("2\n");
     } else {
     if (n%2==0)
     {
     return 0;
     }
     for (d = 3; d <= sqrt (n); d = d + 2)
     {
     if (n%d==0)
     {
     return 0;
     }
     return 1;
     }
     
     
     }
     
     int premier_2(int x)
     {
     int j,a;
     
     if(x == 0 || x == 1)
     {
     return 0;
     }
     
     // Boucle permettant de scanner les nombres entre 0 et n
     for (j = 1 ; j <= x ; j = j + 1)
     {
     a = premier_1(j);
     
     // Affichage des nombres si ils sont premiers
     if (a == 1)
     {
     printf("%d\n",j);
     }
     }
     printf("\n");
     }
     
     void affiche (int nmax)
     {
     int i;
     for (i = 0; i <= nmax; i++)
     if(premier_1(i)==1)
     printf("%d\n",i);
     // 25 lignes -> étapes attente
     }
     
     int main()
     {
     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 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 = premier_2(n);
     
     getch();
     break;
     }
     
     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_1(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);
     getch();
     break;
     }
     }
     }
     	}
    Je galère, je n'avance pas.

    Merci à tous ceux qui prendront le temps de lire ma discussion.
    Nir3x

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Pourrais-tu nous dire exactement où tu bloques et pourquoi ?

  3. #3
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Ton code est difficilement lisible, et incoherent. Ci-dessous quelques corrections de premier_1, qui en a bien besoin. D'ailleurs, il faudrait la renommer, par exemple en "test_si_nombre_est_premier"

    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
     
     
     
    /* Ici, on decrit ce que fait la fonction, quels sont ses parametres et 
     * ses valeurs de retour, en cas de succes et d'erreur */
    unsigned short premier_1 (unsigned int n)
    {
        int d; /* d sert a ... */
        int b; /* b sert a ... */
        unsigned short return_value;
     
        /* Initialisations */
        b = 1;
     
       switch (n)
       {
         case 0 : 
           /* commenter pourquoi */
            return_value = 0;
            break;
         case 1 : 
           /* commenter pourquoi */
            return_value = 0;
            break;
         case 2 : 
           /* commenter pourquoi */
            return_value = 1;
            break;
         default : 
            /* cas general pour savoir si n est premier */
               for (d = 3; d <= sqrt (n); d += 2)
               {
                   /* Si n est divisible par d, alors il n'est pas premier */
                   if (n%d==0)
                       {
                           return_value = 0;
                       }
                  /* Erreur d'algorithme !!!! 
                   * Ce n'est pas parce que n n'est pas divisible par d qu'il est premier : 
                   * 49 n'est pas divisible par 3, donc tu vas retourner 1, alors que ce n'est pas un nombre premier. */
                   /* return 1; A CORRIGER */
               }
           }
     
       return return_value;
    }
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void affiche (int nmax)
    {
        int i;
            for (i = 0; i <= nmax; i++)
                if(premier_1(i)==1)
                    printf("%d\n",i);
            // 25 lignes -> étapes attente
    }
    Ne manquerait-il pas des accolades pour encadrer les 2 instructions à exécuter dans la boucle for ?

    premier_1 et premier_2 ne sont pas des bons noms de méthodes car on ne sait pas ce qu'elles font et encore moins ce qui les distinguent.

    Il y a trop de return dans la fonction premier_1. Le test if b == 0 est vraiment de trop, pourquoi ne pas faire le return quand tu testes si n == [0/1] ? Le return 1 ne devrait-il pas être en dehors du for ?

    Il faut revoir l'algorithme de tes fonctions, c'est important que l'algo en pseudo-code soit clair avant de coder en C.

  5. #5
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Bonsoir,

    Citation Envoyé par Bktero Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void affiche (int nmax)
    {
        int i;
            for (i = 0; i <= nmax; i++)
                if(premier_1(i)==1)
                    printf("%d\n",i);
            // 25 lignes -> étapes attente
    }
    Ne manquerait-il pas des accolades pour encadrer les 2 instructions à exécuter dans la boucle for ?
    Théoriquement, ce n'est pas nécessaire : la syntaxe du for est du type (§ 6.8.5 de n1570) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    iteration-statement:
        for ( expressionopt ; expressionopt ; expressionopt ) statement
    Or, un if et le corps correspondant est bien une instruction (§ 6.8.4 de n1570) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    selection-statement:
        if ( expression ) statement
    Cependant, sur le fond, les puristes du génie logiciel te rejoindront sûrement. Il est souvent considéré comme étant une bonne pratique d'entourer ses instructions de blocs d'accolades, pour en faciliter l'évolutivité. Mais loin de moi l'idée de lancer une polémique.

    Bonne soirée !
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    C'est pas faux ! Au temps pour moi

  7. #7
    Membre émérite
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 419
    Par défaut
    Bonjour,

    Sans vouloir tomber comme un cheveu sur la soupe, l'algo proposé est pas mal brute force.
    L'algorithme (simple et connu) le plus efficace pour établir une suite de nombre premiers est le crible d'Ératosthène. Il n'est pas très difficile à mettre en place et plaira surement plus au prof (?) qui demande cet exo.

    A+

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 10
    Par défaut
    Citation Envoyé par Nir3x Voir le message
    Bonsoir à toutes et à tous,

    Je suis actuellement en train de bloquer () sur un programme, avec des fonctions optimisées, qui devrait m'afficher ceci :
    • Qui détermine si un nombre est premier ou non,
    • Afficher les nombres premiers inférieur à un N,
    • Afficher les N premiers nombres premiers.
    Vous pouvez partir principe qu'un nombre premier n'a que deux diviseurs, pour cela, faites une fonction qui retourne le nombre de diviseur d'un entier entré paramètre, après dans votre main posez une condition sur le nombre de diviseur, si vous voulez faire des switch il vous faudra faire deux scanf, le premier pour récupérer le nombre a analysé, le second pour le choix du menu switch
    Voici comment doit se présenter le code du main
    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
    int main()
    {
       int nombre = 0;// Variable à analysée
       int choix = 0; // variable utilisé par le switch
       int nbre = 0; // Autre variable utilisé dans le programme
       printf("Entrez un nombre : ");
       scanf("%d", &nombre);
       printf("\n1- Tester si le nombre est premier ");
       printf("\n2- Determiner l'ensemble des nombre premier inferieur au nombre ");
       printf("\n3- Determiner les %d premiers nombres premiers", nombre);
       printf("\nFaites votre choix : ");
       scanf("%d", &choix);
       switch(choix)
       {
           case 1 :
           {
               if(NbreDiviseur(nombre) == 2)
                  printf("\nLe nombre %d est premier\n", nombre);
               else
                  printf("\nLe nombre %d n'est pas premier\n", nombre);
           }   break;
           case 2 : 
           // condition
           case 3 :
           // condition
           default
           printf("Le nombre entré ne correspond à aucun menu");
       }
       return 0;
    }

  9. #9
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par BStylene Voir le message
    Vous pouvez partir principe qu'un nombre premier n'a que deux diviseurs, pour cela, faites une fonction qui retourne le nombre de diviseur d'un entier entré paramètre
    C'est vrai (1 et lui-meme), mais cela demande de tester tous les diviseurs potentiels entre 1 et le nombre. Or il suffit de tester si le nombre a un diviseur entre 2 et sa racine carree : si oui, il n'set pas premier, si non, il l'est.

    Test : tu peux tester ton programme sur le nombre suivant : 2^57 885 161 – 1
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  10. #10
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Hie,
    Citation Envoyé par BStylene Voir le message
    Vous pouvez partir principe qu'un nombre premier n'a que deux diviseurs, pour cela, faites une fonction qui retourne le nombre de diviseur d'un entier entré paramètre
    Il est absolument superflu de connaître le nombre de diviseurs d'un nombre pour savoir s'il est premier, il ne l'est pas dès qu'on en a trouvé 1.

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

Discussions similaires

  1. programme nombre premier
    Par Asmod_D dans le forum C++
    Réponses: 4
    Dernier message: 04/06/2012, 17h07
  2. Réponses: 5
    Dernier message: 13/03/2012, 10h32
  3. Programme détectant les nombres premiers
    Par frankthechamp dans le forum Windows Forms
    Réponses: 8
    Dernier message: 04/12/2008, 22h41
  4. Réponses: 2
    Dernier message: 20/02/2008, 22h44

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