Gambas France BETA


Pas de compte ? Incription

conditions nombre premier

Ce sujet est résolu.

1
AuteurMessages
stracoma#1 Posté le 24/9/2015 à 18:02:29
Apprentissage programmation pour le plaisirBonjour tout le monde.
J'ai écris un code qui dois vérifier si une variable x entier est un nombre premier. Mais mon code affiche toujours "ce n'est pas un nombre premier". je n'arrive pas à retrouver l'erreur dans le 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
' Gambas module file

PUBLIC SUB Main()

DIM x AS INTEGER = 0
DIM NBP AS BOOLEAN = TRUE
DIM i AS INTEGER = 0

DO WHILE x <= 1

PRINT "entrer un nombre entier >1"
INPUT x ' Gambas module file


LOOP
FOR i = 1 TO (x - 1)
IF (x % i) == 0 THEN
NBP = FALSE
ENDIF
NEXT

IF NBP THEN
PRINT "c'est un nombre premier"
ELSE
PRINT "ce n'est pas un nombre premier"
ENDIF

END

Merci
SVP patience avec moi car neurones > 50 ans
stracoma#2 Posté le 24/9/2015 à 18:11:59
Apprentissage programmation pour le plaisirJe viens de repérer mon erreur:
FOR i = 2 TO (x - 1) et non FOR i = 1 TO (x - 1)
SVP patience avec moi car neurones > 50 ans
didier18#3 Posté le 25/9/2015 à 11:42:08
Bonjour stracoma

Quelques petites précision pour ton code...
Tu peux parfaitement déclarer plusieurs variables dans Dim, il suffit quelle soit du même type et séparées par une ','.
Exemple :
Dim i, x as integer=0

est la même chose que :
Dim i as integer=0
Dim x as integer=0

Ce qui te fais déjà gagner une ligne de code...
Si tu utilise seulement une partie de la condition d'un IF, autant mettre tout sur une seule ligne...

Exemple :
If (x % i) == 0 Then NBP = False

est la même chose que :
IF (x % i) == 0 THEN
NBP = FALSE
ENDIF

sauf que là tu 'économise' 2 lignes de code...
Enfin et pour finir...
Puisque MBP est boolean, autant utiliser le IIF...

Exemple :
msg = IIf(NBP, "c'est un nombre premier", "ce n'est pas un nombre premier")
Print msg

est la même chose que :
IF NBP THEN
PRINT "c'est un nombre premier"
ELSE
PRINT "ce n'est pas un nombre premier"
ENDIF

sauf que là tu 'économise' 3 lignes de code...

Voici le code une fois modifié...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
PUBLIC SUB Form_Open()
DIM x, i AS INTEGER = 0
DIM NBP AS BOOLEAN = TRUE
DIM msg AS STRING

DO WHILE x <= 1

PRINT "entrer un nombre entier >1"
INPUT x ' Gambas module file


LOOP
FOR i = 2 TO (x - 1)
IF (x % i) == 0 THEN NBP = FALSE

NEXT

msg = IIf(NBP, "c'est un nombre premier", "ce n'est pas un nombre premier")
PRINT msg

END


Regarde la doc pour voir la différence entre le IF et le IIF (il me semble que IIF est plus rapide en exécution -a confirmer par l'assemblée-).

Bonne journée.
stracoma#4 Posté le 30/9/2015 à 20:51:01
Apprentissage programmation pour le plaisirBonsoir didier18. Merci pour l'info.
iif est nouvelle pour moi (j'ai jamais vu).
En faisant quelques essais j'ai remarqué qu'on peut se passer de la variable string "msg"
1
2
3
4
5
6
7
8
9
PUBLIC SUB Main()
DIM x, y AS INTEGER
DIM grand AS BOOLEAN
x = 5
y = 20
grand = y < x
PRINT IIf(grand, "vrai", "pas vrai")

END

une autre fois merci
SVP patience avec moi car neurones > 50 ans
gambix#5 Posté le 3/10/2015 à 17:01:36
Faire simple !iif est plus lent assez souvent dans la mesure ou les valeurs sont toute évaluée a chaque appel a la fonction. Donc pour des valeurs calculées c'est a fuir.

Il ne faut pas résonner en terme de nombre de ligne de code mais en terme d’efficacité de code. Parfois, les pertes de rendement ne situe pas la ou on pense, et souvent c'est pas le code le plus esthétique qui remporte la palme.

Moins de texte dans une signature c'est agrandir son espace.
1