« Exercices en langage C/Structures de contrôle » : différence entre les versions

Contenu supprimé Contenu ajouté
Ligne 375 :
A noter la ligne vide en tout début.
}}
 
=== Triangle d'étoiles (double boucles)===
Compléter la fonction afficherTriangle dans le programme ci-dessous : cette fonction devra afficher un triangle rempli d'étoiles (*) sur un nombre de lignes donné passé en paramètre, exemple :
<pre>
*
**
***
****
*****
******
*******
********
</pre>
 
* 1ère version : sans utiliser de tableau à l'aide de deux boucles ''for'' imbriquées.
* 2ème version : avec une seule boucle ''for'' et un tableau de chaîne de caractère où vous accumulerez des étoiles.
 
<source lang="c">
/*
Nom : etoile.c
Compilation : gcc -Wall -std=c99 -o etoile.exe etoile.c
Exécution : ./etoile.exe
*/
#include <stdio.h>
#include <stdlib.h>
 
/*
Nom ... : afficherTriangle
Role .. : Afficher un triangle d'etoiles
Parametre :
nbLignes : nombre de lignes du triangle
*/
static void afficherTriangle(const int nbLignes)
{
// Partie à compléter
} // static void afficherTriangle(...
 
// Fonction principale pour test
int main(void)
{
int nbLignes = 0;
int nbChampsLu = 0;
int codeRetour = EXIT_SUCCESS;
 
(void)fputs("Lignes ? ", stdout);
nbChampsLu = scanf("%u", &nbLignes);
if (nbChampsLu == 1 && nbLignes > 0)
{
afficherTriangle(nbLignes);
}
else
{
(void)fputs("Erreur : Vous devez entrer un entier strictement positif !\n",
stderr);
codeRetour = EXIT_FAILURE;
}
 
return codeRetour;
} // int main(...
</source>
 
<div style="width:70%">{{Boîte déroulante|titre=Solution|contenu =
 
'''1ère version''' : sans utiliser de tableau à l'aide de deux boucles ''for'' imbriquées.
 
<source lang="c">
/*
Nom ... : afficherTriangle
Role .. : Afficher un triangle d'etoiles
Parametre :
nbLignes : nombre de lignes du triangle
Version 1 du 9/1/2008
*/
static void afficherTriangle(const int nbLignes)
{
for (int numLigne = 1; numLigne <= nbLignes; numLigne++)
{
for (int numColonne = 1; numColonne <= numLigne; numColonne++)
{
(void)putchar('*');
}
(void)putchar('\n');
}
} // static void afficherTriangle(...
</source>
 
'''Remarque''' :
*''for (int i = 0'' : c'est une syntaxe introduite en C99. Avec les anciennes normes C, La variable aurait dû être déclarée hors de la boucle. Cette nouvelle syntaxe permet d'avoir des variables d'itération locales à la boucle for.
* ''(void)putchar('*');'' : la fonction putchar retourne le caractère écrit dans le flux de sortie ou EOF en cas d'erreur. Comme j'ai décidé de ne pas utiliser ce code retour, je le signale en castant à void la fonction. L'outil qualité ''lint'' signale toute fonction retournant une valeur qui n'est pas affectée à une variable ou ignoré explicitement. Cela permet d'éviter l'erreur qui consiste à oublier de traiter un code retour de fonction.
Dans un code opérationnel robuste, tous les codes retours doivent être traités et un traitement doit être prévu en cas d'erreur. Le type void n'existait pas en C K&R.
 
 
'''2ème version''' : avec une seule boucle ''for'' et un tableau de chaîne de caractère où vous accumulerez des étoiles.
 
<source lang="c">
/*
Nom ... : afficherTriangle
Role .. : Afficher un triangle d'etoiles
Parametre :
nbLignes : nombre de lignes du triangle
Version 2 du 9/1/2008
*/
static void afficherTriangle(const int nbLignes)
{
// Déclaration de la chaine de caractère (voir ma remarque)
char chaineEtoiles[nbLignes+1];
// Initialisation du tableau avec un terminateur de chaine
chaineEtoiles[0] = '\0';
for (int numLigne = 1; numLigne <= nbLignes; numLigne++)
{
(void)strcat(chaineEtoiles, "*");
(void)puts(chaineEtoiles);
}
} // static void afficherTriangle(...
</source>
 
'''Remarque''' :
* Le tableau chaineEtoiles est de type VLA (Variable-Length Arrays) introduite par C99. Avec les versions de C précédente, il aurait fallu allouer dynamiquement le tableau au début du programme, puis le désalloué à la fin.
 
}} </div>
 
 
[[Catégorie:Exercices en langage C (livre)|Structures de controle]]