- 10 heures
- Moyenne
Ce cours est visible gratuitement en ligne.
course.header.alt.is_video
Ce cours existe en livre papier.
course.header.alt.is_certifying
J'ai tout compris !Mis à jour le 14/02/2024
Utiliser les pointeurs pour aller plus loin en C
Compétences évaluées
- Utiliser des pointeurs
Description
Pour ce quiz, vous allez réaliser, au fil des questions, un jeu en console : le jeu du Pendu (un grand classique où il faut deviner un mot caché, lettre par lettre).
Voici un rappel du déroulement du jeu du Pendu :
- Supposons que le mot caché soit "ROUGE".
- Le joueur propose une lettre à l'ordinateur, par exemple la lettre "A".
- L'ordinateur vérifie si cette lettre se trouve dans le mot caché.
- Si oui, on dévoile la lettre du mot. Si non, on indique que la lettre ne s'y trouve pas et on diminue le nombre de coups restants.
- Quand il ne reste plus de coups (0), le jeu est terminé et on a perdu.
Voici à quoi devrait ressembler une partie en console lorsque votre programme sera terminé :
Bienvenue dans le Pendu !
Il vous reste 10 coups a jouer
Quel est le mot secret ? *****
Proposez une lettre : A
Il vous reste 9 coups a jouer
Quel est le mot secret ? *****
Proposez une lettre : O
Il vous reste 9 coups a jouer
Quel est le mot secret ? *O***
Proposez une lettre : E
Il vous reste 9 coups a jouer
Quel est le mot secret ? *O**E
Proposez une lettre : R
Et ainsi de suite jusqu'à ce que le joueur ait découvert toutes les lettres du mot (ou bien qu'il ne lui reste plus de coups à jouer) :
Il vous reste 8 coups a jouer
Quel est le mot secret ? ROU*E
Proposez une lettre : G
Gagne ! Le mot secret etait bien : ROUGE
Prenons la fonction main suivante qu’on va modifier au fur et à mesure des questions :
#include <stdio.h>
#include <ctype.h>
int main(int argc, char* argv[])
{
char lettre = 0; // Stocke la lettre proposée par l'utilisateur (retour du scanf)
char motSecret[] = "ROUGE"; // C'est le mot à trouver
int coupsRestants = 10; // Compteur de coups restants (0 = mort)
return 0;
}
Ajoutons une fonction qui permet de calculer la taille du mot :
int tailleMot(char motSecret[])
{
int nombreLettres = 0;
for(int i = 0; motSecret[i] != '\0'; i++)
{
nombreLettres++;
}
return nombreLettres;
}
Question 1
Quelle ligne devez-vous ajouter dans la fonction
main
pour enregistrer la taille du mot dans la variablenombreLettres
?tailleMot(motSecret);
int nombreLettres = tailleMot(motSecret);
nombreLettres = tailleMot(motSecret);
tailleMot(motSecret) = nombreLettres;
Question 2
Vous allez créer un tableau
LettreTrouvee
de booléen à l’aide d’un pointeur, en effet ce tableau aura la même taille que le tableau qui contient chaque lettre du mot. Chaque case sera associée à une lettre trouvée ou non. Les cases du tableau sont au départ initialisées à 0, ce qui signifie "Lettre non trouvée". Au fur et à mesure de l'avancement du jeu, ce tableau sera modifié. Pour chaque lettre du mot secret trouvée, la case correspondante du tableaulettreTrouvee
sera mise à 1.Il faut donc donc tout d’abord créer un pointeur
LettreTrouvee
et l’initialiser àNULL
.Quelle instruction devez-vous ajouter au
main
pour déclarer et initialiser le pointeurLettreTrouvee
?int *lettreTrouvee;
int lettreTrouvee = NULL;
int lettreTrouvee;
int *lettreTrouvee = NULL;
Question 3
Une fois le pointeur
lettreTrouvee
déclaré, vous devez ensuite allouer la mémoire avec le nombre de lettres grâce à la fonctionmalloc
:lettreTrouvee = malloc(nombreLettres * sizeof(int));
Vous allez maintenant créer une fonctioninitTableau
qui permet d'initialiser l’ensemble des cases de notre tableau à 0. N'oubliez pas d'appeler cette fonction dans votre code.Quelle serait la bonne définition de la fonction
initTableau
?int* initTableau(int* lettreTrouvee, int taille) { for(int i = 0; i < taille; i++) { lettreTrouvee[i] = 0; } return *lettreTrouvee; }
int* initTableau(int lettreTrouvee[], int taille) { for(int i = 0; i < taille; i++) { lettreTrouvee[i] = 0; } }
void initTableau(int* lettreTrouvee, int taille) { for(int i = 0; i < taille; i++) { lettreTrouvee[i] = 0; } }
void initTableau(int* lettreTrouvee, int taille) { for(int i = 0; i < taille; i++) { *lettreTrouvee[i] = 0; } }
- Formations jusqu’à 100 % financées
- Date de début flexible
- Projets professionnalisants
- Mentorat individuel