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

Contenu supprimé Contenu ajouté
m Révocation des modifications de 81.192.238.113 (discussion) vers la dernière version de Sigma 7
Ligne 74 :
 
== Structures répétitives ==
===Analyse de programme : boucle simple===
=== Triangle d'étoiles ===
Soit le programme suivant :
<source lang="c">
#include <stdio.h>
#include <stdlib.h>
int main(void){
int i;
for (i=0;i<5;i++) {// "/": division entiere
(void)printf("Module EC%d\n",(i+9)/(i+1));
}
return EXIT_SUCCESS;
}
</source>
Qu'affichera à l'écran l'exécution de ce programme ?
{{Boîte déroulante|titre=solution|contenu=
La seule difficulté de ce programme est la division entière, d'ailleurs précisée dans le commentaire. C'est la division que l'on a appris à l'école primaire : 5 / 2 : quotient = 2 et reste =1. La division entière donne le quotient c'est à dire 2 (et non pas 2,5 !!!)
<pre>
Module EC9
Module EC5
Module EC3
Module EC3
Module EC2
</pre>
}}
 
 
===Analyse de programme : boucle simple et tableau===
Soit le programme suivant :
<source lang="c">
#include <stdio.h>
#include <stdlib.h>
int main(void){
unsigned char i;
unsigned char tab[5];
//initialisation du tableau
tab[0]=1;tab[1]=2;tab[2]=4;tab[3]=8;tab[4]=16;
for (i=0;i<5;i++) {
(void)printf("Le %d° elt est %d\n",i+1,tab[i]);
}
return EXIT_SUCCESS;
}
</source>
Qu'affichera à l'écran l'exécution de ce programme ?
 
{{Boîte déroulante|titre=solution|contenu=
Tableau de 5 cases numérotées de 0 à 4. Le programme affiche tout simplement son contenu :
<pre>
Le 1° elt est 1
Le 2° elt est 2
Le 3° elt est 4
Le 4° elt est 8
Le 5° elt est 16
</pre>
}}
 
 
=== Somme d'entiers (boucle simple) ===
Ecrire un programme ''somme'' demandant à l'utilisateur de taper 10 entiers et qui affiche leur somme. Le programme ne devra utiliser que 3 variables et ne devra pas utiliser de tableau.
 
<div style="width:70%">{{Boîte déroulante|titre=Solution|contenu =
<source lang="c">
/*
Programme : somme
Role : demander 10 entiers et afficher leur somme
Compilation :
gcc -Wall -std=c99 -o somme.exe somme.c
Execution :
./somme.exe
Version 2.0 du 9/1/2008
*/
#include <stdio.h>
#include <stdlib.h>
#define NB_ENTIERS 10
int main(void)
{
int valeurLue = 0;
int somme = 0;
// Lecture des valeurs
(void)printf("Vous allez devoir entrer %d entiers\n", NB_ENTIERS);
for (int i = 0; i < NB_ENTIERS ; i++)
{
// Demande et lecture de l'entier
(void)printf("Tapez l'entier de rang %d : ", i+1);
(void)scanf("%d", &valeurLue);
somme = somme + valeurLue;
} // for (int i = 0...
// Affichage du résultat
(void)printf("la somme des %d entiers vaut : %d\n",
NB_ENTIERS, somme);
return EXIT_SUCCESS;
} // int main(...
</source>
 
'''Remarques qualité sur la correction proposée''' :
* Un cartouche d'entête indique des informations utiles dont les particularités de la compilation (-std=c99), la version.
* Les messages guident l'utilisateur : il sait ou il en est dans sa saisie.
* Utilisation d'une constante symbolique ''NB_ENTIERS'' au lieu de valeurs littérales 10 : si le nombre d'entier à demander change, il n'y aura qu'une seule ligne à modifier au lieu de 3 dans notre cas.
*''for (int i = 0'' : c'est une syntaxe autorisée 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)printf(...'' : la fonction printf retourne le nombre de caractères écrit dans le flux de sortie. 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.
*Le code retour de scanf est ignoré. Il renvoie le nombre de valeurs correctement récupérée. 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.
 
}} </div>
 
=== 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>
Ligne 193 ⟶ 301 :
'''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>
 
=== Somme d'entiers ===
Ecrire un programme ''somme'' demandant à l'utilisateur de taper 10 entiers et qui affiche leur somme. Le programme ne devra utiliser que 3 variables et ne devra pas utiliser de tableau.
 
<div style="width:70%">{{Boîte déroulante|titre=Solution|contenu =
<source lang="c">
/*
Programme : somme
Role : demander 10 entiers et afficher leur somme
Compilation :
gcc -Wall -std=c99 -o somme.exe somme.c
Execution :
./somme.exe
Version 2.0 du 9/1/2008
*/
#include <stdio.h>
#include <stdlib.h>
#define NB_ENTIERS 10
int main(void)
{
int valeurLue = 0;
int somme = 0;
// Lecture des valeurs
(void)printf("Vous allez devoir entrer %d entiers\n", NB_ENTIERS);
for (int i = 0; i < NB_ENTIERS ; i++)
{
// Demande et lecture de l'entier
(void)printf("Tapez l'entier de rang %d : ", i+1);
(void)scanf("%d", &valeurLue);
somme = somme + valeurLue;
} // for (int i = 0...
// Affichage du résultat
(void)printf("la somme des %d entiers vaut : %d\n",
NB_ENTIERS, somme);
return EXIT_SUCCESS;
} // int main(...
</source>
 
'''Remarques qualité sur la correction proposée''' :
* Un cartouche d'entête indique des informations utiles dont les particularités de la compilation (-std=c99), la version.
* Les messages guident l'utilisateur : il sait ou il en est dans sa saisie.
* Utilisation d'une constante symbolique ''NB_ENTIERS'' au lieu de valeurs littérales 10 : si le nombre d'entier à demander change, il n'y aura qu'une seule ligne à modifier au lieu de 3 dans notre cas.
*''for (int i = 0'' : c'est une syntaxe autorisée 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)printf(...'' : la fonction printf retourne le nombre de caractères écrit dans le flux de sortie. 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.
*Le code retour de scanf est ignoré. Il renvoie le nombre de valeurs correctement récupérée. 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.
 
}} </div>