Prouver un Triangle Rectangle

Résolu
CDEProgrammeur Messages postés 23 Date d'inscription jeudi 7 octobre 2010 Statut Membre Dernière intervention 20 juillet 2012 - 7 oct. 2010 à 03:46
CDEProgrammeur Messages postés 23 Date d'inscription jeudi 7 octobre 2010 Statut Membre Dernière intervention 20 juillet 2012 - 9 oct. 2010 à 06:59
Bonjour tout le monde je suis nouveau ici. Je suis étudiant comme programmeur-analyste depuis déjà un mois. J'ai un petit travail à faire sur les triangle. Je dois demander a l'usager du programme de rentrer 3 longeurs différentes dans 3 textbox. Je dois ensuite dire a l'usager si le triangle est Scalène, Équilateral, Isocèle, Rectangle ou Isocèle Rectangle. Je commencer ma parti pour le triangle rectangle et j'aimerais savoir si mon algorithm est bon pour prouver ce type de triangle.

        Dim longeur1 As Integer
        Dim longeur2 As Integer
        Dim longeur3 As Integer
        Dim rectangle1 As Integer
        Dim rectangle2 As Integer
        Dim grand As Integer
        Dim petit1 As Integer
        Dim petit2 As Integer

        longeur1 = CInt(txt1erCoté.Text)
        longeur2 = CInt(txt2ieCoté.Text)
        longeur3 = CInt(txt3ieCoté.Text)



        If longeur1 > longeur2 And longeur1 > longeur3 Then
            grand = longeur1
            petit1 = longeur2
            petit2 = longeur3
        ElseIf longeur2 > longeur3 And longeur2 > longeur1 Then
            grand = longeur2
            petit1 = longeur3
            petit2 = longeur1
        Else

            grand = longeur3
            petit1 = longeur2
            petit2 = longeur1

        End If

        rectangle1 = grand * grand
        rectangle2 = (petit1 * petit1) + (petit2 * petit2)

        If rectangle1 = rectangle2 Then
            MessageBox.Show("Triangle Rectangle")
        End If


Je l'ai tester et ça marche proprement mais j'aimerais avoir votre opinion. Suis-je correcte?

16 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
7 oct. 2010 à 06:54
trop fort...
dans l'enonce, on entend parler de triangle "Scalène"...(irregulier)
et dans le code, c'est grand, petit1 et petit2...
pas d'emploi du mot "hypotenuse" ^^

bref.

le code est correct, meme si inelegant.

j'aime pas le manque de controle, iic:
CInt(txt1erCoté.Text)



Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
8 oct. 2010 à 06:25
Int.TryParse ferait l'affaire.

Concernant le e.Cancel, j'ai ete trop vite en besogne...
ca interdit pas de regarder la doc:
KeyEventArgs

on y voit e.SuppressKeyPress

Perso, je suis assez pour laisser la saisie libre, et la valider ensuite...

en effet, on a toujours des cas ou on arrive a entrer des valeurs interdites, ou des cas non geres...

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
3
CDEProgrammeur Messages postés 23 Date d'inscription jeudi 7 octobre 2010 Statut Membre Dernière intervention 20 juillet 2012
7 oct. 2010 à 06:59
Tu veu dire quoi par "manque de controle"?
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
7 oct. 2010 à 08:53
si je saisi par exemple :

"erreur"

dans une des zones de saisie, un exception non gérée sera levée...

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pile_poil Messages postés 682 Date d'inscription vendredi 6 avril 2007 Statut Membre Dernière intervention 4 août 2012 6
7 oct. 2010 à 09:04
bonjour
essaie de rentrer "toto" en guise de valeur pour une des textbox et tu verras ce que le "manque de contrôle" veut dire

si c'est la solution, penser : REPONSE ACCEPTEE
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
7 oct. 2010 à 19:10
Bonsoir
voila une autre version
a b c sont des textboxes
labelresult un label
il faut tester
 Public Class Formtriangle

    Private Sub a_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles a.Click
        If Trim(a.Text).Length > 0 And Trim(b.Text).Length > 0 And Trim(c.Text).Length > 0 Then
            Button1.Enabled = True
        End If
    End Sub

    Private Sub a_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles a.KeyPress
        If a.Text.IndexOf(".") > 0 And e.KeyChar = "." Then
            a.ReadOnly = True
            Exit Sub
        End If
        If Char.IsDigit(e.KeyChar) Or e.KeyChar "." Or Asc(e.KeyChar) 8 Then
            a.ReadOnly = False
        Else
            a.ReadOnly = True
        End If
    End Sub

    Private Sub a_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles a.TextChanged

        If Trim(a.Text).Length > 0 And Trim(b.Text).Length > 0 And Trim(c.Text).Length > 0 Then
            Button1.Enabled = True
        End If
    End Sub

    Private Sub b_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles b.Click
        If Trim(a.Text).Length > 0 And Trim(b.Text).Length > 0 And Trim(c.Text).Length > 0 Then
            Button1.Enabled = True
        End If
    End Sub

    Private Sub b_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles b.KeyPress
        If b.Text.IndexOf(".") > 0 And e.KeyChar = "." Then
            b.ReadOnly = True
            Exit Sub
        End If
        If Char.IsDigit(e.KeyChar) Or e.KeyChar "." Or Asc(e.KeyChar) 8 Then
            b.ReadOnly = False
        Else
            b.ReadOnly = True
        End If
    End Sub

    Private Sub c_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles c.Click
        If Trim(a.Text).Length > 0 And Trim(b.Text).Length > 0 And Trim(c.Text).Length > 0 Then
            Button1.Enabled = True
        End If
    End Sub

    Private Sub c_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles c.KeyPress
        If c.Text.IndexOf(".") > 0 And e.KeyChar = "." Then
            c.ReadOnly = True
            Exit Sub
        End If
        If Char.IsDigit(e.KeyChar) Or e.KeyChar "." Or Asc(e.KeyChar) 8 Then
            c.ReadOnly = False
        Else
            c.ReadOnly = True
        End If
    End Sub

    Private Function Checktriangle() As String
        Dim side1 As Double
        Dim side2 As Double
        Dim side3 As Double
        Dim result As String
        Dim isisocele As Boolean
        Dim istriangle As Boolean
        Dim isrectangle As Boolean
        Dim isequilateral As Boolean
        side1 = CDbl(a.Text)
        side2 = CDbl(b.Text)
        side3 = CDbl(c.Text)
        result = ""
        istriangle = False
        If (side1 + side2) > side3 And (side1 + side3) > side2 And (side2 + side3) > side1 And side1 > 0 And side2 > 0 And side3 > 0 Then
            istriangle = True
        End If
        isequilateral = False
        If (side1 side2) And (side1 side3) And (side2 = side3) Then
            isequilateral = True
        End If
        isisocele = False
        isrectangle = False
        If side1 side2 Or side1 side3 Or side2 = side3 Then
            isisocele = True
        End If
        If (side1 ^ 2 + side2 ^ 2 side3 ^ 2) Or (side1 ^ 2 + side3 ^ 2 side2 ^ 2) Or (side2 ^ 2 + side3 ^ 2 = side1 ^ 2) Then
            isrectangle = True
        End If
        If istriangle = False Then
            result = "ne peut pas etre un triangle"
        End If
        If isisocele And isrectangle And istriangle Then
            result = "triange isocele rectangle"
        End If
        If isisocele And Not isrectangle And istriangle Then
            result = "triange isocele"
        End If
        If isrectangle And Not isisocele Then
            result = "triangle rectangle"
        End If
        If isequilateral And istriangle Then
            result = "triangle equilateral"
        End If
        If istriangle And Not isisocele And Not isrectangle And Not isequilateral Then
            result = "triangle Scalène"
        End If
        Return result
    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        labelresult.Text = ""
        labelresult.Text = Checktriangle()
    End Sub

    Private Sub c_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles c.TextChanged
        If Trim(a.Text).Length > 0 And Trim(b.Text).Length > 0 And Trim(c.Text).Length > 0 Then
            Button1.Enabled = True
        End If
    End Sub

    Private Sub b_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles b.TextChanged
        If Trim(a.Text).Length > 0 And Trim(b.Text).Length > 0 And Trim(c.Text).Length > 0 Then
            Button1.Enabled = True
        End If
    End Sub

    Private Sub Formtriangle_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Button1.Enabled = False
        labelresult.Text = ""
    End Sub
End Class



bonne programmation
0
CDEProgrammeur Messages postés 23 Date d'inscription jeudi 7 octobre 2010 Statut Membre Dernière intervention 20 juillet 2012
7 oct. 2010 à 19:21
Merci pour vos exemple mais le seul problème ici c'est que je n'ai pas le droit d'utiliser n'importe quel fonction vb.net pour faire ce travail. J'ai un problème maintenant et c'est de valider si tout les textbox contienne vraiment des chiffres. J'au le droit d'utiliser IsNumeric() et aussi les ASCII et dire au programme de regarder si les lettre dans les textbox son par exemple plus grand que 97 et 122 (A - Z). Mais, si j'ai envie de le faire avec IsNumeric() comment est-ce que je peut le faire proprement car comme certaine personne l'on mentionné plus haut j'ai un certain manque de controle. J'ai toujour un cast error si il rentre du text (Impossible de convertir string en integer). Je dois finir toute sa pour demain au plus tard.

Merci pour votre aide!
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
7 oct. 2010 à 19:48
quelles fonctions tu n'as pas le droit ?
avec le code que j'ai envoyé tu peux introduire
seulement des chiffres ou un . pour le decimal
mais pas de lettre
0
CDEProgrammeur Messages postés 23 Date d'inscription jeudi 7 octobre 2010 Statut Membre Dernière intervention 20 juillet 2012
7 oct. 2010 à 19:52
Les fonctions suivante: "trim" et "e.keyChar"
0
Sehnsucht Messages postés 107 Date d'inscription samedi 25 novembre 2000 Statut Membre Dernière intervention 4 mai 2013
7 oct. 2010 à 20:58
Bonsoir,

Juste une information purement mathématique, tu n'as quasiment pas besoin d'essayer de vérifier si un triangle peut être isocèle rectangle car un triangle isocèle rectangle a la particularité d'avoir son côté de l'hypoténuse qui vaut a * sqrt(2) (avec a la longueur du côté isocèle).
Or programmatiquement parlant tu ne pourras jamais vérifier ceci en te servant de la longueur des côtés, un exemple simple si tu veux t'en convaincre est de vérifier que les lignes suivantes te renverront toujours False.
Dim test As Boolean Math.Sqrt(2) * Math.Sqrt(2) 1 * 1 + 1 * 1
Dim test2 As Boolean Math.Pow(Math.Sqrt(2), 2) 1 * 1 + 1 * 1

Le seul moyen, à la limite d'y arriver, serait de demander en saisie, non pas les côtés du triangle (dans mon exemple la saisie était donc 1 ; 1 et 1.4142135623730951 (sqrt(2))) mais directement leurs carrés (soit 1 ; 1 et 2)

Sur un autre plan, quand je lis d'une part
je n'ai pas le droit d'utiliser n'importe quel fonction vb.net pour faire ce travail
et d'un autre que tu dois utiliser IsNumeric je ne peux m'empêcher de rigoler, car IsNumeric n'est pas une fonction VB.Net ; c'est une fonction VB6 mise dans VB.Net uniquement pour assurer la compatibilité des programmes migrant du premier au second langage et par conséquent devrait être proscrite de toute utilisation pour un projet/exercice directement développé en VB.Net ; m'enfin c'est pas toi qui choisi, mais ça en dit long sur le prof...

C'est là que je suis bien content de pouvoir programmer comme je l'entends plutôt que de faire un pavé de code pour pas grand chose ^^


Cordialement !
0
CDEProgrammeur Messages postés 23 Date d'inscription jeudi 7 octobre 2010 Statut Membre Dernière intervention 20 juillet 2012
7 oct. 2010 à 21:06
Oui je crois que je m'avais tromper a propros du triangle rectangle-isocèle. Je parlais plutot d'un triangle rectangle-scalène ce qui est beaucoup plus logique a prouver. C'est qui est de la fonction et bien je ne savais pas vraiment que IsNumeric était une fonction de vb6. Je n'ai jamais fait de vb6 dans le passé mais on utilise IsNumeric car on vien tout juste de commencer vb.net, c'était notre 11ième cours de vb.net avant hier. Mon prof(qui est une femme) est très bonne et qualifié pour ce qu'elle fait, surement un des meilleurs prof que j'ai eu et de plus mon college est privé donc les prof connaisse très bien leur matière. J'imagine que les vrai fonction vont venir au fil du temps cette année.

Mais, merci pour ton aide.C'est très apprécié!
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
7 oct. 2010 à 22:43
a.ReadOnly = True
Exit Sub


e.Cancel est la pour ca...

a b et c peuvent partager les meme gestionnaires d'evenements (voir mot cle Handles)

enfinm le presse papier est encore la, une belle faille.
je met un texte arbitraire dans le presse papier, je le colle dans a, b ou c
je lance le test et boum...


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
8 oct. 2010 à 02:16
Ah oui c'est vrai
j'ai écrit ça à la place

j'ai écrit e.cancel j'ai une erreur
e.cancel is not member of System.Windows.Forms.KeyEventArgs
 Private Sub a_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles a.KeyUp, b.KeyUp, c.KeyUp
        If sender.Text.IndexOf(".") > 0 And e.KeyValue = 52 Then

            sender.readonly = True
            Exit Sub
        End If
        If e.KeyValue 52 Or (e.KeyValue) 8 Or (e.KeyValue >= 48 And e.KeyValue <= 57) Then
            sender.ReadOnly = False
        Else
            sender.ReadOnly = True
        End If
        If IsNumeric(a.Text) And IsNumeric(b.Text) And IsNumeric(c.Text) Then
            Button1.Enabled = True
        Else
            Button1.Enabled = False
        End If
    End Sub
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
8 oct. 2010 à 02:19
une erreur
 Private Sub a_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles a.KeyUp, b.KeyUp, c.KeyUp
        If sender.Text.IndexOf(".") > 0 And e.KeyValue = 190 Then
            sender.readonly = True
            Exit Sub
        End If
        If e.KeyValue 52 Or (e.KeyValue) 8 Or (e.KeyValue = 190) Or (e.KeyValue >= 48 And e.KeyValue <= 57) Then
            sender.ReadOnly = False
        Else
            sender.ReadOnly = True
        End If
        If IsNumeric(a.Text) And IsNumeric(b.Text) And IsNumeric(c.Text) Then
            Button1.Enabled = True
        Else
            Button1.Enabled = False
        End If
    End Sub
0
Sehnsucht Messages postés 107 Date d'inscription samedi 25 novembre 2000 Statut Membre Dernière intervention 4 mai 2013
8 oct. 2010 à 04:11
Enfin ça fait pas mal d'incohérences tout ça, tu as le droit d'utiliser les codes ascii des caractères pour vérifier leur validité mais pas le droit de se servir de KeyChar. D'un autre côté il existe le contrôle NumericUpDown qui permet de simplifier la saisie de nombres, cependant le but est peut-être de voir comment valider une saisie mais dans ce cas pourquoi faire utiliser IsNumeric qui n'est clairement pas le mieux adapté en terme d'apprentissage de bonnes pratiques VB.Net...
0
CDEProgrammeur Messages postés 23 Date d'inscription jeudi 7 octobre 2010 Statut Membre Dernière intervention 20 juillet 2012
9 oct. 2010 à 06:59
@Renfield

Oui aujourd'hui j'ai essayer cette fonction après me l'avoir fait rappeler par mon professeur! Tout est parfait maintenant et mon programme est fini et tout fonction propement. Je ne suis pas sur mon ordi personelle en ce moment mais je vais vous faire part de mon code source! Peut-être que ca pourra aider des débutants comme moi dans le future!

Merci pour votre aide tout le monde!
0
Rejoignez-nous