Langage C/C++

Guide : Comment créer un QCM en langage C avec cases à cocher

Le QCM en langage C peut être simulé dans un programme console en offrant plusieurs réponses à l’utilisateur, où il devra choisir en entrant un numéro correspondant à sa sélection. Bien qu’il ne soit pas possible d’implémenter des cases à cocher graphiques en langage C directement (puisque C est un langage de bas niveau qui fonctionne surtout en mode texte), nous pouvons simuler ce comportement en permettant à l’utilisateur de faire plusieurs sélections via des entrées multiples.

Objectifs :

  • Créer un programme en langage C pour simuler un QCM.
  • Permettre à l’utilisateur de choisir plusieurs réponses (simuler les cases à cocher).
  • Valider les réponses et calculer un score.

Étapes :

  1. Définir les questions et les choix
  2. Recueillir les réponses de l’utilisateur
  3. Valider les réponses
  4. Afficher les résultats

Exemple de programme

Voici un exemple simple de programme C pour un QCM avec plusieurs questions et des réponses multiples possibles :

#include <stdio.h>

void afficher_question(int numero_question, char* question, char* options[]) {
    printf("Question %d: %s\n", numero_question, question);
    for (int i = 0; i < 4; i++) {
        printf("%d. %s\n", i + 1, options[i]);
    }
    printf("Entrez vos réponses (séparées par des espaces) et terminez par '0' : ");
}

int est_reponse_correcte(int reponses_utilisateur[], int bonnes_reponses[], int taille) {
    for (int i = 0; i < taille; i++) {
        if (reponses_utilisateur[i] != bonnes_reponses[i]) {
            return 0; // Faux
        }
    }
    return 1; // Vrai
}

int main() {
    // Définir les questions et les options
    char* questions[] = {
        "Quels sont les langages de programmation ?",
        "Quels sont les types de boucles en C ?"
    };

    char* options_q1[] = {"Python", "C", "HTML", "Java"};
    char* options_q2[] = {"for", "while", "if", "do-while"};

    int bonnes_reponses_q1[] = {2, 4};  // C et Java
    int bonnes_reponses_q2[] = {1, 2, 4};  // for, while, do-while

    int reponses_utilisateur[4];
    int score = 0;

    // Question 1
    afficher_question(1, questions[0], options_q1);

    // Lire les réponses
    int index = 0;
    while (1) {
        scanf("%d", &reponses_utilisateur[index]);
        if (reponses_utilisateur[index] == 0) {
            break;
        }
        index++;
    }

    // Validation des réponses pour la question 1
    if (est_reponse_correcte(reponses_utilisateur, bonnes_reponses_q1, 2)) {
        score++;
    }

    // Réinitialiser pour la prochaine question
    for (int i = 0; i < 4; i++) {
        reponses_utilisateur[i] = 0;
    }
    index = 0;

    // Question 2
    afficher_question(2, questions[1], options_q2);

    while (1) {
        scanf("%d", &reponses_utilisateur[index]);
        if (reponses_utilisateur[index] == 0) {
            break;
        }
        index++;
    }

    // Validation des réponses pour la question 2
    if (est_reponse_correcte(reponses_utilisateur, bonnes_reponses_q2, 3)) {
        score++;
    }

    // Affichage du score
    printf("Votre score : %d/2\n", score);

    return 0;
}

Explication du programme

  1. Questions et options :
    • Deux questions sont définies dans des tableaux de chaînes de caractères, avec leurs options correspondantes.
  2. Afficher les questions :
    • La fonction afficher_question() affiche les questions et les options.
  3. Recueillir les réponses :
    • L’utilisateur entre plusieurs réponses en une seule ligne, séparées par des espaces, et termine par “0”.
  4. Validation :
    • La fonction est_reponse_correcte() compare les réponses de l’utilisateur avec les bonnes réponses.
  5. Score :
    • Un score est calculé en fonction des bonnes réponses données par l’utilisateur.

Comment améliorer ce programme ?

  • Interface utilisateur graphique : Pour créer de vraies cases à cocher, il faudrait utiliser une interface graphique avec des bibliothèques comme GTK ou Qt.
  • Plus de questions : Ajouter plus de questions et une validation dynamique.
  • Sauvegarde des résultats : Enregistrer les résultats dans un fichier.

Ce programme vous permettra de créer un QCM en console C, avec la possibilité de sélectionner plusieurs réponses, simulant ainsi des cases à cocher.

Comment ajouter un chronomètre au QCM ?

Pour ajouter un chronomètre à votre programme de QCM en langage C, vous pouvez utiliser la bibliothèque standard <time.h>, qui vous permet de gérer et mesurer le temps écoulé. L’idée est de mesurer le temps que l’utilisateur prend pour répondre à chaque question ou pour l’ensemble du QCM.

Voici comment vous pouvez implémenter un chronomètre qui limite le temps de réponse à chaque question.

Étapes :

  1. Initialiser le chronomètre avant de poser la question.
  2. Mesurer le temps écoulé pendant que l’utilisateur répond.
  3. Limiter le temps à une certaine durée pour chaque question (par exemple, 30 secondes).
  4. Si le temps est écoulé, passer à la question suivante automatiquement.

Exemple avec chronomètre :

#include <stdio.h>
#include <time.h>  // Pour la gestion du temps

#define TEMPS_LIMITE 30  // Temps limite en secondes par question

void afficher_question(int numero_question, char* question, char* options[]) {
    printf("Question %d: %s\n", numero_question, question);
    for (int i = 0; i < 4; i++) {
        printf("%d. %s\n", i + 1, options[i]);
    }
    printf("Entrez vos réponses (séparées par des espaces) et terminez par '0' : ");
}

int est_reponse_correcte(int reponses_utilisateur[], int bonnes_reponses[], int taille) {
    for (int i = 0; i < taille; i++) {
        if (reponses_utilisateur[i] != bonnes_reponses[i]) {
            return 0; // Faux
        }
    }
    return 1; // Vrai
}

int main() {
    // Définir les questions et les options
    char* questions[] = {
        "Quels sont les langages de programmation ?",
        "Quels sont les types de boucles en C ?"
    };

    char* options_q1[] = {"Python", "C", "HTML", "Java"};
    char* options_q2[] = {"for", "while", "if", "do-while"};

    int bonnes_reponses_q1[] = {2, 4};  // C et Java
    int bonnes_reponses_q2[] = {1, 2, 4};  // for, while, do-while

    int reponses_utilisateur[4];
    int score = 0;
    time_t debut, fin;  // Variables pour le chronomètre

    // Question 1
    afficher_question(1, questions[0], options_q1);

    // Chronométrage du temps de réponse
    time(&debut);  // Prendre le temps de départ
    int index = 0;

    // Lire les réponses jusqu'à ce que le temps soit écoulé ou que l'utilisateur entre "0"
    while (1) {
        time(&fin);  // Prendre le temps actuel
        if (difftime(fin, debut) >= TEMPS_LIMITE) {
            printf("\nTemps écoulé !\n");
            break;
        }

        scanf("%d", &reponses_utilisateur[index]);
        if (reponses_utilisateur[index] == 0) {
            break;
        }
        index++;
    }

    // Validation des réponses pour la question 1
    if (est_reponse_correcte(reponses_utilisateur, bonnes_reponses_q1, 2)) {
        score++;
    }

    // Réinitialiser pour la prochaine question
    for (int i = 0; i < 4; i++) {
        reponses_utilisateur[i] = 0;
    }
    index = 0;

    // Question 2
    afficher_question(2, questions[1], options_q2);

    // Chronométrage du temps de réponse
    time(&debut);  // Prendre le temps de départ

    while (1) {
        time(&fin);  // Prendre le temps actuel
        if (difftime(fin, debut) >= TEMPS_LIMITE) {
            printf("\nTemps écoulé !\n");
            break;
        }

        scanf("%d", &reponses_utilisateur[index]);
        if (reponses_utilisateur[index] == 0) {
            break;
        }
        index++;
    }

    // Validation des réponses pour la question 2
    if (est_reponse_correcte(reponses_utilisateur, bonnes_reponses_q2, 3)) {
        score++;
    }

    // Affichage du score
    printf("Votre score : %d/2\n", score);

    return 0;
}

Explication du code avec chronomètre

Bibliothèque <time.h> :

  • Utilisée pour gérer le temps et mesurer le temps écoulé entre deux événements.

time_t debut, fin; :

  • Deux variables de type time_t pour stocker le temps de début (debut) et le temps de fin (fin).

Fonction time() :

  • La fonction time(&debut) est utilisée pour obtenir le temps actuel, à un instant donné, et le stocker dans la variable debut.

Fonction difftime() :

  • La fonction difftime(fin, debut) calcule la différence de temps en secondes entre fin (temps actuel) et debut (temps de départ).

Limitation de temps :

  • Si le temps écoulé (difftime(fin, debut)) atteint ou dépasse la valeur définie dans #define TEMPS_LIMITE (par exemple, 30 secondes), le programme interrompt la saisie des réponses et passe à la question suivante.

Résultat

Le programme donne à l’utilisateur 30 secondes pour répondre à chaque question. Si le temps est écoulé avant que l’utilisateur ne termine de répondre, un message s’affiche disant que le temps est écoulé, et le programme passe à la question suivante.

Améliorations possibles

  • Appliquer une limite de temps globale pour l’ensemble du questionnaire.
  • Afficher un compte à rebours pour informer l’utilisateur du temps restant.
  • Gérer une interface graphique pour afficher les questions avec un chronomètre visuel en utilisant des bibliothèques comme GTK ou Qt pour une véritable interface utilisateur avec des cases à cocher.

Autres articles

Guide : Implémenter get_iemedans des fichiers avec...
La fonction get_iemepermet de récupérer le i-ème élément d'un fichier...
Read more
Guide : Implémenter un Fichier en Tableau...
Les fichiers en tableaux circulaires (ou files d'attente circulaires )...
Read more
Guide : Fichiers en Tableaux Circulaires en...
Les tableaux circulaires (ou buffers circulaires) sont des structures de...
Read more

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *