# Exercices en langage C/Structures de contrôle

* Préparation
* Notions de base
* Les variables et constantes
* Les types
* Les opérateurs
* Les structures de contrôle
* Les tableaux statiques
* Les fonctions
* Les chaînes de caractères
* Les pointeurs
* Le préprocesseur C
* Préparation
* Notions de base
* Les variables et constantes
* Les types
* Les opérateurs
* Les structures de contrôle
* Les tableaux statiques
* Les fonctions
* Les chaînes de caractères
* Les pointeurs
* Le préprocesseur C
[ Modifier le sommaire ]

## Structures conditionnelles
### Analyse de programme : choix multiple

Ces exercices d'analyses doivent être réalisés sans compilateurs, à la main à l'aide d'un crayon et d'une feuille de papier.
Soit le programme suivant :
Qu'est ce qui sera affiché à l'écran lors de l'exécution de ce programme ?
Même question pour le programme :
* pour le premier programme :
Comme i vaut 7 au début du programme, on pourrait penser que i/2 donne 3.5 qui est arrondi à 4 (puisqu'affecté à une variable entière sur un octet). Mais il n'en est rien : 8/3 = 2.66 ne donne pas plus 3 mais seulement 2... parce que 8/3 donne un quotient de 2 avec 2 comme reste et que l'on s'intéresse à ce quotient justement ! C'est cela la division entière. Don quand on arrive au switch, i vaut 3 et donc
s'affiche à l'écran.
* Pour le deuxième programme, c'est
qui s'affiche car :
est la même chose que :
Remarquons que
donnerait exactement le même résultat (dans le switch).
La suppression des break a des conséquences importantes. Par exemple
afficherait :

### Test simple : programme non complet

Écrire la partie de programme réalisant la structure de contrôle demandée. On ne demande pas le programme en entier : pas les "include" pas le main...
Un test sur une valeur dans la variable i : si i vaut 19 on écrit "OK" autrement on écrit "Rejet"
Cet exercice n'est qu'un échauffement pour l'exercice suivant.
L'erreur la plus fréquente est d'écrire :
qui affichera toujours OK quelle que soit la valeur de i ! Pouvez-vous comprendre pourquoi ? Parce que i=19 met 19 dans i qui n'est pas zéro et donc est vrai... et toujours vrai !!!

### Tester votre âge

Écrire un programme testage.c contenant une fonction main qui :
* lit sur le clavier l'âge de l'utilisateur avec la fonction scanf;
* teste si la réponse est valide par analyse du code retour de scanf et teste si la valeur est comprise entre 0 et 130;
* affiche si l'utilisateur est majeur (>= 18 ans) ou mineur.

## Structures répétitives
### Analyse de programme : boucle simple

Cet exercice d'analyse doit être réalisé sans compilateur, à la main à l'aide d'un crayon et d'une feuille de papier. Soit le programme suivant :
Qu'affichera à l'écran l'exécution de ce programme ?
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 !!!)

### Analyse de programme : boucle simple et tableau

Cet exercice d'analyse doit être réalisé sans compilateur, à la main à l'aide d'un crayon et d'une feuille de papier.
Soit le programme suivant :
Qu'affichera à l'écran l'exécution de ce programme ?
Tableau de 5 cases numérotées de 0 à 4. Le programme affiche tout simplement son contenu :
Remarque : Il est possible de remplacer :
par
Voir même par :
pour lequel on déclare un tableu de 10 case mais on en initialise que 5 ! Les autres seront initialisées à 0 !

### Somme d'entiers (boucle simple)

Écrire 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.
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.

### Analyse de programme (double boucle)

Ces exercices d'analyses doivent être réalisés sans compilateurs, à la main à l'aide d'un crayon et d'une feuille de papier.
* Soit le programme suivant :
Que sera-t-il affiché à l'écran lors d'une exécution de ce programme ?
* Même question pour le programme suivant :
* Pour le premier programme :
* Pour le deuxième programme :
À 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 :
* 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.
1ère version : sans utiliser de tableau à l'aide de deux boucles for imbriquées.
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.
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.