Problème avec les boucles

Problème avec les boucles - Python - Programmation

Marsh Posté le 03-10-2009 à 20:15:12    

Bonjour je suis débutant en Python. Je doit faire un programme pour calculer la racine carré d'un nombre par itération puis calculer l'erreur par rapport à la valeur exact en utilisant la fonction sqrt().
Je voudrais que lorsque je tape un caractère ou une valeur négative il me le signal par un petit message et j'ai donc utilisé des if, elif et else. Mais ça ne marche pas.
Par contre le calcul marche très bien donc pas de problèmes pour ça.
 

Code :
  1. # -*- coding: cp1252 -*-
  2. from math import*
  3. ############################################
  4. # Programme TP1 programme1.py              #
  5. # Auteur : ...                 #
  6. # Derniere mise a jour : 03 octobre 2009   #
  7. ############################################
  8. def iter(xi,C):       # definition d'une fonction
  9.   xip1=0.5*(xi+C/xi)  # xip1 = x(i+1)
  10.   return xip1
  11. #######################
  12. # Programme principal #
  13. xi=1
  14. k=xi
  15. e=1.
  16. erreur=1
  17. while (1) :  # boucler jusqu'a ce que la reponse soit la bonne
  18.   try :
  19.     C=input("Calcul de la racine carré de c. \n Ecrire une valeur positive pour c : " )
  20.     break
  21.   except :
  22.     print "Je ne sais pas lire cela! Essayez de nouveau."
  23. if (C>0.) :
  24.     while (xi<20 and e>0.00001) :
  25.         j=iter(k,C)
  26.         e=abs(j-k)
  27.         xi=xi+1
  28.         k=j
  29.         print "Le résultat est : x =",j
  30.         f=sqrt(C)
  31.         erreur=abs(k-f)
  32.         print "Et l'erreur est de : ", erreur
  33. elif (type(C)==type("bonjour" )) :
  34.   print "Vous avez entré une chaine de caractère!"
  35. elif (C<=0.) :
  36.   print "Vous avez entré un nombre négatif!"
  37. else :
  38.   print "Je ne peux pas identifier ce que vous avez entré!"


 
 
 
   
 
 
 

Reply

Marsh Posté le 03-10-2009 à 20:15:12   

Reply

Marsh Posté le 04-10-2009 à 09:40:47    

Bonjour oxdo,
sans être - et de loin - un expert voici ce que ton code m'inspire :
 
(1) type("bonjour" ) s'écrit en Python "str" : if type(C)==str:
 
(2) on peut calculer la racine de 0, non ? Pourquoi exclure ce cas ?
 
(3) break n'est pas utilisé à la fin d'un try
 
(4) je crois que l'organisation de ton code est problématique. Voilà comment je ferais :
 

Code :
  1. try:
  2.     while(1):
  3.         récupérer la valeur de C
  4.         vérifier que C est un nombre >= 0, sinon lancer une exception
  5.         lancer le calcul
  6. except:
  7.     récupérer une éventuelle exception


Message édité par suizokukan le 04-10-2009 à 09:41:16

---------------
rule #1 : trust the python
Reply

Marsh Posté le 04-10-2009 à 09:59:07    

Autres remarques:

  • Ne pas utiliser input(), utiliser raw_input à la place et faire ses conversions soi même
  • while 1 devrait être écrit while True
  • Pas besoin de parenthèses partout
  • Enfin, qu'est-ce qui ne marche pas?


Également: éviter de redéfinir des builtins (iter), ne pas utiliser "from a import *" (lister ce que tu importes, ou passer par le module), "definition d'une fonction" => l'exemple parfait du commentaire qui ne sert strictement à rien, utiliser un docstring et indiquer ce que fait la fonction, ne pas utiliser "except:", ça attrape beaucoup trop d'exceptions, pourquoi limiter le nombre de pas à 20?

Code :
  1. xip1=0.5*(xi+C/xi)
  2. return xip1


Peut tout aussi bien être écrit

Code :
  1. return 0.5 * (xi + C/xi)


Code :
  1. xi=1
  2. k=xi


=>

Code :
  1. k = xi = 1
 

Finalement, c'est probablement le genre de calculs qui pourraient être exprimés de manière intéressante avec un générateur.


Message édité par masklinn le 04-10-2009 à 10:11:11

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed