Année universitaire 2003-2004

DEUG MIAS
Module Info 2
Travaux pratiques


Séance 3:

  • Types

  • TP 3 : Types
    1. Ce programme calcule le coût de l'assurance d'un concessionnaire de voitures contre les dégâts causés par les tempêtes. Il inclut le report de crédit de l'année précédente */
    [1] #include <stdio.h>
    [2] #define CAR_RATE   20.5  /* taux d'assurance d'une voiture*/
    [3] #define TRUCK_RATE   31  /* taux d'assurance d'un camion*/
    [4] #define CREDIT   -25   /* credit precedent*/
    [5] void main()
    [6] {
    [7]  int  cars, trucks;
    [8]  float  total = 0.0; /* coût de l'assurance*/
    [9]   cars = 30; /* il y a 30 voitures*/
    [10]  trucks = 7; /* il y a 7 camions*/
    [11]  total = CAR_RATE * cars + TRUCK_RATE * trucks;
    [12]  printf("%f \n", total + CREDIT);
    [13]  }

    (a) Taper le programme ci-dessus sans les numéros de ligne, mais sinon exactement tel qu'il est écrit puis le compiler.
    (b) Compiler le même programme après avoir enlevé un point virgule. Le compilateur indique une erreur, où?
    (c) Répéter (b) en faisant une seule erreur à chaque fois. Observer le comportement du compilateur.
    (d) Que fait le compilateur quand on remplace cars = 30 par car = 30?
    (e) Remplacer la ligne [11] du programme original par :
    total = CAR_RATE/ 0;
    Compiler le programme puis l'exécuter. Que se passe-t-il?
    2. Le compilateur ignore les blancs superflus, ce qui permet d'indenter un programme pour une meilleure lisibilité. Quels sont les blancs que l'on peut enlever dans le programme précédent si l'on ne se soucie pas de la lisibilité? Recompiler le programme.
    Que se passe-t-il si l'on remplace cars = 30 par cars=30? int cars, trucks par intcars, trucks?
    3. (a) Ecrire un programme qui imprime la valeur d'un nombre réel, mais qui utilise par erreur le format %d. Que se passe-t-il?
    (b) Répéter l'expérience en essayant d'imprimer un entier en utilisant un format non entier. Noter les résultats.
    (c) Imprimer le caractère 'A' en utilisant le format entier. Quelle est la signification de la valeur obtenue?
    (d) En C il est possible d'ajouter un entier à un caractère. Essayer d'imprimer la quantité 'A' + 7, d'abord avec %c, puis avec %d. Que se passe-t-il?
    (e) Lorsqu'on imprime, disons deux entiers, doit-il y avoir un espace entre les spécifications de format? Peut-on mettre plus d'un espace?
    4. Précédence des opérateurs
    Il s'agit d'examiner des paires d'expressions de la forme:
      a <opérateur1> b <opérateur2> c
      a <opérateur2> b <opérateur1> c
    a, b, c sont les opérandes. L'idée est de voir si les deux opérations sont toujours effectuées de gauche à droite dans les deux cas, ou si l'une des opérations est toujours effectuée la première, où qu'elle soit. Dans ce dernier cas, cette opération a une précédence plus élevée, sinon les deux opérations ont la même précédence.
    (a) Exécuter un programme qui imprime les valeurs des expressions (8 + 4 * 2) et (8 * 4 + 2).
    (b) Répéter la même expérience avec les paires:
    / et *, % et -, / et +. Conclusion?
    5. (a) Exécuter un programme qui fait les choses suivantes:
    Déclarer deux entiers, x et y. Faire les affectations x=3 et y=5. Puis les instructions suivantes:
      printf("%1d %1d /n", x, y);
      printf("%2d %2d /n", x, y);
      printf("%10d %10d /n", x, y);

    Quel est l'effet du nombre qui suit le symbole %?
    (b) Déclarer une variable réelle a et lui affecter la valeur -368.555. Exécuter les instructions suivantes:
      printf("%f /n", a);
      printf("%10.2f /n", a);

    Quel est l'effet du nombre précédant le point? est-il différent du cas entier? Quel est l'effet du nombre suivant le point?
    Que fait l'ordinateur avec : printf("%2f /n", a);
    6. Que fait le compilateur si l'on affecte à une variable de type int une variable de type float? Une telle affectation a-t-elle un sens? Faire l'expérience avec les types int, float, char dans tous les sens possibles. Imprimer les résultats des affectations.
    7. Ecrire un programme contenant les instructions suivantes:
      scanf("%d", &a);
      printf("%d, /n", a);
      scanf("%d", &b);
      printf("%d, /n", b);

    Entrer les nombres : 63 54 sur une seule ligne d'entrée. Est-ce que l'ordinateur s'arrête à la seconde instruction scanf? Expliquer pourquoi.
    8. Ecrire un programme avec une instruction scanf sur un entier. Inclure une instruction qui imprime la valeur de l'entier à l'écran. Entrer la valeur 537J. Que se passe-t-il?
    9. Ecrire un programme avec l'instruction scanf suivante:
      scanf("%d %c", &i, &ch);
    (a) Faire imprimer au programme les valeurs entrées. Exécuter le programme trois fois successivement avec les entrées suivantes: 8J sans blanc entre 8 et J, 8 J avec un espace, 8   J avec plus d'un espace. Expliquer les résultats.

    (b) Utiliser maintenant
      scanf("%c %d", &ch, &i);
    et prendre les entrées suivantes: J8 sans espace; J8 avec un espace avant le J; J8 avec plus d'un espace avant le J. Expliquer les résultats.
    10. Ecrire un programme qui imprime un triangle.
    Entrée: Rien
    Sortie: Un triangle composé d'astérisques.
    11. Ecrire un programme qui calcule le prix total d'un article:
    Entrée: le prix de l'article, suivi du taux de TVA en pourcentage
    Sortie: la phrase " Le prix total est xx" où xx est remplacé par le prix total de l'article.
    12. Ecrire un programme qui imprime sans instruction d'affectation le produit d'un réel par un entier.
    Entrée: Un réel suivi d'un entier
    Sortie: la phrase " le produit est xx" où xx est remplacé par le produit des deux nombres.
    13. Ecrire un programme qui permet à l'utilisateur de choisir un item dans un menu.
    Entrée: Un entier représentant un choix du menu
    Sortie:
    (a) Un écran qui se présente comme suit:
    Choisissez un des choix suivants:
    1. <choix 1>
    2. <choix 2>
    3. <choix 3>
    4. <choix 4>
    Entrez votre choix ici:
    (b) La phrase "Votre choix est xx" où xx est remplacé par le choix de l'utilisateur. Cette phrase doit apparaître 3 lignes plus bas que le menu.


    Commentaires pascal.lafourcade@lsv.ens-cachan.fr