calcul surface d'un rectangle pour me familiariser avec pb .

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
klystron
Messages : 149
Inscription : mar. 02/déc./2014 12:16

Re: calcul surface d'un rectangle pour me familiariser avec

Message par klystron »

bonjour à tous,
je mets le code terminé pour mémoire.
maintenant, je vais noté tous les mots clés dans un cahier.
A+

Code : Tout sélectionner



Enumeration Window
  #MaFenetre
EndEnumeration

Enumeration Gadget
  #Longueur
  #Largeur
  #Surface
  #Hypotenuse
  #Perimetre
  #Bouton_Calculer ; *** Déclarer l'ID du bouton Calculer
EndEnumeration

;Création de la fenetre et des différents gadgets
Procedure Open_MainForm()
  OpenWindow(#MaFenetre, 100, 100, 800, 600, " -Elements d'un triangle rectangle- ")

  TextGadget(#PB_Any, 10, 35, 100, 22, "Longueur")
  StringGadget(#Longueur, 120, 30, 80, 22, "")

  TextGadget(#PB_Any, 10, 65, 100, 22, "Largeur")
  StringGadget(#Largeur, 120, 60, 80, 22, "")

  TextGadget(#PB_Any, 10, 100, 100, 22, "Surface")
  StringGadget(#Surface, 120, 100, 80, 22, "", #PB_String_ReadOnly) ;Ce gadget sera en lecture seule
  

  TextGadget(#PB_Any, 10, 135, 100, 22, "Hypotenuse")
  StringGadget(#Hypotenuse, 120, 135, 80, 22, "", #PB_String_ReadOnly) ;Ce gadget sera en lecture seule


  TextGadget(#PB_Any, 10, 170, 100, 22, "Perimetre")
  StringGadget(#Perimetre, 120, 170, 80, 22, "", #PB_String_ReadOnly) ;Ce gadget sera en lecture seule



  ButtonGadget(#Bouton_Calculer, 10, 220, 100, 25, "Calculer") ; *** Le bouton Calculer
EndProcedure

;Calcul de la surface d'un triangle rectangle
Procedure CalculSurface(Longueur.f, largeur.f)
  Protected AB.f = longueur
  Protected AC.f = largeur
  Protected Resultat.f

  Resultat = (AB * AC)/2 ;Inutile de repeter le typage .f (float) à résultat car déja déclaré

  SetGadgetText(#Surface, StrF(Resultat, 3)) ;Affichage du résultat avec 3 décimales
EndProcedure



; calcul de l'ypotenuse 

Procedure Calculhypotenuse(Longueur.f, Largeur.f)
  Protected AB.f = longueur
  Protected AC.f = largeur
  Protected Resultat.f
  
  Protected BC.f     ;C'est la longueur de l'hypotenuse à retrouver
  
  Resultat = Pow(AB,2) + Pow(AC,2)    ; puissances 2
  
  BC = Sqr(Resultat)    ; racine carree
  
  SetGadgetText(#Hypotenuse,StrF(BC,3))     ;affichage du resultat avec 3 decimales
EndProcedure



; calcul du perimetre du triangle


Procedure Calculperimetre(Longueur.f, Largeur.f,BC.f)
  Protected AB.f = longueur
  Protected AC.f = largeur 
  Protected Resultat.f
  
  Resultat = AB + AC + BC
  
    
  SetGadgetText(#perimetre,StrF(Resultat,3))     ;affichage du resultat avec 3 decimales
EndProcedure


;Le programme commence ici : On ouvre la fenêtre
Open_MainForm()

;Boucle événementielle
Repeat
  Select WaitWindowEvent() ;Un événement est arrivé
    Case #PB_Event_Gadget  ;Est ce un gadget qui a provoqué l'événement ?
      Select EventGadget() ;Apparemment oui : On cherche qui
; *** Je désactive ici le déclenchement automatique sur changement de valeur d'un des deux champs               
;         ;Le gadget #Longueur et #largeur faisant appel à la meme procédure, on va simplifier le code. 
;         Case #Longueur, #Largeur ;Apparemment c'est le gadget #Longueur ou #largeur qui provoque l’événement
;          
;           Select EventType() ;Quel type d'évenement il y a eu sur ces deux gadgets?             
;             Case #PB_EventType_Change ;? il y a du changement dans le gadget : Là ça nous intéresse
;               CalculSurface(ValF(GetGadgetText(#Longueur)), ValF(GetGadgetText(#Largeur)));On appelle la procédure de calcul de la surface
;           EndSelect ;Fin du Seledt EventType()
;       EndSelect ;Fin du Seledt EventGadget()   
            
; *** Je provoque le déclenchement par le bouton Calculer
        Case #Bouton_Calculer
           
          CalculSurface(ValF(GetGadgetText(#Longueur)), ValF(GetGadgetText(#Largeur)));On appelle la procédure de calcul de la surface
          Calculhypotenuse(ValF(GetGadgetText(#Longueur)), ValF(GetGadgetText(#Largeur)))
         Calculperimetre(ValF(GetGadgetText(#longueur)), ValF(GetGadgetText(#largeur)), ValF(GetGadgetText(#hypotenuse))) 
          
       
       EndSelect 

          
          
         
    Case #PB_Event_CloseWindow ;Est ce une fermeture de la fenêtre ?
      End ;Apparemment oui : Fermeture de la fenêtre.
     
  EndSelect
ForEver


; IDE Options = PureBasic 5.31 (Windows - x64)
; CursorPosition = 81
; FirstLine = 83
; Folding = -
; EnableUnicode
; EnableXP
; Executable = triangle_ecole.exe
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: calcul surface d'un rectangle pour me familiariser avec

Message par Marc56 »

Bien, 8)

(Une fois que tu as compris à quoi sert chaque bloc, tu peux effacer les lignes de commentaires pour rendre le code plus lisible)

Avant d'aller plus loin, je te conseille de prendre une bonne habitude qui peut sembler contraignante, mais est très utile pour éviter les fautes de frappe.
Sur le première ligne de tout code, ajoute le mot clé EnableExplicit.
(Ce type de commande existe dans presque tous les langages de programmation: 'Option Explicit ON' en VB(A), 'use strict' en Perl etc) C'est toujours facultatif, mais fortement recommandable :)

Comme tu peux le voir dans l'aide, il sert à générer un message d'erreur si on a oublié de déclarer une variable.

Exemple de son utilité

Si je fais ça:

Code : Tout sélectionner

Global Resultat = 1 + 1
Debug Resultats
Resultats affiche 0 ! et aucun message d'erreur. Pourquoi ?

Simple: j'ai écris trop vite sur la deuxième ligne Resultats (avec un 's') donc pour le compilateur, c'est une autre variable, qui n'a jamais été utilisée, donc à zéro.
C'est l'exemple type de faute de frappe bête qui fait perdre du temps :x

Maintenant si j'avais écris

Code : Tout sélectionner

EnableExplicit
Global Resultat = 1 + 1
Debug Resultats
Au lancement j'aurais eut un message d'erreur:
Ligne 3: Avec 'EnableExplicit', les variables doivent etre explicitement declarees: Resultats

PB a donc reconnu que j'avais tenté d'utiliser deux variables différentes, car pour lui Resultats (avec un 's' n'a pas été déclaré) :D
Si j'enlève le 's', c'est OK

Donc, comme l'a dit quelqu'un sur le forum, toujours mettre EnableExplicit en début de code. Ça ne consomme pas, mais c'est très utile.

:wink:

PS. Note au passage cette petite astuce sous Windows: quand tu as une boite de message d'erreur, tu peux copier/coller le contenu en texte brut, même s'il n'est pas sélectionnable à la souris! il suffit de cliquer sur la boite, de faire CTRL+C puis de faire CTRL+V là où tu veux. C'est commode pour recopier sur un forum, le message d'erreur exact.

Code : Tout sélectionner

---------------------------
PureBasic
---------------------------
Ligne 3: Avec 'EnableExplicit', les variables doivent etre explicitement declarees: Resultats
---------------------------
OK   
---------------------------
Dernière modification par Marc56 le sam. 06/déc./2014 14:53, modifié 1 fois.
klystron
Messages : 149
Inscription : mar. 02/déc./2014 12:16

Re: calcul surface d'un rectangle pour me familiariser avec

Message par klystron »

Ok génial, merci Marc56.
je note :D
bon week-end.
Yves
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: calcul surface d'un rectangle pour me familiariser avec

Message par Marc56 »

Pour ce qui est des commentaires dans le code, on ne les mets (en général) que dans quelques cas:

1. Définir ce que fait une action/formule si ce n'est pas facile à comprendre au premier coup d’œil le jour (éventuellement lointain) où on voudra reprendre le code ou si ce code doit être ensuite maintenu par quelqu’un d'autre.

2. En début de code, on met souvent:
- Le titre de l'application et du programme principal (au cas où il ait été renommé)
- Ce que fait le programme
- Le compilateur (version) nécessaire au minimum (ex: PurBasic 5.3x)
- Les éventuelles librairies et programmes externes
- La date de compilation initiale
- Les dates de modifications et ce qu'elles font
- Le nom de l'auteur initial
- Perso, je met souvent une TODO sur ce que j'ai prévu de faire comme évolution (et que je fais jamais :lol: )

3. Au début de chaque procédure
- Ce que fait la procédure

Tu as pu voir que tu peux masquer un grand bloc de commentaire dans un code en mettant en première ligne
; { et en dernière ; } . Le bloc ainsi encadré devient pliable (voir dans les préférences: pliage de code)

:wink:
klystron
Messages : 149
Inscription : mar. 02/déc./2014 12:16

Re: calcul surface d'un rectangle pour me familiariser avec

Message par klystron »

Ok, merci Marc56.
si tu as d'autres infos pour aider ,je suis preneur .
A+
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: calcul surface d'un rectangle pour me familiariser avec

Message par Marc56 »

klystron a écrit :Ok, merci Marc56.
si tu as d'autres infos pour aider ,je suis preneur .
A+
À propos des commentaires de code, il y a dans l'éditeur de PB un système de notes très commode. Ca agit comme des PosIt(R)
Exemple: créé une ligne de commentaire comme ceci

; TODO : Modifier cette procédure pour limiter le nombre de décimale

Passes à la ligne suivante (ou clique ailleurs) et tu verra cette ligne se surligner!
De même si tu fais,

; FIXME : Bug affichage de décimales
La ligne se surligne d'une autre couleur.

Et si tu fais Outils / Explorateur de notes, tu vois toutes les notes
En cliquant sur l'une d'entre elle, tu y va direct

Magie 8O ? Non, Si tu vas dans
Fichier / Préférences / Editeur / Notes
Tu vois une liste de mots clé (que tu peux modifier / agrandir)
(Tu n'as pas besoin de connaitre les expressions régulières pour ajouter des mots clé, il suffit juste de savoir que le /b signifie boundary (limite), ça limite le bloc de texte à reconnaitre par le système.)

J'ai beau avoir acheté ma licence PB en 2008 je continue à découvrir et fouiller toutes les nouvelle options à chaque version.
8)
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: calcul surface d'un rectangle pour me familiariser avec

Message par Marc56 »

Enfin un autre truc utile.

Dans l'un de tes essais, tu avais un message erreur valf() ligne 111, mais la ligne 111 affichait ceci

Code : Tout sélectionner

Calculperimetre(ValF(GetGadgetText(#longueur)),ValF(GetGadgetText(#largeur),ValF(GetGadgetText(#hypotenuse))))
Le problème de ce type de cas et de savoir lequel des 3 valf() pose problème ?

Solution: Séparer la ligne en plusieurs.

PB considère que chaque instruction doit se faire en une seule ligne, mais accepte de séparer sur plusieurs lignes dans quelques cas, si le dernier caractère de la ligne est une virgule ou un signe (ex: +). Donc en réécrivant ta ligne comme ceci

Code : Tout sélectionner

Calculperimetre(ValF(GetGadgetText(#longueur)),
                ValF(GetGadgetText(#largeur),
                ValF(GetGadgetText(#hypotenuse))))
Déjà tu vois que ça colle pas au niveau nombre de parenthèses (il en manque une au deuxième et il y en a une de trop à la fin)
Mais surtout le compilateur t'aurait indiqué plus exactement où est l'erreur (ligne 111)

:wink:

PS. Certains Basic (ex: VB) permettent de couper une ligne où on veut en terminant la ligne par un underscore ( _ ), ce qui annule le sauf de ligne. On avait demandé à avoir cela dans PB, à une époque, mais je crois que ce n'était pas possible.
klystron
Messages : 149
Inscription : mar. 02/déc./2014 12:16

Re: calcul surface d'un rectangle pour me familiariser avec

Message par klystron »

je viens de faire un peu le ménage.

Code : Tout sélectionner

; exemple de programme code pour apprendre le purebasic.
;---------------------------------------------------------------------------------------

Enableexplicit  ; pour message d'erreur des varables.

Enumeration Window
  #MaFenetre
EndEnumeration

Enumeration Gadget
  #Longueur
  #Largeur
  #Surface
  #Hypotenuse
  #Perimetre
  #Bouton_Calculer                  ; Déclarer l'ID du bouton Calculer
EndEnumeration

;-------------------Création de la fenetre et des différents gadgets-------------------------

Procedure Open_MainForm()
  OpenWindow(#MaFenetre, 100, 100, 800, 600, " -Elements d'un triangle rectangle- ")

  TextGadget(#PB_Any, 10, 35, 100, 22, "Longueur")
  StringGadget(#Longueur, 120, 30, 80, 22, "")

  TextGadget(#PB_Any, 10, 65, 100, 22, "Largeur")
  StringGadget(#Largeur, 120, 60, 80, 22, "")

  TextGadget(#PB_Any, 10, 100, 100, 22, "Surface")
  StringGadget(#Surface, 120, 100, 80, 22, "", #PB_String_ReadOnly)    ;Ce gadget sera en lecture seule
  

  TextGadget(#PB_Any, 10, 135, 100, 22, "Hypotenuse")
  StringGadget(#Hypotenuse, 120, 135, 80, 22, "", #PB_String_ReadOnly)  ;Ce gadget sera en lecture seule


  TextGadget(#PB_Any, 10, 170, 100, 22, "Perimetre")
  StringGadget(#Perimetre, 120, 170, 80, 22, "", #PB_String_ReadOnly)   ;Ce gadget sera en lecture seule



  ButtonGadget(#Bouton_Calculer, 10, 220, 100, 25, "Calculer")          ; Le bouton Calculer
EndProcedure

;-----------------Calcul de la surface d'un triangle rectangle-------------------------

Procedure CalculSurface(Longueur.f, largeur.f)
  Protected AB.f = longueur
  Protected AC.f = largeur
  Protected Resultat.f

  Resultat = (AB * AC)/2              ;Inutile de repeter le typage .f (float) à résultat car déja déclaré

  SetGadgetText(#Surface, StrF(Resultat, 3)) ;Affichage du résultat avec 3 décimales
EndProcedure

;-------------------------Calcul de l'Hypotenuse---------------------------------
 
Procedure Calculhypotenuse(Longueur.f, Largeur.f)
  Protected AB.f = longueur
  Protected AC.f = largeur
  Protected Resultat.f
  
  Protected BC.f                            ;C'est la longueur de l'hypotenuse à retrouver
  
  Resultat = Pow(AB,2) + Pow(AC,2)          ; puissances 2
  
  BC = Sqr(Resultat)                        ; racine carree
  
  SetGadgetText(#Hypotenuse,StrF(BC,3))     ;affichage du resultat avec 3 decimales
EndProcedure

;------------------------------calcul du perimetre du triangle------------------------------

Procedure Calculperimetre(Longueur.f, Largeur.f,BC.f)
  Protected AB.f = longueur
  Protected AC.f = largeur 
  Protected Resultat.f
  
  Resultat = AB + AC + BC
 

  SetGadgetText(#perimetre,StrF(Resultat,3))     ;affichage du resultat avec 3 decimales
EndProcedure

;----------------------Le programme commence ici : On ouvre la fenêtre--------------------------
 
Open_MainForm()

;---------------------------------Boucle événementielle---------------------------------------
 
Repeat
  Select WaitWindowEvent()       ;Un événement est arrivé
    Case #PB_Event_Gadget        ;Est ce un gadget qui a provoqué l'événement ?
      Select EventGadget()       ;Apparemment oui : On cherche qui

           
        Case #Bouton_Calculer      ; Je provoque le déclenchement par le bouton Calculer

;------------------------- on appelle les procedures:------------------------------------

          CalculSurface(ValF(GetGadgetText(#Longueur)),
                        ValF(GetGadgetText(#Largeur))) 
  
          Calculhypotenuse(ValF(GetGadgetText(#Longueur)),
                           ValF(GetGadgetText(#Largeur)))

          Calculperimetre(ValF(GetGadgetText(#longueur)),
                          ValF(GetGadgetText(#largeur)),
                          ValF(GetGadgetText(#hypotenuse))) 
         
      
       EndSelect 
             
      
    Case #PB_Event_CloseWindow      ;Est ce une fermeture de la fenêtre ?

      End                           ;Apparemment oui : Fermeture de la fenêtre.
     
  EndSelect

ForEver


; IDE Options = PureBasic 5.31 (Windows - x64)
; CursorPosition = 81
; FirstLine = 83
; Folding = -
; EnableUnicode
; EnableXP
; Executable = triangle_ecole.exe
Dernière modification par klystron le dim. 07/déc./2014 6:48, modifié 3 fois.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: calcul surface d'un rectangle pour me familiariser avec

Message par Ollivier »

Maintenant, il n'y a plus qu'à généraliser le cas pour tous les triangles:

BC × BC = AB × AB + AC × AC - 2 × AB × AC × Cos BAC
klystron
Messages : 149
Inscription : mar. 02/déc./2014 12:16

Re: calcul surface d'un rectangle pour me familiariser avec

Message par klystron »

Bonjour à tous,
comment faire pour avoir des lettres et des chiffres un peu plus grands , au niveau du texte dans la fenetre principale , caractères en gras Est-ce possible ?.
merci de me répondre.
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

Re: calcul surface d'un rectangle pour me familiariser avec

Message par Micheao »

Bonjour

Je suis un nouveau venu sur purebasic, je débute aussi Merci beaucoup d'avoir crée ce post , j'ai beaucoup appris
au plaisir d'apprendre un peu plus en purebasic

Bon Dimanche
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: calcul surface d'un rectangle pour me familiariser avec

Message par Marc56 »

klystron a écrit :Bonjour à tous,
comment faire pour avoir des lettres et des chiffres un peu plus grands , au niveau du texte dans la fenetre principale , caractères en gras Est-ce possible ?.
merci de me répondre.
Bonjour klystron,

En programmation Windows, la taille d'un texte est liée à la police choisie.

Il faut donc procéder en plusieurs étapes:
1. Définir une constante Police/Taille/Attributs (gras): Commande LoadFont
2. Affecter à chaque gadget cette constante: Commande SetGadgetFont

Un seul LoadFont suffit pour chaque type de fonte/taille
Par contre il faut affecter la fonte (SetGadgetFont) à chaque nouveau gadget (sinon il reste en fonte et taille par défaut)

:D
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

Re: calcul surface d'un rectangle pour me familiariser avec

Message par Micheao »

Bonjour Marc56

merci des conseils
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: calcul surface d'un rectangle pour me familiariser avec

Message par falsam »

Marc56 a écrit :Par contre il faut affecter la fonte (SetGadgetFont) à chaque nouveau gadget (sinon il reste en fonte et taille par défaut)
Bonjour Marc. Non il est possible d'affecter une font à l'ensemble des gadgets d'une fenêtre en une seule fois avec : SetGadgetFont(#PB_Any, FontID(#Fontglobal))

Ensuite tu peux travailler certains gadgets.

■ Exemple avec ce code qui permet
- D'affecter l'ensemble des gadget avec la police "Arial" en taille 12 (C'est gros mais c'est pour l'exemple) et de formater les stringgadgets en gras. J'ai aussi insérer un titre en taille 25.

Code : Tout sélectionner

Enumeration Fonts
  #FontGlobal
  #FontBold
  #FontTitre
EndEnumeration

Enumeration Windows
  #Mainform
EndEnumeration

Enumeration Gadgets
  #Titre
  #Nom
  #Adresse
  #Valider
EndEnumeration

Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget

Procedure Open_MainForm()
  ;Chargement font global
  LoadFont(#FontGlobal, "Arial", 12) 
  
  ;Chargement font bold
  LoadFont(#FontBold, "Arial", 12, #PB_Font_Bold) 
  
  ;Chargement font titre
  LoadFont(#FontTitre, "Arial", 25, #PB_Font_Bold) 
  
  ;Affectation de la font global à l'ensemble de la fenetre
  SetGadgetFont(#PB_Any, FontID(#Fontglobal))
  
  ;Ouverture de la fenêtre
  OpenWindow(#Mainform, 0, 0, 500, 400, "New Form", WindowStyle)
  
  TextGadget(#Titre, 10, 10, 200, 50, "Contact")
  SetGadgetFont(#Titre, FontID(#FontTitre))
  
  TextGadget(#PB_Any, 20, 80, 100, 22, "Nom")
  StringGadget(#Nom, 150, 80, 200, 22, "")
  SetGadgetFont(#Nom, FontID(#FontBold))
  
  TextGadget(#PB_Any, 20, 105, 100, 22, "Adresse")
  EditorGadget(#Adresse, 150, 105, 200, 100)
  SetGadgetFont(#Adresse, FontID(#FontBold))
  
  ButtonGadget(#Valider, 400, 80, 80, 22, "Valider")
  
  SetActiveGadget(#Nom)
EndProcedure

Open_MainForm()

Repeat : Until WaitWindowEvent(10) = #PB_Event_CloseWindow
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
klystron
Messages : 149
Inscription : mar. 02/déc./2014 12:16

Re: calcul surface d'un rectangle pour me familiariser avec

Message par klystron »

Bonjour les amis,
je ne suis plus le seul a etre novice , il y a maintenant l'ami Micheao, super, ça fait des émules tant mieux.
bonjour à Marco56 et aussi à Falsam.
Oui je vais regardé les infos que vous nous avez mis.
on vas y réfléchir.
A+
Répondre