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

Documents pareils