IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Turbo Pascal Discussion :

Comment permuter les questions dans un quiz [Turbo Pascal]


Sujet :

Turbo Pascal

  1. #1
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Par défaut Comment permuter les questions dans un quiz
    Salut à tous,
    J'ai fais un quiz avec 26 questions. Et j'aimerai permuter l'ordre des questions à chaque exécution de mon programme .
    je voulais utiliser la commande ''ramdom'' mais elle peut répéter une question 2 fois.
    Une personne a une idee ??
    merci

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Tu peux faire un algo qui mélange ton tableau de question (en supposant que tu as un tableau pour gérer tes données), en utilisant des algos de mélange et du random.

  3. #3
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Par défaut
    peux tu nous dire comment tu conserve tes données? en utilisant un tableau, un fichier, ou autres.
    Si tu utilise un tableau, tu peux faire simple en utilisant un algorithme comme celui qui suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    pour i de 1 à 26
      indice:=genererNombreDifferentDe(i);
      permuterElementTableau(i, indice);
    finPour

  4. #4
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Par défaut
    En fait j'utilise les tableaux du genre veb[n] n allant de de 1 a 26

    SVP je ne comprends pas bien cet algo.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i := 1 to 26 do begin
      indice:=genererNombreDifferentDe(i);
      permuterElementTableau(i, indice);
    readln(vveb[i]);
     end;

  5. #5
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Par défaut
    Le code que j'ai donné sert juste à distribuer les elements du tableau de façon aléatoire.
    Par exemple, si tu as un tableau (1,2,3,4,5), apres transformation, tu peux avoir (3,5,1,2,4).
    indice:=genererNombreDifferentDe(i);
    permuterElementTableau(i, indice);
    sont des fonction à definir. Les operaétions effectuées par ces fonctions se comprennent dejà en lisant leur noms.
    Peut etre que tu devrais poster une partie de ton code, pour nous permetre de bien te comprendre, et savoir exactement ce que tu veux faire

  6. #6
    Membre averti

    Inscrit en
    Janvier 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2009
    Messages : 37
    Par défaut
    Perso, je te conseillerai de sauvegarder les questions de ton quizz dans un fichier externe, ce qui te permettra, parce que cela devrait arriver, d'en augmenter les questions autant que bon te semble. Qui plus est, ce fichier, exploité à partir d'un notepad, par exemple, te permettrait de manipuler les 'copier'-'coller' de windows.

    Je me suis amusé à faire ce petit programme à ma façon, pas toujours trés "pascalement officielle". Tu noteras que le point-clé réside dans la constante max_questions qui fixe le volume maximum de questions du QUIZZ. A cette constante sont liées les variables [1..26]. Toute modification de max_questions demande de modifier les tableaux pour ne pas planter le programme.

    ET LA, je suis sûr qu'il y a une solution en mode tableau dynamique, pointeurs, etc...et je viens de prouver mes limites en TP

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    PROGRAM QUIZ;
    USES crt,dos;
     
    TYPE
    tableau_quizz = RECORD
       question :  string;
       selection : boolean;
    end;
     
    VAR
    cpta : byte;
    ff : text;
    nb_questions : byte;
    cle : char;
     
    veb : array[1..26] of tableau_quizz;
    tableau_genere : array[1..26] of byte;
     
    CONST
    max_questions : byte =26;
     
    PROCEDURE QUITTER(message : string[100]);
    begin
       clrscr;
       writeln(message);
       halt;
    end;
     
    PROCEDURE INITIALISE_QUIZZ;
    begin
       for cpta:=1 to max_questions do begin
          veb[cpta].question:='';
          veb[cpta].selection:=false;
          tableau_genere[cpta]:=0;
       end;
    end;
     
    PROCEDURE CHARGE_QUIZZ;
    begin
       {$I-}
       assign(ff,'quizz.txt');
       {$I+}
       if ioresult<>0 then quitter('FICHIER QUIZZ.TXT ABSENT DU REPERTOIRE');
       reset(ff);
       readln(ff,nb_questions);
       if nb_questions>max_questions then quitter('FICHIER QUIZZ POSSEDE PLUS DE QUESTIONS QUE LE PROGRAMME PEUT TRAITER');
       for cpta:=1 to nb_questions do readln(ff,veb[cpta].question);
    end;
     
    PROCEDURE GENERE_QUIZZ;
    VAR incremente : byte;
    alea : byte;
    begin
       randomize;
       incremente:=0;
       repeat
          alea:=succ(random(nb_questions));
    {permet de ne plus pouvoir sélectionner une question préalablement incluse dans le tri.
    la variable tableau_genere agit un peu comme un pointeur déguisé, donnant en fait la localisation (le n° d'ordre) dans la variable veb}
          if veb[alea].selection=false then begin
             inc(incremente,1);
             tableau_genere[incremente]:=alea;
             veb[alea].selection:=true;
          end;
       until incremente=nb_questions;
    end;
     
    BEGIN
       clrscr;
       initialise_quizz {mettre les variables à '0'};
       charge_quizz; {charger le fichier externe}
       genere_quizz; {faire le mélange aléatoier}
    {une méthode simplissime d'affichage sans effets}
       for cpta:=1 to nb_questions do begin
          clrscr;
          write(veb[tableau_genere[cpta]].question);
          repeat until keypressed;
          if keypressed then cle:=readkey;
          if cle=chr(27) then quitter('FIN DU PROGRAMME');
       end;
    END.
    Sur ce modèle, la variable record pourrait s'enrichir de champs comme 'réponse', 'points par réponse', etc...

    Espérant que cela t'aide et si quelqu'un sait transformer ce bazar en tableau dynamique, il m'éclairerait sûrement !

  7. #7
    Membre averti

    Inscrit en
    Janvier 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2009
    Messages : 37
    Par défaut
    Voici le fichier QUIZZ que j'ai utilisé pour tester le programme :
    Par habitude, je crée les deux premières lignes sous TP, je sauvegarde avec l'extension souhaitée, puis j'ouvre en NOTEPAD et je le manipule comme je veux.

    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    4
    QUEL EST L'AGE DU CHIEN
    POURQUOI
    QUOI
    COMMENT

    PS : j'ai essayé en FreePascal, le programme plante sur la fonction de lecture du fichier, et ne reconnaît pas Ioresult. J'ai peut-être une piste à suivre pour comprendre le passage de TP7 en FreePascal...

  8. #8
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Avec un tableau dynamique ou une liste chaînée, ça serait beaucoup plus simple en effet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    tant que il y a des lignes dans le fichier
        lire la prochaine ligne du fichier
        allouer une case mémoire pour la stocker
        copier la ligne lue en mémoire
    fin

  9. #9
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Par défaut
    Citation Envoyé par wormful_sickfoot Voir le message
    Avec un tableau dynamique ou une liste chaînée, ça serait beaucoup plus simple en effet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    tant que il y a des lignes dans le fichier
        lire la prochaine ligne du fichier
        allouer une case mémoire pour la stocker
        copier la ligne lue en mémoire
    fin
    Mais l'auteur de ce post sait il utilisé les listes chainée?

  10. #10
    Membre averti

    Inscrit en
    Janvier 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2009
    Messages : 37
    Par défaut
    C'est tout mon pb avec ces maudits tableaux dynamiques et pointeurs. La théorie est hyper-claire et somme toute très simple.

    C'est le passage en code Pascal qui me coince, même avec des aides. Ceci dit, si tu avais un code pour illustrer la théorie, je suis preneur.

    Sinon, LEX001, est-ce que cela semble répondre à ta question ?

  11. #11
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 971
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 971
    Par défaut
    Hea,
    Citation Envoyé par DUGUERPF Voir le message
    Tu noteras que le point-clé réside dans la constante max_questions qui fixe le volume maximum de questions du QUIZZ. A cette constante sont liées les variables [1..26].
    Puisque tu définis une constante, il est nécessaire d'aller au bout du principe : s'en servir pour définir les types qui en dépendent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    CONST
    max_questions : byte =26;
     
    type
    veb : array[1..max_questions] of tableau_quizz;
    tableau_genere : array[1..max_questions] of byte;
    Un principe est de ne pas utiliser de valeurs "magiques", c'est à dire codées en dur dans le code.

    Citation Envoyé par DUGUERPF Voir le message
    Toute modification de max_questions demande de modifier les tableaux pour ne pas planter le programme.
    Utiliser des constantes permet justement de n'avoir à modifier le code qu'à un endroit, sans avoir à chercher toutes les occurrences d'une valeur qu'on veut modifier.

    ----- ici, édité

    J'ai oublié de rappeler quelque chose : quand on définit une constante typée comme tu le fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CONST
    max_questions : byte =26;
    ce n'est pas une véritable constante, mais une variable initialisée (si, si, essaye de la modifier dans un petit programme ).

    C'est une des aberrations qui nous viennent de Borland, car étant de fait une variable, on devrait la déclarer dans la section var, mais comme on peut s'en servir comme constante, en particulier dans la définition de types, elle a sa place dans la section const.
    En clair, il aurait fallu créer une section spéciale pour ce type de déclaration, afin de lever toute ambiguïté.

  12. #12
    Membre averti

    Inscrit en
    Janvier 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2009
    Messages : 37
    Par défaut
    Miracle du net.

    Dire que je galère depuis des années à modifier à chaque fois des "constantes" qui servent dans beaucoup de variables, et que la solution était nettement plus...simple ! Merci de l'indication.

    Sinon, oui, je savais que toute CONST est effectivement modifiable (cause de bugs dans mes jeunes années). C'est en effet une curiosité de TP7 de le permettre !

  13. #13
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 971
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 971
    Par défaut
    Gea,
    Citation Envoyé par DUGUERPF Voir le message
    Sinon, oui, je savais que toute CONST est effectivement modifiable (cause de bugs dans mes jeunes années). C'est en effet une curiosité de TP7 de le permettre !
    Pas toute const.

    Toute const typée.

    Par exemple, avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const
      limite = 100;
     
      maxi : integer = 235;
    limite est une vraie constante, absolument non modifiable
    alors que maxi est en fait une variable initialisée, et est donc modifiable..

  14. #14
    Membre averti

    Inscrit en
    Janvier 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2009
    Messages : 37
    Par défaut
    Tout arrive à point à qui sait attendre.

    Il va y avoir quelques petits changements ce soir dans certains programmes...

  15. #15
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Par défaut
    merci a tout. en enfait je ne connais pas utiliser les listes chainée. Mais je pense que j'ai trouver ce que je cherchais.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment permuter l'ordre des questions dans un quiz
    Par lex001 dans le forum Débuter
    Réponses: 3
    Dernier message: 12/02/2009, 02h30
  2. [ClassPath]Comment inclure les librairies dans un .BAT
    Par Kyti dans le forum Général Java
    Réponses: 2
    Dernier message: 26/03/2005, 08h07
  3. Comment tuer les processus dans l'état sleeping sans EM ?
    Par David Guillouet dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 04/02/2005, 09h42
  4. Comment afficher les toolTipText dans une zone de statut ?
    Par nicok01 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 28/01/2005, 13h32
  5. Comment éviter les doublons dans ma table
    Par einegel dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/11/2004, 12h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo