Page 1 sur 1
[R] Calcul de promotion
Posté : jeu. 19 févr. 2015 02:19
par ApoKLypsWarrior
Bonjour,
Je viens ici pour vous poser une question. Je suis actuellement en train de créer mon petit programme qui permet de calculer automatiquement les prix sans promotion, avec promotion et une petite astuce trouvée.
J'arrive parfaitement à faire ce dont j'ai envie, mais je ne pense pas que ce soit la meilleure des façons.
Nous avons en tout 4 ComboBox :
- Une pour choisir la classe
- Une pour choisir l'item
- Une pour choisir le niveau actuel de l'item
- Une pour choisir le niveau désiré de l'item
► Afficher le texteExemple de ma fonction calcul
Code : Tout sélectionner
If $ReadComboCEL = "Chasseur" Then
If $ReadComboOCCM = "Ordinateur" Then
; == 2 ==
If $ReadComboLvlActuel = 2 And $ReadComboLvlVoulu = 2 Then
Global $cubit = 0
Global $kittuning = 0
ElseIf $ReadComboLvlActuel = 2 And $ReadComboLvlVoulu = 3 Then
Global $cubit = $coLvl3
Global $kittuning = $cubit / 1000
ElseIf $ReadComboLvlActuel = 2 And $ReadComboLvlVoulu = 4 Then
Global $cubit = $coLvl3 + $coLvl4
Global $kittuning = $cubit / 1000
ElseIf $ReadComboLvlActuel = 2 And $ReadComboLvlVoulu = 5 Then
Global $cubit = $coLvl3 + $coLvl4 + $coLvl5
Global $kittuning = $cubit / 1000
EndIf
EndIf
EndIf
Voici un exemple de ma fonction calcul.
Je stock donc auparavant dans une variable le prix sans promotion ($coLvlx), je lis ensuite la ComboBox du niveau actuel et du niveau désiré.
Je fais cela jusqu'à $ReadComboLvlActuel = 2 And $ReadComboLvlVoulu = 15, puis je recommence mais cette fois-ci avec un If $ReadComboLvlActuel = 3 afin que toute les possibilité soit prise en compte.
Je me retrouve donc rapidement avec un code de plus de 4000 lignes.
Auriez-vous une astuce pour ce genre de calcul ?
Désolé si ce n'est pas trop bien expliqué..
Cordialement,
Apo.
Re: [..] Calcul de promotion
Posté : jeu. 19 févr. 2015 10:59
par timmalos
Il faudrait arriver à exprimer la formule de calcul quel que soit le niveau, vous n'auriez alors pas besoin de toutes ces étapes !
Re: [..] Calcul de promotion
Posté : jeu. 19 févr. 2015 11:17
par mikell
Je vois pas bien le rapport entre les différentes variables donc le code ci-dessous peut être inexact, mais en principe ça peut se faire avec des boucles For
Code : Tout sélectionner
If $ReadComboLvlActuel = 2 Then
For $i = 2 to 5
If $ReadComboLvlVoulu = $i Then
$cubit += Eval("coLvl" & $i)
$kittuning = $cubit / 1000
EndIf
Next
Edit
Mais timmalos a raison, une formule générale dans une fonction serait plus simple et plus efficace
Re: [..] Calcul de promotion
Posté : jeu. 19 févr. 2015 14:07
par ApoKLypsWarrior
Bonjour,
Tout d'abord merci de vos réponses.
Timmalos, effectivement c'est ce que je cherchais à faire mais je ne trouve pas.
Mikell, je vais essayer de cette façon, elle m'a l'air sympathique et prendra déjà beaucoup moins de place.
Est-ce possible de mettre une boucle For dans une boucle For ?
Je m'explique : Le LvlActuel doit ce faire de 2 à 14 et le LvlVoulu de 3 à 15.
Encore merci pour vos réponses.
EDIT : Mikell, votre boucle ne fonctionne pas car si le niveau actuel est 2 et que le niveau voulu est 5 alors il doit ajouté le niveau 3 + 4 + 5, or la il ne fait qu'afficher le prix du niveau voulu.
Cordialement,
Apo.
Re: [..] Calcul de promotion
Posté : jeu. 19 févr. 2015 17:51
par mikell
Hum désolé je n'ai pas compris grand'chose à l'explication
Peut-être comme ça ?
► Afficher le texte
Code : Tout sélectionner
If $ReadComboLvlActuel = 2 Then
For $i = 2 to 5
If $ReadComboLvlVoulu = $i Then
Local $cubit ; réinitialise la variable
For $k = 2 to $i
$cubit += Eval("coLvl" & $k) ; par exemple si $i = 4, $coLvl2+$coLvl3+$coLvl4
Next
$kittuning = $cubit / 1000
EndIf
Next
Et oui, on peut "emboiter" des boucles For
Re: [..] Calcul de promotion
Posté : jeu. 19 févr. 2015 19:06
par ApoKLypsWarrior
Merci pour cette aide, néanmoins ce n'est pas terminé. Je vais encore vous embêter un bout de temps
Voici comment j'ai adapter le code :
Code : Tout sélectionner
For $i = $ReadComboLvlActuel to 15
If $ReadComboLvlVoulu = $i Then
Local $cubit ; réinitialise la variable
For $k = $ReadComboLvlActuel to $i
$cubit += Eval("coLvl" & $k) ; par exemple si $i = 4, $coLvl2+$coLvl3+$coLvl4
Next
$kittuning = $cubit / 1000
EndIf
Next
A première vu, il m'a l'air correct, mais... Lorsque je lance la fonction calcul, le programme se ferme en me disant (si celui-ci est compilé) qu'une variable est utilisée avant d'être déclaré. Je n'arrive pas à trouver l'erreur. $cubit est déclaré, à moins que je ne me trompe..
Je vous remercie encore de m'aider et de vous penchez sur mon problème.
Cordialement,
Apo.
Re: [..] Calcul de promotion
Posté : jeu. 19 févr. 2015 21:47
par mikell
Voui certes mais là ça devient *un peu* compliqué, vu que je n'ai pas la moindre idée sur la nature des données entrées ni sur le calcul qui doit être effectué
Quel est le nom de la variable responsable de l'erreur ?
Est-ce que le script fonctionne correctement si non compilé ?
Un exemple serait le bienvenu (avec code testable si possible)
Re: [..] Calcul de promotion
Posté : ven. 20 févr. 2015 01:51
par ApoKLypsWarrior
Le nom de la variable ... Aucune idée, car lorsque le script n'est pas compilé celui-ci fonctionne mais ce ferme lors de l'utilisation de la fonction calcul.
Voici les données :
► Afficher le texte
Code : Tout sélectionner
#include <MsgBoxConstants.au3>
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
; = Ordinateur =
$coLvl3 = 300
$coLvl4 = 900
$coLvl5 = 1500
$coLvl6 = 2300
$coLvl7 = 5300
$coLvl8 = 6000
$coLvl9 = 9000
$coLvl10 = 1500
$coLvl11 = 23000
$coLvl12 = 34000
$coLvl13 = 50000
$coLvl14 = 74000
$coLvl15 = 113000
$Form1 = GUICreate("Test", 617, 521)
$ComboCEL = GUICtrlCreateCombo("", 32, 24, 105, 25, $CBS_DROPDOWNLIST)
GUICtrlSetData($ComboCEL, "Chasseur|Escorte|Liner", "Chasseur")
$ComboOCCM = GUICtrlCreateCombo("", 152, 24, 105, 25, $CBS_DROPDOWNLIST)
GUICtrlSetData($ComboOCCM, "Canon|Coque|Moteur|Ordinateur", "Canon")
$Label1 = GUICtrlCreateLabel("Niveau actuel", 32, 64, 99, 17)
$ComboLvlActuel = GUICtrlCreateCombo("", 192, 64, 65, 25, $CBS_DROPDOWNLIST)
GUICtrlSetData($ComboLvlActuel, "2|3|4|5|6|7|8|9|10|11|12|13|14|15", "2")
$Label2 = GUICtrlCreateLabel("Niveau désiré :", 32, 96, 75, 17)
$ComboLvlVoulu = GUICtrlCreateCombo("", 192, 96, 65, 25, $CBS_DROPDOWNLIST)
GUICtrlSetData($ComboLvlVoulu, "3|4|5|6|7|8|9|10|11|12|13|14|15", "3")
$Information = GUICtrlCreateLabel("", 40, 200, 545, 112)
$GroupInformation = GUICtrlCreateGroup("Information", 32, 176, 553, 145)
$Button1 = GUICtrlCreateButton("Calcul", 32, 136, 75, 25)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
_Calcul()
EndSwitch
WEnd
Func _Calcul()
Global $ReadComboCEL = GUICtrlRead($ComboCEL)
Global $ReadComboOCCM = GUICtrlRead($ComboOCCM)
Global $ReadComboLvlActuel = GUICtrlRead($ComboLvlActuel)
Global $ReadComboLvlVoulu = GUICtrlRead($ComboLvlVoulu)
If $ReadComboCEL = "Chasseur" Then
If $ReadComboOCCM = "Ordinateur" Then
; == 2 ==
For $i = $ReadComboLvlActuel To 15
If $ReadComboLvlVoulu = $i Then
Local $cubit ; réinitialise la variable
For $k = $ReadComboLvlActuel To $i
$cubit += Eval("coLvl" & $k) ; par exemple si $i = 4, $coLvl2+$coLvl3+$coLvl4
Next
Global $kittuning = $cubit / 1000
EndIf
Next
EndIf
EndIf
Global $cubit20 = $cubit * 0.80
Global $cubitpromo = ($cubit20 / 1000) * 800
_Information()
EndFunc ;==>_Calcul
Func _Information()
GUICtrlSetData($Information, "Il te faut " & $cubit & " Cubits ou " & $kittuning & " KitTuning pour effectuer l'amélioration." & @CRLF & @CRLF & _
"Avec la promotion -20% sur les " & $ReadComboOCCM & ", il te faut " & $cubit20 & " Cubits ou " & $cubit20 / 1000 & " KitTuning pour effectuer l'amélioration." & @CRLF & @CRLF & _
"En achetant les KitTuning à -20% et en les utilisant sur la promotion -20% sur les " & $ReadComboOCCM & ", il te faut " & $cubitpromo & " Cubits soit " & $cubit20 / 1000 & " KitTuning à -20%.")
EndFunc ;==>_Information
Voici un code testable, et nous voyons bien dans celui-ci que c'est la variable $cubit qui pose problème.
EDIT : Si je met la variable comme ceci dans la fonction _Information($cubit), elle serai donc bien déclaré ?
Cordialement,
Apo.
Re: [..] Calcul de promotion
Posté : ven. 20 févr. 2015 12:45
par mikell
Ah ça yest j'ai compris

Comme quoi avec un code complet ça va tout de suite mieux
Si tu dois utiliser certaines variables dans plusieurs fonctions il faut les déclarer en Global en tête de script (et ne pas les redéclarer ensuite)
D'une manière générale il est déconseillé de déclarer une variable en global dans une fonction
► Afficher le texte
Code : Tout sélectionner
#include <MsgBoxConstants.au3>
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
Global $ReadComboOCCM, $cubit, $cubit20, $kittuning, $cubitpromo
; = Ordinateur =
$coLvl3 = 300
$coLvl4 = 900
$coLvl5 = 1500
$coLvl6 = 2300
$coLvl7 = 5300
$coLvl8 = 6000
$coLvl9 = 9000
$coLvl10 = 1500
$coLvl11 = 23000
$coLvl12 = 34000
$coLvl13 = 50000
$coLvl14 = 74000
$coLvl15 = 113000
$Form1 = GUICreate("Test", 617, 521)
$ComboCEL = GUICtrlCreateCombo("", 32, 24, 105, 25, $CBS_DROPDOWNLIST)
GUICtrlSetData($ComboCEL, "Chasseur|Escorte|Liner", "Chasseur")
$ComboOCCM = GUICtrlCreateCombo("", 152, 24, 105, 25, $CBS_DROPDOWNLIST)
GUICtrlSetData($ComboOCCM, "Canon|Coque|Moteur|Ordinateur", "Canon")
$Label1 = GUICtrlCreateLabel("Niveau actuel", 32, 64, 99, 17)
$ComboLvlActuel = GUICtrlCreateCombo("", 192, 64, 65, 25, $CBS_DROPDOWNLIST)
GUICtrlSetData($ComboLvlActuel, "2|3|4|5|6|7|8|9|10|11|12|13|14|15", "2")
$Label2 = GUICtrlCreateLabel("Niveau désiré :", 32, 96, 75, 17)
$ComboLvlVoulu = GUICtrlCreateCombo("", 192, 96, 65, 25, $CBS_DROPDOWNLIST)
GUICtrlSetData($ComboLvlVoulu, "3|4|5|6|7|8|9|10|11|12|13|14|15", "3")
$Information = GUICtrlCreateLabel("", 40, 200, 545, 112)
$GroupInformation = GUICtrlCreateGroup("Information", 32, 176, 553, 145)
$Button1 = GUICtrlCreateButton("Calcul", 32, 136, 75, 25)
GuiSetState()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
_Calcul()
EndSwitch
WEnd
Func _Calcul()
$ReadComboCEL = GUICtrlRead($ComboCEL)
$ReadComboOCCM = GUICtrlRead($ComboOCCM)
$ReadComboLvlActuel = GUICtrlRead($ComboLvlActuel)
$ReadComboLvlVoulu = GUICtrlRead($ComboLvlVoulu)
If $ReadComboCEL = "Chasseur" Then
If $ReadComboOCCM = "Ordinateur" Then
; == 2 ==
For $i = $ReadComboLvlActuel To 15
If $ReadComboLvlVoulu = $i Then
$cubit = 0 ; réinitialise la variable
For $k = $ReadComboLvlActuel To $i
$cubit += Eval("coLvl" & $k) ; par exemple si $i = 4, $coLvl2+$coLvl3+$coLvl4
Next
$kittuning = $cubit / 1000
EndIf
Next
EndIf
EndIf
$cubit20 = $cubit * 0.80
$cubitpromo = ($cubit20 / 1000) * 800
_Information()
EndFunc ;==>_Calcul
Func _Information()
GUICtrlSetData($Information, "Il te faut " & $cubit & " Cubits ou " & $kittuning & " KitTuning pour effectuer l'amélioration." & @CRLF & @CRLF & _
"Avec la promotion -20% sur les " & $ReadComboOCCM & ", il te faut " & $cubit20 & " Cubits ou " & $cubit20 / 1000 & " KitTuning pour effectuer l'amélioration." & @CRLF & @CRLF & _
"En achetant les KitTuning à -20% et en les utilisant sur la promotion -20% sur les " & $ReadComboOCCM & ", il te faut " & $cubitpromo & " Cubits soit " & $cubit20 / 1000 & " KitTuning à -20%.")
EndFunc ;==>_Information
Re: [..] Calcul de promotion
Posté : ven. 20 févr. 2015 13:34
par ApoKLypsWarrior
Bonjour,
Je vous remercie ça fonctionne à merveille est prend beaucoup moins de place, mais... Encore une dernière erreur.
Dans la fonction _Information(), j'utilise la fonction $cubit afin d'afficher les cubits nécessaire à l'amélioration. Le problème étant que lorsque la variable est sollicitée elle ne s'affiche pas. Elle est pourtant bien utilisé pour la variable $cubit20 = $cubit * 0.80 qui elle fonctionne et s'affiche.
J'ai refais également la boucle afin qu'il ne prenne pas en compte le niveau actuel mais seulement l'amélioration :
Code : Tout sélectionner
For $i = $ReadComboLvlActuel To 15
If $ReadComboLvlVoulu = $i Then
Local $cubit
For $k = $ReadComboLvlActuel + 1 To $i
$cubit += Eval("coLvl" & $k)
Next
$kittuning = $cubit / 1000
EndIf
Next
Je tiens à vous remercier pour votre aide, et surtout merci je ne savais pas que l'on pouvait déclarer plusieurs variable en une ligne et sans donnée.
Cordialement,
Apo.
Re: [..] Calcul de promotion
Posté : ven. 20 févr. 2015 13:45
par mikell
Hum tu as lu mon code en diagonale et zappé une explication
Enlève "Local $cubit " et mets "$cubit = 0" pour réinitialiser la variable
Le fait de déclarer $cubit en local lui enlève son statut global (c.f. le fichier d'aide : Language Reference / Variables)
Re: [..] Calcul de promotion
Posté : ven. 20 févr. 2015 14:18
par ApoKLypsWarrior
Ah bah que c'est parfait tout ça !
Désolé pour mon idiotie
Un grand merci à vous et bonne continuation, je reviendrai surement vous voir bientôt !
Biz.