• 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 02/03/2022

Utiliser les pointeurs pour aller plus loin en C

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

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 :

  1. Supposons que le mot caché soit "ROUGE".
  2. Le joueur propose une lettre à l'ordinateur, par exemple la lettre "A".
  3. L'ordinateur vérifie si cette lettre se trouve dans le mot caché.
  4. 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.
  5. 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 variable  nombreLettres  ?

    • 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 tableau  lettreTrouvee  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 pointeur  LettreTrouvee  ?

    • int *lettreTrouvee;

    • int lettreTrouvee = NULL;

    • int lettreTrouvee;

    • int *lettreTrouvee = NULL;

  • Question 3

    Une fois le pointeurlettreTrouveedéclaré, vous devez ensuite allouer la mémoire avec le nombre de lettres grâce à la fonction malloc

    lettreTrouvee = malloc(nombreLettres * sizeof(int));


    Vous allez maintenant créer une fonction  initTableau  qui permet d'initialiser l’ensemble des cases de notre tableau à 0.

    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;
      }
      }