• Aucun résultat trouvé

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

N/A
N/A
Protected

Academic year: 2022

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

Copied!
5
0
0

Texte intégral

(1)

Examen de C et C++

Année 2013/2014 - Deuxième session

Numéro d'anonymat :

Soient deux entiers non signés x et y. On suppose que y est plus petit que 16. Indiquez comment calculer les valeurs x*16 et (x*16)+y sans utiliser d’opérateur arithmétique mais en utilisant uniquement des opérateurs bitwise (à choisir parmi <<,>>,&,|,~,^).

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

10%

En langage C, un tableau d’entiers est désigné par un pointeur sur int représentant l’adresse de début et un entier représentant sa taille. Vous devez compléter la fonction ci-dessous de manière à ce qu’elle retourne la valeur 1 (vrai) si le tableau t1 est complètement inclus dans le tableau t2, au sens où les adresses de toutes ses cellules sont comprises entre l’adresse de début et l’adresse de fin de t2.

int covered(int t1[], int n1, int t2[], int n2) {

Tableaux 1D et pointeurs sur scalaires.

(2)

Chaînes.

Une équipe de programmeurs décide de représenter les chaînes de caractères d’une manière différente du format standard du langage c. La nouvelle représentation d’une chaîne commence par deux octets qui représentent la longueur de la chaîne codée sur 16 bits et est suivie par la suite des caractères constituant le contenu de la chaîne. Par exemple, la chaîne "abc" est représentée par un tableau de 5 caractères ayant pour valeurs respectives 0, 3, ’a’, ’b’, et

’c’, où les valeurs 0 et 3 représentent la longueur de la chaîne codée sur 16 bits (0000 0000 0000 0011 en binaire). Cette nouvelle représentation est appelée « format Pascal » alors que la représentation standard sera appelée « format C ». Complétez ci-dessous le code de la fonction c2p qui convertit une chaîne représentée en format C en une chaîne représentée en format Pascal. La chaîne au format C ne doit pas être modifiée et la chaîne résultat doit être placée à l’adresse indiquée comme second paramètre. On suppose que cette adresse pointe une zone mémoire libre suffisamment grande pour y placer le résultat.

10%

void c2p(char* strc, char* strp) {

}

tabint* clone(tabint* t) {

Variables dynamiques et structures.

On définit comme ci-dessous le type tabint représentant un tableau encapsulé d’entiers : typedef struct {int* tab; int n;} tabint;

Le champ tab pointe sur un bloc mémoire contenant les valeurs stockées dans le tableau et le champ n représente la taille du tableau.

Définissez ci-dessous la fonction clone qui crée un nouveau tableau encapsulé stocké complètement sur le tas et qui contient les valeurs du tableau pointé par le paramètre t.

(3)

Soient les lignes de code suivantes : tabint t,w;

t.tab=(int*)calloc(3,sizeof(int));

t.n=3; t.tab[1]=33;

w = *clone(&t);

Dessinez toutes les données crées sur le tas et sur la pile par l’exécution des ces lignes de code (ainsi que les liens entre pointeurs et valeurs pointées).

10%

Classes et représentation mémoire en C++

On définit la classe Fiche comme ci-dessous : class Fiche

{

private:

string* nom; int num;

public:

Fiche(string nom, int num) {this->nom=new String; *(this->nom)=nom; this->num=num;}

void print(); void setname(String s) {*nom=s;}

};

Cette classe représente une fiche constituée d’un nom et d’un numéro. La méthode print affiche le contenu de l’instance courante au format suivant : Donald –> 332.

Soit la fonction suivante (supposée être définie en dehors de toute classe) : void test()

{

(4)

Dessinez ci-dessous les données créées en mémoire sur le tas et sur la pile par l'exécution de la fonction test définie précédemment. Vous devez dessiner les données telles qu'elles se présentent en mémoire juste avant que l'exécution de la fonction test se termine.

10%

Structures chaînées en C++

On définit une classe Pile qui représente une pile d’entiers avec le principe tête / queue.

Dans cette représentation, il y a une seule classe nommée Pile qui fait aussi office de maillon pour le chaînage. Une pile vide est représentée par une instance de Pile dans laquelle la variable d’instance suite vaut NULL, et la variable d’instance val vaut arbitrairement 0. Une pile non vide est représentée par une instance de Pile dans laquelle val contient la valeur la plus récemment empilée (sommet) et suite pointe une pile contenant les autres valeurs empilées, si applicable, ou une pile vide sinon.

class Pile {

private:

int val; Pile* suite;

public:

Pile() {suite=NULL; val=0;}

void push(int x);int pop();

};

Donnez ci-dessous le code du destructeur de la classe Pile.

(5)

10%

On suppose que la classe Pile est pourvue d'une méthode Pile* clone() qui retourne un pointeur sur une nouvelle pile identique à la pile courante mais complètement indépendante en mémoire.

Donnez ci-dessous la redéfinition complète de l'opérateur d'assignation = de la classe Pile, en respectant les bonnes pratiques de programmation.

int cherche(arbre* w, int val) {

Structures chaînées en C

Un arbre général est un arbre dont chaque nœud possède un nombre arbitraire de fils. Dans le cadre de cet exercice, on représente, avec la structure arbre définie ci dessous, des arbres généraux étiquetés par des entiers. Par convention, les feuilles sont représentées par NULL.

Chaque nœud qui n’est pas une feuille contient un champ val représentant l’entier associé, un champ n représentant le nombre de fils (que l’on supposera être au moins égal à 1), et un champ fils pointant sur un tableau de pointeurs vers les fils du nœud (lorsqu’un fils est une feuille, la valeur de la cellule correspondante du tableau est NULL).

typedef struct _arbre {struct _arbre** fils; int n; int val;} arbre;

Donnez ci-dessous la définition de la fonction cherche qui accepte en paramètre d’adresse d’un arbre et une valeur, et qui retourne la valeur 1 (vrai) si la valeur se trouve dans l'arbre et 0 (faux) sinon.

Références

Documents relatifs

Alors H est

Pour prouver la correction d’une fonction récursive, on procède en général par récurrence : on prouve d’abord que la sortie de la fonction est correcte pour les cas

Pour supprimer un des fi chiers d’une pile, ouvrez simplement la pile et faites glisser l’élément à l’extérieur, vers l’endroit où vous voulez le déposer.. Pour supprimer

On s’intéresse dans tout ce problème à une suite infinie de lancers d’une pièce équilibrée autour duquel deux joueurs J et J 0 s’affrontent. Le joueur J l’emporte si

5. Sur la première pile uniquement, en utilisant le vocabulaire introduit, indiquer ce qui arrive aux électrons au niveau de chacune des électrodes en précisant celle

Emplacement de la pile.- Pour ˆetre sˆ ur que le programme et la pile n’interf`erent pas, le microprocesseur i8086 a ´et´e con¸cu de telle fa¸con que le code et les

Exemple.- ´ Ecrivons un programme QBasic qui demande un entier naturel (de deux octets) et fait appel ` a un sous-programme en langage machine qui passe la valeur en

– à créer la pile comme un objet récursif (une pile est vide ou bien constituée d'un élément qui est son sommet et d'une pile) … voir question a) ci-dessous ;. – à créer