Inscription / Connexion Nouveau Sujet
Niveau seconde
Partager :

Python

Posté par
Nichene
20-03-18 à 22:14

Bonsoir a tous, je dois rendre un dm dans 2 jours sur le logiciel python mais j'ai quelques difficultés voici mon énoncé : On demande à l'utilisateur de deviner en moins de six essais un nombre tiré au hasard entre 10 et 100. On lui indique à chaque fois si le nombre proposé est superieur ou inférieur au nombre cherché.
1) a) Que représente les variables E,S,N
b) Ecrire et tester un programme traduisant cet algorithme.
2)Sans stratégie, il est difficile de gagner.
En effet, selon le choix des valeurs, il sera
ou non possible de déterminer à coup sûr la
solution.
La méthode consiste, en choisissant à
chaque fois la valeur située au milieu de
l'intervalle en cours, à réduire de moitié
l'amplitude de l'intervalle dans lequel se
trouve le nombre.
Tester cette stratégie pour gagner à tous les
coups à ce jeu et détailler un coup gagnant.

Affecter à S la valeur d'un nombre
aléatoire entier compris entre 10 et 100
Affecter à E la valeur 1
Tant que E<7
Saisir N
Si N>S
Alors afficher "C'est moins"
Sinon
Si N<S
Alors afficher "C'est plus"
Sinon
Afficher "C'est gagné"
Sortir de la boucle
Fin Si
Fin Si
Affecter à E la valeur E+1
Fin Tant que
Si E=7
Alors afficher "C'est perdu"
Fin Si


Voici mon algorithme en langage naturel

J'ai testé sur python cet algorithme et j'ai obtenue :

from random import*
S= randint (10,100)
E = 1
while E < 7 :
N = int(input("saisir une valeur comprise entre 10 et 100:"))
if N > S:
print("C'est moins")
elif N < S:
print("C'est plus")
else:
print("C'est gagné")
break
E= E+1
if E==7:
print("C'est gagné")
Mon seul problème c'est que mon ''elif'' m'indique qu'il y a une erreur de syntaxe du coup je ne peux pas exécuter mon programme.
Pour terminer je n'ai pas compris le sens de la question 2.
Si quelqu'un peut m'éclaircir sur ces 2 points s'il vous plait merci infiniment

Posté par
chadok
re : Python 20-03-18 à 22:49

Bonjour,
Pas d' erreur de syntaxe chez moi, en recopiant ton code...
Tu n' as pas une erreur d' indentation?

Posté par
Nichene
re : Python 20-03-18 à 22:52

Ah je ne sais pas, qu'est ce que l'indentation?. Merci de m'avoir répondu

Posté par
carita
re : Python 20-03-18 à 22:55

bonsoir

je pense aussi que c'est l'indentation

en revanche, à la fin, je mettrais
if E==7:
      print("C'est perdu")

Posté par
Nichene
re : Python 20-03-18 à 22:57

Ah d'accord merci bcp je vais corriger

Posté par
carita
re : Python 20-03-18 à 23:00

oui, si après 6 essais (E>7) tu te trouves à cet endroit du programme, c'est que tu n'as pas trouvé S, donc "perdu"

tu as rectifié tes indentations? tu as compris ?

Posté par
flight
re : Python 20-03-18 à 23:00

salut

pour te donner une idée ..fais sous excel

Sub jeu()
Dim t As Variant
Randomize
ReDim t(0 To 90)
For i = 0 To UBound(t)
t(i) = i + 10
Next
p = Int(Rnd * 91)
MsgBox p
N = InputBox("saisir une valeur entière")

While Val(N) <> p
If Val(N) > p Then
MsgBox "doit etre plus petit"
End If
If Val(N) < p Then
MsgBox "doit etre plus grand"
End If
j = j + 1
N = ""
N = InputBox("saisir une valeur entière")
If j = 6 Then
MsgBox "6 essais on été effectués, fin de la partie"
Exit Sub
End If
Wend
MsgBox "Exact"

End Sub

Posté par
carita
re : Python 20-03-18 à 23:01

* oups E==7,  et non  pas E>7

Posté par
Nichene
re : Python 20-03-18 à 23:02

Oui j'ai compris je vais essayer et je vous dirai merci infiniment d'avoir pris le temps de me répondre

Posté par
carita
re : Python 20-03-18 à 23:05


bonne programmation !

Posté par
carita
re : Python 20-03-18 à 23:22

2) la méthode décrite est par recherche dichotomique
(pour le moment, je te laisse réfléchir en lisant bien l'énoncé, et rechercher un peu)

Posté par
bbomaths
re : Python 21-03-18 à 02:21

Bonjour.

Franchement, c'est pas mal du tout...

Petites remarques :

-> problème d'indentation possible si on mélange les espaces " " avec les tabulations "\t", surtout avec les suppressions arrières de caractères "DEL". Python a horreur de cela. Généralement, il signale ce type de problème mais ne vous dit pas où dans la ligne incriminée alors qu'à l'écran tout semble normal.

-> essayez de formater votre texte pour garder les indentations. Personnellement, j'utilise un éditeur de texte jamais de logiciel comme Word.  Les éditeurs de texte ont souvent des options pour remplacer les tabulations par des espaces de taille prédéfinie : une "\t " = 3 ou 4 " ".

-> prenez l'habitude de ne jamais utiliser de lettres accentuées dans les messages. Vous risquez de voir apparaitre des symboles bizarres à moins de connaitre le type exact de police de caractères utilisées.

-> pour les boucles, commencez si possible à 0 et faites le test E < 6. Comme cela, vous comptez 6 boucles : 0, 1, 2, 3, 4, 5 et la limite 6 apparait clairement.

Sinon en pseudo-code, j'aurais fait cela en plus proche d'Algobox :


VARIABLES

   E EST_DU_TYPE NOMBRE
   N EST_DU_TYPE NOMBRE
   S EST_DU_TYPE NOMBRE
   G EST_DU_TYPE NOMBRE

DEBUT_ALGORITHME

   // initialisation...

   // numéro d'essais, nul par défaut
   E PREND_LA_VALEUR 0

   // pas gagné par defaut
   G PREND_LA_VALEUR 0

   // valeur secrète ~ nombre aléatoire entier compris entre 10 et 100
   S PREND_LA_VALEUR randint(min, max)

   // fin des 6 essais ?
   TANT_QUE (E < 6) FAIRE
      DEBUT_TANT_QUE

         // saisie de la valeur testée
         AFFICHER "Entrez votre valeur : "
         LIRE N

         // valeur entrée supérieure à valeur secrète ?
         SI (N > S) ALORS
            DEBUT_SI
               // oui : trop haut
               AFFICHER "C'est moins..."
            FIN_SI
         SINON
            DEBUT_SINON
            // non : valeur entrée inférieure à valeur secrète ?
               SI (N <S) ALORS
                  DEBUT_SI
                     // oui : trop bas
                     AFFICHER "C'est plus..."
                  FIN_SI
               SINON
                  DEBUT_SINON
                     // non : signale que l'on a gagné
                     G PREND_LA_VALEUR 1

                     // et fin de partie
                     Sortie de boucle...
                  FIN_SINON
               FIN_SINON
            FIN_SINON

         // essais suivant
         E PREND_LA_VALEUR E + 1
      FIN_TANT_QUE

   // partie gagnée ?
   SI (G == 1) ALORS
      DEBUT_SI
         AFFICHER "C'est gagne... "
      FIN_SI
SINON
      DEBUT_SINON
         AFFICHER "C'est perdu... "
      FIN_SINON

FIN_ALGORITHME

Posté par
bbomaths
re : Python 21-03-18 à 03:26

Le code Python associé...

J'ai rajouté 2 choses :

- un test sur la valeur saisie
- et, surtout, afficher la valeur attendue en cas d'échec...


#*******************************************************************************
# IMPORT ***********************************************************************
#*******************************************************************************

# module pour le systeme d'exploitation
import os

# module specifique pour le systeme
import sys

# module pour les donnees aleatoires
import random

#*******************************************************************************
# MAIN *************************************************************************
#*******************************************************************************

# effacement de l'ecran (facultatif)
os.system('cls')
print(" ")

# numero d'essai, nul par defaut
E = 0

# pas gagne par defaut
G = False

# valeur secrete ~ nombre aleatoire entier compris entre 10 et 100
S = random.randint(10, 100)

# fin des 6 essais ?
while E < 6 :

   # fausse valeur de N
   N = 0
   # pour eviter les erreurs de saisie
   while N < 10 or N > 100 :

      # saisie de la valeur testee
      print(" Essai", E + 1, ": entrez votre valeur...")
      N = int(input(" "))
      print(" ")

   # valeur entree superieure a valeur secrete ?
   if N > S :

      # oui : trop haut
      print(" C'est moins...")
      print(" ")

   # non : valeur entree inferieure à valeur secrete ?
   elif N < S :

      # oui : trop bas
      print(" C'est plus...")
      print(" ")

   else :
      # non : signale que l'on a gagne
      G = True

      # fin de partie
      break

   # essai suivant
   E += 1

# partie gagnee ?
if G is True :

   # oui :
   print(" C'est gagne...  ")

else :

   # non :
   print(" C'est perdu...  ")
   print(" ")
   print(" La valeur etait : ", S)


Ce qui donne :

1/ en cas d'échec

 Essai 1 : entrez votre valeur...
 55

 C'est moins...

 Essai 2 : entrez votre valeur...
 25

 C'est moins...

 Essai 3 : entrez votre valeur...
 15

 C'est plus...

 Essai 4 : entrez votre valeur...
 20

 C'est moins...

 Essai 5 : entrez votre valeur...
 17

 C'est plus...

 Essai 6 : entrez votre valeur...
 18

 C'est plus...

 C'est perdu...  

 La valeur etait :  19


1/ en cas de réussite

 Essai 1 : entrez votre valeur...
 55

 C'est moins...

 Essai 2 : entrez votre valeur...
 20

 C'est plus...

 Essai 3 : entrez votre valeur...
 35

 C'est moins...

 Essai 4 : entrez votre valeur...
 32

 C'est moins...

 Essai 5 : entrez votre valeur...
 30

 C'est plus...

 Essai 6 : entrez votre valeur...
 31

 C'est gagne...  

Posté par
Nichene
re : Python 21-03-18 à 19:47

Bonjour, merci à tous d'avoir pris le temps de me répondre. Malheuresement j'ai essaye plusieurs fois mais j'ai toujours le même problème avec le ''elif'' du coup je ne peux pas exécuter mon programme. Vous m'avez parler d'indentation ca consiste a quoi exactement. Merci énormément

Posté par
bbomaths
re : Python 21-03-18 à 20:23

Bonsoir.

L'indentation en Python consiste à décaler un bloc d'instructions.

Exemple, pour if... :


if condition :
     instruction
     ...


Pour faire une indentation de code, on insère des espaces qui sont réalisées soit avec la barre du clavier soit la touche de tabulation.

Python ne supporte pas qu'une indentation sur une ligne soit différente de la précédente dans un même bloc d'instructions.

Exemple : une tabulation de 4 " " + une " " est différent de 5 " ".  A l'écran cela ne se voit pas mais Python le détecte.

Posté par
Nichene
Python 21-03-18 à 20:23

Bonjour à tous, je dois rendre demain un dm de maths sur le logiciel python, mais j'ai un petit souci avec ma programmation

from random import*
S= randint (10,100)
E = 1
while E < 7 :
    N = int(input("saisir une valeur comprise entre 10 et 100:"))
    if N > S:
        print("C'est moins")
         elif N < S:
            print("C'est plus")
             else:
                print("C'est gagne")
                break
            E= E+1
            if E==7:
                print("C'est perdu")
Voici mon programme mais j'ai un problème avec le ''elif'' il m'indique ''syntax error'' on m'a parlé d'indentation mais je ne sais pas qu'est ce que c'est. comment puis-je résoudre ce problème svp Merciiii beaucoup

*** message déplacé ***

Posté par
Jezebeth
re : Python 21-03-18 à 20:27

Bonsoir

Python est un langage de programmation, pas un logiciel...

Il y a effectivement un gros problème d'indentation. Python est intransigeant là-dessus parce que c'est son repère. Il s'agit du retrait (l'espace) à gauche à chaque ligne, avant le texte. Après un while, ou if ou un elif par exemple, il doit y avoir un niveau de retrait (jusqu'à ce que vous ayez fini d'écrire les instructions dans le while) et le MEME pour chaque instruction. Ce n'est pas du tout le cas dans votre programme.

Posté par
malou Webmaster
re : Python 21-03-18 à 20:28

dis moi, tu as lu ceci ?

Python

Posté par
bbomaths
re : Python 21-03-18 à 20:31

Pouvez-vous essayer ce code sans tabulation


import random
S = randint(10,100)
E = 1
while E < 7 :
   N = int(input("saisir une valeur comprise entre 10 et 100:"))
   if N > S :
      print("C'est moins")
   elif N < S :
      print("C'est plus")
   else :
      print("C'est gagné")
      break

   E = E+1

if E==7:
   print("C'est gagné")


Il y a-t'il un message d'erreur ?

Posté par
carpediem
re : Python 21-03-18 à 20:39

salut

un algorithme qui permet de continuer ... même quand on a perdu

... et en anglais ... histoire d'apprendre la langue

PS : la déclaration des variables n'est plus exigée voire même bannie (consigne reçues dans l'année par l'inspection)

n = alea (10, 100)
p = 0
While p < 6
    p = p + 1
    Read "votre essai ?", x
    If x < n Then mot =  "trop grand"
    If x > n Then mot =  "trop petit"
    If x = n Then mot =  "gagné"
    If mot = "gagné" Then Write "vous avez gagné en ", p, " coups"
If mot = "perdu" then Read "voulez-vous continuer ? (oui/non)", réponse
If réponse = "oui" Then
    While x <> n
        p = p + 1
        Read "votre essai ?", x
        If x < n Then mot =  "trop grand"
        If x > n Then mot =  "trop petit"
    Write "Bingo", "vous avez gagné en ", p - 1, " coups"


...

Posté par
Nichene
re : Python 21-03-18 à 20:41

j'ai enfin trouve je vous remercie tous de m'avoir aider merci bcp

Posté par
carita
re : Python 21-03-18 à 20:49

bonsoir à tous

@carpediem
ne faudrait-il pas initialiser mot = "perdu" avant le début du while
(si j'ai bien compris)

Posté par
carpediem
re : Python 21-03-18 à 21:12

effectivement on pourrait ... mais il me semble que ce n'est pas obligatoire en python

ici pour p il le faut parce que le while en dépend

...

ha non !! par contre j'ai fait une erreur

après la boucle while c'est :

If mot <> "gagné Then ...

car on continue à jouer si on n'a pas gagné en 6 coups ...

car mot contient forcément quelque chose dès le premier tour de la boucle while

Posté par
carita
re : Python 21-03-18 à 21:15

If mot <> "gagné Then ...   ok je comprends

... c'était pour voir si on suivait ?

bonne soirée !!

Posté par
carpediem
re : Python 22-03-18 à 13:22

merci et à toi aussi ... enfin bonne journée !!  



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Inscription gratuite

Fiches en rapport

parmi 1488 fiches de maths

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !