Pyramide d’étoiles en langage C

L’exercice de la pyramide d’étoile ou triangle d’étoiles est un programme classique dans l’apprentissage du langage C. L’exercice consiste à demander à l’utilisateur au lancement du programme combien il veut de lignes dans sa pyramide et ensuite afficher la pyramide correspondante.

Par exemple, si l’utilisateur souhaite afficher 4 lignes d’étoiles, le programme devra afficher :

   *
  ***
 *****
*******

Le code à écrire pour réaliser ce programme est très court mais il devient rapidement prise de tête si l’algorithme d’affichage n’est pas posé de façon claire dès le départ. C’est pourquoi avant de commencer l’écriture du code nous allons analyser le résultat pour les premières valeurs des lignes pour en déduire un comportement générique quel que soit le nombre de lignes à afficher.

Saisie d’une valeur par l’utilisateur

Pour récupérer dans une variable la valeur saisie au clavier par l’utilisateur de programme, on va utiliser la fonction scanf(). Dans cet exemple nous n’effectuerons aucun contrôle de format (valeur numérique uniquement, valeur positive), on suppose que la valeur saisie sera toujours un entier positif.

Bien évidemment pour être utilisé par des personnes lambda, des contrôles supplémentaires devront être mis en place.

// Déclaration des variables
unsigned int nbLignes;               // Nombre de lignes d'étoile à afficher
 
// Prompt de saisie du nombre de lignes
printf("Entrez le nombre de lignes d'etoiles que vous voulez dans la pyramide : ");
scanf("%d", &nbLignes);

On dispose maintenant d’une variable nbLignes contenant le nombre de lignes d’étoiles que l’utilisateur veut afficher.

Analyse du problème

Pour implémenter l’algorithme, il faut partir sur les premières lignes de la pyramide et en déduire une solution qui respecte cette règle et construise le triangle d’étoile correspondant.

Valeur saisieNombre de lignesNombre d'étoiles maximalPosition des étoiles
1111
2232, 123
3353, 234, 12345
4474, 345, 23456, 1234567
............
20203920, ...

 

Grâce à ce tableau on commence à voir le début de la solution :

  • La ligne la plus longue affichée sera la dernière de la pyramide. Le nombre d’étoiles affichées sur la ligne sera de (nbLignes x 2) – 1.
  • Le programme va s’articuler autour d’une boucle variant entre 0 et (nbLignes – 1). A chaque tour de boucle, le programme affiche une nouvelle ligne de la pyramide.
  • La position de départ sur la première ligne se trouve nbLignes soit ligne[nbLignes – 1] car en C les tableaux sont indicés à partir de 0.
  • A chaque tour de boucle i, les étoiles sont ajoutées aux positions (nbLignes – i) et (nbLignes + i)

Maintenant que l’algorithme est trouvé, il reste à la transposer dans le langage C en prenant en compte que les tableaux de longueur N :

  • Varient de 0 à N-1
  • La position N contient \0, le caractère de fin de chaîne

Il faut donc déduire 1 sur la position de l’étoile centrale dans le programme.

centreLigne = nbLignes -1;
 
for (i=0; i<nbLignes; i++) {
  printf("Affichage de la ligne %d\n", i);
  printf("====== Nouvelle etoile a la position : %d\n", (centreLigne - i));
  printf("====== Nouvelle etoile a la position : %d\n", (centreLigne + i));
}

Ce qui lors de l’exécution du programme va afficher les valeurs des indices à mettre à jour à chaque nouvelle ligne traitée.

Pyramide d'étoile en langage C

Programme final

On dispose maintenant de toutes les informations nécessaires pour finaliser le programme. Il suffit maintenant de définir un modèle de ligne générique vide. Il suffit de repartir de la boucle précédente et à chaque tour au lieu d’afficher le message à l’écran on va positionner la case correspondante avec *. Une fois la ligne correctement alimentée, on va l’afficher sur la sortie standard, c’est-à-dire l’écran.

#include <stdio.h>
#define MAX_ETOILE 100
 
int main(void) {
  // Déclaration des variables
  unsigned int nbLignes;	// Nombre de lignes d'étoile à afficher
  unsigned int centreLigne;
  int i;
  char ligne[MAX_ETOILE];	// Ligne d'étoiles
 
  // Prompt de saisie du nombre de lignes
  printf("Entrez le nombre de lignes d'etoiles que vous voulez dans la pyramide : ");
  scanf("%d", &nbLignes);
 
  // Initialisation à vide de la ligne
  for(i=0; i<MAX_ETOILE; i++) {
    ligne[i] = ' ';
  }
  ligne[MAX_ETOILE - 1] = '\0';
 
  centreLigne = nbLignes -1;
  for (i=0; i<nbLignes; i++) {
    ligne[centreLigne - i] = '*';
    ligne[centreLigne + i] = '*';
 
    // Affichage de la ligne
    printf("%s\n", ligne);
  }  
 
  return 0;
}

On obtient bien une pyramide d’étoiles dynamique en fonction du paramètre renseigné par l’utilisateur.

Pyramide d'étoiles finale

5 réflexions au sujet de “Pyramide d’étoiles en langage C”

  1. Où sans utilisé de char[]:

    int main() {
    	int i, j, k, nb, esp ;
    	
    	printf ("nombres de lignes :\n");
    	scanf ("%d", &nb);
    
    	esp = nb-1 ;
    	for (i=0;i<nb;++i){
    		for (j=0;j<(esp-i);++j){
    			printf (" ");
    		}
    		for (k=0;k<=(2*i);++k){
    			printf ("*");
    		}
    		printf ("\n");
    	}
    }
    Répondre
  2. Une autre solution qui utilise une boucle pour le nombre de ligne où l’on imbrique une boucle pour afficher les caractères ( » « ) ou (« * »). On jouera avec les intervalles 🙂 :

    int main(void) {
      int n;
      int max;
      int interval1;
      int interval2;
      int cursor;
      
      printf("Nombre de lignes à afficher : ");
      scanf("%d", &n);
      
      max = n + n -1;
      interval1 = max/2;
      interval2 = max/2+2;
    
      while(n > 0) {
        for(cursor = 1; cursor <= max; cursor++) {
          if(cursor > interval1 && cursor < interval2) {
            printf("*");
          } else {
            printf(" ");
          }
        }
        interval1--;
        interval2++;
        printf("\n");
        n--;
      }
      return 0;
    }
    Répondre
  3. Si vous pouvez m’aider, je n’ai pas encore vu ce ‘\0’ en classe mais je dois l’utiliser pour résoudre un problème et je ne sais pas ce que cela signifie.

    Répondre
    • Bonjour Tuan Mira,

      En C, le caractère \0 indique une fin de chaîne de caractère. C’est lorsqu’elles rencontrent ce caractère particulier que les fonctions qui travaillent sur les chaînes savent qu’elles ont atteint le dernier caractère significatif.

      Ce qui implique que pour stocker une chaîne de 10 caractères, il faut déclarer un tableau de 11 cases car on compte toujours le caractère \0.

      Voici une explication rapide mais tu trouveras plein de cours à ce sujet sur Internet. Bon courage !

      Répondre

Répondre à Tuan Mira Annuler la réponse