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