[Resolu] QCM

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

[Resolu] QCM

Message 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.
Dernière modification par Micoute le sam. 22/juin/2013 19:00, modifié 3 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 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: QCM

Message 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()

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%
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: QCM

Message 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 !
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 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: QCM

Message 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.
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 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: QCM

Message par Ar-S »

Code : Tout sélectionner

DeleteElement(Liste() [, Options]) 
~~~~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
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: QCM

Message 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
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: QCM

Message par Micoute »

OK, c'est bon, merci à tous !
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 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre