En attendant d'en savoir plus sur la compilation séparée, le but de cette série d'exercices est de vous permettre de pratiquer les entrées/sorties vues la semaine passée.
Avez-vous pris connaissance des conseils relatifs à ces séries d'exercices ?
Écrivez le programme ecriture.c qui :
Votre programme devra en outre :
CTRL+D
(ce qui correspond au caractère signalant la fin de
fichier);
CTRL+Z
puis Enter
)
Jo 24 Marc 35 Ted 74 Andy 3 Werner 48 OldBob 103
Exemple d'execution :
Entrez un nom (CTRL+D pour terminer) : Jo âge : 24 Entrez un nom (CTRL+D pour terminer) : Marc âge : Ted Je vous demande un age (nombre entier positif) pas n'importe quoi ! Cet enregistrement est annulé. Entrez un nom (CTRL+D pour terminer) : Marc âge : 35 Entrez un nom (CTRL+D pour terminer) : ^D
Dans le fichier lecture.c:
+-----------------+-----+ | Jo | 24 | | Marc | 35 | | Ted | 74 | | Andy | 3 | | Werner | 48 | | Bob | 103 | +-----------------+-----+ âge minimum : 3 âge maximum : 103 6 personnes, âge moyen : 47.8 ans
Dans le zip à télécharger ici [ou sinon lien direct ici] se trouve un fichier binaire a_lire.bin contenant des entiers (nombre non précisé) .
Écrivez un programme qui lit le contenu de ce fichier et l'affiche en clair à l'écran.
On fera ici particulièrement attention aux conversions de type, la fonction «racine carrée» (sqrt de math.h) prenant comme argument des doubles et retournant un double (vous devriez obtenir un message intelligible en français).
Écrivez ensuite un programme permettant de constituer de tels fichiers, c.-à-d. un programme lisant une phrase au clavier et créant un fichier binaire contenant le tableau d'entiers dont les valeurs sont les carrés des caractères de la phrase (sans le 0 final).
Testez votre programme avec l'exemple précédemment obtenu.
Faites en particulier attention à l'aspect signé/non signé (p.ex.
avec les accents).
Note : le fichier encodé de la sorte contient un caractère accentué encodé en Latin-1 (ISO 8859-1). Ce caractère sera mal affiché sur des terminaux qui ne sont pas en Latin-1. Cela n'est pas un problème, ce n'est pas votre programme qui est en cause (il suffit de changer l'encodage du terminal).
On cherche ici à écrire un programme stat.c qui calcule les statistiques sur les lettres contenues dans un fichier.
Remarque préliminaire : Les moins à
l'aise d'entre vous peuvent laisser
tomber cette première partie (et la fonction demander_fichier) et
ouvrir le fichier comme ils le préfèrent, par exemple comme dans
les exercices précedents.
Revenez alors plus tard à cette partie quand vous vous sentirez
plus à l'aide.
Écrire une fonction demander_fichier, qui
retourne FILE* correspondant au fichier ouvert (ou NULL
sino) :
FILE* demander_fichier();
Cette fonction, après avoir demandé à l'utilisateur d'entrer le nom du fichier à lire, ouvrira le fichier correspondant.
En cas d'erreur à l'ouverture, la fonction redemandera le nom du
fichier, au maximum 3 fois. Au bout de 3 échecs le programme
abandonera et retournera NULL
.
Exemple d'exécution :
Nom du fichier à lire : stupid.name -> ERREUR, je ne peux pas lire le fichier "stupid.name" Nom du fichier à lire : stupid2.name -> ERREUR, je ne peux pas lire le fichier "stupid2.name" Nom du fichier à lire : evenmorestupid.name -> ERREUR, je ne peux pas lire le fichier "evenmorestupid.name" => j'abandonne !
Exemple positif :
Nom du fichier à lire : stupid.name -> ERREUR, je ne peux pas lire le fichier "stupid.name" Nom du fichier à lire : data.dat -> OK, fichier "data.dat" ouvert pour lecture.
Définir le type Statistique comme un tableau d'entiers longs non-signés.
Écrire une fonction initialise_statistique, prenant comme argument une variable Statistique (et peut être d'autres arguments si nécessaire) et initialisant à 0 tous ses éléments.
Écrire une fonction collecte_statistique, de prototype
unsigned long int collecte_statistique(Statistique a_remplir, FILE* fichier_a_lire);qui collectera le nombre de fois que chaque caractère compris entre l'espace (' ' ou (char) 32) et 'ý' ((char) 253) apparait dans le fichier fichier_a_lire.
Ainsi a_remplir[0] contiendra le nombre d'espaces contenus dans le fichier fichier_a_lire, et a_remplir[221] (253-32) le nombre de 'ý' que contient fichier_a_lire.
Pour lire un fichier caractère par caractère, utilisez la fonction get(char). man getc pour plus de détails.
La fonction collecte_statistique retournera le nombre total de caractères enregistrés dans a_remplir, c'est-à-dire la somme de ses éléments.
Écrire pour finir une fonction affiche qui prend une Statistique en argument (plus d'autres arguments si nécessaire) et affiche les statistique récoltées en valeurs absolues (les vrais nombres) et relatives (pourcentages).
Les valeurs absolues seront affichés alignées à droite sur 11 caractères et les pourcentages alignés à droite sur 5 caractères.
Attention ! Il ne faut pas afficher les caractères qui ne sont pas apparus dans le fichier (c.-à-d. ayant un compte de 0).
Exemple d'affichage :
STATISTIQUES : : 6 - 12.2% 0 : 1 - 2.04% 1 : 1 - 2.04% 2 : 1 - 2.04% 3 : 3 - 6.12% 4 : 3 - 6.12% ...