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 :

Exo sur les triangles


Sujet :

Python

  1. #1
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut Exo sur les triangles
    Bonjour

    Je débute donc, en programmation et en Python.
    Je suis (enfin...j'essaie de suivre) le livre dispo gratuitement "apprendre à Programmer avec Python3"

    Je suis embêtée avec le corrigé d'un exercice, qui utilise des choses qui ne sont pas mentionnées dans le cour, et qui ne sont pas expliquées du coup. Et j'aimerai bien comprendre pour mieux avancer

    Je vous le résume: exo 6.11 Il faut déterminer si les 3 longueurs entrées par l'utilisateur peuvent construire un triangle, et si oui si ce triangle est équilatéral, isocèle, rectangle, rectangle et isocèle, ou quelconque.

    Le corrigé :
    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
    from sys import exit
     
    print("Veuillez entrer les longueurs des 3 côtés en séparant ces valeurs à l'aide d'une virgule : ")
    a,b,c=eval(input())
     
    if(a<(b+c))and(b<(a+c))and(c<(a+b)):
        print("Ces 3 longueurs déterminent bien un triangle")
    else:
        print("Il est impossible de construire un tel triangle !")
        exit()
     
    f=0
    if(a==b)and(b==c):
        print("Ce triangle est équilatéral.")
        f=1
    elif(a==b)or(b==a)or(c==a):
        print("Ce triangle est isocèle")
        f=1
    if(a*a+b*b==c*c)or(b*b+c*c==a*a)or(c*c+a*a==b*b):
        print("Ce triangle est rectangle.")
        f=1
    if(f==0):
        print("Ce triangle est quelconque")
    Alors, déjà, je découvre qu'il existe un module "sys"

    Mais surtout :
    1. c'est quoi ces histoires de f=0 ou f=1 ?
    2. si le triangle est rectangle ET isocèle, ça marche ? (je ne trouve pas de longueurs correspondantes avec des nombres entiers pour tester)
    3. on a un "if", puis un "elif"....et ensuite on peut remettre un "if" ??? pourquoi pas un "elif" ou un "else" ?

    D'avance, je vous remercie de vos lumières

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 100
    Par défaut
    Les print donnent une indication suffisante il me semble.

    On est dans deux cas,
    • triangle quelconque (f=0)
    • triangle non quelconque (f=1)


    Si f = 1, on spécifie le type de triangle.

    Autant dire que ce code n'est pas très beau, mais vous n'aidez pas à sa lecture en ne vérifiant pas que l'indentation est bien respectée entre les balises code (bouton # au dessus de la fenêtre d'édition).

  3. #3
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Ouais pas très beau effectivement et surtout qui montre un très mauvaise exemple d'utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    a,b,c=eval(input())

  4. #4
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    Mes excuses, je n'avais pas vu qu'il y avait une balise Code.
    C'est donc réparé, j'ai édité mon 1er message. En effet, c'est beaucoup, beaucoup plus facile à lire

  5. #5
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,

    Ouais pas très beau effectivement et surtout qui montre un très mauvaise exemple d'utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    a,b,c=eval(input())
    Justement je trouvais ça très pratique
    Moi je m'étais embêtée bien + que ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    print("Veuillez entrer 3 longueurs, séparées par des virgules :")
    ch=input()
    L=list(eval(ch)) # les valeurs saisie par l'utilisateur sont maintenant
                     # des nombres
     
    a,b,c=L[0],L[1],L[2] # on les tranforme en a,b,c pour que ce soit plus
                         # simple ensuite de les manipuler

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 100
    Par défaut
    En fait il y a de mauvaises et très mauvaises pratiques. En l'occurrence, la fonction eval (surtout dans votre cas d'utilisation avec input) est à proscrire.

    Avec un peu de recherches sur le net, vous comprendrez pourquoi, c'est assez connu...

  7. #7
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    Donc finalement.....j'apprends 'mal'

    Je ne voulais pas apprendre seule justement pour ce genre de choses, que je ne peux pas deviner. Je ne peux que faire confiance au livre d'apprentissage que je suis, il est impossible de vérifier chaque ligne sous google pour savoir si c'est correct ou non

  8. #8
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut.

    Tu n'apprends pas mal, la preuve, tu viens d'apprendre que l'utilisation d'eval est à éviter lorsque cela est possible, c'est à dire pratiquement tout le temps

    Et puis apprendre, cela se fait par le biais de beaucoup de choses, lecture de didacticiel, pratique (beaucoup), lecture de sujets de forum, car mine de rien, on apprend beaucoup en lisant divers sujets de forum, lecture de codes écrits pas d'autres personnes plus chevronnées, etc.

    Et non, tu ne peux vérifier si chaque ligne de ton code est parfait ou non, cela s'acquiert avec le temps, tout le monde à ses débuts commet des erreurs de mauvaises pratiques, d'erreurs d'inattentions dans un code, etc. Pour ma part j'en commet toujours....

    Tu verras qu'après avoir acquit un peu de bouteille, tu sourieras en relisant le code que tu as pondu à tes débuts (je te conseille de conserver tous les scripts que tu crées, bons ou mauvais).

  9. #9
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    Merci Bistouille

    C'est un peu déstabilisant tout ça mais bon.

    Je vais continuer sur ma lancée alors. Parce que j'adore ça mine de rien et c'est compliqué de changer de livre d'apprentissage. Je vais essayer d'aller au bout de celui-là, et en effet ensuite je chercherai d'autres sources pour m'exercer

    Donc, pour revenir à eval que je n'utiliserai plus donc....je mets quoi à la place ? Pour que ma liste soit en nombre et pas en string ? je le remplace par int (ou float), comme ça ?

  10. #10
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    liste_saisie=input().split(',')  ### La fonction split permet de découper une chaine de caractère selon un caractère donné et renvoie une liste
    a = float(liste_saisie[0])
    b = float(liste_saisie[1])
    c = float(liste_saisie[2])
    Ou avec des int, si tu souhaites limiter l'exercice aux int.
    Ce bouquin n'est pas mauvais. Simplement la solution proposée est faite avec eval, car tu n'as peut etre pas encore vu la fonction split.

    Si tu limites l'exercice à des nombres entiers tu ne peux pas construire de triangles rectangles isocèles. Puisque si tu prends x la longueur des cotés près de l'angle droit, Pythagore te donne que l'hypothénuse est racine(x^2 + x^2) que l'on peut rééecrire x*racine(2). racine de 2 n'étant pas un nombre rationnel, quelquesoit la valeur entière de x, x*racine(2) ne sera jamais entier.

    NB : Le eval offre un petit avantage : il permet de ne pas entrer des nombres directement dans le programme mais des expressions. Par exemple sur l'input on pourrait saisir :
    5,5,5*sqrt(2)
    et cela fonctionnerait

  11. #11
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 100
    Par défaut
    Ce bouquin n'est pas mauvais. Simplement la solution proposée est faite avec eval, car tu n'as peut etre pas encore vu la fonction split.
    Alors me concernant je le trouve pas mauvais mais très mauvais en tout cas sur ce point et surtout si on veut justifier par une méconnaissance de split.
    N'indiquant pas la référence du livre, je le considérerai comme bon, à condition qu'il prévient des dangers de la fonction.

    Il est évident qu'on doit privilégier les méthodes de chaînes et le formatage de chaînes à la fonction eval.

    D'ailleurs si cette fonction n'existait pas, ça arrangerait tout le monde... surtout les débutants qui en font une utilisation très bancale.
    Si son utilisation est personnelle, on pourrait tester et se prouver des dangers qu'elle provoque.

  12. #12
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    Ce bouquin, il m'a été recommandé ici (enfin dans un autre sujet bien sûr) et il est en lecture gratuite sur ce site : https://python.developpez.com/cours/...ge=page_22#L22
    Bon voilà il est pas parfait. J'espère qu'il me permettra quand même un apprentissage de qualité.



    Merci pour la fonction split lg_53 . Je connaissais pas en effet, c'est surement plus tard dans l'apprentissage.
    Effectivement il faut du float, pour espérer tester un rectangle isocèle

  13. #13
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    Un autre exo....avec la même question, comment je fais pour ne pas utiliser eval ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    print("Nous cherchons à déterminer l'appréciation correspondante à la note d'un élève.")
    print("Veuillez entrer la note de l'élève, sous la forme x/y : ")
    q=input()
    n=float(q)
    évidemment ça, ça ne marche pas, il me dit ValueError: could not convert string to float: '18/20'

    Je tripote ce truc depuis 1/2 heure, j'ai bien compris qu'il ne veut pas me le convertir puisque q n'est pas un nombre mais une opération, mais je ne trouve pas comment faire.

    Une idée ?

    Edit :

    Ah ah j'ai trouvé !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    print("Nous cherchons à déterminer l'appréciation correspondante à la note d'un élève.")
    print("Veuillez entrer la note de l'élève, sous la forme x/y : ")
    q=input().split("/")
    n=float(q[0])/float(q[1])
    Je M'aime

  14. #14
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Pareil, tu traites la chaine de sorte à identifier ce qu'il te faut:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ch = '18/20'
    numerateur, denominateur = ch.split('/')
    note = float(numerateur)/float(denominateur)

  15. #15
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    on a posté en même temps

    Pas si évident de ne pas utiliser eval, c'est un truc fourre-tout ce eval, là il faut réfléchir et traiter différemment selon le cas

  16. #16
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 100
    Par défaut
    C'est vrai que Swinnen l'utilise à toutes les sauces, et cela sans vraiment considérer que c'est une mauvaise pratique. Dommage !

  17. #17
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    Oui, dommage surtout pour tous ceux qui apprennent à coder ainsi !
    Si j'avais pas eu de difficultés avec un corrigé qui mentionnait cette fonction.....moi aussi j'aurai utilisé des eval partout, avec de fâcheuses conséquences potentielles
    J'espère qu'il n'y en a pas d'autres dans le même genre.

    Tu es enseignant c'est ça ?

    Bon, je vais pas te demander de lire le livre en entier pour vérifier tout ce qu'il utilise/enseigne (je voudrai pas abuser), mais si toi ou..une autre âme particulièrement charitable avait la patience de lire les 60 pages de corrigés des exercices, histoire de vérifier ...

    60 pages d'exercices, pour des développeurs chevronnés comme vous, c'est une petite soirée lecture

    Et ça permettrait de le signaler en pop-up par exemple sur le bouquin en ligne, pour les autres

    En échange, j'offre ma reconnaissance éternelle

  18. #18
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 100
    Par défaut
    Citation Envoyé par RowanMayfair Voir le message
    Tu es enseignant c'est ça ?
    Bientôt plus, mais il n'y a pas que les enseignants qui lisent

    Et ça permettrait de le signaler en pop-up par exemple sur le bouquin en ligne, pour les autres
    L'auteur sait très bien ce qu'il fait en utilisant eval, le problème est plus lié au fait que les débutants ne connaissent pas les dangers de cette fonction, c'est sur cela qu'il compte, pour l'utiliser sans risque. Tant qu'on ne dit rien, on ne tentera rien !

    mais si toi ou..une autre âme particulièrement charitable avait la patience de lire les 60 pages de corrigés des exercices
    Les bonnes pratiques tu les auras, pour cela c'est simple... tu fais les exercices, avec eval ou non, et d'autres membres te montreront sans doute des manières différentes de résoudre l'exercice.

  19. #19
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Bientôt plus, mais il n'y a pas que les enseignants qui lisent
    Certes, mais les profs sont réputés pour avoir beaucoup de temps libre; bien plus que dans les autres professions

    Bref.

    En attendant, encore merci pour avoir signalé le problème


    Et un double pour lg_53 qui me trouve des solutions

  20. #20
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 100
    Par défaut
    Citation Envoyé par RowanMayfair Voir le message
    Certes, mais les profs sont réputés pour avoir beaucoup de temps libre; bien plus que dans les autres professions
    Le temps disponible n'est pas du temps libre, au contraire de ce que vous laissez sous entendre... et je l'avais bien compris dans votre remarque précédente, sans vouloir trop relever.

    Cependant si vous le croyez au point de passer les concours, libre à vous de vérifier mes dires

Discussions similaires

  1. exo python : probleme sur les operateurs ?
    Par m1338 dans le forum Général Python
    Réponses: 4
    Dernier message: 05/03/2019, 13h48
  2. probleme Exo sur les ABR
    Par benjy13 dans le forum Autres SGBD
    Réponses: 0
    Dernier message: 17/06/2009, 19h21
  3. exo sur les pointeurs
    Par goldensun dans le forum Débuter
    Réponses: 9
    Dernier message: 07/11/2008, 02h23
  4. des exos sur les boocles
    Par zeyd dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 27/11/2005, 18h03
  5. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18

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