• Aucun résultat trouvé

Examen de C et C++ Année 2014/2015 - Deuxième session

N/A
N/A
Protected

Academic year: 2022

Partager "Examen de C et C++ Année 2014/2015 - Deuxième session"

Copied!
6
0
0

Texte intégral

(1)

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%

(2)

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%

(3)

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%

(4)

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%

(5)

figure* cloneFigure(figure* f) {

}

D2 10%

Pile Tas

D1 10%

O1 5%

O2 5%

(6)

void Maillon::delNextk(int k) {

X2 10%

O3 5%

Pile Tas

O4 5%

void Maillon::delNext() {

}

X1 10%

Références

Documents relatifs

Donner les fonctions pour calculer le total et la moyenne (réponse au tableau) 2.. Déterminer les fonctions pour extraire la valeur minimale et

Legault (72 ans), un client de votre pharmacie, prend de l’énalapril 5 mg BID (Vasotec MD ) depuis 1 mois pour traiter son hypertension artérielle.. Un matin, l’infirmière de la

En supposant que la fonction comb_bitwise est correctement programmée, réalisez une fonction void test_bitwise() qui déclare deux variables entières x et y, initialisées

2 po ints Vous devez implanter ci-dessous le constructeur de la classe LstStr qui accepte en paramètre un tableau de string et qui doit créer une liste contenant toutes les chaînes

1. Pour la question a) de l’exercice, il est demandé de mener les calculs de manière suffisamment détaillée, et non pas de justifier l’applicabilité des

Lorsqu’un g´ erant sp´ ecialiste ach` ete une valeur boursi` ere pour son client, la probabilit´ e que le cours de celle-ci monte est de 80% ; dans le cas d’un non sp´

On consid` ere un plan affine euclidien muni d’un rep`

On consid` ere un plan affine euclidien muni d’un rep`