Examen de C et C++
Année 2012/2013 - Première session
Numéro d'anonymat :
Les deux fonctions ci-dessous retournent des Booléens représentés par des entiers. Complétez leurs définitions de manière à ce que :
●testbits1 retourne vrai si set seulement si dans toutes les positions où il y a un bit à 1 dans le masque, il y a un bit à 1 dans la donnée.
●testbits0 retourne vrai si et seulement si dans toutes les positions où il y a un bit à 1 dans le masque, il y a un bit à 0 dans la donnée.
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
int testbits1(int masque, int donnee) {
}
int testbits0(int masque, int donnee) {
} 2 points
Donnez (page suivante) les affichages réalisés par l’exécution de la fonction test2 définie ci dessous.
void fp1(int* p) {
p++;
}
void fp2(int** w, int* q) {
*w=q;
}
Pointeurs sur scalaires.
void test2() {
int x=0,y=0;
int* p=&x;
(*p)++; printf("%d %d -- ",x,y);
fp1(&y); printf("%d %d -- ",x,y);
fp2(&p,&y); printf("%d %d -- ",x,y);
(*p)++; printf("%d %d -- ",x,y);
}
Tableaux 1D.
int* apvnn(int* tab, int n) {
}
2 points
Complétez ci dessous la définition de la fonction apvnn de manière à ce qu’elle retourne l’adresse de la première valeur différente de 0 du tableau tab, supposé comporter n cellules.
char* prodch(int n) {
}
2 points
Chaînes et variables dynamiques.
Complétez ci dessous la définition de la fonction prodch de manière à ce qu’elle retourne l’adresse d’une chaîne stockées dans le tas, constituée des n premières lettres de l’alphabet.
Par exemple si n vaut 4, la chaîne produite doit être "ABCD".
Complétez (page suivante) la définition de la fonction test3 de manière à ce que l'exécution de cette fonction crée sur la pile un tableau de 11 caractères, puis crée sur la tas, à l’aide de la fonction prodch, une chaîne contenant les 10 premières lettres de l’alphabet, puis recopie la chaîne produite dans le tableau préalablement créé sur la pile, puis affiche pour vérification les contenus des deux chaînes (celle sur la pile et celle sur le tas),
2 points
Structures et variables dynamiques.
2 points void test3()
{
}
typedef struct {
double r; double i;
} complexe;
On définit ci contre une structure représentant un nombre complexe constitué d’une partie réelle et d’une partie imaginaire.
2 points Complétez ci dessous la définition de la fonction add qui crée sur le tas un nouveau nombre complexe égal à la somme des deux nombres complexes dont les adresses sont passées en para- mètres.
complexe* add(complexe* x, complexe* y) {
}
Classes.
On définit une classe Mission qui repré- sente une mission à réaliser, décrite par une chaîne de caractères et un niveau de priorité représenté par un entier. On suppose que les méthodes et les construc- teurs de la classe sont déjà implantés correctement. La méthode print affiche à l’écran une description de la mission et la méthode getPriorite retourne son niveau de priorité.
class Mission {
private:
int priorite;
string description;
public:
Mission(int p, string desc);
Mission();
void print();
int getPriorite();
};
La classe Objectif représente une liste de missions a réaliser. Les missions sont placées dans la liste dans un ordre arbitraire, sans lien avec leurs prio- rités. La variable d’instance n repré- sente le nombre de missions enregistrées dans la liste et la variable d’instance nmax représente le nombre maximum de missions pouvant être enregistrées. La variable d’instance tab pointe un ta- bleau contenant les adresses des mis- sions.
class Objectif {
private:
Mission** tab;
int n;
int nmax;
public:
Objectif(int max);
void add(int priorite, string desc);
~Objectif();
};
Objectif::~Objectif() {
} 1.5 point
On suppose que le constructeur de la classe est déjà correctement implanté et qu’il crée une instance pouvant recevoir max missions. Complétez les définitions du destructeur de la fonc- tion add qui ajoute une nouvelle mis- sions créée à partir des données qui lui sont passées en paramètres. Pour sim- plifier le code, on suppose que n < nmax.
On représente un graphe à l’aide des deux structures définies ci dessous. La structure graphe représente la liste des adresses des sommets d’un graphe. Chaque sommet est représenté par une donnée de type sommet, qui comporte un numéro attribué au sommet, le nombre de successeurs du sommet et un tableau contenant les adresses des successeurs du sommet.
void Objectif::add(int priorite, string description) {
} 1.5 point
Structures complexes en C.
Un graphe est constitué de sommets et d’arcs reliant certains sommets à certains autres.
Lorsqu’il y a un arc d’un sommet a à un sommet b, on dit que b est un successeur de a.
typedef struct {
int nsomm;
sommet** tab;
}graphe;
typedef struct _sommet {
int num;
int nsucc;
struct _sommet** tab;
Donnez sous forme graphique la représentation en mémoire du graphe ci contre dans lequel chaque sommet a un seul successeur.
Complétez ci dessous les lignes de codes permettant de créer ce graphe.
1 point
graphe* g = g->nsomm=
g->tab = sommet* s1=
sommet* s2=
s1->nsucc= ; s2->nsucc= ; s1->num= ; s2->num= ; s1->tab=
s2->tab=
s1->tab[0]= ; s2->tab[0]= ;
1 point
Structures complexes en C++.
On définit (page suivante) les classes Maillon et Missions (avec un s à la fin) qui représentent respectivement un maillon de chaînage et une liste simplement chaînée de missions classées par ordre de priorités croissantes. Attention de ne pas confondre la classe Missions avec la classe Mission définie précédemment et qui représente une mission. Dans la classe Maillon, la classe Missions est déclarée amie, ce qui autorise les méthodes de cette classe à accéder aux membres privés de Maillon.
class Maillon {
private:
Mission m;
Maillon* suivant;
public:
Maillon(Maillon* suiv, Mission m);
Maillon* cherche(int p);
friend class Missions;
};
Complétez ci dessous la définition de la fonction cherche de la classe Maillon. Si le maillon courant contient une mission de priorité strictement supérieure à la valeur du paramètre p, cette fonction retourne NULL, sinon elle retourne l’adresse du dernier maillon contenant une mission de priorité au plus égale à p en parcourant récursivement le chaînage à partir du maillon courant.
1.5 point
void Missions::add(int prio, string desc) {
if(prem==NULL)
else {
Maillon* p=prem->cherche(prio);
if(p==NULL) {
} else {
} }
t class Missions
{
private:
Maillon* prem;
public:
Missions();
void add(int prio, string desc);
void print();
};
Maillon* Maillon::cherche(int p) {
if(m.getPriorite()>p) return NULL;
}
Complétez ci dessous la définition de la méthode add qui ajoute une mission dans la liste en préservant l’ordre des priorités, c’est à dire que les missions de priorité 2 sont toutes après celles de priorité 1, que celles de priorité 3 sont toutes après celles de priorité 2, etc.