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

C Discussion :

Stocker des questions et des réponses dans un programme de quizz


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 1
    Points : 3
    Points
    3
    Par défaut Stocker des questions et des réponses dans un programme de quizz
    Bonjour à tous.

    Pour mon projet de premier semestre, nous devons créer un jeu comme "qui veut gagner des millions" en C/C++, avec la bibliothèque ALLEGRO5.

    Le problème est que nous ne savons pas comment stocker les questions et les réponses (et la bonne réponse), et pour ensuite les appeler et les afficher dans une zone prédéfinie (les cases des questions).

    Pourriez-vous nous aider à y voir plus clair s'il vous plaît ?

    Bonne journée.

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Bonjour,

    Premièrement, ce sujet n'est pas dans le bon topic (débuter serait pas mal).

    Pour coder en C, il faut se donner les bons outils.
    le C propose des tas d'outils primitifs comme les entiers, les pointeurs, les opérations mathématiques.
    Il propose un petit ensembe d'outils plus pratiques, comme les fonctions de la bibliothèque standard (comme fopen() pour ouvrir un fichier)

    Enfin, il permet au développeur de créer ses outils, via les fonctions et les structures (ainsi que les énumérations et unions)

    Dans votre cas, vous devez vous fournir un vocabulaire de base.
    Votre programme doit contenir:
    • Un type représentant une question est ses réponses, et un moyen de savoir quelle est la bonne. Ca sera une structure, vu qu'il y a plusieurs parties,
    • une fonction pour compter les réponses possibles
    • une autre pour les lister
    • une troisième pour savoir si une des réponses est la bonne
    • très importante: deux fonctions pour créer et détruire une telle structure.


    Par ailleurs, vous envisagez de stocker les questions et réponses en dehors du programme. C'est une bonne idée, mais il faut un peu plus d'outils.
    Il faut choisir une forme au fichier, et le plus simple, c'est d'en faire un.
    Par exemple, ainsi:
    ?Quel est l'age du capitaine?
    vieux
    jeune
    *42 ans
    je ne sais pas
    ?Quelle est la capitale de la France?
    Berlin
    Londres
    *Paris
    Viennes
    
    Une fois fait, vous pouvez écrire deux fonctions chargées de lire et écrire des questions depuis/vers le fichier.

    Avec cela, votre programme deviendra plus simple.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    schizo mode on:
    Si par contre vous faites du C++, le problème est très légèrement différent.

    Plutot qu'avoir une structure avec des fonctions à côté, vous aurez une classe avec des fonctions membres.
    Notemment, un constructeur et un destructeur
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    Membre régulier
    Homme Profil pro
    Responsable ingénierie des logiciels - Recherche alternance
    Inscrit en
    Novembre 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable ingénierie des logiciels - Recherche alternance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 68
    Points : 92
    Points
    92
    Par défaut
    Ma réponse ne peut pas être plus complète que celle de "leternel" , cependant je suis surpris quand je vois :
    deux fonctions pour créer et détruire une telle structure.


    Détruire ok pas de problème, mais il n'y a pas besoin de fonction dont le but serait la création de la structure.
    Sa simple déclaration en tant que type, puis son initialisation suffit pour une utilisation de ce genre.

    A moins que par créer, tu entendais initialiser ...

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par leternel Voir le message
    Par ailleurs, vous envisagez de stocker les questions et réponses en dehors du programme...
    Ca je n'ai pas vu qu'il l'ait écrit...

    Citation Envoyé par Tom_Rgd Voir le message
    Le problème est que nous ne savons pas comment stocker les questions et les réponses (et la bonne réponse), et pour ensuite les appeler et les afficher dans une zone prédéfinie (les cases des questions).
    Une structure serait très appropriée
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct {
        char* text;
        char* choix[4];
        unsigned short reponse;
    } t_question;

    Puis un tableau contenant l'ensemble des questions... avec bien entendu une sentinelle ce qui évitera d'avoir à mémoriser leur nombre...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    t_question tab_questions[]={
        {"Capitale de la France", {"Paris", "Londres", "Berlin", "Rome"}, 1},
        {"Capitale de l'Allemagne", {"Paris", "Londres", "Berlin", "Rome"}, 3},
        {"Capitale de l'Italie", {"Paris", "Londres", "Berlin", "Rome"}, 4},
        {NULL, {NULL, NULL, NULL, NULL}, 0},
    };

    Ensuite suffit de balayer le tableau, afficher le texte, les 4 choix possibles, attendre une réponse et comparer si la réponse donnée correspond à celle attendue. Si ensuite, comme en parle Leternel, tu envisages de séparer le code (le programme) et les datas (les questions) il faudra alors un petit peu modifier la structure (surtout ne plus pointer vers des zones statiques du code mais avoir des tableaux permettant de stocker la question lors de son chargement) mais le principe reste le même...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre régulier
    Homme Profil pro
    Responsable ingénierie des logiciels - Recherche alternance
    Inscrit en
    Novembre 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable ingénierie des logiciels - Recherche alternance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 68
    Points : 92
    Points
    92
    Par défaut
    Pour répondre au précédent message de Sve@r :
    Bien entendu "détruire" n'est pas le terme approprié, mais alors mieux vaut-il dire vider ou libérer ?
    Encore cela dépend de quoi on parle, on peut "libérer" l'espace mémoire attribuer à un pointeur, mais on ne peut pas dire qu'on va libérer un int ou un char ...(à moins que ...). Si je vois "vider", je penserai avant tout à une réinitialisation à 0 de la variable ciblé (et encore là, j'ai beau me relire, je dois bien avouer que je doute de ce que je dis ...) les termes employés sont importants il est vrai, et peuvent portés à confusion.

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Ojiuiookojbezib Voir le message
    Bien entendu "détruire" n'est pas le terme approprié, mais alors mieux vaut-il dire vider ou libérer ?
    Encore cela dépend de quoi on parle, on peut "libérer" l'espace mémoire attribuer à un pointeur, mais on ne peut pas dire qu'on va libérer un int ou un char ...(à moins que ...). Si je vois "vider", je penserai avant tout à une réinitialisation à 0 de la variable ciblé
    Le terme "vider" signifie "enlever son contenu". On ne peut pas "enlever le contenu" d'une variable, on ne peut que le remplacer par autre chose. Par ailleurs à quoi bon "remettre" 0 dans une variable si, 3 lignes plus bas, on lui mettra une valeur utile ???
    "libérer" signifie "rendre disponible". C'est le bon terme à employer, qui se traduit fidèlement par la fonction free()...

    Mais dans l'exemple proposé par Leternel (qui s'est un peu laissé emballer par la fougue) il n'est pas besoin de "créer" et "détruire" une telle structure, mais juste de la remplir (à partir du fichier) et de l'afficher...

    Citation Envoyé par Ojiuiookojbezib Voir le message
    (et encore là, j'ai beau me relire, je dois bien avouer que je doute de ce que je dis ...)
    C'est bien. Ca signifie que tu commences à comprendre que certains termes ne peuvent pas s'employer en informatique et même, provoquent plus de soucis qu'autre chose. Si tu oublies définitivement "vider" ou "détruire" et que tu te contentes juste de te rappeler que "il ne faut jamais lire une variable sans d'abord y avoir écrit dedans" tu éviteras 90% de bugs. Eventuellement éviter en outre d'y "écrire deux fois d'affilée sans l'avoir lue entre temps" évitera des instructions inutiles mais malheureusement n'apportera pas grand chose (en dehors d'un petit orgueil justifié tout de même )
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre régulier
    Homme Profil pro
    Responsable ingénierie des logiciels - Recherche alternance
    Inscrit en
    Novembre 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable ingénierie des logiciels - Recherche alternance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 68
    Points : 92
    Points
    92
    Par défaut
    C'est bien. Ca signifie que tu commences à comprendre que certains termes ne peuvent pas s'employer en informatique et même, provoquent plus de soucis qu'autre chose.
    Oui, je suppose que je suis sûr la bonne voie, mais le chemin est long ahah . Le vocabulaire informatique est important, et pour ce faire, il faut bien comprendre les notions dont il est sujet pour éviter de porter à confusion. Néanmoins retourner au véritable sujet du topic.

    Puis un tableau contenant l'ensemble des questions... avec bien entendu une sentinelle ce qui évitera d'avoir à mémoriser leur nombre...
    Par "sentinelle", tu entends par là le "unsigned short" utilisé pour identifier la réponse à la question ? Jamais encore entendu ce terme de sentinelle, est-ce officiel ou purement informel ?

    Ensuite suffit de balayer le tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t_question tab_questions[]={
    Tu as du édité ton message, car au début il me semble que tu n'avais pas indiqué les " [ ] ", ça m'a quelque peu confus car si tu ne précise pas que c'est un tableau tu ne pourra pas accéder aux données de cette manière.

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Ojiuiookojbezib Voir le message
    Par "sentinelle", tu entends par là le "unsigned short" utilisé pour identifier la réponse à la question ? Jamais encore entendu ce terme de sentinelle, est-ce officiel ou purement informel ?
    Non, le "unsigned" n'est là que parce que pour chaque question, la réponse est comprise entre 1 et 4 donc inutile de forcer le compilo à mettre en place sa lourde stratégie d'expansion du bit de signe pour une valeur qui ne sera jamais négative (toujours ajuster ses types au mieux des valeurs qu'il à à manipuler). J'aurais même pu écrire unsigned char reponse car un caractère non signé n'est qu'un nombre compris entre 0 et 255 mais cela aurait un peu obscurci un lecteur peu habitué à ce jonglage (et puis il me semble qu'avec la stratégie d'optimisation du compilo qui s'adapte aux mots machines (souvent 2 octets) cela n'amène rien de plus).

    La sentinelle est une valeur "spéciale" permettant d'indiquer la fin du tableau. Et c'est un terme assez usité en algorithmique. Il suffit d'avoir un tableau excluant (dans ta logique de travail) certaines valeurs pour que tu puisses alors utiliser une de ces valeurs exclues comme "sentinelle". Par exemple, dans un tableau de positifs, tu pourras utiliser alors la valeur "-1" pour détecter ta fin (mais tu te prives de la plage des valeurs "unsigned"). Ici on pourra tester au choix soit le NULL de "text", soit un des 4 NULL des choix, soit la valeur "0" de "reponse"
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    t_question *pt;
    for (pt=tab_questions; pt->text != NULL /* ou bien pt->reponse != 0 */; pt++)
    {
        printf("%s ?\n", pt->text);
        ...
    }

    Ainsi, si je veux rajouter une question, je la rajoute dans mon tableau initial et c'est tout ; mon code s'adaptera tout seul (après recompilation évidemment !!!). Ca évite d'avoir à stocker la taille du tableau avec tous les inconvénients annexes (variable à passer ensuite aux fonctions qui manipulent le tableau ou macrodéfinition à faire évoluer quand le contenu change). Et je suis certain que tu as déjà entendu parler du '\0' terminant une chaine...

    Citation Envoyé par Ojiuiookojbezib Voir le message
    Tu as du édité ton message, car au début il me semble que tu n'avais pas indiqué les " [ ] ", ça m'a quelque peu confus car si tu ne précise pas que c'est un tableau tu ne pourra pas accéder aux données de cette manière.
    Hé oui, en me relisant j'ai vu cet oubli des crochets
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    J'avais volontairement utilisé détruire pour faire le lien sémantique avec le destructeur du C++.
    Cela ne change pas grand chose au fait qu'il vaut mieux proposer une fonction d'initialisation et une de suppression, pour libérer la mémoire interne.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

Discussions similaires

  1. [Débutant] Lire des fichiers texte en boucle dans un programme
    Par niepoc dans le forum MATLAB
    Réponses: 6
    Dernier message: 20/05/2008, 18h05
  2. Réponses: 2
    Dernier message: 02/06/2006, 12h59
  3. appel des fonctions d'un driver dans un programme en c
    Par richie25 dans le forum Windows
    Réponses: 5
    Dernier message: 10/01/2006, 08h27

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