IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

problème boucle while


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    étudiante
    Inscrit en
    Mai 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante

    Informations forums :
    Inscription : Mai 2011
    Messages : 41
    Points : 26
    Points
    26
    Par défaut problème boucle while
    Bonjour,

    j'ai une liste des réels dans l'ordre décroissant et je veux faire un algorithme qui compare une valeur donnée 'sig_eq_Goodman' avec les termes de la liste.
    une partie du script est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    x = [1,1666,16666,100000,200000,300000,400000,500000,700000,1000000,2000000,3000000,4000000,7000000,10000000,20000000,30000000,40000000,50000000,80000000,100000000,200000000,300000000,400000000,700000000,1000000000,10000000000]
     
    y = [333.487953502046,333.487953502046,252.023589004762,144.841143106185,134.316479532823,128.773084241854,125.091228664023,122.370855728624,118.481010326472,114.620454409826,107.826945429572,104.248768756484,101.872187428479,97.605392834564,95.113463177554,90.728357283851,88.418699099329,86.884652288088,85.751207659768,83.515504894025,82.521999403873,79.691480778685,78.200631830545,77.210428132759,75.432666212810,74.394402580963,69.148163438073]
    sig_eq_Goodman = (Rm*sig_dyn)/(Rm-(sig_stat/alpha_G))
            if sig_eq_Goodman > y[0]:
                N_cycle = 0
            elif sig_eq_Goodman < y[-1]:
                N_cycle = 1.0E+10
            else:
                i=1
                while (y[i] > sig_D):
                    if (sig_eq_Goodman < y[i]) and (sig_eq_Goodman > y[i+1]):
                        N_cycle = x[i+1]-((y[i+1]-sig_eq_Goodman)*(x[i+1]-x[i])/(y[i+1]-y[i]))
                    else:
                        i=i+1
            print ('N_cycle : %E\n'%(N_cycle))
    ma problème est que dans le 3ème cas du boucle if ; je veux faire une restriction de sig_eq_Goodman entre deux termes consécutifs afin de calculer 'N_cycle' mais la boucle ne s'arrête pas une fois j'ai trouvé ce couple de restriction
    je veux qu'une foie je trouve ces deux termes la boucle s'arrête même si la condition du boucle while est correcte.
    je me trompe et je ne trouve pas comment le faire

    j'ai besoin d'aide
    merci d'avance

  2. #2
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    C’est très simple –*tu n’incrémentes plus i si ton test dans la boucle while est vérifié*! Le bon code devrait être celui-ci, je pense*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    x = [1,1666,16666,100000,200000,300000,400000,500000,700000,1000000,2000000,3000000,4000000,7000000,10000000,20000000,30000000,40000000,50000000,80000000,100000000,200000000,300000000,400000000,700000000,1000000000,10000000000]
     
    y = [333.487953502046,333.487953502046,252.023589004762,144.841143106185,134.316479532823,128.773084241854,125.091228664023,122.370855728624,118.481010326472,114.620454409826,107.826945429572,104.248768756484,101.872187428479,97.605392834564,95.113463177554,90.728357283851,88.418699099329,86.884652288088,85.751207659768,83.515504894025,82.521999403873,79.691480778685,78.200631830545,77.210428132759,75.432666212810,74.394402580963,69.148163438073]
    sig_eq_Goodman = (Rm*sig_dyn)/(Rm-(sig_stat/alpha_G))
            if sig_eq_Goodman > y[0]:
                N_cycle = 0
            elif sig_eq_Goodman < y[-1]:
                N_cycle = 1.0E+10
            else:
                i=1
                while (y[i] > sig_D):
                    if (sig_eq_Goodman < y[i]) and (sig_eq_Goodman > y[i+1]):
                        N_cycle = x[i+1]-((y[i+1]-sig_eq_Goodman)*(x[i+1]-x[i])/(y[i+1]-y[i]))
                    i=i+1
            print ('N_cycle : %E\n'%(N_cycle))

  3. #3
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Citation Envoyé par foufaa33
    je veux qu'une foie je trouve ces deux termes la boucle s'arrête même si la condition du boucle while est correcte.
    Pour cela, je reprend le code de mont29, et ajoute simplement un break (ligne 14):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    x = [1,1666,16666,100000,200000,300000,400000,500000,700000,1000000,2000000,3000000,4000000,7000000,10000000,20000000,30000000,40000000,50000000,80000000,100000000,200000000,300000000,400000000,700000000,1000000000,10000000000]
     
    y = [333.487953502046,333.487953502046,252.023589004762,144.841143106185,134.316479532823,128.773084241854,125.091228664023,122.370855728624,118.481010326472,114.620454409826,107.826945429572,104.248768756484,101.872187428479,97.605392834564,95.113463177554,90.728357283851,88.418699099329,86.884652288088,85.751207659768,83.515504894025,82.521999403873,79.691480778685,78.200631830545,77.210428132759,75.432666212810,74.394402580963,69.148163438073]
    sig_eq_Goodman = (Rm*sig_dyn)/(Rm-(sig_stat/alpha_G))
            if sig_eq_Goodman > y[0]:
                N_cycle = 0
            elif sig_eq_Goodman < y[-1]:
                N_cycle = 1.0E+10
            else:
                i=1
                len_y = len(y)
                while (y[i] > sig_D):
                    if i >= len_y: break #au cas ou i deviendrait "out of range"
                    if (sig_eq_Goodman < y[i]) and (sig_eq_Goodman > y[i+1]):
                        N_cycle = x[i+1]-((y[i+1]-sig_eq_Goodman)*(x[i+1]-x[i])/(y[i+1]-y[i]))
                        break
                    i=i+1
            print ('N_cycle : %E\n'%(N_cycle))
    break est une instruction qui porte bien son nom et casse la boucle dans laquelle il se trouve.

    Ceci dit, j'aurais personnellement plutôt tendance à remplacer la boucle while par une for:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    x = [1,1666,16666,100000,200000,300000,400000,500000,700000,1000000,2000000,3000000,4000000,7000000,10000000,20000000,30000000,40000000,50000000,80000000,100000000,200000000,300000000,400000000,700000000,1000000000,10000000000]
     
    y = [333.487953502046,333.487953502046,252.023589004762,144.841143106185,134.316479532823,128.773084241854,125.091228664023,122.370855728624,118.481010326472,114.620454409826,107.826945429572,104.248768756484,101.872187428479,97.605392834564,95.113463177554,90.728357283851,88.418699099329,86.884652288088,85.751207659768,83.515504894025,82.521999403873,79.691480778685,78.200631830545,77.210428132759,75.432666212810,74.394402580963,69.148163438073]
    sig_eq_Goodman = (Rm*sig_dyn)/(Rm-(sig_stat/alpha_G))
            if sig_eq_Goodman > y[0]:
                N_cycle = 0
            elif sig_eq_Goodman < y[-1]:
                N_cycle = 1.0E+10
            else:
                for i in range(1,len(y)): #utiliser xrange en lieu et place de range si python 2.x
                    if y[i]>sig_D:
                        break
                    elif y[i+1] < sig_eq_Goodman < y[i]:
                        N_cycle = x[i+1]-((y[i+1]-sig_eq_Goodman)*(x[i+1]-x[i])/(y[i+1]-y[i]))
                        break
            print ('N_cycle : %E\n'%(N_cycle))

  4. #4
    Nouveau membre du Club
    Femme Profil pro
    étudiante
    Inscrit en
    Mai 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante

    Informations forums :
    Inscription : Mai 2011
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    Bonjour,

    merci beaucoup pour les réponses, ils m'ont aidée énormément et ça marche très bien comme j'ai voulu )

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème boucle while
    Par Peedro dans le forum Langage
    Réponses: 4
    Dernier message: 07/10/2008, 14h09
  2. Problème boucle while
    Par chuko dans le forum C
    Réponses: 7
    Dernier message: 04/07/2008, 16h12
  3. Problème boucle while
    Par fred33 dans le forum Langage
    Réponses: 2
    Dernier message: 23/05/2008, 19h16
  4. [MySQL] Problème boucle WHILE
    Par Adlack dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/02/2007, 19h30
  5. Problème boucle while et evenement
    Par tse_tilky_moje_imja dans le forum Général Python
    Réponses: 2
    Dernier message: 30/03/2006, 18h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo