#1 Le 20/07/2010, à 16:14
- mr-tulip
[Python] "Interrogation sur les tables de multiplications..."
Bonjour, je débute dans la programmation. Je souhaite créer un programme python, qui serait une sorte d'interrogation sur les "tables de multiplications", avec des multiplications allant de la table de 2 à celle de 12, ainsi que celle de 25.
L'idée peut sembler idiote, mais j'en assume la responsabilité.. ^^
A terme, il serait question d'y intégrer un chrnonomètre, et d'un tableaux de stats...
Voici ce que j'ai tenté d'écrire..
from random import randrange
a,b = (randrange(2,13) ), (randrange(2,13) )
print ('a*b=c')
c = raw_input()
if c==a*b
print('ok')
Malheureusement, ca ne donne absolument rien.. Quelqu'un saurait m'indiquer la marche à suivre ?
Dernière modification par mr-tulip (Le 20/07/2010, à 17:45)
AMD Athlon 64 Processor 3200+ | Asus A8N5X | 1024MB ram | Ubuntu 10.04 Lucid Lynx / Xubuntu 10.10 Maverick Meerkat / WinXP Famillial SP3 |
-------------------------------------------------------------------------------------------------------------------------------------
"C'est plus c'que c'était."
Hors ligne
#2 Le 20/07/2010, à 16:38
- bejazzy
Re : [Python] "Interrogation sur les tables de multiplications..."
Bonjour,
Rien n'est stupide en programmation, surtout quand on débute. Tu as déjà vu des tutoriels avec le fameux "Hello World !" ?
1/ À propos de ton titre de sujet, [Python] est un peu vague.
2/ Quand tu veux imprimer des variables, il faut préciser le nom de la variable et pas seulement une lettre dans un caractère. Par exemple:
> a = 6
> print('a: ', a)
a: 6
Dans ton code, seul les caractères "a*b=c" vont s'afficher, et pas la valeur des variables.
3/ Attention au type de valeur que renvoie la fonction "raw_input": est-ce un entier, un flottant, une liste, une chaîne de caractère?
4/ La syntaxe pour la condition "if" n'est pas bonne. Vérifie bien.
5/ Attention à l'indentation !! Après une boucle "for", "while" ou un "if", il faut une indentation (4 espaces).
Et quand tu dis: "cela ne donne absolument rien". As-tu essayé de lancer ton fichier avec la commande
> python mon_script.py
Aucun message d'erreur ne s'affiche?
Dis-nous en plus son ton environnement de programmation: avec toi tu édites, utilises-tu un terminal, un IDE, ...
Remarque: je t'ai volontairement pas corrigé mais orienté vers une solution sans bug.
Dernière modification par bejazzy (Le 20/07/2010, à 16:41)
Dell Inspiron 1525 - #!CrunchBang Linux 10 Statler Xfce --- #! FR
Hors ligne
#3 Le 20/07/2010, à 16:57
- mr-tulip
Re : [Python] "Interrogation sur les tables de multiplications..."
Merci de répondre aussi vite.
Désolé pour le titre, c'est un oubli.. Comment fait on pour le modifier ?
>>> from random import randrange
>>> a,b = ('a*b=c')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
>>> c = raw_input():
File "<stdin>", line 1
c = raw_input():
^
SyntaxError: invalid syntax
>>> if c==a*b:
... print ('ok')
File "<stdin>", line 2
print ('ok')
^
IndentationError: expected an indented block
>>>
J'édite avec idle.
AMD Athlon 64 Processor 3200+ | Asus A8N5X | 1024MB ram | Ubuntu 10.04 Lucid Lynx / Xubuntu 10.10 Maverick Meerkat / WinXP Famillial SP3 |
-------------------------------------------------------------------------------------------------------------------------------------
"C'est plus c'que c'était."
Hors ligne
#4 Le 20/07/2010, à 17:18
- bejazzy
Re : [Python] "Interrogation sur les tables de multiplications..."
Désolé pour le titre, c'est un oubli.. Comment fait on pour le modifier ?
Plop, je suis entrain de cherché et ne trouve pas...[boulet!]
Pour imprimer plusieurs variables, on peut faire:
>>> age_alice = 21
>>> age_bob = 26
print("Age alice et Bob: ", age_alice, age_bob)
Tu verras que le résultat n'est en fait pas très lisible. On verra par la suite comment améliorer ça.
Pas de ":" après une fonction.
Sur le type que rend "raw_input()", essaie:
>>> bouffe = raw_input("Que veux-tu manger?")
Tu tapes ce que tu veux et imprimes le résultat. Cela te donnera une idée. Pourquoi je te demande ça? Parce qu'ensuite tu compares dans le "if" plusieurs variables. Et si elles ne sont pas de mêmes types, tu auras toujours False.
Après le "if", tu as mis ":", c'est ce qu'il faut faire. Tu vois qu'après tu as une IndentationError. Avec IDLE, je viens de voir que tu n'as pas besoin de taper d'espace, le curseur se met où il faut. Si tu es sous Linux, je te conseille ipython, ou bpython
Dernière modification par bejazzy (Le 20/07/2010, à 17:20)
Dell Inspiron 1525 - #!CrunchBang Linux 10 Statler Xfce --- #! FR
Hors ligne
#5 Le 20/07/2010, à 17:30
- mr-tulip
Re : [Python] "Interrogation sur les tables de multiplications..."
# -*- coding: utf-8 -*-
from random import randrange
a,b = (randrange(2,13) ), (randrange(2,13) )
c=c
print ('a x b = ', a, b)
c = raw_input(c)
if c==a*b:
print ('a x b = c', a, b, c)
C'est vrai que ce n'est pas très lisible le
print ('a x b = ', a, b)
AMD Athlon 64 Processor 3200+ | Asus A8N5X | 1024MB ram | Ubuntu 10.04 Lucid Lynx / Xubuntu 10.10 Maverick Meerkat / WinXP Famillial SP3 |
-------------------------------------------------------------------------------------------------------------------------------------
"C'est plus c'que c'était."
Hors ligne
#6 Le 20/07/2010, à 17:47
- bejazzy
Re : [Python] "Interrogation sur les tables de multiplications..."
Pour modifier le titre, tu cliques sur le "Modifier" de ton premier post, et là tu peux modifier le titre.
Je ne comprends pas le:
c = c
et ensuite:
c = raw_input(c)
Et quelle est la réponse à la question: quel type renvoie raw_input()"?
Quand je parlais de la lisibilité, je parlais surtout de la lisbilité de l'affichage que renvoie la fonction "print":
>>> print('Age alice et bob', age_alice, age_bob)
('Age alice et bob', 21, 26)
Dell Inspiron 1525 - #!CrunchBang Linux 10 Statler Xfce --- #! FR
Hors ligne
#7 Le 20/07/2010, à 17:56
- mr-tulip
Re : [Python] "Interrogation sur les tables de multiplications..."
J'ai écrit c=c car j'avais le message d'erreur
NameError: name 'c' is not defined
J'ai pensé que.. ^^
# -*- coding: utf-8 -*-
from random import randrange
a,b = (randrange(2,13) ), (randrange(2,13) )
print (a, 'x' , b, '= ' )
c = raw_input()
if c==a*b:
print ('')
Voila, comme ça je crois que c'est mieux.
Maintenant, comment retirer les guillemets entre les facteurs?
Et je voudrais également faire répeter l'opération tant que le résultat est faux. Je dois utiliser else, mais ensuite ?
AMD Athlon 64 Processor 3200+ | Asus A8N5X | 1024MB ram | Ubuntu 10.04 Lucid Lynx / Xubuntu 10.10 Maverick Meerkat / WinXP Famillial SP3 |
-------------------------------------------------------------------------------------------------------------------------------------
"C'est plus c'que c'était."
Hors ligne
#8 Le 20/07/2010, à 20:27
- Link31
Re : [Python] "Interrogation sur les tables de multiplications..."
print('%dx%d =' % (a, b))
Et en algorithmique : "tant que" => "while".
Dernière modification par Link31 (Le 20/07/2010, à 20:28)
Hors ligne
#9 Le 20/07/2010, à 21:21
- mr-tulip
Re : [Python] "Interrogation sur les tables de multiplications..."
print('%dx%d =' % (a, b))
Et en algorithmique : "tant que" => "while".
Je sais bien que "While" signifie "Tant que", mais je ne vois pas ce que tu veux dire..
AMD Athlon 64 Processor 3200+ | Asus A8N5X | 1024MB ram | Ubuntu 10.04 Lucid Lynx / Xubuntu 10.10 Maverick Meerkat / WinXP Famillial SP3 |
-------------------------------------------------------------------------------------------------------------------------------------
"C'est plus c'que c'était."
Hors ligne
#10 Le 20/07/2010, à 21:45
- Link31
Re : [Python] "Interrogation sur les tables de multiplications..."
Maintenant, comment retirer les guillemets entre les facteurs?
Comme ça :
print('%dx%d =' % (a, b))
Et je voudrais également faire répeter l'opération tant que le résultat est faux. Je dois utiliser else, mais ensuite ?
Tu dois surtout entourer l'opération en question d'un bloc "while", qui signifie : continuer "tant que".
Hors ligne
#11 Le 20/07/2010, à 22:09
- bejazzy
Re : [Python] "Interrogation sur les tables de multiplications..."
Si tu as une version de Python supérieure (ou égale) à la 2.6.x, tu peux (et il est préférable de) utiliser ceci:
print "{0} fois {1}".format(a, b)
Dell Inspiron 1525 - #!CrunchBang Linux 10 Statler Xfce --- #! FR
Hors ligne
#12 Le 21/07/2010, à 08:57
- bejazzy
Re : [Python] "Interrogation sur les tables de multiplications..."
Un exemple de "tant que" très simple:
count = 0
while count < 10:
print "count: ", count
count += 1
Dell Inspiron 1525 - #!CrunchBang Linux 10 Statler Xfce --- #! FR
Hors ligne
#13 Le 21/07/2010, à 09:33
- valAa
Re : [Python] "Interrogation sur les tables de multiplications..."
Salut mr-tulip,
Vu que tu débutes dans la programmation et que tu as choisi python pour apprendre, je te conseille de jeter un coup d'œil à
Apprendre à programmer avec python, G. Swinnen
Téléchargeable entre autres ici http://www.framasoft.net/article1971.html
Hors ligne
#14 Le 21/07/2010, à 13:39
- mr-tulip
Re : [Python] "Interrogation sur les tables de multiplications..."
Hello. J'ai presque réussi ce que je voulais faire, à l'aide de vos conseils, et de quelques tutoriels
Voila ce que j'ai :
#-*- coding=utf-8 -*-
from random import choice
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 25]
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 25]
n=0
adieux = ['fin', 'stop', 'kenavo']
print 'Calculez ces produits'
print "Repondre 'fin', 'stop', ou pour arreter"
while n<20:
print choice(a), 'x' , choice(b), '= '
reponse = raw_input()
n+=1
if reponse==choice(a)*choice(b):
print 'Kenavo!'
Ce que j'aimerais améliorer : 1- que la réponse soit alignée avec la proposition
2- ajouter un chrono, et un compteur de bonnes réponses
AMD Athlon 64 Processor 3200+ | Asus A8N5X | 1024MB ram | Ubuntu 10.04 Lucid Lynx / Xubuntu 10.10 Maverick Meerkat / WinXP Famillial SP3 |
-------------------------------------------------------------------------------------------------------------------------------------
"C'est plus c'que c'était."
Hors ligne
#15 Le 21/07/2010, à 14:08
- redo_fr
Re : [Python] "Interrogation sur les tables de multiplications..."
salut,
Tout d'abord, je te conseille d'indiquer en quel langage ton script est écrit.
A ajouter en toute première ligne de ton script (on appelle cela "shabang")
#! /usr/bin/env python
Remplace ta boucle while (pas très "jolie") par une expression plus... pythonesque ^_^
for n in range(1,20):
Lorsque tu choisis tes deux termes, mémorise les, sinon, les réponses seront toujours incorrectes!
Chaque appel à choice, donne une valeur différente, donc les premiers choice(a) et choice(b) seront toujours différents des appels suivants (sauf coïncidence...).
termeUn = choice(a)
termeDeux = choice(b)
reponseCorrecte = int(termeUn)*int(termeDeux)
Voici un exemple de code complet commenté:
#!/usr/bin/env python
#-*- coding=utf-8 -*-
from random import choice
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 25]
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 25]
n=0
adieux = ['fin', 'stop', 'kenavo']
print 'Calculez ces produits'
print "Repondre 'fin', 'stop', ou 'kenavo' pour arreter"
# Compteur de bonnes reponses
bonnesReponses = 0
# On démarre pour 20 questions
for n in range(1,20):
# On choisit deux termes au hasard et on les memorise
termeUn = choice(a)
termeDeux = choice(b)
# On calcule le bonne reponse
reponseCorrecte=int(termeUn)*int(termeDeux)
# On affiche la question (noter la virgule en fin de ligne pour afficher
# tout sur la meme ligne)
print termeUn, 'x' , termeDeux, '= ',
reponse = raw_input()
# On place une exception pour le cas ou un utilisateur ne taperait pas
# des chiffres
try:
if int(reponse) == reponseCorrecte:
print 'Bravo!'
# La reponse est correcte on incremente le compteur de bonnes reponses
bonnesReponses = bonnesReponses+1
# L'utilisateur n'a pas tapé des chiffres...
except ValueError:
# Si sa reponse est dans le tableau 'adieux', c'est qu'il veut arreter de jouer
if reponse.lower() in adieux:
break
print "Terminé."
# On affiche le nombre de reponses correctes
print "Nombre de bonnes reponse: ", bonnesReponses
# Fin du programme
Il reste encore à mettre un compteur de temps en place (regarde du coté du module 'time')
Un autre problème :
Les tables de multiplications vont en général de 1 à 10...
Ici, on se retrouve parfois avec une question du style : "25 x 25" Oo
Je pense que le tableau 'b' pourrait avantageusement être remplacé par un randint(1,10)
Dernière modification par redo_fr (Le 21/07/2010, à 14:13)
Il n'y a pas de mauvais outils, il n'y a que de mauvais ouvriers
- papy -
Personnellement, je crois que faire des procès est un signe que les affaires vont mal. Je ne dis pas que Microsoft va mal, ce n'est qu'un signe, pas un indicateur...
- Linus Torvalds -
Hors ligne
#16 Le 21/07/2010, à 18:30
- mr-tulip
Re : [Python] "Interrogation sur les tables de multiplications..."
Merci redo, pour la correction, et le machage de travail redo ^^ . Par contre, j'ai un probleme avec 'break' Lorsque j'exécute avec le Terminal j'ai le message d'erreur suivant :
File "mult.py", line 29
break
SyntaxError: 'break' outside loop
try:
if int(reponse) == repCorrecte:
print ' :)'
bonnesReponses+=1
except ValueError:
if reponse.lower() in msgFin :
break
print "Terminé."
# On affiche le nombre de reponses correctes
print bonnesReponses, "sur", n-1
# Fin du programme
AMD Athlon 64 Processor 3200+ | Asus A8N5X | 1024MB ram | Ubuntu 10.04 Lucid Lynx / Xubuntu 10.10 Maverick Meerkat / WinXP Famillial SP3 |
-------------------------------------------------------------------------------------------------------------------------------------
"C'est plus c'que c'était."
Hors ligne
#17 Le 22/07/2010, à 08:36
- redo_fr
Re : [Python] "Interrogation sur les tables de multiplications..."
Il faut faire très attention à l'indentation avec python ^_^
Ne pas mélanger (par exemple) espaces et tabulations...
En ce qui me concerne, je travaille avec vim, et avant de commencer à écrire du python, je paramètre mon éditeur ainsi:
:set nu ai expandtab tabstop=4
Comme ça, pas de soucis de tabulations.
Il n'y a pas de mauvais outils, il n'y a que de mauvais ouvriers
- papy -
Personnellement, je crois que faire des procès est un signe que les affaires vont mal. Je ne dis pas que Microsoft va mal, ce n'est qu'un signe, pas un indicateur...
- Linus Torvalds -
Hors ligne
#18 Le 23/07/2010, à 14:56
- mr-tulip
Re : [Python] "Interrogation sur les tables de multiplications..."
C'est ce que j'avais cru comprendre, que l'indentation était très importante avec python ^^. Mais je ne comprend pas pourquoi ce message d'erreur s'affiche...
AMD Athlon 64 Processor 3200+ | Asus A8N5X | 1024MB ram | Ubuntu 10.04 Lucid Lynx / Xubuntu 10.10 Maverick Meerkat / WinXP Famillial SP3 |
-------------------------------------------------------------------------------------------------------------------------------------
"C'est plus c'que c'était."
Hors ligne
#19 Le 23/07/2010, à 15:08
- redo_fr
Re : [Python] "Interrogation sur les tables de multiplications..."
Le message te dit que ton break est "hors d'une boucle". Il est probable que ton indentation est mauvaise et que ton exception try...except est hors de la boucle for.
Peux tu poster l'entièreté de ton code ?
De ce que je vois, les lignes "bonnesReponses += 1" et "break" me semblent "trop" indentées par rapport à la ligne supérieure.
Il n'y a pas de mauvais outils, il n'y a que de mauvais ouvriers
- papy -
Personnellement, je crois que faire des procès est un signe que les affaires vont mal. Je ne dis pas que Microsoft va mal, ce n'est qu'un signe, pas un indicateur...
- Linus Torvalds -
Hors ligne
#20 Le 23/07/2010, à 16:03
- bejazzy
Re : [Python] "Interrogation sur les tables de multiplications..."
Le problème si tu fais des copier/coller d'un code écrit via l'interpréteur IDLE, c'est qu'il ne respecte pas du tout les règles d'indentation Python. Il indente beaucoup trop.
Du coup, si tu teste via IDLE, que ça fonctionne tout bien et que tu copies/colles dans un fichier pour ensuite l'exécuter, tu peux avoir ce genre d'erreur.
Il faut bien attention à avoir:
- un bon interpréteur
- un bon éditeur (qui indente comme il faut, avec des espaces et pas des tabulations)
Dell Inspiron 1525 - #!CrunchBang Linux 10 Statler Xfce --- #! FR
Hors ligne
#21 Le 23/07/2010, à 18:18
- HP
Re : [Python] "Interrogation sur les tables de multiplications..."
Ou, utiliser un « vrai éditeur » et un terminal…
on code tranquillement, et de façon régulière, on contrôle dans le terminal…
cat /dev/urandom >/dev/null 2>&1 #github
Hors ligne
#22 Le 23/07/2010, à 22:36
- nesthib
Re : [Python] "Interrogation sur les tables de multiplications..."
je te propose une petite solution commentée, tu y trouveras des exemples classiques de ce que l'on peut rencontrer en programmation :
Ce script n'a pas pour vocation d'être parfait mais plutôt didactique.
N'hésitez pas pour toute remarque ou question
#!/usr/bin/env python
# coding=utf-8
# import des modules
from random import choice
from time import time
# multiples possibles
multiples = range(1,13)+[25]
# initialisation du nombre de cycles
cycles = raw_input(u'nombre de questions : ')
while True:
try:
cycles = int(cycles)
break
except ValueError:
cycles = raw_input(u'attention un nombre est demandé ! : ')
# quizz
score = 0
for cycle in range(cycles):
nombre1 = choice(multiples)
nombre2 = choice(multiples)
debut = time()
#print('debug %s %s → %s') % (nombre1, nombre2, nombre1*nombre2)
# boucle principale
for essai in range(1,5):
if essai == 4:
print(u'Dommage la réponse était %s\n') % (nombre1*nombre2)
break
reponse = raw_input(u'Question %s - essai %s\n\t%s × %s = ' % (cycle+1, essai, nombre1, nombre2))
# teste si la réponse est un nombre, sinon tant pis
try:
reponse = int(reponse)
except ValueError:
print("erreur '%s' n'est pas un nombre") % reponse
# vérification de la réponse
if reponse == nombre1*nombre2:
score+=1
fin = time()
print(u'Bravo ! tu as mis %i secondes pour répondre\n') % round(fin-debut)
break
# affichage du score
if score >1:
pluriel = 's'
else:
pluriel = ''
print('\nTu as trouvé %s réponse%s sur %s') %(score, pluriel, cycles)
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne