Petits exercices pour débutants

atari54 Messages postés 20 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 6 juin 2012 - 11 nov. 2011 à 19:18
atari54 Messages postés 20 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 6 juin 2012 - 13 nov. 2011 à 18:39
Bonjour à tous !

Je suis nouveau sur le forum, et à vrai dire tout débutant en programmation (je viens d'entamer une formation pour adultes de développeur informatique).
Pour parler franchement, les exercices donnés par le formateur me paraissent trop difficiles pour mon niveau; du coup, désireux d'y aller étape par étape, à mon rythme, je me mets à faire de petits exercices simples à partir d'algorithmes.

Voici un exercice proposé dans un tutoriel d'algorithmes :

"Écrire un algorithme qui demande deux nombres à l’utilisateur et l’informe ensuite si le produit est négatif ou positif (on inclut le traitement du cas où le produit peut être nul). Attention toutefois, on ne doit pas calculer le produit !"

Voici mon algo. :

Variables x, y en entier
Début
Lire x, y
SI x>0 ET y>0 ALORS
Ecrire "Le résultat est positif"
SINONSI x<0 ET y<0 ALORS
Ecrire "Le résultat est positif"
SINONSI x= 0 ET y= 0 ALORS
Ecrire "Le résultat est nul"
SINONSI
Ecrire "Le résultat est négatif"
FINSI
Fin

Je l'ai ensuite transposé sur VB 2010 :

Public Class Form1

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


'déclaration des variables
Dim x As Integer
Dim y As Integer


'on précise que le(s) chiffre(s) représenté par x correspond(ent) à la case nommé "entier1",
'et que le(s) chiffre(s) représenté par y correspond(ent) à la case nommée "entier2"
x = Val(entier1.Text)
y = Val(entier2.Text)


'traitement des différents cas possibles
If x > 0 And y > 0 Then
MsgBox("Le résultat est positif", MsgBoxStyle.Information, "type de résultat")
ElseIf x < 0 And y < 0 Then
MsgBox("Le résultat est positif", MsgBoxStyle.Information, "type de résultat")
ElseIf x 0 Or y 0 Then
MsgBox("Le résultat est nul", MsgBoxStyle.Information, "type de résultat")
Else
MsgBox("Le résultat est négatif", MsgBoxStyle.Information, "type de résulstat")
End If
End Sub
End Class

Que pensez-vous de mon code ? Je pense ne pas l'avoir suffisamment sécurisé (notamment lorsque l'utilisateur ne rempli qu'une seule case et pas l'autre).
Par avance, merci beaucoup !

25 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
11 nov. 2011 à 20:00
Bonjour,
Pourquoi pas ?

Mais c'est quoi, "une case " ? . Es-tu certain de développer sous VB.Net ? (je n'en ai pas du tout l'impression, moi !)
Alors (juste pour le cas où tu développerais finalement sous VBA, voire VB6 ...) :
1) puisque tu parles de "case", regarde ce qu'est Select Case ! (et utilise-le au lieu de tes If ...Then ...elseif ... then ... etc ...
2) et XOR ? tu connais ? ===>> regarde ===>>
a 11 '>> ou la valeur te ton choix
b -3 '>> ou la valeur te ton choix
toto = a Xor b
Select Case toto
 Case Is >= 0
   msg IIf(a 0 Or b = 0, "nul", "positif")
 Case Else
   msg = "négatif"
End Select
MsgBox "le produit de " & a & " par " & b & " est " & msg


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
11 nov. 2011 à 20:18
Salut

Petite différence entre ta préparation d'algo et le code qui en découle :
SINONSI x=0 ET y=0 ALORS
ElseIf x 0 Or y 0 Then
C'est le code qui est correct, pas la prépa (And Or).

Tu peux aussi utiliser la fonction Sgn qui te renvoie le signe et faire tes If-Then-Else avec : Si les signes de chaque nombre :
sont identiques -> positif
sont différents -> négatif
(voir l'aide)

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
atari54 Messages postés 20 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 6 juin 2012
11 nov. 2011 à 20:19
Bonjour ucfoutu,

Merci pour ta réponse.
J'utilise bien Visual Basic 2010. Pour ce qui est de la "case", je voulais parler des "TextBox" de la boîte à outils, dans le formulaire "design" (désolé d'avoir parlé de "case", ça pouvait prêter à confusion. Mais j'apprends... ).
Peut-être d'autres avis ?
0
Utilisateur anonyme
11 nov. 2011 à 20:21
Salut Atari,

On se croirait à l'école...

Mais t'as raison, du coup quand on regarde bien on traduit du français à l'anglais quelque part.

Mais quand tu dis:
Je pense ne pas l'avoir suffisamment sécurisé (notamment lorsque l'utilisateur ne rempli qu'une seule case et pas l'autre)


Je pense que c'est ce qu'ils ont voulu dire par:
Attention toutefois, on ne doit pas calculer le produit !


Je ferais comme ça:
        'En partant du principe que Entier1 et 2 ce sont des textBox
        Dim x As Integer = Val(Entier1.Text)
        Dim y As Integer = Val(entier2.Text)

        'traitement des différents cas possibles
        If Entier1.Text "" Or Entier2.Text "" Then 'Si l'utilisateur n'a pas rempli une des cases:
            MsgBox("Vous devez remplir tous les champs!...")
        Else
            If x 0 Or y 0 Then
                MsgBox("Le résultat est nul", MsgBoxStyle.Information, "type de résultat")
            ElseIf x > 0 And y > 0 Then
                MsgBox("Le résultat est positif", MsgBoxStyle.Information, "type de résultat")
            ElseIf x < 0 And y < 0 Then
                MsgBox("Le résultat est négatif", MsgBoxStyle.Information, "type de résulstat")
            End If
        End If
        Entier1.Text = ""
        Entier2.Text = ""



CF2i - Guadeloupe
Ingénierie Informatique
0

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

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
11 nov. 2011 à 20:22
Peut-être d'autres avis ?


Tu as également eu l'avis de jack (que je salue), non ?
Quel que sera ton choix : utilise Select case (comme dit plus haut) plutôt que ta suite d'expressions conditionnelles.
Bonne étude.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
atari54 Messages postés 20 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 6 juin 2012
11 nov. 2011 à 20:28
Bonjour jack et acive !
Merci pour vos réponses, j'étudie tout ça et je vous tiens au courant. ;)

Tu as également eu l'avis de jack (que je salue), non ?


Effectivement ucfoutu, j'ai tout simplement posté mon message quelques secondes après celui de jack, d'où le petit "décalage". Sinon, j'ai bien pris en compte le "Select case" ! Merci bien donc.
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 6
11 nov. 2011 à 20:29
Bonjour atari54,

Voici le code à titre indicatif :

Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Try
      Dim msg As String = "NEGATIF"
      Dim x As Integer = Fix(CInt(TextBox5.Text))
      Dim y As Integer = Fix(CInt(TextBox6.Text))
      TextBox5.Text = x
      TextBox6.Text = y
      If (x < -1000000 Or x > 1000000) Or (y < -1000000 Or y > 1000000) Then GoTo faute
      If (x > 0 And y > 0) Or (x < 0 And y < 0) Then msg = "POSITIF"
      If x 0 Or y 0 Then msg = "NUL"
      MsgBox(msg, vbInformation, "Résultat") ' va direct à exit sub
    Catch ex As Exception
      GoTo faute
    End Try
    Exit Sub ' sort ici pour ne pas aller dans le message d'erreur
faute:  ' gestion collctive des erreurs
    Dim erreur As String = "Erreur de saisie : " & vbLf
    erreur = erreur & "Saisir dans chaque zone un nombre entier" & vbLf
    erreur = erreur & "De  -1.000.000  à  1.000.000 inclus, remédier...  " & vbLf
    MsgBox(erreur, vbInformation, "Erreur")
    TextBox5.Focus() ' donne le curseur à cet objet
  End Sub



' Ta case elle se nomme "TextBox"
' Si c'est destiné à être modifié en public il vaut mieux laisser le nom aux objets, ça évite à celui qui le charge de changer le nom de ses objets, tu ls changeras in fine si tu le veux.
' La conversion d'un INTEGER se fait plus spécifiquement pas CInt() car VAL aval un peu n'importe quoi...
' J'ai rajouté un FIX afin d'enlever les décimaux si jamais il y en avait, ça ne prend que la partie entirèe, c'est pourquoi je réaffiche la saisie corrigée dans les zone de saisie ensuite.
' Ce qui fait donc x Fix(CInt(texbox)), soit x entierde(conversion en Int(textBox))
' On peut opérer de façon différente, mais je ne veux pas t'embrouiller en te rajoutant trop de choses nouvelles...

Cordialement, Joe.
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 6
11 nov. 2011 à 20:38
Suite,

A la vue des réponses :

Le code d'UCfoutu semble très pertinent

Par contre ne prend pas VAL car si par exemple ton textBox est vide = "", ben VAL va le prendre pour un zéro, or ce n'est pas ce que tu veux, de même, ainsi on peut passer des nombres décimaux, il faut donc éliminer la partie décimale (FIX, INT)...

Fin des obs, cordialement, Joe.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
11 nov. 2011 à 20:43
salu, EjhJoe,
la suggestion de jack (utilisation de sgn) n'est pas non plus dénuée d'intérêt
Je viens d'essayer (mais je garde pour moi le code de sorte à ce que notre ami se creuse un peu les méninges lui aussi) ===>> du tout bon également.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Utilisateur anonyme
11 nov. 2011 à 20:48
Re:

Pas tout à fait d'accord avec Joe...
Je rappelle le chaier des charges:
"Écrire un algorithme qui demande deux nombres à l’utilisateur et l’informe ensuite si le produit est négatif ou positif (on inclut le traitement du cas où le produit peut être nul). Attention toutefois, on ne doit pas calculer le produit !"


On parle bien de deux nombres demandés à l'utilisateur, pas de "" ou " ", de plus on nous demande pas s'ils doivent être entiers ou non.

C'est pour ça qu'on doit d'abord filtrer le textbox pour savoir si le texte est conforme.


L'instruction Val() prend les deux à condition d'utiliser des "." comme séparateurs des décimales.



CF2i - Guadeloupe
Ingénierie Informatique
0
atari54 Messages postés 20 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 6 juin 2012
11 nov. 2011 à 20:52
Bonjour EhJoe,

Merci également pour ton aide ! Je prends des informations ici et là, et ça m'aide beaucoup à comprendre les choses, du genre :

Par contre ne prend pas VAL car si par exemple ton textBox est vide = "", ben VAL va le prendre pour un zéro


Ce sont des petits "trucs" mais qui finalement me seront précieux pour la suite !

ElseIf x < 0 And y < 0 Then
MsgBox("Le résultat est négatif", MsgBoxStyle.Information, "type de résulstat"


acive : le résultat serait plutôt positif dans ce cas, faute de frappe j'imagine ;)

mais je garde pour moi le code de sorte à ce que notre ami se creuse un peu les méninges lui aussi


Pas de soucis là-dessus ucfoutu : je suis venu ici pour apprendre, et par la suite, aider les autres lorsque j'aurais atteint un niveau qui puisse me le permettre. Ces petits exercices et l'aide des forumeurs qui en découle m'aident beaucoup à comprendre la syntaxe, mais aussi voir les différents possibilités de traiter un problème. Et Dieu sait si elles sont nombreuses !
0
Utilisateur anonyme
11 nov. 2011 à 21:03
Re:
Oui pardon...
J'avais fait un copier/coller de ton code mais au mauvais endroit

Mais te voilà plein d'idées maintenant, même si on a pas tous la même manière de faire.
Moi j'ai voulu refaire le code que t'as commencé de façon à que tu comprennes plus facilement.

Mais il y a une multitude de façons de faire selon tes besoins.



CF2i - Guadeloupe
Ingénierie Informatique
0
Utilisateur anonyme
11 nov. 2011 à 23:32
Une dernière chose...

En réalité on se connait tous entre nous par le biais de ce forum (plus ou moins) ucfoutu, EhJoe, Jack etc.

Si t'as eu des réponses aussi rapides et bien ciblées, avec des codes en exemple c'est parce que:
1) T'as été honnête depuis le début, tu dis "je suis débutant, je fais une formation"
2) Tu arrives ici avec un bout de code fait par toi, qui fonctionne, sauf quelques modifications à apporter.
3) Tu ne prends la tête à personne en disant des trucs du genre "C'est pas ça que je cherche, y a t il quelqu'un pour m'aider?" au contraire tu remercies tout le monde.

Voilà, je voulais juste signaler ça, parce que d'habitude on nous dit souvent qu'on est antipathique, que nous sommes de mauvaise volonté etc.

Mais c'est un peu à cause de certains soit disant débutants qui exposent leur problème de façon suivante (En gros):
"Voilà j'ai réussi à me faire embaucher à la SG mais je n'y connais rien, je cherche donc quelqu'un qui puisse avoir la gentillesse de m'aider SVP, c'est à dire que j'ai besoin d'un code pour lire les mails de mes supérieurs et envoyer les réponses par mail et par la poste et si possible leur apporter le café, parce que j'en ai marre"

Voilà désolé pour le coup de gueule, il fallait le sortir.



CF2i - Guadeloupe
Ingénierie Informatique
0
Utilisateur anonyme
11 nov. 2011 à 23:41
Bonsoir,

Je te conseille, pour prendre de bonnes habitudes, de modifier les options du projet suivantes :

[*] Dans l'onglet compilation : Option Strict sur On
[*] Dans l'onglet Références : retirer Microsoft.VisualBasic (obsolète) de la liste des noms importés.

L'ide soulignera alors les erreurs que tu pourras alors corriger.

Bonne prog.
0
Utilisateur anonyme
12 nov. 2011 à 00:06
Oui Banana a raison aussi...

on se connait tous entre nous par le biais de ce forum (plus ou moins) ucfoutu, EhJoe, Jack etc.


J'ai oublié Banana32, très bon programmeur, et toujours la aussi.
Pourquoi Banana32? parce qu'il travaille en 32 bits...

NON Je plaisante...

CF2i - Guadeloupe
Ingénierie Informatique
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 6
12 nov. 2011 à 07:59
Bonjour UCfoutu,

En fait touts les réponses devraient être bonnes, mais c'est l'utilisation du XOr qui m'a plu car c'est vrai que cette bête je ne l'utilise jamais, le ou non eclusif rend ton code optimal et compact, par contre pour l'auteur de la question a contario, ça complique avec du nouveau vocabulaire, en fait peu utilisé en plus...

Cordialement, Joe.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
12 nov. 2011 à 08:09
Bonjour, EjJoe,

Tu as raison.
Ce n'est toutefois pas par hasard, que j'ai proposé l'utilisation de cet opérateur utilisé en comparaison de bits. Ce qui m'y a incité, c'est cette petite phrase qui m'a interpellé :

je viens d'entamer une formation pour adultes de développeur informatique


et le commencement est alors là, pour moi, car tout le reste en découle.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 6
12 nov. 2011 à 08:13
Bonjour acive,


deux nombres à l’ ; utilisateur et l’ ;

case nommé "entier1"


Les nombres je ne sais pas ce que c'est que ce truc : l’, peut être un problème de conversion de codage de texte ?

Plus bas il précise case "entier", alors je me suis branché dessus.

Je ne me suis pas top intéressé au libellé mais à son code...

Quel qee soit le libellé, il faut bien par exemple pour ne pas déborder, refuse au dessus de la capacité de la variable.

Si ce sont des décimaux, alors il faut dans le doute utilier un DOUBLE

On peut utiliser VAL mais il n'est pas assez restrictif, il faut dans ce cas vérifier le texte avant conversion, mais je ne voulais pas trop lui rajouter des truc s'il est éjà un peu saturé de vocabulaire et de méthodes, cInt ou CDbl sont plus restrictif.

Tu évoques la saisie d'un point ou d'une virgule, y a pire, mettre des lettres dans ls chiffres par exemple...

Tous les codes proposés sont bons...

Cordialement, Joe.
0
Utilisateur anonyme
12 nov. 2011 à 14:23
Salut Joe

Oui de toute façon il a pu remarquer que ça peut se faire de plusieurs façons, et oui tous les codes proposées sont bons.

Pour les erreurs de saisie, je viens d'y penser... pourquoi ne pas faire un truc du genre:
 Private Sub Entier1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Entier1.KeyUp
        For Each Caractere In Entier1.Text
            If IsNumeric(Caractere) = False Then
                Entier1.Text = Entier1.Text.Remove(Entier1.TextLength - 1)
                Entier1.SelectionStart = Entier1.TextLength
            End If
        Next
    End Sub



CF2i - Guadeloupe
Ingénierie Informatique
0
cs_ShayW Messages postés 3258 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 55
12 nov. 2011 à 20:13
Salut atari54

Une proposition

sur la form
textnum1 et textnum2 : textbox
ButtonCheck : button

Private num1, num2 As Double
    Private Sub CheckProduct()
        If Not Double.TryParse(textnum1.Text, num1) Then
            MessageBox.Show(textnum1.Text & " n'est pas numérique")
            Exit Sub
        End If
        If Not Double.TryParse(textnum2.Text, num2) Then
            MessageBox.Show(textnum2.Text & " n'est pas numérique")
            Exit Sub
        End If
        If (num1 > 0) And (num2 > 0) Then
            MessageBox.Show("le produit " & num1 & " * " & num2 & " est positif")
            Exit Sub
        End If
        If (num1 0) Or (num2 0) Then
            MessageBox.Show("le produit " & num1 & " * " & num2 & " est nul")
            Exit Sub
        End If
        If (num1 < 0) Or (num2 < 0) Then
            MessageBox.Show("le produit " & num1 & " * " & num2 & " est négatif")
            Exit Sub
        End If
    End Sub
    
    Private Sub ButtonCheck_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ButtonCheck.MouseClick
        CheckProduct()
    End Sub


bonne prog
0