Page 1 sur 1

[Resolu] QCM

Publié : ven. 21/juin/2013 14:39
par Micoute
Je souhaiterais faire un questionnaire à choix multiples, dont j'aimerais qu'il affiche la bonne réponse + 2 mauvaises, mais qu'il ne sorte jamais les 2 ou 3 mêmes réponses et qu'en plus je souhaiterais qu'il ne pose pas plusieurs fois la même question.

J'espère avoir été concis dans mes désidératas et je vous remercie tous d'avance.

Re: QCM

Publié : ven. 21/juin/2013 14:47
par falsam
Je partirais d'une structure de ce style

Code : Tout sélectionner

Structure Question
  Actif.b              ;Déja posé oui ou non
  Question.s           ;La question
  Reponse.s[3]         ;Trois reponses prossible
  Indice.i             ;Numéro de la réponse correcte
  ReponseUtilisateur.i ;Réponse donnée par l'utilisateur
EndStructure

Global NewList QCM.Question()


Re: QCM

Publié : ven. 21/juin/2013 15:04
par Micoute
Merci falsam, je ne m'attendais pas à une réponse aussi rapide et en plus on peut comparer les questions et les réponses !

Re: QCM

Publié : sam. 22/juin/2013 15:50
par Micoute
Voici mon code et j'aimerais l'améliorer, j'aimerais qu'il ne pause pas plusieurs fois la même question.

Code : Tout sélectionner

Enumeration
   #Fenetre_Question
   #Fenetre_Resultat
EndEnumeration

Enumeration
   #Police
   #Police2
EndEnumeration

Enumeration
   #Texte
   #tNumero
   #tReponse
   #Bonne_Reponse
   #Mauvaise_Reponse_1
   #Mauvaise_Reponse_2
   #Region
EndEnumeration

#NbDep = 95
#Nb_Questions = 40

Structure Question
   Actif.b              ;Déja posée oui ou non
   Question.i           ;La question
   Reponse.i[3]         ;Trois reponses prossiblee
   Indice.i             ;Numéro de la réponse correcte
   ReponseUtilisateur.i ;Réponse donnée par l'utilisateur
EndStructure

Global NewList QCM.Question()
Global NewList Message$()

Global Dim Departement.s(2,#NbDep)
Global x, Compteur, Points, rep1$
Global Hasard, X1, X2, X3
Global Police = LoadFont(#Police, "Verdana",  11, #PB_Font_Bold)
Global Police2= LoadFont(#Police2, "Agnes"  ,  20, #PB_Font_Bold)

Procedure Lire_les_donnees()
   For i = 1 To #NbDep
      Read.s Departement(0,i)
      Read.s Departement(1,i)
      Read.s Departement(2,i)
   Next
EndProcedure

Procedure Aide()
   #fenetre_Aide = 0
   #Image = 2
   #Bouton_Aide_Ok = 3
   
   UsePNGImageDecoder()
   
   AddElement(Message$()) : Message$() = "Voici le principe:"
   AddElement(Message$()) : Message$() = ""
   AddElement(Message$()) : Message$() = "Tu as une série de 40 questions."
   AddElement(Message$()) : Message$() = ""
   AddElement(Message$()) : Message$() = "On te propose 3 réponses possibles, pour trouver celle"
   AddElement(Message$()) : Message$() = "qui correspond au département proposé, tu dois donc "
   AddElement(Message$()) : Message$() = "cliquer sur le bon numéro pour donner la bonne réponse"
   AddElement(Message$()) : Message$() = ""
   AddElement(Message$()) : Message$() = "On ne peut pas faire plus simple"
   AddElement(Message$()) : Message$() = ""
   AddElement(Message$()) : Message$() = "Je te souhaite un bon divertissement"
   
   OpenWindow(#fenetre_Aide, 0, 0, 530, 350, "Aide", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
   
   FirstElement(Message$())
   For Index = 0 To ListSize(Message$())-1
      TextGadget(100+index,60,10+Index*24,520,24,Message$())
      SetGadgetFont(100+Index, FontID(#Police))
      NextElement(Message$())
   Next
   
   CatchImage(#Image, ?iconeQuestion)
   ImageGadget(#Image, 5,5,40,40, ImageID(#Image))
   
   ButtonGadget(#Bouton_Aide_Ok, 245, 300, 40, 30, "Ok")
   SetGadgetFont(#Bouton_Aide_Ok, FontID(#Police))
   
   SetActiveGadget(#Bouton_Aide_Ok)
   
   ;- Boucle d'évenements Aide
   Repeat
      Select WaitWindowEvent()
         Case #PB_Event_Gadget
            Select EventGadget()
               Case #Bouton_Aide_Ok
                  CloseWindow(#fenetre_Aide)
                  Sortir = 1
            EndSelect
         Case #PB_Event_CloseWindow
            Select EventWindow()
               Case #fenetre_Aide
                  CloseWindow(#fenetre_Aide)
                  Sortir = 1
                  Break
            EndSelect
      EndSelect
   Until Sortir = 1
EndProcedure

Procedure Bonne_reponse()
   MessageRequester("Cool", "Trop bien !", #MB_OK)
EndProcedure

Procedure Mauvaise_reponse()
   MessageRequester("Désolé", "la réponse, c'était le "+Str(Val(Departement(0,QCM()\Reponse[0])))+Chr(10)+"Retiens-le pour la pochaine fois !", #MB_OK)
EndProcedure

Procedure.s Notation()
   Protected Texte.s
   Points/2
   Select Points
      Case 0
         Texte = "Tu n'as répondu à aucune question"
      Case 1 To 3
         Texte = " nul"
      Case 4 To 8
         Texte = " médiocre"
      Case 9 To 12
         Texte = " moyen"
      Case 13 To 15
         Texte = " assez bien"
      Case 16 To 18
         Texte = " très bien"
      Case 19 To 20
         Texte = " excellent"
   EndSelect
   ;Mon MessageRequester
   OpenWindow(#Fenetre_Resultat, 0, 0, 300, 120, "Bilan", #PB_Window3D_Borderless | #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
   TextGadget(#tReponse, 10,10, 280, 280, "Ta note est de "+Str(Points)+"/20"+Chr(10)+Chr(10)+ "Résultat : "+Texte, #PB_Text_Center)
   SetGadgetFont(#tReponse, FontID(#Police2))
   CloseWindow(#Fenetre_Question)
   Repeat
   Until WaitWindowEvent()= #PB_Event_CloseWindow
EndProcedure

Procedure placerBoutons()
   Hasard = Random(3, 1)
      
   Select Hasard
      Case 1
         X1 = 10
         X2 = 140
         X3 = 280
      Case 2
         X1 = 140
         X2 = 280
         X3 = 10
      Case 3
         X1 = 280
         X2 = 140
         X3 = 10
   EndSelect
EndProcedure

Procedure Questionnaire()
   OpenWindow(#Fenetre_Question, 30,30, 340, 150, "Question "+Str(Compteur), #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget )
   StickyWindow(#Fenetre_Question, 1)
   SetWindowColor(#Fenetre_Question,$D0FFD0)
   TextGadget(#Texte, 10, 10, 300, 20, "Quel est le numéro du département ", #PB_Text_Center)
   TextGadget(#tNumero, 10, 40, 300, 20, Left(Departement(1,QCM()\Question),1)+LCase(Mid(Departement(1,QCM()\Question),2)), #PB_Text_Center)	
   
   ButtonGadget(#Bonne_Reponse,          X1, 70, 40, 30, Departement(0, QCM()\Reponse[0]))
   ButtonGadget(#Mauvaise_Reponse_1, X2, 70, 40, 30, Departement(0, QCM()\Reponse[1]))
   ButtonGadget(#Mauvaise_Reponse_2, X3, 70, 40, 30, Departement(0, QCM()\Reponse[2]))
   
   TextGadget(#Region, 10, 110, 300, 20, "Région : " + Departement(2, QCM()\Reponse[0]), #PB_Text_Center)
   
   ;Définir les couleurs des gadgets
   SetGadgetColor(#Texte, #PB_Gadget_BackColor, $D0FFD0)
   SetGadgetColor(#tNumero, #PB_Gadget_BackColor, $D0FFD0)
   SetGadgetColor(#Region, #PB_Gadget_BackColor, $D0FFD0)
   
   ;Définir les polices
   SetGadgetFont(#Texte, FontID(#Police))
   SetGadgetFont(#tNumero, FontID(#Police))
   SetGadgetFont(#Bonne_Reponse, FontID(#Police2))
   SetGadgetFont(#Mauvaise_Reponse_1, FontID(#Police2))
   SetGadgetFont(#Mauvaise_Reponse_2, FontID(#Police2))
   SetGadgetFont(#Region, FontID(#Police))
   
   ;{- Boucle d'évenements	
   Repeat
      Select WaitWindowEvent()
         Case #PB_Event_Gadget
            Select EventGadget()
               Case #Bonne_Reponse
                  grepondu$="bien"
                  QCM()\ReponseUtilisateur = QCM()\Reponse[0]
               Case #Mauvaise_Reponse_1
                  grepondu$ = "faux"
                  QCM()\ReponseUtilisateur = QCM()\Reponse[1]
               Case #Mauvaise_Reponse_2
                  grepondu$ = "faux"
                  QCM()\ReponseUtilisateur = QCM()\Reponse[2]
            EndSelect
         Case #PB_Event_CloseWindow
            Select EventWindow()
               Case #Fenetre_Question
                  CloseWindow(#Fenetre_Question)
                  End
            EndSelect
      EndSelect
   Until grepondu$="bien" Or grepondu$ = "faux"
   ;}
   If grepondu$ = "bien"
      rep1$=GetGadgetText(#Bonne_Reponse) 
      If Val(rep1$)=Val(Departement(0, QCM()\Reponse[0]))
         Bonne_reponse()
         Points+1
      EndIf
   EndIf
   
   If grepondu$ = "faux"  
      Mauvaise_reponse()
   EndIf
   
   If Points=0
      MessageRequester("Pfff...", "Essaie de faire mieux." + Chr(10) + "Ce n'est quand même pas si dur.", #MB_ICONQUESTION)
   Else
      If Points < 2
         Texte$ = Str(Points)+" bonne réponse"
      Else
         Texte$ = Str(Points)+" bonnes réponses"
      EndIf
   EndIf
   
EndProcedure

;Début du programme
Select MessageRequester("Question", "Veux-tu tester tes capacités dans ce questionnaire ?", #PB_MessageRequester_YesNo)
   Case #IDYES
      Resultat = MessageRequester("","Désires-tu le mode d'emploi ?", #MB_YESNO)
      If Resultat = 6
         Aide()
      EndIf
      Lire_les_donnees()
      ;-debut du Questionnaire
      For Compteur = 1 To #Nb_Questions
         AddElement(QCM())
         QCM()\Reponse[0] = Random(#NbDep,1)	
         QCM()\Reponse[1] = Random(#NbDep,1)
         If QCM()\Reponse[1] = QCM()\Reponse[0]
            QCM()\Reponse[1] = Random(#NbDep,1)
         EndIf
         QCM()\Reponse[2] = Random(#NbDep,1)
         If QCM()\Reponse[2] = QCM()\Reponse[0] Or QCM()\Reponse[2] = QCM()\Reponse[1]
            QCM()\Reponse[2] = Random(#NbDep,1)
         EndIf
         
         QCM()\Question = QCM()\Reponse[0]
         placerBoutons()
         Questionnaire()
      Next
      Notation()
   Case #IDNO
      MessageRequester("A bientôt","Reviens quand même tester tes compétences plus tard!")
      End
EndSelect

Repeat 
   Evenement = WaitWindowEvent () 
Until Evenement = #PB_Event_CloseWindow ; si on appuie sur la croix, on ferme le programme 
End ; Fin du programme 

DataSection
   iconeQuestion:
   IncludeBinary "D:\Programmation\Prg perso\Gfx\Icones_MRP\iconeQuestion.png"
   
   Data.s "01", "AIN", "Rhône-Alpes", "02", "AISNE", "Picardie", "03", "ALLIER", "Auvergne", "04", "ALPES DE HAUTE PROVENCE ", "Provence-Alpes-Côte-d'Azur"
   Data.s "05", "HAUTES ALPES", "Provence-Alpes-Côte-d'Azur", "06", "ALPES MARITIMES", "Provence-Alpes-Côte-d'Azur", "07", "ARDECHE", "Rhône-Alpes"
   Data.s "08", "ARDENNES", "Champagne-Ardenne", "09", "ARIEGE", "Midi-Pyrénées", "10", "AUBE", "Champagne-Ardenne" , "11", "AUDE", "Languedoc-Roussillon"
   Data.s "12", "AVEYRON", "Midi-Pyrénées", "13", "BOUCHES DU RHONE", "Provence-Alpes-Côte-d'Azur", "14", "CALVADOS", "Basse-Normandie" 
   Data.s "15", "CANTAL", "Auvergne", "16", "CHARENTE", "Poitou-Charentes", "17", "CHARENTE MARITIME", "Poitou-Charentes", "18", "CHER", "Centre" 
   Data.s "19", "CORREZE", "Limousin", "20", "CORSE", "Corse" , "21", "COTE D'OR", "Bourgogne", "22", "COTES D'ARMOR", "Bretagne" 
   Data.s "23", "CREUSE", "Limousin", "24", "DORDOGNE", "Aquitaine", "25", "DOUBS", "Franche-Comté", "26", "DROME", "Rhône-Alpes"
   Data.s "27", "EURE",  "Haute-Normandie", "28", "EURE ET LOIR", "Centre", "29", "FINISTERE", "Bretagne", "30", "GARD", "Languedoc-Roussillon"
   Data.s "31", "HAUTE GARONNE", "Midi-Pyrénées", "32", "GERS", "Midi-Pyrénées", "33", "GIRONDE", "Aquitaine", "34", "HERAULT", "Languedoc-Roussillon"
   Data.s"35", "ILLE ET VILAINE", "Bretagne", "36", "INDRE", "Centre", "37", "INDRE ET LOIRE", "Centre", "38", "ISERE", "Rhône-Alpes"
   Data.s "39", "JURA",  "Franche-Comté", "40", "LANDES", "Aquitaine", "41", "LOIR ET CHER", "Centre", "42", "LOIRE", "Rhône-Alpes"
   Data.s "43", "HAUTE LOIRE", "Auvergne", "44", "LOIRE ATLANTIQUE", "Pays-de-la-Loire", "45", "LOIRET", "Centre", "46", "LOT", "Midi-Pyrénées"
   Data.s "47", "LOT ET GARONNE", "Aquitaine", "48", "LOZERE", "Languedoc-Roussillon", "49", "MAINE ET LOIRE", "Pays-de-la-Loire"
   Data.s "50", "MANCHE", "Basse-Normandie", "51", "MARNE", "Champagne-Ardenne", "52", "HAUTE MARNE", "Champagne-Ardenne" 
   Data.s "53", "MAYENNE", "Pays-de-la-Loire", "54", "MEURTHE ET MOSELLE", "Lorraine", "55", "MEUSE", "Lorraine", "56", "MORBIHAN", "Bretagne" 
   Data.s "57", "MOSELLE", "Lorraine", "58", "NIEVRE", "Bourgogne", "59", "NORD", "Nord-Pas-de-Calais", "60", "OISE", "Picardie"
   Data.s "61", "ORNE", "Basse-Normandie", "62", "PAS DE CALAIS", "Nord-Pas-de-Calais", "63", "PUY DE DOME", "Auvergne" 
   Data.s "64", "PYRENEES ATLANTIQUES", "Aquitaine", "65", "HAUTES PYRENEES", "Midi-Pyrénées", "66","PYRENEES ORIENTALES", "Languedoc-Roussillon"
   Data.s "67", "BAS RHIN", "Alsace", "68", "HAUT RHIN", "Alsace", "69", "RHONE", "Rhône-Alpes", "70", "HAUTE SAONE",  "Franche-Comté"
   Data.s "71", "SAONE ET LOIRE", "Bourgogne", "72", "SARTHE", "Pays-de-la-Loire", "73", "SAVOIE", "Rhône-Alpes", "74", "HAUTE SAVOIE", "Rhône-Alpes"
   Data.s "75", "PARIS", "Île-de-France", "76", "SEINE MARITIME", "Haute-Normandie", "77", "SEINE ET MARNE", "Île-de-France", "78", "YVELINES", "Île-de-France"
   Data.s "79", "DEUX SEVRES",  "Poitou-Charentes", "80", "SOMME", "Picardie", "81", "TARN",  "Midi-Pyrénées", "82", "TARN ET GARONNE", "Midi-Pyrénées"
   Data.s "83", "VAR",   "Provence-Alpes-Côte-d'Azur", "84", "VAUCLUSE", "Provence-Alpes-Côte-d'Azur", "85", "VENDEE", "Pays-de-la-Loire"
   Data.s "86", "VIENNE", "Poitou-Charentes", "87", "HAUTE VIENNE", "Limousin", "88", "VOSGES", "Lorraine", "89", "YONNE", "Bourgogne" 
   Data.s "90", "TERRITOIRE DE BELFORT", "Franche-Comté", "91", "ESSONNE", "Île-de-France", "92", "HAUTS DE SEINE", "Île-de-France"
   Data.s "93", "SEINE SAINT DENIS", "Île-de-France", "94", "VAL DE MARNE", "Île-de-France", "95", "VAL D'OISE",   "Île-de-France"
EndDataSection
Je remercie d'avance chacun d'entre vous qui voudra bien m'aider.

Re: QCM

Publié : sam. 22/juin/2013 16:46
par Ar-S

Code : Tout sélectionner

DeleteElement(Liste() [, Options]) 

Re: QCM

Publié : sam. 22/juin/2013 17:31
par G-Rom
Structure Question
[b]Actif.b ;Déja posée oui ou non[/b]
Question.i ;La question
Reponse.i[3] ;Trois reponses prossiblee
Indice.i ;Numéro de la réponse correcte
ReponseUtilisateur.i ;Réponse donnée par l'utilisateur
EndStructure
Pourquoi tu n'utilises pas le boolean que tu as mis en place ? 8O

Re: QCM

Publié : sam. 22/juin/2013 19:00
par Micoute
OK, c'est bon, merci à tous !