Précédent   Forum du club des développeurs et IT Pro > Autres langages > Pascal
Pascal Forum d'entraide sur la programmation en langage Pascal et sur les EDI. Avant de poster -> la F.A.Q Pascal, les cours
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 01/06/2012, 12h29   #1
Weldan
Invité de passage
 
Homme
Étudiant
Inscription : 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!
Weldan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2012, 14h45   #2
M.Dlb
Rédacteur/Modérateur
 
Avatar de M.Dlb
 
Inscription : avril 2002
Messages : 2 273
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : avril 2002
Messages : 2 273
Points : 3 378
Points : 3 378
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
M.Dlb est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 01/06/2012, 17h15   #3
Weldan
Invité de passage
 
Homme
Étudiant
Inscription : 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
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.
Weldan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2012, 13h14   #4
Roland Chastain
Membre Expert
 
Homme Roland Chastain
Inscription : décembre 2011
Messages : 687
Détails du profil
Informations personnelles :
Nom : Homme Roland Chastain
Âge : 39
Localisation : Mali

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : décembre 2011
Messages : 687
Points : 1 001
Points : 1 001
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.
Roland Chastain est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/06/2012, 13h58   #5
droggo
Expert Confirmé
 
Inscription : août 2006
Messages : 3 414
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 3 414
Points : 3 769
Points : 3 769
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.
droggo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2012, 12h42   #6
Weldan
Invité de passage
 
Homme
Étudiant
Inscription : 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
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 ...
Weldan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2012, 14h49   #7
Modulpro
Membre habitué
 
Avatar de Modulpro
 
Homme Emilien
Étudiant
Inscription : octobre 2010
Messages : 69
Détails du profil
Informations personnelles :
Nom : Homme Emilien
Âge : 19
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2010
Messages : 69
Points : 146
Points : 146
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.
Modulpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2012, 15h27   #8
droggo
Expert Confirmé
 
Inscription : août 2006
Messages : 3 414
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 3 414
Points : 3 769
Points : 3 769
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.
droggo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2012, 15h17   #9
extrem-alpha
Futur Membre du Club
 
Inscription : avril 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 14
Points : 15
Points : 15
Code :
1
2
3
4
5
while (diviseur <= a div 2) and (result = false) do
  begin
    ...
    diviseur:=diviseur+1;
  end;
extrem-alpha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2012, 19h19   #10
ragone
Invité de passage
 
Homme
Étudiant
Inscription : 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
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.
ragone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2012, 19h54   #11
droggo
Expert Confirmé
 
Inscription : août 2006
Messages : 3 414
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 3 414
Points : 3 769
Points : 3 769
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.
droggo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 12h01   #12
ragone
Invité de passage
 
Homme
Étudiant
Inscription : 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
Vous n'arrivez pas a comprendre que le changement est la meilleure façons d'améliorer les choses???
ragone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 14h40   #13
droggo
Expert Confirmé
 
Inscription : août 2006
Messages : 3 414
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 3 414
Points : 3 769
Points : 3 769
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.
droggo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h16.


 
 
 
 
Partenaires

Hébergement Web