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 saisie | Nombre de lignes | Nombre d'étoiles maximal | Position des étoiles |
---|---|---|---|
1 | 1 | 1 | 1 |
2 | 2 | 3 | 2, 123 |
3 | 3 | 5 | 3, 234, 12345 |
4 | 4 | 7 | 4, 345, 23456, 1234567 |
... | ... | ... | ... |
20 | 20 | 39 | 20, ... |
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.
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.
Où sans utilisé de char[]:
Oui c’est une autre façon de faire. L’avantage de votre méthode c’est qu’on n’est pas limité par la taille de la ligne.
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 🙂 :
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.
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 !