Examen de C et C++
Année 2014/2015 - Deuxième session
S1. Soient les deux fonctions suivantes :
void ex1a(int* p1, int* p2){(*p1)=(*p2)+1; p1=p2; (*p2)++;}
void ex1b(){
int x=11; int y=22; int* px=&x; int* py=&y;
ex1a(px, py); (*py)++; printf("%d %d\n",x,y);}
Donnez les affichages produits par l’exécution de ex1b.
Vous devez répondre dans les cadres prévus à cet effet. Il sera tenu compte de la concision et de l'efficacité de vos programmes. Téléphones portables, calculatrices, ordinateurs et tablettes interdits. Notes personnelles (manuscrites ou imprimées) et documents de cours, TD et TP sont autorisés.
Fonctions et opérateurs bitwise.
Université de Bourgogne - UFR Sciences et Techniques - L2
5%
S2. Soient les deux fonctions suivantes :
void ex2a(int* p, int n){if(*p>0){(*p)--; n=n*2; ex2a(p,n);}}
void ex2b(){int n=1; int x=2; int* p=&x; ex2a(p,n); printf("%d %d\n",x,n);}
Donnez les valeurs affichées par l’exécution de ex2b.
Tableaux 1D et chaînes.
5%
S3. Soit la fonction suivante : void ex3a(int x, int n){
int a = (~0) << n; int b = ~a; int c = (x << n)|b;
printf("%x %x %x \n", a,b,c);}
Quels sont les affichages réalisés par l’appel ex3a(4,2) ? 5%
S4. Comment calculer (2 puissance n) moins 1 en utilisant uniquement des opérateurs bitwise (donc pas de +,-,*…). Indice, la représentation binaire de la valeur à calculer est constituée de bits à 0 avec n bits à 1 à la fin. Par exemple, pour n=4, …00001111.
5%
T1. Réalisez une fonction int test_chiffre(char* p) qui, en supposant que p pointe un caractère situé dans une chaîne de caractères, retourne la valeur vrai (1) si le caractère pointé par p représente un chiffre et la valeur faux (0) sinon. 6%
T2. Réalisez une fonction int lit_chiffre(char** p) qui n’est supposée être appelée que si le pointeur situé à l’adresse p pointe un caractère situé dans une chaîne et désignant un chiffre. Cette fonction retourne la valeur numérique représentée par le chiffre pointé (par exemple si le caractère pointé par le pointeur pointé par p est ‘4’ alors la valeur de retour devra être l’entier 4) et incrémente le pointeur situé à l’adresse p.
8%
T3. Réalisez un petit programme (sous la forme d’une fonction main) utilisant les deux fonctions précédentes et réalisant les actions suivantes : création et initialisation d’une chaîne de caractères « 123a5 » située dans la pile, création d’une variable q de type char*
et initialisation de cette variable avec l’adresse de début de la chaîne, puis affichage de tous les chiffres situés à partir du début de la chaîne jusqu’au premier caractère qui n’est pas un chiffre.
Variables dynamiques et structures.
D1. Soient les structures suivantes :
typedef struct{double x; double y;} point;
typedef struct{point* tab; int n;} figure;
Une instance de la structure point représente un point dans un repère à deux dimensions et une instance de la structure figure représente une figure constituée de plusieurs points. Le champ n de cette structure représente le nombre de points de la figure et le champ tab contient l’adresse d’un tableau situé dans le tas où ces points sont stockés.
Réalisez une fonction figure* cloneFigure(figure* f) qui crée une figure située entièrement dans le tas, en tous point identique à celle pointée par f, mais complètement indépendante en mémoire.
10%
D2. Soit la fonction suivante :
void test_fig(){point tab[]={{1.0,1.0},{2.0,2.0},{1.0,2.0}}; figure f={tab,3};
figure* w = cloneFigure(&f);}
Représentez par un dessin les données en mémoire dans la pile et dans le tas juste avant la fin de l’exécution de cette fonction. Dessinez également les liens entre pointeurs et données pointées. Entourez en pointillés les données qui ne seront pas détruites et provoqueront une fuite mémoire.
10%
Classes et objets
O1. On suppose qu’une classe Date, représentant une date, est déjà définie et comporte un constructeur en copie et un autre constructeur qui crée une date à partir d’un jour, d’un mois et d’une année passés en paramètres sous la forme de trois entiers. On déclare les classes DateVal1 et DateVal2 de la manière suivante :
class DateVal1{friend class DateVal2;
private: Date* d; double val;
public: //A compléter.
};
class DateVal2{friend class DateVal1;
private: Date d; double val;
public: //A compléter.
};
Une instance de DateVal1 ou de DateVal2 associe une date et une valeur (qui pourrait par exemple représenter la température maximum atteinte dans une ville ce jour là).
Chacune des deux classes est déclarée amie de l’autre, ce qui permet à ses méthodes d’accéder aux variables d’instance privées de l’autre classe.
Est il indispensable de définir un destructeur pour la classe DateVal1 ? Et pour la classe 5%
6%
Structures complexes en C++
Soit la classes Maillon suivante : class Maillon
{
private: int val; Maillon* suiv;
public:
void delNext(); //Détruit le maillon suivant void delNextk(int k);
};
Cette classe représente un maillon pouvant appartenir à un chaînage permettant de réaliser une liste.
O3. Définissez le constructeur DateVal2::DateVal2(DateVal1* m) permettant de créer une instance de DateVal2 à partir des informations contenues dans une instance de DateVal1.
5%
X1. Donnez la définition (le code) de la méthode delNext qui détruit le maillon situé dans le chaînage immédiatement après le maillon courant (i.e. celui pointé par this). Cette méthode ne fait rien si elle est appelée avec le dernier maillon d’un chaînage (c’est à dire si this->suiv vaut NULL).
10%
X2. Donnez la définition (le code) de la méthode delNextk qui détruit les k premiers maillons situés dans le chaînage après le maillon courant. Cette méthode doit faire appel à la méthode delNext. S’il y a moins de k maillons après le maillon courant, tous les maillons qui suivent le maillon courant doivent être détruits.
10%
O4. On suppose que la classe DateVal2 est pourvue d’un constructeur par défaut qui crée une instance de valeur 0.0 datée du 1 janvier 1900. Soit la fonction suivante :
void test(){DateVal2 d; DateVal1 w(&d);}
Représentez par un dessin les données en mémoire dans la pile et dans le tas juste avant la fin de l’exécution de cette fonction. Dessinez également les liens entre pointeurs et données pointées.
5%
S1 5%
Numéro d'anonymat :
int test_chiffre(char* p) {
}
int lit_chiffre(char** p) {
}
S2 5% S3 5%
S4 5%
T1 6%
T2 8%
Examen de C et C++
Année 2014/2015 - Deuxième session
T3 6%
figure* cloneFigure(figure* f) {
}
D2 10%
Pile Tas
D1 10%
O1 5%
O2 5%
void Maillon::delNextk(int k) {
X2 10%
O3 5%
Pile Tas
O4 5%
void Maillon::delNext() {
}
X1 10%