Année universitaire 2002-2003
espace

Licence d'informatique
Module 4 - partie "C / shell"



Travaux pratiques 2 :

  • 1. Quelques astuces utiles pour les travaux pratiques.
  • 2. Ouverture d'un fichier : fonction fopen.
  • 3. Lecture dans un fichier de texte : fonction fscanf.
  • 4. Écriture dans un fichier de texte : fonction fprintf.
  • 5. Fermeture d'un fichier : fonction fclose.
  • 6. Exercice 1 : modèle numérique de terrain.
  • 7. Exercice 2 : version plus sophistiquée de l'exercice 1.

  • 1. Quelques astuces utiles pour les travaux pratiques.

    1.1. Effacement d'un caractère.

    Dans la fenêtre système, la touche <Backspace> doit être utilisée à la place de la touche <Delete>, qui génère des caractères non interprétés.

    1.2. Historique.

    La commande history ("historique" des commandes), ou son abréviation h, affichent la liste des dernières commandes tapées dans la fenêtre système, précédées de leurs numéros d'ordre. Pour relancer une commande, il suffit de taper :

    Il est également possible de relancer une commande en tapant le caractère ! suivi de la, ou des premières lettres de cette commande (si plusieurs commandes ont en commun ces premières lettres, c'est la commande la plus récemment tapée qui sera relancée).

    Exemple :

    Il est possible à tout moment de relancer la commande précédente en tapant !!

    Enfin, il est possible de faire réafficher une commande précédemment tapée, en utilisant les touches <flèche vers le haut> et <flèche vers le bas>. Pour modifier une commande précédemment tapée, il est possible de se positionner à l'endroit désiré avec les touches <flèche vers la gauche> et <flèche vers la droite>. Une fois la modification faite, il faut taper un caractère retour-chariot pour lancer la nouvelle commande.

    1.3. Interruption du déroulement d'un programme.

    Pour interrompre le déroulement d'un programme (dans le cas d'une boucle infinie, par exemple), il faut taper :

    Si cette commande reste inopérante, il faut alors taper :

    1.4. Lancement d'une commande en tâche de fond.

    Pour "reprendre la main" dans une fenêtre système après avoir lancé une commande sans l'avoir fait suivre du caractère &, ce qui aurait permis son exécution "en parallèle" (on dit aussi "en tâche de fond"), il faut :

    Exemple :

    1.5. Écriture du nom d'un fichier ou d'un répertoire.

    Pour afficher dans la fenêtre système, le nom complet d'un fichier ou d'un répertoire, il suffit d'en taper les premières lettres puis d'appuyer sur la touche <Tab>. En cas d'ambiguïté (si le système ne parvient pas à déterminer le répertoire ou le fichier auquel les premières lettres font référence), rien ne se produit, en dehors de l'émission d'un signal sonore ("bip").

    Exemple :

    2. Ouverture d'un fichier : fonction fopen.

    Pour manipuler un fichier en langage C, il faut d'abord déclarer une variable de type FILE * (appelée "identificateur de fichier") :

    Pour affecter à cette variable l'adresse d'un fichier, on utilise la fonction fopen, d'en-tête :

    L'ouverture en lecture d'un fichier inexistant retourne la valeur NULL. L'ouverture en écriture d'un fichier inexistant provoque la création de celui-ci, et retourne son adresse, sauf si un problème survient (disque saturé), auquel cas la valeur NULL est retournée.

    Exemple :

    Remarque :

    3. Lecture dans un fichier de texte : fonction fscanf.

    Pour effectuer la lecture de caractères dans un fichier de texte, on utilise la fonction fscanf, d'en-tête :

    La fonction fscanf renvoie le nombre d'items effectivement lus. Ce nombre peut être inférieur au nombre attendu, s'il n'y a pas une totale correspondance entre les spécificateurs de formats spécifiés dans l'appel de la fonction et les données disponibles dans le fichier, ou bien si la fin du fichier est atteinte. En cas de problème lors de la lecture, la valeur EOF (constante symbolique prédéfinie de valeur -1) est retournée.

    Exemple :

    4. Écriture dans un fichier de texte : fonction fprintf.

    Pour effectuer l'écriture de caractères dans un fichier de texte, on utilise la fonction fprintf, d'en-tête :

    La fonction fprintf renvoie le nombre d'octets effectivement écrits, qui peut être inférieur au nombre attendu, dans le cas où l'écriture est effectuée sur un disque saturé. En cas de problème lors de l'écriture, une valeur négative est retournée.

    5. Fermeture d'un fichier : fonction fclose.

    Lorsqu'un fichier a été ouvert dans un programme C, il est nécessaire de le fermer avant la fin de l'exécution de ce programme. On utilise pour cela la fonction fclose, d'en-tête :

    La fonction fclose renvoie 0 si tout se passe normalement et EOF en cas de problème.

    Exemple :

    #include <stdio.h>
    int main(void)
    {
    FILE *f; /* Identificateur de fichier. */
    int i;
    if ((f=fopen("tempo.txt","wt"))==NULL) printf("Création impossible\n");
    else
    {
    ----------fprintf(f,"Création OK\n");
    ----------for (i=1;i<=9;i++) fprintf(f,"%d ",i);

    }
    fclose(f);
    return(0);
    }

    6. Exercice 1.

    Avant-propos :

    Répondre aux questions suivantes :

    1) Créer un MNT contenant les cent valeurs entières strictement positives suivantes :

    01 02 23 45 56 58 62 77 98 100
    03 04 06 32 50 72 81 74 82 99
    31 05 07 08 35 80 51 91 90 84
    59 33 11 10 09 38 73 52 92 89
    78 79 36 13 14 12 30 83 53 54
    61 68 87 39 16 17 15 37 55 93
    69 60 44 85 41 18 19 20 34 88
    86 43 67 66 75 37 21 24 22 40
    64 44 76 57 48 49 40 26 27 25
    70 63 46 47 65 71 56 34 28 29

    Pour cela :

    Ce MNT peut être représenté en perspective par :

    Représentation MNT

    2) Écrire une fonction permettant de lire dans le fichier précédent, et de stocker les données dans une matrice de taille 12 x 12 (et non de taille 10 x 10), de manière à rajouter une bordure, qui sera initialisée à l'altitude 0

    Remarques :

    3) Tester la fonction précédente, à l'aide d'un programme principal qui affiche les valeurs de la matrice.

    4) On appelle "voisin" d'un point du MNT, un des huit points situés immédiatement autour de ce point :

    8 voisins

    Écrire une fonction qui renvoie dans un tableau les coordonnées du voisin le plus bas d'un point dont les coordonnées sont passées en paramètres.

    Remarque :

    5) Écrire le programme principal, qui doit :

    Il est demandé de n'utiliser aucune variable globale pour réaliser cet exercice.

    7. Exercice 2.

    Reprendre l'exercice précédent en rajoutant le raffinement suivant : en cas de conflit entre plusieurs voisins possédant la même altitude minimale, on choisit le point qui "perturbe" le moins le trajet de la goutte d'eau.

    Exemple :

    On codera les huit directions, correspondant aux huit plus proches voisins, par les indices de tableaux suivants :

    Direction
    Indice
    Est
    0
    Nord-Est
    1
    Nord
    2
    Nord-Ouest
    3
    Ouest
    4
    Sud-Ouest
    5
    Sud
    6
    Sud-Est
    7

    On pourra donc décrire la position des huit voisins d'un point par leurs décalages respectifs, suivant la latitude et la longitude, en déclarant en variables globales constantes les deux tableaux suivants :

    L'intérêt est que, par exemple, le voisin d'indice 3 dans les tableaux précédents correspond à un déplacement dans la direction du NORD_OUEST, de code 3.

    Répondre aux questions suivantes :

    1) Écrire la fonction angle qui retourne l'angle entre deux directions. Cet angle est toujours compris entre 0 et 4 (compris). Par exemple, l'angle entre le SUD et le NORD_EST est égal à 3.

    2) Écrire la fonction plus_bas qui renvoie dans un tableau les coordonnées du voisin le plus bas, ainsi que le code de la direction du déplacement correspondant. S'il existe plusieurs voisins possibles, on choisit celui qui fait faire l'angle le plus faible à la trajectoire de la goutte d'eau. Cette fonction fait donc appel à la fonction précédente. Au niveau du point de départ de la goutte, la direction de la trajectoire sera initialisée à la valeur SUD_OUEST.

    Remarque :

    3) Écrire le programme principal, répondant aux mêmes exigences que celui de l'exercice 1.


    Ces pages ont été réalisées par A. Crouzil, J.D. Durou et Ph. Joly.
    Pour tout commentaire, envoyer un mail à crouzil@irit.fr, à durou@irit.fr ou à Philippe.Joly@irit.fr.