Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 15 sur 15
  1. #1
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2012
    Messages : 3
    Points : 0
    Points
    0

    Par défaut Déterminer si un nombre est premier

    Bonjour à tous,

    Je rencontre un problème avec mon programme, est-ce quelqu'un pourrait m'éclairer?
    Le programme reçoit un nombre entier et renvoie si c'est un nombre premier ou pas:
    Code :
    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
     
    program test;
    var
    a, diviseur :integer;
    result	:BOOLEAN;
     
    begin
    writeln('Entrez un nombre entier');
    readln(a);
     
    IF (a = 2) THEN
    Result := True
     
        ELSE IF (a > 2) THEN
        result := false
     
        ELSE IF (a mod 2 = 0) THEN
        Result := False
     
        For diviseur := 2 to (a-1) DO
        ELSE IF (a mod diviseur = 0) THEN
        result := false
     
     
    ELSE
    result := true;
     
    writeln('Est-ce que ce nombre est premier? ', result)
    end.
    Je suppose que le problème vient d'à partir de la ligne 20 ...

    Merci d'avance!

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    avril 2002
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Âge : 29

    Informations forums :
    Inscription : avril 2002
    Messages : 2 346
    Points : 3 862
    Points
    3 862

    Par défaut

    Ton indentation n'est pas du tout claire, de même que l'imbrication des condition If/Then/Else. Essaye de bien découper ces instructions, et ton problème devrait apparaître plus clairement.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  3. #3
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2012
    Messages : 3
    Points : 0
    Points
    0

    Par défaut

    De cette manière, j'arrive à faire fonctionner mon programme mais l'écriture ne me plaît pas... Je n'arrive vraiment pas à faire fonctionner le premier... Est-ce quelqu'un pourrais me montrer la bonne écriture ? Ce n'est pas faute d'avoir y essayé...

    Merci pour la réponse d'au dessus mais je n'y vois pas plus clair... Je re essayerai demain à tête reposée.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    program test;
     
    var
    a, diviseur :integer;
    result	:BOOLEAN;
    begin
    writeln('Entrez un nombre entier');
    readln(a);
    result := true;
    IF a = 2 THEN
    result := true;
    IF a < 2 THEN
    result := false;
    for diviseur := 2 to (a-1) DO
    IF (a mod diviseur = 0) then
    result := false;
     
    writeln('Est-ce que ce nombre est premier? ', result)
    end.

  4. #4
    Rédacteur/Modérateur
    Avatar de Roland Chastain
    Homme Profil pro Roland Chastain
    Inscrit en
    décembre 2011
    Messages
    1 462
    Détails du profil
    Informations personnelles :
    Nom : Homme Roland Chastain
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 462
    Points : 4 025
    Points
    4 025

    Par défaut

    Citation Envoyé par Weldan Voir le message
    Est-ce quelqu'un pourrais me montrer la bonne écriture ?
    Pour tenir compte du conseil qui t'a été donné plus haut, tu ferais peut-être bien d'utiliser systématiquement l'écriture suivante:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if condition then
      begin
        {...}
      end
    else
      begin
        {...}
      end;
    Ainsi tu te rendrais mieux compte de ce qui ne va pas dans ton code.
    L'Art est long et le Temps est court.

  5. #5
    Expert Confirmé Sénior
    Inscrit en
    août 2006
    Messages
    3 576
    Détails du profil
    Informations forums :
    Inscription : août 2006
    Messages : 3 576
    Points : 4 614
    Points
    4 614

    Par défaut

    Koa,

    +1, ET d'utiliser une mise en forme cohérente et régulière.
    Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir.

  6. #6
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2012
    Messages : 3
    Points : 0
    Points
    0

    Par défaut

    Merci à tous pour vos réponses qui m'aide. J'ai enfin réussi à faire fonctionner la bête ! ;-)
    Est-ce que vous pourriez m'éclairer sur 2-3 points:
    Il y a-t-il un moyen d'éviter que mon programme calcul tous les diviseurs jusqu'au (nombre-1) une fois qu'il a trouvé un nombre qu'il le divise.
    Peut-être que je ne suis pas clair, je vais vous donner un exemple:
    Imaginons que je rentre le chiffre 9: mon programme va le diviser par 2 puis 3, puis 4... jusqu'à 9 diviser par 8. Est-ce qu'il y a moyen qu'une fois que mon programme remarque que 9 est divisible par 3 il arrête la boucle ? ça me permettrait d'économiser... Devrais-je utiliser la boucle repeat... until ?

    Deuxième question:
    Est-ce si par exemple mon programme rempli la première condition, il y-a-t-il moyen qu'il évite toutes les autres conditions ? Ou est-ce que ça le fait déjà lorsqu'on utilise IF, ELSE IF, Else ... ?

    Merci à vous et désolé si mes questions semblent stupides ...

  7. #7
    Membre habitué Avatar de Modulpro
    Homme Profil pro Emilien
    Étudiant
    Inscrit en
    octobre 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Nom : Homme Emilien
    Âge : 21
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2010
    Messages : 73
    Points : 145
    Points
    145

    Par défaut

    Bonjour,

    Il existe un théorème en arithmétique qui stipule que si un nombre n'est divisible par aucun entier inférieur à sa racine carré, alors ce nombre est premier. Tu n'as donc pas besoin de monter jusqu'à n-1 mais seulement jusqu’à l'entier immédiatement inférieur à la racine de n.

    Pour ce qui est de stopper le test quand un diviseur est trouvé, tu peux remplacer ta boucle for par une boucle while qui teste deux conditions, quelque chose comme :
    Code :
    1
    2
    3
    4
    5
    while (diviseur <= sqrt(a)) and (result = false) do
      begin
        ...
        diviseur:=diviseur+1;
      end;
    Edit : Pour ta deuxieme question, la structure if , else if, ..., else if, else permet effectivement d'ignorer toutes les conditions suivantes dès qu'il y en a une de vraie. Ainsi si la première condition est vraie, tout le reste de la structure est ignorée.

  8. #8
    Expert Confirmé Sénior
    Inscrit en
    août 2006
    Messages
    3 576
    Détails du profil
    Informations forums :
    Inscription : août 2006
    Messages : 3 576
    Points : 4 614
    Points
    4 614

    Par défaut

    Hoi,

    Et n'oublies pas de ne pas utiliser les diviseurs pairs comme tu le fais avec ta boucle for
    Code :
    for diviseur := 2 to (a-1) DO
    Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir.

  9. #9
    Membre à l'essai
    Inscrit en
    avril 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 24
    Points : 23
    Points
    23

    Par défaut

    Code :
    1
    2
    3
    4
    5
    while (diviseur <= a div 2) and (result = false) do
      begin
        ...
        diviseur:=diviseur+1;
      end;

  10. #10
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : décembre 2012
    Messages : 2
    Points : 3
    Points
    3

    Par défaut

    Tiens cette réponse :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    program premier;
    var n,c,i:integer;
    begin
    repeat
          begin
               Writeln('donner un entier naturel');
               readln(n);
               if n=1 then writeln('1 n''est pas un premier')
               else
                   begin
                        i:=1;
                        repeat
                              begin
                                   i:=i+1;
                                   c:=n mod i;
                              end
                        until c=0;
                        if i=n then writeln(n,' est un premier ')
                        else writeln(n,' n''est pas un premier');
                   end;
          end
    until false;
    end.

  11. #11
    Expert Confirmé Sénior
    Inscrit en
    août 2006
    Messages
    3 576
    Détails du profil
    Informations forums :
    Inscription : août 2006
    Messages : 3 576
    Points : 4 614
    Points
    4 614

    Par défaut

    Woe,

    Quand on donne une réponse, on essaye d'en fournir une qui améliore ce qui a déjà été fait, ce qui n'est pas du tout le cas de la tienne.
    Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir.

  12. #12
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : décembre 2012
    Messages : 2
    Points : 3
    Points
    3

    Par défaut

    Vous n'arrivez pas a comprendre que le changement est la meilleure façons d'améliorer les choses???

  13. #13
    Expert Confirmé Sénior
    Inscrit en
    août 2006
    Messages
    3 576
    Détails du profil
    Informations forums :
    Inscription : août 2006
    Messages : 3 576
    Points : 4 614
    Points
    4 614

    Par défaut

    Hoa,
    Citation Envoyé par ragone Voir le message
    Vous n'arrivez pas a comprendre que le changement est la meilleure façons d'améliorer les choses???
    Le changement est une bonne chose, quand il va dans le bon sens. Mais pour le côté amélioration, ce n'est pas le cas de ton code, qui reprend tout ce qu'il ne faut pas faire pour résoudre le problème posé.
    Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir.

  14. #14
    Invité de passage
    Homme Profil pro hichaman haddad
    Administrateur systèmes et réseaux
    Inscrit en
    novembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Nom : Homme hichaman haddad
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : novembre 2012
    Messages : 2
    Points : 3
    Points
    3

    Par défaut

    Bonjour
    lien de telechargement d'un programme en pascal qui détermine si un nombre est premier ou pas http://www.4shared.com/zip/YZ9ohCgj/...e_premier.html

  15. #15
    Membre Expert
    Avatar de e-ric
    Homme Profil pro Eric BARBIER
    Développeur informatique
    Inscrit en
    mars 2002
    Messages
    1 153
    Détails du profil
    Informations personnelles :
    Nom : Homme Eric BARBIER
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mars 2002
    Messages : 1 153
    Points : 2 408
    Points
    2 408

    Par défaut

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    function EstPremier(const a: Integer): Boolean;
    var
      nmax, i: Integer;
    begin
      if (a = 2) then
        Result := True
      else if (a = 1) or (a mod 2 = 0) then
        Result := False
      else
      begin
        nmax := Trunc(Sqrt(a))+1;
        i := 3;
        Result := True
        while (i < nmax) do
        begin
            Result := (a mod i <> 0)
            if not Result then
               exit
            Inc(i, 2); // que les nombres impairs
        end
      end;
    End;
    est une solution parmi d'autres, j'ai testé l'algo en Python, j'ai pas FPC sur place.

    Il est peut-être possible d'éviter les divisions en adaptant une mise en oeuvre simple du crible d'Eratosthène (Il y a eu des discussions ici il y a peu sur le sujet), je n'ai pas vérifié cette solution.

    @+

    M E N S . A G I T A T . M O L E M

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •