Enfin (!), voici comment on peut rajouter les échelles (micro, méga, etc...). Comme chaque grandeur physique (en entrée comme en sortie) a sa propre échelle, on peut rajouter cette échelle dans la structure récemment créée.
Code : Tout sélectionner
Structure GrandeurPhysique
Nom.S
GadgetNom.L
Valeur.D
GadgetVal.L
Unite.S
GadgetUnite.L
Exposant.L ; <<<<<<<< ICI
EndStructure
Petit rappel de maths :
n puissance 1 = n
n puissance 2 = n * n (peut se lire n au carré)
n puissance 3 = n * n * n (peut se lire n au cube)
n puissance -1 = 1 / n
n puissance -2 = 1 / (n * n)
n puissance -3 = 1 / (n * n * n)
n puissance (a + b) = (n puissance a) * (n puissance b)
n puissance (a - b) = (n puissance a) / (n puissance b)
n puissance 0 = n puissance (1 - 1) = (n puissance 1) / (n puissance 1) = n / n = 1
n puissance (1/2) = Racine carrée de n (on peut pas écrire le symbole ici)
n puissance (1/3) = Racine cubique de n
n puissance (1/x) = Racine x ième de n
Petit rappel d'anglais : puissance se dit POWER
D'où l'instruction PureBasic Pow(a, b)
Pow(a, b) signifie a puissance b
Le champ appelé "Exposant" dans la structure ci-dessus, stocke en fait la valeur n tel que
le nombre réel traité = Valeur * Pow(10, n)
Exemples:
***********
Valeur = 15
Exposant = 3
>> Valeur réelle = 15 000
Valeur = 26
Exposant = 2
>> Valeur réelle = 2 600
Valeur = 31
Exposant = 0
>> Valeur réelle = 31
Valeur = 171
Exposant = 1
>> Valeur réelle = 1710
Valeur = 12
Exposant = -1
>> Valeur réelle = 1.2
Remarque: L'exposant est un nombre entier
J'ai rajouté une procédure appelée StrExpo(n)
Elle retourne un texte en fonction de l'exposant n spécifié
Exemple:
**********
Debug StrExpo(3) affichera "Kilo"
Debug StrExpo(-6) affichera "Micro"
Il y a aussi les symboles abrégés. Pour cela, il faut rajouter un argument de valeur entière 1.
Debug StrExpo(6, 1) affichera "M" (parce que "Méga")
Debug StrExpo(1, 1) affichera "Da" (parce que "Déca")
Etc...
Au moment où les textes des gadgets sont convertis en nombres, ils doivent subir la conversion des échelles (D'où la présence de *Pow(10, blabla) dans la boucle principale)
Au moment où le résultat est converti en texte pour être réaffiché, il doit aussi subir la conversion d'échelle.
Résultat: le calcul reste confiné et tu n'as donc pas à te soucier des échelles dans le calcul même.
Tu dois gérer les échelles dans la partie "Préparation" du programme, et plus précisément quand tu crées une grandeur avec GrandeurInstalle(). C'est le dernier argument entre parenthèses.
Si tu as des questions, il n'y a aucun souci.
N'oublie pas les petits signes /!\ qui indiquent les endroits qui sont importants pour toi dans le code, et permettent d'arriver facilement à ce que tu m'as demandé en pm. C'est logiquement un bon repérage.
Bon courage.
Code : Tout sélectionner
;***********************************
;***********************************
;***********************************
; Calcul de la puissance P en
; fonction de l'intensité I
; et la tension U
;***********************************
; (4) Rajout de texte
; & Mise en structure
;***********************************
;***********************************
;===================================
; INITIALISATION
;===================================
#FenetreTest = 1
#StyleStandard = $CF0001
Structure GrandeurPhysique
Nom.S
GadgetNom.L
Valeur.D
GadgetVal.L
Unite.S
GadgetUnite.L
Exposant.L
EndStructure
Define Event0.L
Define Tension.GrandeurPhysique
Define Intensite.GrandeurPhysique
Define Puissance.GrandeurPhysique
;/!\
Global GadgetCurseurY.L
Procedure.S StrExpo(n.L, Abrege.L = 0)
Protected Result.S
Static Ech3.S = "atto/a;pico/p;nano/n;micro/µ;milli/m;/;kilo/K;méga/M;giga/G;tera/T"
Static Ech10.S = "centi/c;déci/d;/;déca/Da;hecto/H"
If Abs(n) <= 2
Result = StringField(Ech10, n + 3, ";")
Else
Result = StringField(Ech3, (n / 3) + 6, ";")
EndIf
If Abrege
Result = StringField(Result, 2, "/")
Else
Result = StringField(Result, 1, "/")
Result = UCase(Left(Result, 1) ) + Right(Result, Len(Result) - 1)
EndIf
ProcedureReturn Result
EndProcedure
Procedure GrandeurInstaller(*C.GrandeurPhysique, Nom.S, Unite.S, Exposant.L = 0)
With *C
\GadgetNom = TextGadget(-1, 16, GadgetCurseurY, 80, 24, Nom)
\GadgetVal = StringGadget(-1, 96, GadgetCurseurY, 128, 24, "")
\GadgetUnite = TextGadget(-1, 240, GadgetCurseurY, 128, 24, StrExpo(Exposant) + Unite)
\Exposant = Exposant
EndWith
GadgetCurseurY + 32
EndProcedure
;===================================
; DEMARRAGE
;===================================
If OpenWindow(#FenetreTest, 0, 0, 320, 96, "Test", #StyleStandard)
GadgetCurseurY = 16
GrandeurInstaller(Tension, "Tension", "Volt(s)", -3)
GrandeurInstaller(Intensite, "Intensité", "Ampère(s)", 6)
GrandeurInstaller(Puissance, "Puissance", "Watt(s)", 3)
;/!\
ResizeWindow(#FenetreTest, #PB_Ignore, #PB_Ignore, #PB_Ignore, GadgetCurseurY)
EndIf
;===================================
; BOUCLE PRINCIPALE
;===================================
Repeat
; On attend un événement système...
Event0 = WaitWindowEvent() ; ...stocké dans Event0
; On récupère la tension
Tension\Valeur = ValD(GetGadgetText(Tension\GadgetVal) ) * Pow(10, Tension\Exposant)
; On récupère l'intensité
Intensite\Valeur = ValD(GetGadgetText(Intensite\GadgetVal) ) * Pow(10, Intensite\Exposant)
; /!\
; On fait le calcul
Puissance\Valeur = Tension\Valeur * Intensite\Valeur
; /!\ Modifier le calcul
; On place le résultat dans la zone de sortie
SetGadgetText(Puissance\GadgetVal, StrD(Puissance\Valeur * Pow(10, 0.0 - Puissance\Exposant), 3) )
; /!\ Modifier le nom de la sortie /!\
; /!\ car ça n'est pas forcément la puissance /!\
; On laisse le CPU se reposer un peu...
Delay(15)
; Si l'événement système est une sortie (code 16)...
Until Event0 = 16
; ...On ne remonte pas à la ligne REPEAT (début de boucle)
End