Mon premier programme ne marche pas mais ne plante pas non plus

Résolu
ericstoclet Messages postés 8 Date d'inscription lundi 7 juin 2004 Statut Membre Dernière intervention 26 février 2010 - 16 févr. 2010 à 00:07
ericstoclet Messages postés 8 Date d'inscription lundi 7 juin 2004 Statut Membre Dernière intervention 26 février 2010 - 21 févr. 2010 à 19:27
Bonjour a tous,

Je ne trouve pas l'erreur qui fait que mon programme ne fonctionne pas (liste4 et liste5 restent vides) :

# -*- coding:Utf-8 -*-
import sys, string, os
# Ce code devrait permettre de transcrire un montant en euros en toutes lettres
# Seulement, il se trouve que liste4 et liste5 restent desespérement vide... Pourquoi ?

### RAPPEL DES REGLES (je verrai ça quand ce code marchera) ###
# On utilise des traits d'union pour écrire les nombres composés plus petits que cent sauf autour du mot et  (qui remplace alors le trait d'union). 
# Partout ailleurs, il n'y a que des espaces. Exemples : dix-sept (17), vingt et un (21), trente-deux mille
# Mille est toujours invariable, il ne prend donc pas de s à la fin.
# Vingt et cent prennent un s à la fin quand ils sont multipliés et quand ils ne sont pas suivis d’un autre nombre.
# Million(s) et milliard(s) prennent un s quand il y en a plusieurs.

# Donnees utiles pour la fonction
monnaie = [' euro(s)', ' centime(s)']
liste1 = ['', 'un', 'deux', 'trois', 'quatre', 'cinq', 'six', 'sept', 'huit', 'neuf']
liste2 = ['dix', 'onze', 'douze', 'treize', 'quatorze', 'quinze', 'seize', 'dix-sept', 'dix-huit', 'dix-neuf']
liste3 = ['', 'dix', 'vingt', 'trente', 'quarante', 'cinquante', 'soixante', 'soixante', 'quatre-vingt', 'quatre-vingt']
liste4 = ['']
liste5 = ['']
lettresGrdNbre = ['cent', 'mille', 'million', 'milliard']


##############################################################
#####   Sous-fonction écrivant les nombres à 3 chiffres   ####
##############################################################
def petitEnLettres(petit):

# Décomposition du nombre
restePetit = petit
c = int(restePetit / 100)
restePetit = restePetit - c * 100
d = int(restePetit / 10)
restePetit = restePetit - d * 10
u = restePetit

# Chiffre des centaines (variable c) : 1er cas - si c = 0 > AUCUNE ACTION

# Chiffre des centaines (variable c) : 2eme cas
if c==1:
liste4.append('cent')
# Chiffre des centaines (variable c) : 3eme cas
elif c>1 and d+u == 0:
liste4.append(liste1(c))
liste4.append('cents')
# Chiffre des centaines (variable c) : dernier cas
elif c>1 and d+u != 0:
liste4.append(liste1(c))
liste4.append('cent')

# Chiffre des dizaines (variable d) : 1er cas - si d = 0 > AUCUNE ACTION

# Chiffre des dizaines (variable d) : 2eme cas
if d==1:
liste4.append(liste2(u))
# Chiffre des dizaines (variable d) : 3eme cas
elif d>1:
liste4.append(liste3(d))

# Chiffre des unités (variable u) : 1er cas
if d==7 and u==1:
liste4.append('et')
# Chiffre des unités (variable u) : tous les autres cas
else:
liste4.append(liste1(u))

return ' '.join(liste4)


########################################################################
#####   Fin de la sous-fonction écrivant les nombres à 3 chiffres   ####
########################################################################

def nombreEnLettres(nombre):

# Decomposition du nombre et conversion en lettres

milliards millions milliers = 0

resteNombre = nombre

milliards = int(nombre / 1000000000)
if milliards != 0:
resteNombre = resteNombre - milliards * 1000000000
liste5.append(petitEnLettres(milliards))
liste5.append('milliard')
if milliards > 1:
liste5.append('s')

millions = int(resteNombre/1000000)
if millions != 0:
resteNombre = resteNombre - millions * 1000000
liste5.append(petitEnLettres(millions))
liste5.append('million')
if millions > 1:
liste5.append('s')

milliers = int(resteNombre/1000)
if milliers > 1:
resteNombre = resteNombre - milliers * 1000
liste5.append(petitEnLettres(milliers))
liste5.append('mille')
if milliers == 1:
liste5.append('mille')

# Ajout de la monnaie, du reste en partie décimale
if nombre < 1:
liste5.append('zéro')
decimale = resteNombre - int(resteNombre)
liste5.append(monnaie[0])
if decimale != 0:
liste5.append(petitEnLettres(decimale))
liste5.append(monnaie[1])

return ' '.join(liste5)


# TEST DE FONCTIONNEMENT
test = 1
while test != '0':
print 'Entrez un nombre (0 pour sortir)'
test = input()
if test == 0:
break
print test, ':' , liste5, 'liste4 : ',liste4

6 réponses

cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 24
20 févr. 2010 à 22:50
pb 1:
soit remplacer
	if nombre == 0:
liste5.append('zéro euro')

par
	if int(nombre) == 0:
liste5.append('zéro euro')

pour afficher "zéro euros et vingt trois centimes"
Soit remplacer
	if centimes != 0 and nombre != 0:
liste5.append('et')

par
	if centimes != 0 and nombre > 0:
liste5.append('et')

Pour l'autre problème, je ne vois pas trop, il faut vérifier la valeur de la variable u. Et vérifier l'item correspondant dans la liste.
Cdt
3
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 24
19 févr. 2010 à 17:20
C'est peut être parce que les deux fonctions (petitEnLettres et nombreEnLettres) qui mettent à jour les listes liste4 et liste5 ne sont pas appelées....
0
ericstoclet Messages postés 8 Date d'inscription lundi 7 juin 2004 Statut Membre Dernière intervention 26 février 2010
19 févr. 2010 à 20:09
Merci... J ai rajouté à la ligne 124 :
	nombreEnLettres(test)


Malgrès ça, j'ai aucun retour pour les nombres à 1, 2 et 3 chiffres et un plantage pour les nombres à 4 :

Entrez un nombre (0 pour sortir)
12
12 : ['', ' euro(s)'] liste4 :  ['']
Entrez un nombre (0 pour sortir)
123 
123 : ['', ' euro(s)', ' euro(s)'] liste4 :  ['']
Entrez un nombre (0 pour sortir)
1234
1234 : ['', ' euro(s)', ' euro(s)', 'mille', ' euro(s)'] liste4 :  ['']
Entrez un nombre (0 pour sortir)
12345
Traceback (most recent call last):
  File "Bureau/ecrireNombreEnLettres.py", line 124, in <module>
    nombreEnLettres(test)
  File "Bureau/ecrireNombreEnLettres.py", line 100, in nombreEnLettres
    liste5.append(petitEnLettres(milliers))
  File "Bureau/ecrireNombreEnLettres.py", line 54, in petitEnLettres
    liste4.append(liste2(u))
TypeError: 'list' object is not callable


Je raaame ! c pas si facile le python !
0
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 24
20 févr. 2010 à 00:41
TypeError: 'list' object is not callable
=> pour récupéré l'élément à la position i, il fait faire liste[i] et non liste(i).
Pour tes autres problème, il faut revoir ton code.
Rajoute, par exemple des print pour voir le contenu de tes variables "intermédiaires", et déterminer les blocs de code qui sont exécutés.

Cdt
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ericstoclet Messages postés 8 Date d'inscription lundi 7 juin 2004 Statut Membre Dernière intervention 26 février 2010
20 févr. 2010 à 21:26
Merci infiniment de ton aide ! Je n'aurais pas du faire cette erreur de syntaxe (liste (i) au lieu de liste[i])... A ma décharge je n'ai commencé à apprendre la programmation (et donc python) que depuis 8 jours...

Tes lumieres m'ont permis d'avancer et de corriger 7 erreurs de sémantique mais il m'en reste 2 :

Erreur n°1 : Malgrès la double condition en ligne 135, le nombre 0.23 retourne "et vingt trois centimes"

Erreur n°2 : Si le nombre entré a nécessité une éxecution des lignes 60 à 72 (traitant du cas des "70 à 79" et "90 à 99"), il me traduit le nombre mais avec un centime en moins...

une idée ? Voici mon code corrigé :
# -*- coding:Utf-8 -*-
import sys, string, os
# Ce code devrait permettre de transcrire un montant en euros en toutes lettres
# Seulement, il se trouve que liste4 et liste5 restent desespérement vide... Pourquoi ?

### RAPPEL DES REGLES (je verrai ça quand ce code marchera) ###
# On utilise des traits d'union pour écrire les nombres composés plus petits que cent sauf autour du mot et  (qui remplace alors le trait d'union). 
# Partout ailleurs, il n'y a que des espaces. Exemples : dix-sept (17), vingt et un (21), trente-deux mille
# Mille est toujours invariable, il ne prend donc pas de s à la fin.
# Vingt et cent prennent un s à la fin quand ils sont multipliés et quand ils ne sont pas suivis d&#8217;un autre nombre.
# Million(s) et milliard(s) prennent un s quand il y en a plusieurs.

# Donnees utiles pour la fonction
monnaie = [' euro(s)', ' centime(s)']
liste1 = ['', 'un', 'deux', 'trois', 'quatre', 'cinq', 'six', 'sept', 'huit', 'neuf']
liste2 = ['dix', 'onze', 'douze', 'treize', 'quatorze', 'quinze', 'seize', 'dix-sept', 'dix-huit', 'dix-neuf']
liste3 = ['', 'dix', 'vingt', 'trente', 'quarante', 'cinquante', 'soixante', 'soixante', 'quatre-vingt', 'quatre-vingt']
lettresGrdNbre = ['cent', 'mille', 'million', 'milliard']


##############################################################
#####   Sous-fonction écrivant les nombres à 3 chiffres   ####
##############################################################
def petitEnLettres(petit):
liste4 = ['']
# Décomposition du nombre
restePetit c d = u = 0
restePetit = petit
c = int(restePetit / 100)
restePetit = restePetit - c * 100
d = int(restePetit / 10)
restePetit = restePetit - d * 10
u = restePetit

# Chiffre des centaines (variable c) : 1er cas - si c = 0 > AUCUNE ACTION

# Chiffre des centaines (variable c) : 2eme cas
if c==1:
liste4.append('cent')
# Chiffre des centaines (variable c) : 3eme cas
elif c>1 and d+u == 0:
liste4.append(liste1[c])
liste4.append('cents')
# Chiffre des centaines (variable c) : dernier cas
elif c>1 and d+u != 0:
liste4.append(liste1[c])
liste4.append('cent')

# Chiffre des dizaines (variable d) : 1er cas - si d = 0 > AUCUNE ACTION

# Chiffre des dizaines (variable d) : 2eme cas
if d==1:
liste4.append(liste2[u])
u = 0

# Chiffre des dizaines (variable d) : 3eme cas
elif d>1:
liste4.append(liste3[d])

# Chiffre des unités (variable u) : cas des 7x et 9x
if d==7 and u==1:
liste4.append('et')
liste4.append(liste2[u])
u=0

elif d==7 and u!=1:
liste4.append(liste2[u])
u=0

elif d==9:
liste4.append(liste2[u])
u=0

# Chiffre des unités (variable u) : tous les autres cas
else:
liste4.append(liste1[u])

return ' '.join(liste4)


########################################################################
#####   Fin de la sous-fonction écrivant les nombres à 3 chiffres   ####
########################################################################

def nombreEnLettres(nombre):
liste5 = ['']
# Decomposition du nombre et conversion en lettres

milliards millions milliers = 0

resteNombre = nombre

if nombre == 0:
liste5.append('zéro euro')

milliards = int(nombre / 1000000000)
if milliards == 1:
resteNombre = resteNombre - milliards * 1000000000
liste5.append(petitEnLettres(milliards))
liste5.append('milliard')
if milliards > 1:
resteNombre = resteNombre - milliards * 1000000000
liste5.append(petitEnLettres(milliards))
liste5.append('milliards')

millions = int(resteNombre/1000000)
if millions == 1:
resteNombre = resteNombre - millions * 1000000
liste5.append(petitEnLettres(millions))
liste5.append('million')
if millions > 1:
resteNombre = resteNombre - millions * 1000000
liste5.append(petitEnLettres(millions))
liste5.append('millions')

milliers = int(resteNombre/1000)
if milliers > 1:
resteNombre = resteNombre - milliers * 1000
liste5.append(petitEnLettres(milliers))
liste5.append('mille')
if milliers == 1:
liste5.append('mille')

unites = int(resteNombre)
if unites == 1:
resteNombre = resteNombre - unites
liste5.append(petitEnLettres(unites))
liste5.append('euro')
if unites > 1:
resteNombre = resteNombre - unites
liste5.append(petitEnLettres(unites))
liste5.append('euros')

centimes = int(resteNombre * 100)
if centimes != 0 and nombre != 0:
liste5.append('et')

if centimes == 1:
resteNombre = resteNombre - centimes / 100
liste5.append(petitEnLettres(centimes))
liste5.append('centime')

elif centimes > 1:
resteNombre = resteNombre - centimes / 100
liste5.append(petitEnLettres(centimes))
liste5.append('centimes')

return ' '.join(liste5)


# TEST DE FONCTIONNEMENT
test = 1
while test != '0':
print 'Entrez un nombre ("exit" pour sortir)'
test = input()
if test == 'exit':
break
print "Réponse :", nombreEnLettres(test)
0
ericstoclet Messages postés 8 Date d'inscription lundi 7 juin 2004 Statut Membre Dernière intervention 26 février 2010
21 févr. 2010 à 19:27
Merci beaucoup, grâce à ton aide, j'ai pu finir ce script...

Reste plus qu'à fabriquer une interface qt pour me faire la main et continuer mon initiation !

Je projette de réaliser pyRecens, un logiciel gérant le recensement militaire des jeunes de 16 ans et donc, destiné aux mairies...

Si quelqu'un est interessé pour participer à ce projet ;)

Il existe bien la gamme OpenMairie mais c'est en PHP...

Mon projet sera dans un premier temps en Python/Qt4 et, je l espère, traduit ensuite en C++/Qt4
0