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 :
- Définir les questions et les choix
- Recueillir les réponses de l’utilisateur
- Valider les réponses
- 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
- Questions et options :
- Deux questions sont définies dans des tableaux de chaînes de caractères, avec leurs options correspondantes.
- Afficher les questions :
- La fonction
afficher_question()
affiche les questions et les options.
- La fonction
- Recueillir les réponses :
- L’utilisateur entre plusieurs réponses en une seule ligne, séparées par des espaces, et termine par “0”.
- Validation :
- La fonction
est_reponse_correcte()
compare les réponses de l’utilisateur avec les bonnes réponses.
- La fonction
- 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 :
- Initialiser le chronomètre avant de poser la question.
- Mesurer le temps écoulé pendant que l’utilisateur répond.
- Limiter le temps à une certaine durée pour chaque question (par exemple, 30 secondes).
- 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 variabledebut
.
Fonction difftime()
:
- La fonction
difftime(fin, debut)
calcule la différence de temps en secondes entrefin
(temps actuel) etdebut
(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.