IUT R&T - 1ère année - Informatique
Programmation et algorithmique 1
TP n°4
A la fin du TP, envoyer sur l'ENT un compte-rendu contenant les solutions des exercices marqués d'une étoile.
(compte-rendu au format texte, en modifiant modeleTP1.txt
)
EXERCICE 1*
Dans cet exercice, un horaire de train sera représenté par un triplet (Heure,Minute,Seconde) d'entiers naturels, avec Heure≤24, Minute≤60, et Seconde≤60.
1.1. Ecrire en C une fonction Difference
qui prend en paramètres l'horaire de départ (DH,DM,DS) d'un train et son horaire d'arrivée (AH,AM,AS), et qui retourne le temps de trajet du train exprimé en seconde. Cette fonction fera appel à la fonction Conversion
du TD3 pour convertir un horaire. Le prototype de cette fonction sera unsigned int Difference(unsigned int DH, unsigned int DM, unsigned int DS, unsigned int AH, unsigned int AM, unsigned int AS)
.
1.2. On donne l'algorithme effectuant l'opération réciproque de la fonction Conversion
.
Algorithme HMS.
Donnée : un entier naturel T correspondant à un temps en secondes.
Résultat : Un triplet d'entiers naturels (H,M,S) correspondant à l'expression de T en heures, minutes et secondes.
H← T div 3600;
M← (T mod 3600) div 60;
S← T mod 60.
Ecrire en C la procédure HMS
correspondant à cet algorithme, et qui aura pour prototype void HMS(unsigned int T, unsigned int *Hp, unsigned int *Mp, unsigned int *Sp)
.
N.B. Le résultat de l'algorithme sera donc un triplet (*Hp,*Mp,*Sp) d'entiers naturels, obtenu par "effet de bord".
1.3. Ecrire un programme C qui :
– utilise des prototypes pour ces trois fonctions,
– demande les horaires de départ et d'arrivée d'un train,
– vérifie si ces horaires sont cohérents, et si oui,
– affiche le temps de trajet correspondant, exprimé comme un horaire (Heure,Minute,Seconde).
N.B. En utilisant dans le programme principal des variables globales unsigned int T,H,M,S
, l'appel à la fonction HMS sera sous la forme HMS(T,&H,&M,&S)
. En passant en paramètre de la fonction HMS les adresses &H, &M et &S des variables H, M et S (), cet appel modifiera ces variables globales par effet de bord.
EXERCICE 2*
2.1. Ecrire un algorithme qui réalise un jeu consistant à trouver en cinq essais un entier naturel A tiré aléatoirement entre 0 et 15 (compris). Après chaque essai, le programme affiche "trop petit" ou "trop grand" quand la valeur de l'entier fourni est différente de A. Il affichera finalement "bravo" ou "perdu" suivi de la valeur de A.
2.2. Traduire cet algorithme en C, en définissant deux constantes minimum=0 et maximum=15.
N.B. En C, la librairie stdlib.h
fournit la fonction rand()
qui retourne aléatoirement un entier naturel compris entre 0 et la constante prédéfinie RAND_MAX
. Cette fonction rand()
est en fait pseudo-aléatoire : il faut, avant de l'utiliser dans un programme, réinitialiser le générateur avec la commande srand
, généralement sous la forme srand(time(NULL))
, placée au début du main
. La fonction time
est fournie par la bibliothèque time.h
.
2.3. (pour aller plus loin). On pourrait choisir un intervalle de recherche du nombre A plus grand que [0;15], par exemple [0;100], ou [0;1000], ou même [0;RAND_MAX]. Quelle stratégie l'utilisateur pourrait-il adopter pour optimiser la recherche du nombre A en minimisant le nombre de valeurs proposées ?
EXERCICE 3* (voir l'exercice 5 du TP 2)
3.1. Ecrire un algorithme Multiplie
qui, pour un entier naturel n donné, retourne 2n (2 puissance n), en n'effectuant que des multiplications par 2.
3.2. La fonction C suivante effectue une multiplication de n
par 2 en utilisant un décalage à gauche de bit sur le code de n
.
unsigned long Decale(unsigned int n) {
unsigned long k=1<<n;
return k;
}
A quelles opérations correspondent 1<<1
? 1<<n
? 1>>1
? (faire des tests)
3.3. Ecrire un algorithme pour le problème suivant :
Algorithme Puissance
Donnée : un entier naturel n, un booléen b.
Résultat : 2n, en utilisant Multiplie
si b est vrai ou bien Decale
sinon.
3.4. Ecrire en C la fonction correspondante de prototype unsigned long Puissance(unsigned int n, int b)
.
3.5. Ecrire en C un programme qui utilise ce qui précède pour demander à l'utilisateur un entier naturel n et un caractère c, puis afficher 2n, en utilisant Decale
si c='D' ou c='d', ou bien Multiplie
sinon.
Exercice 4 (pour aller plus loin)
Modifier la sortie de l'exercice 3 afin que le programme affiche n et 2n en écriture binaire.
N.B. Utiliser une ou plusieurs fonctions annexes selon les besoins.