• Aucun résultat trouvé

Examen de C et C++ Année 2013/2014 - Première session

N/A
N/A
Protected

Academic year: 2022

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

Copied!
5
0
0

Texte intégral

(1)

Examen de C et C++

Année 2013/2014 - Première 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’adres- se 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 les tableaux désignés par les paramè- tres ne se chevauchent pas, et la valeur 0 (faux) sinon. Vous devez écrire un code le plus simple possible et qui s’exécute en temps constant, donc sans boucle. Un chevauchement est une situation où au moins une cellule d’un tableau appartient aussi à l’autre tableau.

int cover(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 un octet qui indique la longueur de la chaîne 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 4 caractères ayant pour valeurs respectives 3, ’a’, ’b’, et ’c’. 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 p2s qui convertit une chaîne représentée en format Pascal en une chaîne représentée en format C. La chaîne résultat doit être placée dans le même tableau que la chaîne initiale.

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 agrandir qui augmente la taille du tableau encapsulé pointé par dest en lui ajoutant k cellules. On suppose que le tableau initial a été correctement initialisé et qu’il contient des valeurs. Le tableau agrandi doit contenir toutes les valeurs du tableau initial, et ses k dernières cellules doivent être initialisées à 0. Il vous est demandé de ne pas utiliser la fonction realloc, mais la fonction calloc. L’exécution de la fonction agrandir ne doit produire aucune fuite mémoire.

10%

void p2s(char* p) {

}

Variables dynamiques et structures.

void agrandir(tabint* dest, int k) {

(3)

5%

Les lignes de code suivante sont censées créer un tableau encapsulé situé sur le tas et ayant trois cellules initialisées à 0.

tabint* t;

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

t->n=3;

Mais il y a une erreur. Expliquez laquelle et comment la corriger.

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

{

private:

string* nom; int num;

public:

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

};

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.

Donnez ci-dessous la définition de la méthode print.

5%

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

void Fiche::print() {

}

Soit la fonction suivante : void test4()

{

(4)

Complétez ci dessous la définition d’un deuxième constructeur pour la classe Fiche.

10%

Fiche(string nom, int num) {

}

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()

};

Dessinez ci-dessous les contenus de la pile et du tas juste après l’exécution des lignes de code suivantes :

Pile p; p.push(5); p.push(10);

Faites ce dessin avant de répondre à la question suivante, en vous basant sur les explications données ci dessous, sinon il y a de très fortes chances que vous fassiez une erreur en répondant à la question suivante.

(5)

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 termite qui accepte en paramètre d’adresse d’un arbre, supposé être stocké complètement dans le tas, et qui détruit complètement cet arbre.

10%

void push(int x) {

}

Donnez ci dessous la définition de la méthode push de la classe Pile.

void termite(arbre* w) {

Références

Documents relatifs

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

Alors H est

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

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

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