Devoir surveillé du 21 octobre 2014 Exercice 1
Transcription
Devoir surveillé du 21 octobre 2014 Exercice 1
UJF - UFR IM2 AG Master 2 CCI Devoir surveillé du 21 octobre 2014 Durée : 1h – Documents : autorisés – Barème indicatif Exercice 1 (∼ 3 points) On donne ci-dessous la suite de commandes executées dans une fenêtre ”Unix” par un utilisateur (chaque commande est précédée par rochail[x]). rochail[1] ls pgm.c rochail[2] more pgm.c #include <stdio.h> int main() { char x, y ; scanf("%c", &x) ; printf("%c\n", x) ; scanf("%c", &y) ; printf("%c\n", y+1) ; return 0 ; } rochail[3] gcc -o pgm pgm.c rochail[4] ./pgm Q1. En supposant que l’utilisateur entre successivement au clavier les caractères a et b, que va t-il être affiché à l’écran après exécution de la dernière commande ? Q2. Que serait-il affiché si on exécutait la commande ls entre les commandes 3 et 4 ? Exercice 2 (∼ 6 points) On rappelle qu’en langage C les chaı̂nes de caractères sont classiquement représentées dans des tableaux de caractères en les terminant par le caractère spécial ’\0’ (marque de fin). On rappelle également que les caractères sont représentés par leur code Ascii et que ce code préserve l’ordre alphabétique sur les lettres. Ainsi : – pour transformer un caractère minuscule en caractère majuscule il suffit de lui ajouter la valeur ’a’ - ’A’ ; – pour tester si un caractère c est une lettre minuscule il suffit de tester si ’a’ ≤ c ≤ ’z’. Q1. Ecrire une fonction C correspondant au profil suivant : void min_vers_MAJ (char s[]) ; /* etat initial : s contient une chaine de caracteres etat final : - les lettres minuscules de s ont ete mises en majuscule - les autres caracteres de s sont inchanges */ Q2. Ecrire un programme principal (main) permettant de tester la fonction min vers MAJ en répétant 5 fois les opérations suivantes : 1. lecture d’une chaı̂ne de caractères s au clavier (de longueur inférieur à 50 caractères) 2. appel de la fonction min vers MAJ avec s en paramètre et affichage à l’écran des deux chaı̂nes produites en résultat. Exercice 3 (∼ 4 points) int a, b, *p ; void f1 (int x) { int b=3 ; a = a + x ; b = a + 1 ; /* point d’observation (3) */ } void f2 (int y, int z) { b = y + z ; /* point d’observation (2) */ } int main() { a = 2 ; p = &a ; b = *p+1; /* point d’observation (1) */ f2 (a+1, b) ; f1 (*p +3) ; /* point d’observation (4) */ return 0 ; } Indiquez les valeurs des variables a et b aux points d’observation (1), (2), (3) et (4) indiqués en commentaire. Exercice 4 (∼ 7 points) Proposez une solution pour traduire en C le lexique suivant : NB_CARTE : constante 4 hauteur : type [sept, huit, neuf, dix, valet, dame, roi, as] couleur : type {coeur, pique, carreau, trefle} carte : type doublet <h : hauteur, c : couleur> jeu : type tableau sur [0..NB_CARTE] de couleur Ecrivez alors les fonctions suivantes : MemeCarte (c1 : carte, c2 : carte) : booleen /* vaut vrai ssi c1 = c2 */ MemeJeu (j1 : jeu, j2 : jeu) : booleen /* vaut vrai ssi j1 = j2 */ 2