begin process at 2012 05 25 04:40:04
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Python

 > 

Divers

 > 

Débutant(e)

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

mardi 16 février 2010 à 00:07:17 | Mon premier programme ne marche pas mais ne plante pas non plus

ericstoclet

Bonjour a tous,

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

Code Python :
# -*- 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
vendredi 19 février 2010 à 17:20:48 | Re : Mon premier programme ne marche pas mais ne plante pas non plus

laurent1024

Membre Club
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....
vendredi 19 février 2010 à 20:09:10 | Re : Mon premier programme ne marche pas mais ne plante pas non plus

ericstoclet

Merci... J ai rajouté à la ligne 124 :
Code Python :
	nombreEnLettres(test)


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

Code :
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 
    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 !
samedi 20 février 2010 à 00:41:11 | Re : Mon premier programme ne marche pas mais ne plante pas non plus

laurent1024

Membre Club
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
samedi 20 février 2010 à 21:26:49 | Re : Mon premier programme ne marche pas mais ne plante pas non plus

ericstoclet

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é :
Code Python :
# -*- 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)



samedi 20 février 2010 à 22:50:41 | Re : Mon premier programme ne marche pas mais ne plante pas non plus

laurent1024

Membre Club
Réponse acceptée !
pb 1:
soit remplacer
Code Python :
	if nombre == 0:
		liste5.append('zéro euro')

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

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

par
Code Python :
	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
dimanche 21 février 2010 à 19:27:26 | Re : Mon premier programme ne marche pas mais ne plante pas non plus

ericstoclet

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


Cette discussion est classée dans : append, if, liste5, liste4, restenombre


Répondre à ce message

Sujets en rapport avec ce message

svp urgent [ par hasna1980 ] salut je suis entrain de faire une view  qui sert a afficher des modules autorises pour un utilisateur donne ,pr certains ca va afficher 1 module pr d bot irc python problème rejoindre channel [ par Kuby ] Bonjour, voila, après avoir un petit peu fouiller sur le net, j'ai reussi a trouver / modifier ceci : Mais je n'arrive pas à rejoindre de channel... a tri de fichier [ par mtanfin ] Bonjour;Alors voilà en fait je voudrais trier des fichiers en fonction de leur date de création. en fait le but est de regarder dans chaque fichier si aide tkinter [ par coco02 ] Bonjour,Je debute en programmation avec python depuis quelques jours.J'essaie de creer un petit programme simple pour controler l'efficacité d'une cli programme a améliorer [ par samuel310 ] Bonjour a tous,Je suis nouveau sur ce forum et débutant avec python.Je dois créer un petit jeu avec language python pour l'école, programme noté bien Caractère de coupure + formfeed [ par bowbz ] Bonjour, J'essaie de créer de multiples fichiers à partir d'un gros fichier. Dans ce gros fichier, il y a un séparateur que j'aimerai utiliser comme changement des propriétés d'un objet [ par nikko76600 ] Bonjour a tous et a toutes, Je suis débutant dans la programmation en python (j'ai commencé il y a 3 jours) et je pose ma première question ici (qui gestion du temps de presence du personnel:rapatriement des données des pointeuses [ par etiennenono ] bonjour, Il ya environ deux mois que je vous ai posé un probleme concernant les pointeuses, mais en ce moment je n'avais vraiment aucune idée. Entre t aide pour Jeu puissance 4 [ par soso586 ] bonjour, j'aimerai modifier ce code python pour que le jeu ne s'arrete pas lorsque le joueur à fait un alignement de 4 pions , mais 3 alignements. Problèmme de code [ par DAAEz ] Salut, Je me suis lancé dans un programme et la je rame ( à ce niveau la c'est plus des rames mais des cuillères...). Voyez plutôt par vous mêmes. Je


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,671 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales