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

Résolu
Signaler
Messages postés
8
Date d'inscription
lundi 7 juin 2004
Statut
Membre
Dernière intervention
26 février 2010
-
Messages postés
8
Date d'inscription
lundi 7 juin 2004
Statut
Membre
Dernière intervention
26 février 2010
-
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

Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
25
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
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
25
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....
Messages postés
8
Date d'inscription
lundi 7 juin 2004
Statut
Membre
Dernière intervention
26 février 2010

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 !
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
25
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
Messages postés
8
Date d'inscription
lundi 7 juin 2004
Statut
Membre
Dernière intervention
26 février 2010

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)
Messages postés
8
Date d'inscription
lundi 7 juin 2004
Statut
Membre
Dernière intervention
26 février 2010

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