TP 2 de programmation avancée en C
Important :
Dans ce TP, on n'utilisera pas d'autres bibliothèques que
stdlib
et stdio
.
Pour les entrée-sorties, se référer à la fiche correspondante.
Exercice 1
1.
Compléter le code suivant :
FILE* f=NULL;
...
fopen(f,"nomfichier","r");
if (f==NULL) {printf("probleme\n"); exit(-1)};
while (!feof(f)) { ... }
fclose(f);
pour créer un exécutable analogue à la commande Unix cat
qui affiche le contenu d'un fichier à l'écran.
N.B. On ne nommera bien sûr par l'éxécutable
cat
!
2.
Même question pour la commande Unix cp
qui copie
un fichier dans un autre.
Exercice 2
1.
Exécuter le programme ci-dessous.
2.
Ecrire l'algorithme correspondant.
3.
Modifier ce programme pour que la sortie se fasse dans un fichier nommé
sortie.txt
.
4.
Que se passe-t-il pour les deux programmes si un des caractères saisis
est un 'ê' ?
Modifier ce deuxième programme afin que les caractères saisis qui
n'appartiennent pas au code ASCII soient envoyés vers la sortie d'erreur
stderr
au lieu du fichier sortie.txt
.
// Programme ES1
#include <stdlib.h>
#include <stdio.h>
int i;
char c;
FILE * f=NULL;
FILE * g=NULL;
main() {
f=stdin;
g=stdout;
i=32;
do {
i=getc(f);
c=(char) i;
putc(c,g);
} while (i!='\n');
}
Exercice 3
1.
Ecrire un programme qui envoie les arguments en ligne de commande
vers un fichier nommé arguments.txt
, avec un argument
par ligne.
2.
Ecrire ensuite un programme qui lit, caractère par caractère,
le fichier arguments.txt
, puis affiche le nombre
de voyelles.
Exercice 4
Ecrire un programme qui :
1.
Définit, en utilisant typedef
, un nouveau type structuré
nommé individu
et formé d'un nom, d'un prénom et d'un âge.
2.
Prend en paramètre un nom, un prénom, et un âge et les placent dans
un individu
.
L'âge devra être un entier compris entre 0 et 127, si ce n'est
pas le cas du troisième paramètre, le programme cherchera dans la
suite des paramètres le premier qui répond à cette contrainte.
Si les paramètres ne permettent pas de construire un individu en
entier, le programme demandera à l'utilisateur les informations complémentaires.
3.
Sauvegarde ensuite l'individu dans un fichier nommé
individus.txt
. La sauvegarde devra être
cumulative : une exécution du programme ajoutera
un individu à la fin du fichier.
Exercice 5
Ecrire un programme qui lit un fichier de type
individus.txt
, comme celui créé à
l'exercice précédent, place chaque individu dans
une variable de ce type avant de l'afficher proprement.
Exercice 6
1.
Ecrire un programme qui initialise un pointeur p à NULL,
et qui tente d'accéder à la variable
pointée par ce pointeur. Que se passe-t-il à l'exécution ?
2*.
Compiler en ajoutant l'option -g de gcc,
puis chercher l'erreur avec gdb étudié précédemment.
3.
Afin d'éviter cette erreur,
Initialiser le pointeur p avec la fonction malloc.
A-t-on le choix de la taille d'allocation ?
4.
Ajouter une variable int n
dans le programme
et lui faire afficher la valeur du pointeur
pointant sur cette variable n. Faire afficher aussi la valeur
du pointeur p avant puis après allocation.
5.
Créer un tableau d'entiers à deux dimensions nommé
tb
dont le nombre de lignes et de colonnes
sera saisi par l'utilisateur.
Le programme réalisera ensuite les affectations tb[i,j]←i*j,
avant d'afficher proprement le tableau rempli.
6.
Afficher ensuite les valeurs des pointeurs tb[0,0]
et tb[n-1,p-1]
où n et p correspondent respectivement
aux nombre de lignes et de colonnes.
Que se passe-t-il si on essaie d'afficher tb[n,p]
?
© 2011, 2016 – A. Guitton, A. Sigayret – Université Clermont-Fd II