Année universitaire 2002-2003
espace

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



Travaux dirigés 5 :

  • 1. Compléments sur la fonction scanf.
  • 2. Compléments sur la fonction printf.
  • 3. Gestion dynamique de la mémoire.
  • 4. Structures.
  • 5. Initialisation d'un tableau à la déclaration.
  • 6. Initialisation d'une structure.
  • 7. Pointeurs et structures.
  • 8. Exercice 1 : liste chaînée.
  • 9. Compléments sur la représentation en mémoire.
  • 10. Exercice 2 : représentation en mémoire.

  • 1. Compléments sur la fonction scanf.

    On a déjà vu le fonctionnement détaillé de la fonction scanf avec les spécificateurs de format %c, %d et %f, dans le paragraphe 8 de la séance 2 de travaux dirigés. On a également vu, dans le paragraphe 7 de la séance 4 de travaux dirigés, que la fonction scanf permet de lire une chaîne de caractères à l'aide du spécificateur de format %s. Voici la description détaillée de la lecture d'une chaîne de caractères :

    Exemple :

    2. Compléments sur la fonction printf.

    On a déjà vu le fonctionnement de la fonction printf avec les spécificateurs de format %c, %d et %f, dans le paragraphe 7 de la première séance de travaux dirigés, ainsi que dans divers exemples.

    La fonction printf permet également d'afficher une expression de type "chaîne de caractères", à l'aide du spécificateur de format %s, et ce de la manière suivante :

    expr a pour valeur l'adresse de la zone mémoire contenant la chaîne à afficher.

    Remarques :

    Pour récapituler, on peut faire le tableau suivant, dans lequel les différentes syntaxes d'appels aux fonctions scanf et printf sont rappelées, avec les quatre spécificateurs de format les plus courants %c, %d, %f et %s :


    Lecture


    Affichage

    scanf("%c",&car); printf("%c",car);
    scanf("%d",&i); printf("%d",i);
    scanf("%f",&r); printf("%f",r);
    scanf("%s",ch); printf("%s",ch);

    3. Gestion dynamique de la mémoire.

    Une gestion "dynamique" de la mémoire est possible, grâce aux fonctions suivantes :

    Attention :

    4. Structures.

    Une structure est un ensemble de variables (de types éventuellement différents) adapté à une gestion spécifique des données. Par exemple, pour gérer les coordonnées d'un point (abscisse et ordonnée), on pourra définir le type suivant :

    Le point-virgule, après l'accolade fermante de la déclaration de la structure, est nécessaire. La définition d'une structure, comme d'ailleurs la définition d'un type quelconque, à l'aide du mot-clé typedef (cf. la troisième séance de travaux dirigés), peut être faite à l'intérieur d'une fonction ou en dehors de toute fonction, auquel cas on dit qu'il s'agit d'une définition globale. Contrairement à ce qui a été dit pour les variables, la définition globale d'une structure n'est pas déconseillée, bien au contraire.

    Exemple de déclaration d'une variable de type structure :

    Remarques :

    5. Initialisation d'un tableau à la déclaration.

    Un tableau peut être initialisé au moment de sa déclaration en indiquant la liste de ses valeurs.

    Exemples :

    Rappel :

    Attention :

    6. Initialisation d'une structure.

    Pour initialiser la variable pt de type struct point déclarée précédemment, on peut utiliser la syntaxe suivante :

    Il est également possible d'initialiser une structure au moment de sa déclaration, en donnant la liste des valeurs de ses champs, de la même manière que pour un tableau. En reprenant l'exemple précédent, au moment de déclarer la variable pt, on peut écrire :

    Attention :

    7. Pointeurs et structures.

    7.1. Priorité des opérateurs.

    L'opérateur . est prioritaire sur l'opérateur *

    Exemple :

    On peut également utiliser l'opérateur -> (qui est de même priorité que l'opérateur .) :

    Dans le cas de l'exemple précédent, on a donc l'identité pp->x == (*pp).x. Conformément à l'exemple ci-dessus, pt.x est une notation correcte, mais pas pt->x, puisque pt n'est pas un pointeur vers une variable de type struct point.

    Remarque :

    7.2. Listes chaînées.

    Le plus souvent, on manipule une liste chaînée à l'aide d'éléments de type "structure", dont le dernier champ est un pointeur (la valeur de ce pointeur sera, à l'exception du dernier élément de la liste, l'adresse de l'élément suivant). Par exemple, on peut choisir de représenter une courbe par une liste chaînée de points :

    8. Exercice 1.

    Soit trois points de coordonnées respectives (10,20), (30,20) et (20,10). Écrire l'initialisation du triangle construit à partir de ces trois points, en initialisant trois variables, respectivement c1, c2 et c3 (cf. le schéma du paragraphe suivant) du type struct courbe défini précédemment.

    Questions complémentaires :

    1) À partir de c1, et en utilisant les pointeurs, donner la valeur de l'abscisse de p3.

    2) Que valent :

    9. Compléments sur la représentation en mémoire.

    On peut compléter les règles déjà énoncées dans la séance 3 de travaux dirigés, concernant la représentation graphique de la mémoire centrale d'un ordinateur lors de l'exécution d'un programme, par les règles suivantes, relatives aux structures :

    Exemple :

    image 1

    10. Exercice 2.

    Soit le programme suivant :

    #include <stdio.h>

    struct s1
    {
    char ch1[4];
    char ch2[4];
    };

    int main(void)
    {
    struct s1 st1={"abc","def"};

    struct s2
    {
    char ch3[4];
    struct s1 ss1;
    } st2={"ghi",{"jkl","mno"}};

    printf("%c %c\n",st1.ch1[0],*st1.ch2);
    printf("%s %s\n",st1.ch1,st1.ch2);
    printf("%s %s\n",st2.ch3,st2.ss1.ch2);
    printf("%s %s\n",st2.ch3+1,st2.ss1.ch2+1);
    return(0);
    }

    Donner la représentation des données dans la mémoire centrale et les résultats affichés à l'écran.


    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.