[Résolu] peut-on incrémenter ou décrémenter une variable

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

[Résolu] peut-on incrémenter ou décrémenter une variable

Message par Micoute »

Bonjour à tous,

toujours dans mes programmes d'éducation pour mes petits-enfants, j'ai fabriqué un QCM et pour lire les données correspondantes à chaque question, je lis les données suivantes quand on clique sur le bouton précédant ou suivant, j'incrémente ou décrémente une variable prévue à cet effet, c'est pourquoi je viens solliciter votre aide, car je voudrais savoir si on peut faire une procédure simple ou une macro pour incrémenter ou décrémenter ma variable et lire des données adéquates, là je fait un raccourci de ma procédure et je suis limité à 50 question du fait des nombreux tests que je dois faire pour comparer ma variable, si vous pouvez m'aider, ce serait merveilleux et je vous en remercie à l'avance.

Code : Tout sélectionner

Procedure Clic_Btn_Precedant()  ;Reculer d'une série
  Select EventType()
    Case #PB_EventType_LeftClick
      S - 1
      If S =  49
        Restore S49
      ElseIf S = 48
        Restore S48
      ElseIf S =  ...
        Restore S...
      ElseIf S = 2
        Restore S2
      ElseIf S = 1
        Restore S1
      Else
        S = 50
        Restore S50
      EndIf
      
      Lire_les_donnees()
      Mettre_a_jour()
  EndSelect
EndProcedure
Dernière modification par Micoute le sam. 12/janv./2019 7:00, modifié 1 fois.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: peut-on incrémenter ou décrémenter une variable

Message par boby »

Je crois que tu cherches trop compliqué là où il n'y a pas raison à se compliquer la vie Micoute.

Code : Tout sélectionner

Structure QCM
  question.s
  Choix1.s
  Choix2.s
  Choix3.s
EndStructure
Global NewList questions.QCM()

For a = 0 To 50
  AddElement(questions())
  With questions()
    \question = "question "+a
    \Choix1 = "Choix 1 Q "+a
    \Choix2 = "Choix 2 Q "+a
    \Choix3 = "Choix 3 Q "+a
  EndWith
Next

Procedure ChangeQuestion()
  If EventGadget() = 5
    PreviousElement(questions())
  ElseIf EventGadget() = 6
    NextElement(questions())
  EndIf
  SetGadgetText(1,questions()\question)
  SetGadgetText(2,questions()\Choix1)
  SetGadgetText(3,questions()\Choix2)
  SetGadgetText(4,questions()\Choix3)
  
EndProcedure

OpenWindow(0,10,10,500,300,"QCM",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
TextGadget(1,10,10,480,50,"",#PB_Text_Border)
CheckBoxGadget(2,10,100,480,20,"")
CheckBoxGadget(3,10,140,480,20,"")
CheckBoxGadget(4,10,180,480,20,"")
ButtonGadget(5,10,220,50,20,"precedent")
ButtonGadget(6,300,220,50,20,"suivant")
FirstElement(questions())
ChangeQuestion()
BindGadgetEvent(5,@ChangeQuestion())
BindGadgetEvent(6,@ChangeQuestion())
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
El Papounet
Messages : 57
Inscription : mer. 09/juin/2010 23:47

Re: peut-on incrémenter ou décrémenter une variable

Message par El Papounet »

Je ne maitrise pas très bien les macros, mais c'est à essayer (en supposant que le label des données est bien S1, S2, S3...):

Code : Tout sélectionner

Macro myRestore(n)
  Restore S#n
EndMacro

Procedure Clic_Btn_Precedant()  ;Reculer d'une série
  Select EventType()
    Case #PB_EventType_LeftClick
      S - 1
      myRestore(S)
      Lire_les_donnees()
      Mettre_a_jour()
  EndSelect
EndProcedure
Edit: Ça fonctionne bien si on passe un nombre en paramètre de la macro, mais ça provoque une erreur si on passe une variable. Désolé :oops:
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: peut-on incrémenter ou décrémenter une variable

Message par Micoute »

Bonjour El Papounet,

les labels sont bien une suite de S1 à S50 dans mon cas et j'avais eut la même idée que toi, en passant ces paramètres dans une macro, hélas ça me sort un message d'erreur "Ligne 160: Label manquant (SS)".

Il y a sûrement une autre méthode que je n'ai pas envisagée. :roll:

En tous cas merci beaucoup de m'avoir donné de ton temps.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: peut-on incrémenter ou décrémenter une variable

Message par djes »

Faire une liste de pointeurs te permettrait de passer à l'étape suivante de ton cours : les tableaux...

Nb : précédent
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: peut-on incrémenter ou décrémenter une variable

Message par boby »

djes a écrit :Faire une liste de pointeurs te permettrait de passer à l'étape suivante de ton cours : les tableaux...
Oui ou... Une liste, avec question suivante = nextelement() et question précédente = previouselement, enfin, comme dans l'exemple donné 4 postes plus haut.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: peut-on incrémenter ou décrémenter une variable

Message par djes »

Zut... Non, pas une liste comme ça, ça serait sauter des étapes dans son cours. Non, des datas contenant les adresses des zones de données (ou éventuellement des adresses relatives), comme on a toujours fait en assembleur.
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: peut-on incrémenter ou décrémenter une variable

Message par Marc56 »

À moins d'avoir une grande quantité de données, la logique d'un programme de QCM est:

1. Charger toutes les données (Read) dans une liste ou un tableau
2. Avancer ou reculer avec NextElement/PreviousElement ou avec l'indice du tableau

Think simple
Ne surtout pas se prendre la tête avec des pointeurs quand on débute.
Ne pas faire des Read multiples

:wink:
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

[Résolu] peut-on incrémenter ou décrémenter une variable

Message par Micoute »

Merci à tous pour votre contribution très constructive pour moi,

finalement, j'avais déjà opté pour la proposition de Marc56, juste pour faire plus simple.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: peut-on incrémenter ou décrémenter une variable

Message par boby »

@Djes Mais si on voulais faire comme on fait en assembleur... On coderais en assembleur o_O si on utilise des langage comme purebasic c'est justement pour ne pas avoir à se prendre la tête avec ce genre de fonctionnement. Pourquoi utiliser un outil comme pure si ce n'est pas pour utiliser ses fonctions sinon ???

@Micoute as tu au moins lancé l'exemple que je t'ai donné ? Par-ce que je ne voie pas vraiment comment faire plus simple en fait...
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: peut-on incrémenter ou décrémenter une variable

Message par djes »

Marc56 a écrit :À moins d'avoir une grande quantité de données, la logique d'un programme de QCM est:

1. Charger toutes les données (Read) dans une liste ou un tableau
2. Avancer ou reculer avec NextElement/PreviousElement ou avec l'indice du tableau

Think simple
Ne surtout pas se prendre la tête avec des pointeurs quand on débute.
Ne pas faire des Read multiples

:wink:
Ça dépend du type d'enseignement qu'on veut apporter. Là apparemment il le fait à l'ancienne avec des read et des datas. Quand je parle de pointeurs, il ne s'agit que de labels disposés dans des datas, et ça permet de très bien comprendre ce qu'est une zone de données, et qu'elle peut stocker aussi bien des données que des adresses.
Par exemple :

Code : Tout sélectionner

TableAdressesData:
data.i ?S1, ?S2, ?S3
data.i 0 ; un marqueur de fin quelconque
S1:
data.i 1, 2, 3, 4
S2:
data.s "yop"
S3:
data.f 1.01, 3.14, 2.5
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: peut-on incrémenter ou décrémenter une variable

Message par boby »

Là apparemment il le fait à l'ancienne avec des read et des datas. Quand je parle de pointeurs, il ne s'agit que de labels disposés dans des datas
Encore une fois, ça n’empêche pas de faire une procédure pour stocker les données dans une liste au lancement du logiciel pour ensuite simplement naviguer dans tes question comme tu navigue dans une liste : question suivante = nextelement(), question précédente = previouselement().
Ça reste probablement la méthode la plus simple et avec une toute petite structure tu as au même "pointeur" ta question, les choix possible, les réponses qui ont été sélectionnées etc... Avec les machines qu'on a aujourd'hui, il n'y a plus vraiment d’intérêt à économiser quelques Ko de RAM... On a largement de quoi stocker sans se poser de question et je pense que la simplicité de code est plus importante que l'optimisation tans qu'on reste dans le domaine du pouillème de ressources supplémentaire consommé.
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: peut-on incrémenter ou décrémenter une variable

Message par Ar-S »

Je suis de l'avis de boby
Les outils comme les list/structures/map sont idéales pour les QCM..

Code : Tout sélectionner

; Exemple QCM avec Map // Ar-S

Declare Launch(question)
Declare Rempli(question)


Global NumQuestion
Global.s rep

Structure CHOIX
  Question.s
  BonneRep.s
  Rep1.s
  Rep2.s
  Rep3.s
EndStructure

Global NewMap QCM.CHOIX()

; LES QUESTIONS ===================================
; Tu peux très bien allez chercher tes éléments dans un fichiers texte, tes datasections etc... 
; ici je les inscris directement
QCM("0")\Question = "Combien font 3*6"
QCM()\Rep1 = "16"
QCM()\Rep2 = "18"
QCM()\Rep3 = "21"
QCM()\BonneRep = QCM()\Rep2
  
QCM("1")\Question = "Quel est la capitale de la France"
QCM()\Rep1 = "Marseilles"
QCM()\Rep2 = "Lyon"
QCM()\Rep3 = "Paris"
QCM()\BonneRep = QCM()\Rep3
;==============================================


  Procedure WinD()
  
  If OpenWindow(0, 0, 0, 220, 130, "QCM", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    StickyWindow(0,1)
    ButtonGadget  (1, 10, 94, 200, 30, "Valider")
    OptionGadget(2, 10, 31, 110, 20, "")
    OptionGadget(3, 10, 52, 110, 20, "")
    OptionGadget(4, 10, 73, 110, 20, "")
    TextGadget(5,10,10,210,20,"")
    
    NumQuestion = 0
    
    Rempli(NumQuestion)
    
    Repeat
      Event = WaitWindowEvent()
      
      Select Event

        Case #PB_Event_Gadget
          Select EventGadget()
            Case 1 
              Launch(NumQuestion)
              
              ; ici je boucle entre les 2 questions vu que j'en ai mis que 2 (Question 0 et Question 1)
              If NumQuestion = 0
                NumQuestion +1
              Else
                NumQuestion -1
              EndIf
              
              
              Rempli(NumQuestion)
              ; déselection des Optionsgadgets
              For i = 2 To 4
                SetGadgetState(i, 0)
              Next
           Case 2
              Rep.s = GetGadgetText(2)
             
              ; Extension
            Case 3
              Rep.s = GetGadgetText(3)
              
            Case 4
              Rep.s = GetGadgetText(4)  
              
          EndSelect
          
      EndSelect
    Until Event = #PB_Event_CloseWindow
  EndIf
  
EndProcedure


Procedure Rempli(question)

  ; on rempli le QCM
  MapKey( QCM() )
  SetGadgetText(5, QCM(Str(question))\Question )
  SetGadgetText(2, QCM(Str(question))\Rep1)
  SetGadgetText(3, QCM(Str(question))\Rep2)
  SetGadgetText(4, QCM(Str(question))\Rep3)
 EndProcedure


Procedure Launch(question)
If FindMapElement(QCM(), Str(question))
  Debug "Question " + question
Else
  Debug "no more question"
ProcedureReturn 0
EndIf

MapKey( QCM() )
If LCase(Rep.s) = LCase(QCM(Str(question))\BonneRep)
  Debug "reponse exacte"
  Debug ""
Else
  Debug "reponse fausse"
  Debug "La bonne réponse est " + QCM(Str(question))\BonneRep
  Debug ""
  EndIf



EndProcedure


WinD()
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: peut-on incrémenter ou décrémenter une variable

Message par Micoute »

Excuse-moi boby, mais en fait je ne l'avais même pas vu, car il était noyé sous la tonne de réponses et j'en profite pour remercier tout le monde et de te dire que je le trouve excellent, il y a tellement de manières pour arriver au même résultat que j'admire l'équipe que à conçu PureBasic, j'espère qu'un jour ce logiciel de développement merveilleux soit hissé au dessus de tous les autres.

Je remercie aussi Ar-s pour excellent exemple avec des Maps, une preuve de plus pour féliciter chaleureusement l'équipe de Fred.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: peut-on incrémenter ou décrémenter une variable

Message par djes »

boby a écrit :
Là apparemment il le fait à l'ancienne avec des read et des datas. Quand je parle de pointeurs, il ne s'agit que de labels disposés dans des datas
Encore une fois, ça n’empêche pas de faire une procédure pour stocker les données dans une liste au lancement du logiciel pour ensuite simplement naviguer dans tes question comme tu navigue dans une liste : question suivante = nextelement(), question précédente = previouselement().
Ça reste probablement la méthode la plus simple et avec une toute petite structure tu as au même "pointeur" ta question, les choix possible, les réponses qui ont été sélectionnées etc... Avec les machines qu'on a aujourd'hui, il n'y a plus vraiment d’intérêt à économiser quelques Ko de RAM... On a largement de quoi stocker sans se poser de question et je pense que la simplicité de code est plus importante que l'optimisation tans qu'on reste dans le domaine du pouillème de ressources supplémentaire consommé.
Et encore une fois (je peux être obtus aussi), cela dépend de sa façon d'enseigner. Le contexte est bien celui d'apprendre à programmer, étape par étape. J'ai appris seul, enfant. Pendant des années, le simple concept de tableau était hors de ma portée, et les listes n'existaient même pas. Une liste est une chaîne de pointeurs, c'est un concept extrêmement abstrait. Avant de comprendre une chaîne, et même un tableau, il faut comprendre le concept de mémoire... Enfin voilà, c'est mon avis, maintenant, chacun fait comme il veut.
Répondre