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 dans un if


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2013
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Novembre 2013
    Messages : 4
    Par défaut Problème dans un if
    Bonjour,

    Voivi mon code :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    #-- coding=utf-8 --
    import csv
    import json
    from math import *
     
    #Fichiers utilisés
    ListeVilleLatitudeLongitude = csv.reader(open("liste_ville.csv","rb"),delimiter=",") #fichier csv contenant le classement des villes, leurs noms, leur latitudes, leurs longitudes et les pays où sont les villes
    Info_avion = json.load(open("full_all.json")) #fichier json fournit contenant les données sur les avions
     
    #Listes créés à partir du fichier "liste_ville.csv" car une boucle utilisant row ne peut être utilisé qu'une fois dans un programme
    villes=[]
    latitudes=[]
    longitudes=[]
    for row in ListeVilleLatitudeLongitude:
    	villes.append(row[1]) #lister les villes
    	latitudes.append(row[2]) #lister les latitudes
    	longitudes.append(row[3]) #lister les longitudes
     
    #Partie du programme servant à calculer la vitesse moyenne
    vitesse_totale=0 #initialisation de la vitesse cumulée des avions
    mon_dictionnaire=dict(Info_avion) #création du dictionnaire à partir du fichier json
    nombre_avion=0 #initialisation du nombre d'avion
    for key,value in mon_dictionnaire.items():
    	if (value[5]>200):
    		nombre_avion=nombre_avion+1
    		vitesse_totale=vitesse_totale + value[5]
    vitesse_moyenne=vitesse_totale/nombre_avion
     
    #Pour recommencer le programme autant de fois que nécessaire si l'utilisateur n'est pas satisfait de sa recherche et qu'il veut recommencer le programme.
    z=0
    while (z==0):
     
    #Partie I demande de la ville
     
    	print "Quelle est votre ville cible parmis les 50 plus grandes villes mondiales? (merci d'éviter les accents)\nMettre des tirets à la place des espaces."
    	ville=raw_input().upper()
     
    	i=0
    	while (i==0):
    		for j in range(0,len(villes)):
    			if (villes[j]==ville):
    				i=1
    				numero_ville=j 
    		if (i==0):
    			print "Vous vous êtes trompés lors de la saisie de votre ville ou vous n'avez pas choicit une des plus grandes 50 villes.\n Merci de la resaisir."
    			ville=raw_input().upper()
    	print "Vous avez bien marqué une ville faisait partie des 50 plus grandes villes du monde."
     
     
    #Partie II demande du temps moyen et calcul de la distance
    #Partie II.1 Demande du temps moyen
    	print "Quel est le temps moyen dont vous disposez pour détrourner votre avion (temps en minute, minimum 1 min)?"
    	Temps_Moyen=float(raw_input())
     
    	i=0
    	while(i==0):
    		if (Temps_Moyen>1):
    			Temps_Plus_10pourcent=Temps_Moyen*1.1
    			Temps_Moins_10pourcent=Temps_Moyen*0.9
    			print Temps_Plus_10pourcent
    			print Temps_Moins_10pourcent
    			i=1
    		else:
    			print "Le temps moyen n'est pas de minimum 1 minute. Merci de retaper un temps."
    			Temps_Moyen=float(raw_input())
    	print "Le temps marqué est correct."
     
    #Partie II.2 Calcul de la distance
    	Distance_Plus_10pourcent=Temps_Plus_10pourcent*vitesse_moyenne/60
    	Distance_Moins_10pourcent=Temps_Moins_10pourcent*vitesse_moyenne/60
     
    #Partie III Trouver les avions disponibles
    	avion_proche=0
    	for key,value in mon_dictionnaire.items():
    		if (value[5]>200 and acos(sin(radians(latitudes(numero_ville)))*sin(radians(value[1]))+cos(radians(latitudes(numero_ville)))*cos(radians(value[1]))*cos(radians(longitudes(numero_ville)-value[2])))*6371<Distance_Plus_10pourcent and Distance_Moins_10pourcent<acos(sin(radians(latitudes(numero_ville)))*sin(radians(value[1]))+cos(radians(latitudes(numero_ville)))*cos(radians(value[1]))*cos(radians(longitudes(numero_ville)-value[2])))*6371):
    			avion_proche=avion_proche+1
    et la j'ai un problème avec un if... cette formule sert normalement à verifier que la vitesse de l'avion est supérieur à 200 et qu'il est entre dans les distances demandés..
    Cette formule marhce bien sur excel mais impossible de la faire marcher ici...

    quelqu'un a une idée du pourquoi?

  2. #2
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Bonsoir

    il y a 5 tests (if) dans 70 lignes de code plutôt touffues.

    Donner le contexte, c'est bien (il faut !) mais, en même temps, tu aurais certainement plus de réponses en recopiant le message d'erreur (copier-coller, c'est pas la mort) exact et en débroussaillant le terrain (de façon pertinente).

  3. #3
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 567
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 567
    Par défaut
    Salut

    Pas facile sans les message d'erreurs mais je vois déjà (seulement?) 2 choses :
    - Si aucun avion n'atteint la vitesse de 200, tu vas avoir une division par 0. Une moyenne nulle serait plus pertinente.

    - la variable est initialisée mais n'est jamais changée dans la boucle, tu as donc une boucle inifinie.

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  4. #4
    Membre à l'essai
    Inscrit en
    Novembre 2013
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Novembre 2013
    Messages : 4
    Par défaut
    Bonjour,
    Merci beaucoup de vos réponses.
    désole je n'ai pas précisé qu'il s'agir du dernier if.
    Il ne s'agit pas d'une division par 0, il existe plus de 2 000 avions avec une vitesse de plus de 200.

    Voici le message d'erreur :
    Traceback (most recent call last):
    File "projet.py", line75, in <module>
    if.......
    TypeError : 'list' object is not callable

    Bonne soirée

  5. #5
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 567
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 567
    Par défaut
    Citation Envoyé par horit Voir le message
    Bonjour,
    Il ne s'agit pas d'une division par 0, il existe plus de 2 000 avions avec une vitesse de plus de 200.
    Je n'ai jamais dit que ton problème venait de là, j'évoquais seulement le risque d'un plantage "bête". Libre à toi de ne pas le traiter. c'est compliqué et cela prouve que tu as envisagé le cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if nombre_avion:
        vitesse_moyenne = vitesse_totale/nombre_avion
    else:
        vitesse_moyenne = 0
    Dans ton fichiers des villes que contient le premier élément de chaque ligne ?

    quelques remarques :

    - La boucle pour rechercher une ville n'est pas fondée car l'opérateur [G]in[/G] est là pour ça. En changeant villes.append(row[1]) par villes.append(row[1].upper()) au début, le test devient plus simple et plus digeste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        print "Quelle est votre ville cible parmis les 50 plus grandes villes mondiales? (merci d'éviter les accents)\nMettre des tirets à la place des espaces."
        whille True:            
            ville=raw_input().upper()
            if ville in villes:
                break
            else:
                print "Vous vous êtes trompés lors de la saisie de votre ville ou vous n'avez pas choisit une des plus grandes 50 villes.\n Merci de la resaisir."
    - Pour clarifier ton code, prend l'habitude d'écrire des fonctions, tu y verras plus clair toi aussi... La dernière partie de ton code est incompréhensible.

    - La variable numero_ville sort du néant.

    - latitudes et longitudes sont des listes et tu t'en sers comme d'une fonction, d'où ton message d'erreur.

    - l'expression
    acos(sin(radians(latitudes[numero_ville]))*sin(radians(value[1]))+cos(radians(latitudes[numero_ville]))*cos(radians(value[1]))*cos(radians(longitudes[numero_ville]-value[2])))*6371,
    difficile à comprendre en soi, est répétée, calcules-là une fois pour toutes dans une variable bien nommée et simplifie ton test.

    - 6371 est une constante magique ?
    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  6. #6
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Citation Envoyé par e-ric
    6371 est une constante magique ?
    l'utilisation d'une "constante"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RAYON_TERRESTRE = 6371.   # unité km
    serait, effectivement, plus parlant ...

  7. #7
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (value[5]>200 and acos(sin(radians(latitudes(numero_ville)))* ... etc
    latitudes est une liste : [] et non () pour accéder à ses éléments

    ps : il y a d'autres erreurs de ce type sur cette longue ligne ...

Discussions similaires

  1. Problème dans la déclaration de Winmain
    Par lvdnono dans le forum DirectX
    Réponses: 3
    Dernier message: 29/05/2004, 13h38
  2. problème dans l'hebergement
    Par Redouane dans le forum ASP
    Réponses: 9
    Dernier message: 31/12/2003, 23h34
  3. Quel est le problème dans ce code ?
    Par Luther13 dans le forum C
    Réponses: 12
    Dernier message: 26/08/2003, 16h09
  4. Problème dans analisys Manager
    Par ien_ien23 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 11/07/2003, 14h38
  5. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02

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