Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 23/05/2019, à 21:13

stephane13

[Resolu] Pourquoi ça ne lit pas ma première boucle?

Bonjour,

Je débute dans mes exercices et je ne comprends pas pourquoi si j'écris 1200 par exemple ça valide quand même:

# Jeu du juste prix
# choisir un nombre entre 1 et 1000
# tant que le jeu n'est pas fini
#   -> demander à l'utilisateur "Entrer un prix"
#   -> si il trouve le juste prix "C'est gagné"
#   -> sinon on affiche "C'est moins" ou "C'est plus"

nombre = int(input("Choisir un nombre: "))
while 1 < nombre <= 1000:
    if nombre > 1000:
         print("Le nombre doit être inférieur à 1 000")
    elif nombre >= 1:
         print("Le nombre doit être supérieur à 1")

choixduprix = int(input("Entrer un prix: "))

while choixduprix != nombre:
    if choixduprix < nombre:
        print("C'est plus")
    else:
        print("C'est moins")
    choixduprix = int(input("Entrer un prix: "))

print("C'est gagné!")

Merci.

Dernière modification par stephane13 (Le 27/05/2019, à 20:22)


Ubuntu Mate 22.04

En ligne

#2 Le 23/05/2019, à 21:20

pingouinux

Re : [Resolu] Pourquoi ça ne lit pas ma première boucle?

Bonsoir,
Si tu choisis 1200, tu ne passes pas dans la première boucle while.

Hors ligne

#3 Le 23/05/2019, à 21:54

stephane13

Re : [Resolu] Pourquoi ça ne lit pas ma première boucle?

Me gourais-je?

while 1 < nombre <= 1000:

J'ai bien écrit inférieur ou égal à 1000 non?


Ubuntu Mate 22.04

En ligne

#4 Le 24/05/2019, à 08:30

pingouinux

Re : [Resolu] Pourquoi ça ne lit pas ma première boucle?

Justement, si nombre=1200, tu n'es pas dans l'intervalle ]1,1000], et cette boucle while n'est pas exécutée.
Ou alors, je n'ai pas compris ta question…

Hors ligne

#5 Le 24/05/2019, à 09:29

stephane13

Re : [Resolu] Pourquoi ça ne lit pas ma première boucle?

OK, d'accord, je me base sur des exercices précédents. Avec cette ligne de code je croyais écrire syntaxiquement «tant que le nombre est entre 1, et inférieur ou égale à 1000».

Je peux faire comment alors?


Ubuntu Mate 22.04

En ligne

#6 Le 24/05/2019, à 09:36

moko138

Re : [Resolu] Pourquoi ça ne lit pas ma première boucle?

Je reformule.
Visuellement,
  le champ étroit du télé-objectif while 1 < nombre <= 1000: ne te permet pas de voir le phare zéro à bâbord, ni l'amer 1200 à tribord.
  Donc, pour améliorer ton film, pingouinux t'invite à utiliser aussi le grand-angle.


%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel :  À la découverte de dcraw

Hors ligne

#7 Le 24/05/2019, à 10:15

pingouinux

Re : [Resolu] Pourquoi ça ne lit pas ma première boucle?

stephane13 #5 a écrit :

Avec cette ligne de code je croyais écrire syntaxiquement «tant que le nombre est entre 1, et inférieur ou égale à 1000»

Oui, c'est exactement ça. J'ai peut-être mal compris ta demande. Dans ce cas, explique exactement ce que ton programme est censé faire, et ce qui te chagrine dans son exécution.

Hors ligne

#8 Le 24/05/2019, à 11:16

bipede

Re : [Resolu] Pourquoi ça ne lit pas ma première boucle?

Tu as plusieurs erreurs...
1- Tu dois d'abord fixer une valeur de nombre qui n'entre pas dans la plage autorisée si tu veux rentrer dans la 1ère boucle.
2- Tu as mal rédigé ta condition de première boucle.
3- Tu dois faire saisir le nombre dans la boucle.
4- Idem au 1 pour la deuxième boucle
5- Le choix du prix dans la 2ème boucle doit être fait avant les test pour avoir toujours le bon message
6- la condition else doit être mise en elif pour éviter un message d'erreur quand le compte est bon.
Ci-dessous, le programme corrigé.

# Jeu du juste prix
# choisir un nombre entre 1 et 1000
# tant que le jeu n'est pas fini
#   -> demander à l'utilisateur "Entrer un prix"
#   -> si il trouve le juste prix "C'est gagné"
#   -> sinon on affiche "C'est moins" ou "C'est plus"

nombre = 0
while 2 > nombre <= 1000:
    nombre = int(input("Choisir un nombre: "))
    if nombre > 999:
         print("Le nombre doit être inférieur à 1 000")
    elif nombre < 2:
         print("Le nombre doit être supérieur à 1")

choixduprix = 0

while choixduprix != nombre:
    choixduprix = int(input("Entrer un prix: "))
    if choixduprix < nombre:
        print("C'est plus")
    elif choixduprix > nombre:
        print("C'est moins")

print("C'est gagné!")

Desktop: MSI - Intel® Core™ i5-3330 CPU @ 3.00GHz × 4 - RAM 8 go- Kubuntu 21.04 - Système sur SSD 64 Go - /home sur HDD 500 Go.
Laptop: DELL Inspiron-15 3567 - Intel® Core™ i5-7200 CPU @ 2.50GHz × 4 - RAM 8 go - HDD 1 To - Ubuntu 20.10 avec /home séparé.

Mon site: Les contributions du bipède

Hors ligne

#9 Le 24/05/2019, à 13:45

stephane13

Re : [Resolu] Pourquoi ça ne lit pas ma première boucle?

@ bipede merci mais je ferme les yeux à ton message.

@pingouinux Je ne sais pas si tu connais le Juste prix et c'est expliqué en haut dans les commentaires: le nombre correspond à la valeur du produit (un téléviseur par exemple), tu donnes une estimation et tant que c'est pas bon on te dit «c'est plus/c'est moins».

Donc là je ne comprends pas: j'ai donc mis une boucle pour tant qu'il donne un nombre (la valeur exact du produit) à moins de 1 et au-dessus de 1000 il ait un message explicatif, lui faire comprendre que ça ne peut pas être en-dessous de 1 ou au-dessus de 1000.

Mais bon là je tape 0 ou 1200, ça passe.


Ou alors ce n'est pas avec while, c'est avec for et range?


Merci. smile


Ubuntu Mate 22.04

En ligne

#10 Le 24/05/2019, à 15:16

erresse

Re : [Resolu] Pourquoi ça ne lit pas ma première boucle?

Bonjour,
En fait, ce sont tes tests qui sont incorrects, que ce soit pour régler les boucles ou dans les "if" de contrôle...

while 1 < nombre <= 1000:
    if nombre > 1000:
         print("Le nombre doit être inférieur à 1 000")
    elif nombre >= 1:
         print("Le nombre doit être supérieur à 1")

La boucle vérifie que le nombre est bien entre 1 et 1000 et, si c'est bien le cas, alors tu vérifie que :
- si le nombre est supérieur à 1000, envoi d'un message d'erreur
- si le nombre est supérieur ou égal à 1, envoi d'un autre message d'erreur
Or,si tu passes dans cette boucle, le nombre ne sera jamais > 1000 et par contre il sera toujours >= 1, ce qui te fera envoyer ton message d'erreur à tort !
Il faut revoir tes tests pour qu'ils s'effectuent dans le bon sens...


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#11 Le 24/05/2019, à 15:43

stephane13

Re : [Resolu] Pourquoi ça ne lit pas ma première boucle?

erresse a écrit :

Bonjour,
En fait, ce sont tes tests qui sont incorrects, que ce soit pour régler les boucles ou dans les "if" de contrôle...

while 1 < nombre <= 1000:
    if nombre > 1000:
         print("Le nombre doit être inférieur à 1 000")
    elif nombre >= 1:
         print("Le nombre doit être supérieur à 1")

La boucle vérifie que le nombre est bien entre 1 et 1000 et, si c'est bien le cas, alors tu vérifie que :
- si le nombre est supérieur à 1000, envoi d'un message d'erreur
- si le nombre est supérieur ou égal à 1, envoi d'un autre message d'erreur
Or,si tu passes dans cette boucle, le nombre ne sera jamais > 1000 et par contre il sera toujours >= 1, ce qui te fera envoyer ton message d'erreur à tort !
Il faut revoir tes tests pour qu'ils s'effectuent dans le bon sens...

D'accord, j'ai compris. Je cogite.

Merci erresse.


Ubuntu Mate 22.04

En ligne

#12 Le 27/05/2019, à 14:54

stephane13

Re : [Resolu] Pourquoi ça ne lit pas ma première boucle?

Je suis toujours bloqué:

Mon code

# Jeu du juste prix
# choisir un nombre entre 1 et 1000
# tant que le jeu n'est pas fini
#   -> demander à l'utilisateur "Entrer un prix"
#   -> si il trouve le juste prix "C'est gagné"
#   -> sinon on affiche "C'est moins" ou "C'est plus"

# valeur du nombre et du prix
nombre = int(input("Choisir un nombre: "))

# vérifier que le nombre soit entre 1 et 1000
if nombre < 1:
    print("Le nombre doit être supérieur à 1")
elif nombre > 1000:
    print ("Le nombre doit être inférieur à 1 000")
else:
    choixduprix = int(input("Entrer un prix: "))

while choixduprix != nombre:
    if choixduprix < nombre:
        print("C'est plus")
    else:
        print("C'est moins")
    choixduprix = int(input("Entrer un prix: "))

print("C'est gagné!")

Le message d'erreur

/home/stephane/PycharmProjects/myfirstproject/venv/bin/python /home/stephane/PycharmProjects/myfirstproject/test.py
Choisir un nombre: 1200
Le nombre doit être inférieur à 1 000
Traceback (most recent call last):
  File "/home/stephane/PycharmProjects/myfirstproject/test.py", line 19, in <module>
    while choixduprix != nombre:
NameError: name 'choixduprix' is not defined

Process finished with exit code 1

Ubuntu Mate 22.04

En ligne

#13 Le 27/05/2019, à 16:31

pingouinux

Re : [Resolu] Pourquoi ça ne lit pas ma première boucle?

stephane13 #12 a écrit :
  File "/home/stephane/PycharmProjects/myfirstproject/test.py", line 19, in <module>
    while choixduprix != nombre:
NameError: name 'choixduprix' is not defined
# vérifier que le nombre soit entre 1 et 1000
if nombre < 1:
    print("Le nombre doit être supérieur à 1")
elif nombre > 1000:
    print ("Le nombre doit être inférieur à 1 000")  #  nombre=1200, tu es passé ici
else:
    choixduprix = int(input("Entrer un prix: ")) # donc tu n'es pas passé là, et choixduprix n'est pas défini

Hors ligne

#14 Le 27/05/2019, à 16:43

erresse

Re : [Resolu] Pourquoi ça ne lit pas ma première boucle?

Quand tu lis ton programme et que tu imagines l'exécution de chaque ligne d'instruction, qu'est-ce que tu vois ?
- 1e instruction, acquisition de "nombre"
- bloc "if" de vérification de la validité de la saisie :
  - si "nombre" est inférieur à 1, message d'erreur et fin de la vérification
  - si "nombre" est supérieur à 1000, message d'erreur et fin de la vérification
  - si "nombre" compris entre 1 et 1000, saisie correcte, et acquisition de "choixduprix"
- boucle "while" de détermination du juste prix (c'est la ligne 19 qui signale une erreur)
Que se passe-t-il lorsque la saisie de "nombre" est 1200 ?
- Est-ce que "nombre" est inférieur à 1 ? Non !
- Est-ce que "nombre" est supérieur à 1000 ? Oui ! Et donc, message d'erreur fin de la vérification...
Quelle est l'instruction suivante qui va être exécutée ? La boucle "while" de la ligne 19. Et est-ce que "choixduprix" a été saisi quelque part avant d'attaquer cette boucle ? Non ! Et donc il y a erreur...
Tu vois, ça n'a rien de sorcier, il te faut juste te mettre à la place de la machine et essayer de faire ce qu'elle doit faire pour exécuter correctement le programme, tu verras très vite où ça coince.

Edit: Grillé par pingouinux, caramba !!! Mais j'espère avoir mieux expliqué l'origine de l'erreur... lol

Dernière modification par erresse (Le 27/05/2019, à 16:45)


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#15 Le 27/05/2019, à 17:16

stephane13

Re : [Resolu] Pourquoi ça ne lit pas ma première boucle?

D'accord. Donc il me faut obligatoirement 2 boucles: une pour vérifier que je soit entre 1 et 1000, et une autre pour trouver le bon prix?


Ubuntu Mate 22.04

En ligne

#16 Le 27/05/2019, à 17:22

erresse

Re : [Resolu] Pourquoi ça ne lit pas ma première boucle?

Pas forcément, si tu préfères laisser le programme choisir tout seul le "nombre" à trouver par une randomisation aléatoire, tu n'auras qu'une seule boucle à gérer pour la découverte de ce nombre...
Il y a toujours d'autres solutions, c'est ce qui est bien en programmation...


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#17 Le 27/05/2019, à 20:22

stephane13

Re : [Resolu] Pourquoi ça ne lit pas ma première boucle?

C'est bon!

# Jeu du juste prix
# choisir un nombre entre 1 et 1000
# tant que le jeu n'est pas fini
#   -> demander à l'utilisateur "Entrer un prix"
#   -> si il trouve le juste prix "C'est gagné"
#   -> sinon on affiche "C'est moins" ou "C'est plus"

# valeur du nombre
import random
nombre = random.randint(1,10)

choixduprix = int(input("Entrer un prix: "))

while choixduprix != nombre:
    if choixduprix < nombre:
        print("C'est plus")
    else:
        print("C'est moins")
    choixduprix = int(input("Entrer un prix: "))

print("C'est gagné!")

Je ne connaissais pas la fonction random, forcément je débute. Effectivement c'est plus souple.

Merci à tous.


Ubuntu Mate 22.04

En ligne