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
où 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.