IN3S02 : Sujet du TD de C
Groupe ESIEE, Denis BUREAU, octobre 2006.
Attention !
Le sujet peut être modifié jusqu'à la veille du TD.
1 Les objectifs
Écrire de premiers programmes C en utilisant les notions les plus importantes
(passages de paramètres, chaînes de caractères, pointeurs, allocation
dynamique, etc...).
2 Notions vues dans les 2 cours de C
- Commentaires, identificateurs, affectation
- Affichage, saisie
- Types de données primitifs, déclarations de variables et de constantes
- Opérateurs, expressions, fonctions mathématiques, conversions
- Tests, boucles
- Fonctions, procédures, ordre des déclarations
- Tableaux, chaînes de caractères
- Définition de nouveaux types, structures
- Pointeurs
- Passage de paramètres (par adresse)
- Équivalence tableaux « pointeurs, arithmétique des pointeurs
- Allocation dynamique de types simples, de tableaux, et de structures
- (Notions de maillon et de liste chaînée)
3 Premier programme
Écrire un programme complet qui affiche simplement Bonjour !.
On s'attachera à ce que la syntaxe soit 100% correcte.
4 Passage de paramètres
- Écrire une fonction hms2s qui prend en entrée 3 entiers représentant
un nombre d'heures, de minutes, et de secondes, et qui retourne le nombre total
de secondes que cela représente. Il n'y a pas de limitation sur la valeur de
chacun des 3 nombres, mais on supposera que le nombre total de secondes ne
dépasse pas la capacité maximale du type int.
- Écrire une procédure s2jhms qui prend en entrée un nombre de secondes
et qui fournit 4 sorties : le nombre de jours, d'heures, de minutes, et de
secondes que cela représente.
- Écrire un programme principal qui saisit 3 entiers représentant un nombre
d'heures, de minutes, et de secondes, sans limitation particulière, qui
les convertit en un nombre de jours, d'heures, de minutes, et de secondes,
et qui affiche le résultat. Ce programme appellera bien évidemment les
2 sous-programmes définis précédemment.
Exemple d'exécution :
70 70 70 ® 2j 23h 11mn 10s
5 Chaînes de caractères
- Définir une constante MAX par exemple égale à 10.
- Définir un type Chaine = tableau de MAX+1 caractères
(il faut penser au caractère nul ...)
- Écrire une procédure affiche qui prend une chaîne de caractères
en entrée et qui affiche la chaîne entre parenthèses.
- Écrire un programme principal qui saisit 2 chaînes de caractères
et qui boucle 8 fois en affichant alternativement chacune des 2 chaînes.
Pour cela, il est possible d'utiliser une variable entière dont la valeur vaut
alternativement 1 ou 2; suivant cette valeur, le programme recopiera l'une des
2 chaînes de caractères dans une troisième, et appellera affiche
sur cette dernière.
Remarque :
Si t est un tableau de caractères, scanf( "%s", t );
permet de saisir d'un seul coup un mot dans t.
Par contre, il n'est pas possible de saisir ainsi des phrases avec des espaces.
Dans ce cas, il faut utiliser : fgets( t, taille_de_t, stdin ); où
stdin représente le clavier. Attention, le caractère de retour à la
ligne ('\n') est stocké dans le tableau.
6 Pointeurs et chaînes de caractères
Modifier une copie du programme précédent pour :
- qu'il déclare un type PtrChar = pointeur de caractère,
- que le paramètre d'affiche soit un PtrChar,
- que le programme principal ne recopie plus une chaîne de caractères à
chaque tour de boucle, mais se contente de recopier un pointeur.
Remarques :
les caractères doivent toujours être stockés quelquepart,
et il y a en tout seulement 6 lignes à modifier.
7 Pointeurs et allocation dynamique
- Définir une constante INCREMENT par exemple égale à 2 ou à 3.
- Définir un type PtrDouble = pointeur de double.
- Écrire un programme principal qui saisit une taille initiale (petite), qui alloue
un tableau de double de cette taille, puis qui rentre dans la boucle
suivante :
tant que le nombre saisi est positif, le stocker dans le tableau
(après avoir stocké un premier nombre négatif, la boucle s'arrête)
tout en appelant agrandit à chaque fois que nécessaire.
Afficher toutes les valeurs contenues dans la tableau agrandi pour
vérification.
Dans quel cas peut-on voir des valeurs aberrantes ?
Comment l'éviter ?
- Écrire une procédure agrandit qui a comme paramètres
d'entrée/sortie un PtrDouble (ne pointant pas sur le même
tableau de double au début et à la fin de la procédure) et un entier
(représentant la taille du tableau, étant plus grande à la fin qu'au début
de la procédure), et qui
agrandit le tableau de INCREMENT cases, sans bien sûr perdre les
valeurs qui s'y trouvaient, et en libérant les zones mémoire
devenues inutiles.
File translated from
TEX
by
TTH,
version 3.74.
On 28 Oct 2006, 15:22.