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 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 !" ? tongue

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..."

mr-tulip a écrit :

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..."

Link31 a écrit :
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 smile

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 : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne