Année universitaire 2002-2003
espace

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



Travaux dirigés 1 :

  • 1. Équivalences entre C et Ada.
  • 2. Équivalences entre C et Pascal.
  • 3. Quelques différences entre C, Ada et Pascal.
  • 4. Boucle for et boucle while.
  • 5. Incrémentation d'un compteur.
  • 6. Structure de contrôle de condition.
  • 7. Lecture d'un caractère : fonction getchar.
  • 8. Affichages : fonction printf.
  • 9. Vidange du buffer de sortie : fonction fflush.
  • 10. Vidange du buffer d'entrée.
  • 11. Exemple de programme C.
  • 12. Exercice 1 : lecture d'un tableau de caractères.
  • 13. Exercice 2 : consonnes et voyelles.
  • 14. Exercice 3 : recherche d'une séquence.

  • 1. Équivalences entre C et Ada.


    Langage C


    Équivalent Ada


    Définition des constantes :

    #define NOMBRE 1
    #define CHAINE "ALPHA"
    NOMBRE:constant:=1;
    CHAINE:constant string:="ALPHA";

    Déclaration et initialisation des variables :

    int a,b;
    int i,j=0;

    char car='Z';
    float r;
    a,b:integer;
    i:integer;
    j:integer:=0;
    car:character:='Z';
    r:float;

    Déclaration et manipulation des tableaux :

    int tab1[50];
    int tab2[50][10];
    ...
    tab2[i][j]=6;
    tab1:array (0..49) of integer;
    tab2:array (0..49,0..9) of integer;
    ...
    tab2(i,j):=6;

    Comparateurs / opérateurs logiques / opérateurs arithmétiques :

    ==, !=, >, <, >=, <=
    &&
    , ||, !
    +
    , -, *, /, %
    =, /=, >, <, >=, <=
    and then
    , or else, not
    +
    , -, *, /, mod

    Instructions :

    = (affectation)
    car=getchar();
    printf("Message %d : \n",i);
    :=
    get(car);
    put_line("Message "&integer'image(i)&" : ");

    Structures de contrôle :

    {
    }
    /* Commentaires */
    begin
    end
    -- Commentaires
    if (!condition) action1;
    else action2;
    if not condition then action1;
    else action2;
    end if;
    while ((cond1)||(cond2))
    {
    action1;
    action2;
    }
    while (cond1)or else(cond2) loop

    action1;
    action2;
    end loop;
    for (i=1;i<=10;i++) action; for i in 1..10 loop action;
    end loop;

    Exemple de programme :


    int a;
    int f(int b)
    {
    int c;
    if (b%2==0) c=1;
    else c=0;
    return(c);

    }
    int main(void)
    {
    int d=3;
    a=d+1;
    a+=5;
    a=f(a);
    return(0);
    }
    procedure exemple is
    a:integer;
    function f(b:in integer)return integer is
    c:integer;
    begin
    if b mod 2=0 then c:=1;
    else c:=0;
    end if;
    return c;
    end f;
    d:integer:=3;
    begin

    a:=d+1;
    a:=a+5;
    a:=f(a);

    end exemple;

    2. Équivalences entre C et Pascal.


    Langage C


    Équivalent Pascal


    Définition des constantes :

    #define NOMBRE 1
    #define CHAINE "ALPHA"
    CONST NOMBRE=1;
    CONST CHAINE='ALPHA';

    Déclaration et initialisation des variables :

    int a,b;
    int i,j=0;

    char car='Z';

    float r;
    VAR a,b:INTEGER;
    VAR i,j:INTEGER;
    ...j:=0;
    VAR car:CHAR;
    ...car:='Z';
    VAR r:REAL;

    Déclaration et manipulation des tableaux :

    int tab1[50];
    int tab2[50][10];
    ...
    tab2[i][j]=6;
    VAR tab1:ARRAY [0..49] OF INTEGER;
    VAR tab2:ARRAY [0..49,0..9] OF INTEGER;
    ...
    tab2[i,j]:=6;

    Comparateurs / opérateurs logiques / opérateurs arithmétiques :

    ==, !=, >, <, >=, <=
    &&
    , ||, !
    +
    , -, *, /, %
    =, <>, >, <, >=, <=
    AND
    , OR, NOT
    +
    , -, *, / (ou DIV), MOD

    Instructions :

    = (affectation)
    car=getchar();
    printf("Message %d : \n",i);
    :=
    read(car)
    writeln('Message ',i,' : ')

    Structures de contrôle :

    {
    }
    /* Commentaires */
    BEGIN
    END
    (* Commentaires *)
    ou { Commentaires }
    if (!condition) action1;
    else action2;
    IF NOT condition THEN action1
    ELSE action2
    while ((cond1)||(cond2))
    {
    action1;
    action2;
    }
    WHILE (cond1) OR (cond2) DO
    BEGIN
    action1;
    action2
    END
    for (i=1;i<=10;i++) action; FOR i:=1 TO 10 DO action

    Exemple de programme :


    int a;
    int f(int b)
    {
    int c;
    if (b%2==0) c=1;
    else c=0;
    return(c);
    }
    int main(void)
    {
    int d=3;
    a=d+1;
    a+=5;
    a=f(a);
    return(0);
    }
    PROGRAM exemple;
    VAR a:INTEGER;
    FUNCTION f(b:INTEGER):INTEGER;
    VAR c:INTEGER;
    BEGIN
    IF (b MOD 2=0) THEN c:=1
    ELSE c:=0;
    f:=c
    END;
    VAR d:INTEGER;
    BEGIN
    d:=3;
    a:=d+1;
    a:=a+5;
    a:=f(a)

    END.

    3. Quelques différences entre C, Ada et Pascal.

    4. Boucle for et boucle while.

    L'instruction :

    est équivalente à :

    5. Incrémentation d'un compteur.

    Les quatre instructions suivantes produisent le même résultat après leur exécution :

    Exemples :

    i=1;
    a=i++; /* a vaut 1 et i vaut 2 */

    En revanche :

    i=1;
    a=++i; /* a vaut 2 et i vaut 2 */

    6. Structure de contrôle de condition.

    7. Lecture d'un caractère : fonction getchar.

    Il existe une zone mémoire, appelée "buffer d'entrée", prévue pour contenir les caractères tapés par l'utilisateur lors d'une opération de lecture de caractères tapés au clavier, et qui fonctionne selon le principe d'une "file" (premier arrivé = premier sorti). Si le buffer d'entrée n'est pas vide, l'instruction car=getchar(); affecte à la variable car le caractère le plus ancien se trouvant dans le buffer d'entrée, et enlève ce caractère du buffer d'entrée. Si le buffer d'entrée est vide, l'instruction car=getchar(); stoppe le déroulement du programme jusqu'à ce que le buffer d'entrée reçoive un ou plusieurs caractères. L'ajout de caractères dans le buffer d'entrée ne se fait qu'au moment où l'utilisateur tape un retour-chariot. Par exemple, si l'utilisateur tape les caractères texTe TApé<retour-chariot>, alors le contenu du buffer d'entrée ne sera modifié qu'au moment de la frappe du caractère retour-chariot et, à ce moment-là, le buffer d'entrée recevra onze caractères (neuf caractères alphabétiques, plus un espace, plus le retour-chariot).

    8. Affichages : fonction printf.

    La fonction printf permet d'afficher à l'écran du texte et des valeurs d'expressions (une variable est une expression particulière). La syntaxe de l'appel à cette fonction est :

    Cet appel est interprété de la manière suivante :

    Exemple :

    Remarque :

    9. Vidange du buffer de sortie : fonction fflush.

    En fait, la fonction printf envoie la chaîne de caractères interprétée, non pas directement à l'écran, mais sur le "buffer de sortie". Pour forcer l'affichage du contenu du buffer de sortie à l'écran, il existe deux possibilités :

    Après chaque appel à la fonction printf, on placera donc systématiquement l'instruction fflush(stdout); dans le cas où la chaîne de caractères affichée par la fonction printf ne se termine pas par un caractère \n. La raison de cette systématique est d'éviter les confusions éventuelles dues à une mauvaise synchronisation entre les entrées au clavier et les affichages à l'écran, en particulier lors du "débogage" d'un programme.

    10. Vidange du buffer d'entrée.

    Contrairement à ce que nous préconisions les années précédentes, l'instruction fflush(stdin); (permettant la "vidange du buffer d'entrée") n'est pas autorisée par la norme ANSI, même si cette instruction est acceptée par certains compilateurs. Il est donc demandé de ne plus utiliser cette instruction. Les opérations de lecture dans le buffer d'entrée se feront donc généralement sans l'avoir préalablement vidé, sauf dans certains cas de figure, comme celui que nous allons détailler dans l'exemple ci-dessous.

    Exemple :

    Dans la mesure où cette écriture de la vidange du buffer d'entrée répond bien à la norme ANSI, mais s'avère nettement plus compliquée que l'instruction fflush(stdin); on n'y aura recours que dans les cas de nécessité absolue, que l'on peut résumer par la règle suivante : "il ne faut procéder à la vidange préalable du buffer d'entrée que lors de la lecture d'un caractère, à un moment où le buffer d'entrée risque de ne pas être vide".

    11. Exemple de programme C.

    Le programme suivant sera brièvement commenté en séance de travaux dirigés :

    #include <stdio.h>

    int lire(void)
    {
    int i=0;
    char car;
    car=getchar();
    while (car!='#')
    {
    if ((car=='a')||
        (car=='e')||
        (car=='i')||
        (car=='o')||
        (car=='u')||
        (car=='y')) i++;
    car=getchar();
    }
    return(i);
    }

    int main(void)
    {
    int a;
    printf("Entrez votre texte (non accentué, terminé par un #) :\n");

    a=lire();
    if (a!=0) printf("Ce texte contient %d voyelles.\n",a);
    else printf("Ce texte ne contient aucune voyelle.\n");
    return(0);
    }

    11. Exercice 1.

    Écrire un programme C qui lit un texte contenant au plus 100 caractères, se terminant par un caractère $, le stocke dans un tableau puis le réaffiche. Ce programme ne devra pas comporter d'autre fonction que la fonction main.

    Remarque :

    13. Exercice 2.

    Écrire un programme C qui calcule le nombre de consonnes ou de voyelles (au choix de l'utilisateur) dans un texte non accentué et terminé par un caractère #. On utilisera pour cela une fonction qui teste si une lettre est une consonne ou une voyelle. On suppose que le texte n'est composé que de lettres minuscules non accentuées, que les mots ne sont séparés que par des espaces, qu'il n'y a aucune ponctuation et qu'il n'y a pas de caractère retour-chariot.

    14. Exercice 3.

    Réaliser un programme en langage C permettant de rechercher dans une suite de caractères donnée, le nombre de fois qu'apparaît une séquence particulière. La suite de caractères à tester est entrée la première, dans un tableau de taille égale à 100, et se termine par le caractère $. Le texte de la séquence à rechercher se termine par un caractère $, contient au plus 10 caractères et n'est pas vide.


    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.