Exercices et probl` emes corrig´ es en C++ M1 Math´ ematiques Appliqu´ ees 2019
Exercices et probl` emes corrig´ es en C++ M1 Math´ ematiques Appliqu´ ees 2019-2020 Version du 6 avril 2020 Lien vers la version en ligne Exercice 1 : Pointeurs On consid` ere que l’on dispose d’un tableau de flottants d´ eclar´ e de la mani` ere suivante : float tab [3]; On supposera que ce tableau a ´ egalement ´ et´ e initialis´ e. 1) ´ Ecrire un programme permettant de calculer la somme des ´ el´ ements du tableau en utilisant le formalisme tableau. 2) ´ Ecrire un programme permettant de calculer la somme des ´ el´ ements du tableau en utilisant le formalisme pointeur. 3) Reprendre les questions 1) et 2) en consid´ erant un tableau ` a deux dimensions d´ eclar´ e comme suit : float tab2D [3][4]; et dont on supposera qu’il a ´ et´ e initialis´ e. Exercice 2 : Structures et fonctions On consid` ere le type structure suivant : struct producteur{ int stock; int ventes [12]; } Ecrire une fonction qui initialise les champs stock et ventes en donnant la valeur 0 ` a tous les ´ el´ ements de deux fa¸ cons : a) Via une fonction acc´ edant ` a une variable de type producteur en argument; 1 b) Via une fonction membre d´ efinie dans la structure producteur sous la forme : void init (); Exercice 3 : Chaˆ ınes de caract` eres Cet exercice reprend et compl` ete un exercice du TP 2. ´ Ecrire une fonction qui prenne en argument une chaˆ ıne de caract` eres et un caract` ere, et qui renvoie le nombre d’occurrences du caract` ere dans la chaˆ ıne. On consid` erera trois en-tˆ etes, correspondant ` a trois repr´ esentations des chaˆ ınes de caract` eres en C++ : a) Repr´ esentation via le type string : int nb_occ(string s,char c); b) Repr´ esentation via un tableau de caract` eres : int nb_occ(char s[],char c); c) Repr´ esentation via un pointeur vers le premier caract` ere : int nb_occ(char *s, char c); Probl` eme A : Files d’attente et magasins Remarque : il est fortement recommand´ e d’impl´ ementer et de tester les diff´ erentes classes de l’exercice sur machine. Contexte On souhaite mod´ eliser la gestion des files d’attente durant une p´ eriode de confine- ment. Pour cela, on consid` erera tout d’abord les constituants d’une file (les individus), puis la file elle-mˆ eme, d´ efinie via une allocation dynamique. Enfin, on mod´ elisera des commerces comme h´ eritant de la classe repr´ esentant une file. Partie 1 : Individus On consid` ere une classe Personne repr´ esentant des individus en temps de confinement. Cette classe comporte trois membres donn´ ees : • Deux membres nom et prenom de type string; • Un membre attestation de type bool qui repr´ esente le fait que la personne dispose ou non d’une attestation de sortie. a) Coder deux constructeurs pour la classe Personne, respectivement sans argument et avec deux chaˆ ınes de caract` eres en arguments. Dans le premier cas, les membres nom et prenom seront initialis´ es avec la chaˆ ıne de caract` eres vide; dans le second, les deux arguments serviront ` a initialiser ces deux membres donn´ ees. Enfin, dans les deux cas, la valeur du membre attestation sera initialis´ ee ` a false. 2 b) Cr´ eer une fonction permettant de mettre la valeur du bool´ een attestation ` a true. c) On souhaite cr´ eer une classe Policier qui d´ erive de la classe Personne. Cette classe de- vra disposer d’un constructeur bas´ e sur celui de la classe Personne, qui initialise la valeur du bool´ een ` a true; elle devra ´ egalement comporter une fonction membre controler dont l’interface sera la suivante : string controler(Personne ); Cette fonction v´ erifiera la valeur du bool´ een de l’objet de type Personne pass´ e en argument. En fonction de la valeur de ce bool´ een, elle renverra une chaˆ ıne de caract` eres indiquant le nom complet de la personne, et si celle-ci poss` ede ou non une attestation. Partie 2 : Files d’attente On adoptera ici la repr´ esentation circulaire d’une file d’attente. On se donnera ainsi un tableau de taille fix´ ee, dans lequel on rangera les individus ` a la suite dans leur ordre d’arriv´ ee dans la file. Deux indices serviront ` a rep´ erer respectivement le d´ ebut et la fin de la file. 1. On consid` ere une classe File repr´ esentant une file d’attente poss´ edant trois membres donn´ ees : • gens de type Personne * repr´ esentera un tableau d’objets de type Personne; • lgfile de type int repr´ esentera la taille maximum possible pour la file; • lmax de type static const int repr´ esentera la valeur maximale qui puisse ˆ etre choisie pour lgfile; • ideb et ifin, de type int, repr´ esenteront les indices de d´ ebut et de fin de la file, respectivement. Ils seront initialis´ es ` a la valeur -1. ´ Ecrire les fonctions membres n´ ecessaires pour que la classe File soit sous forme canonique. 2. Surcharger l’op´ erateur [] afin que, si f est un objet de la classe File, f[i] (o` u i est un entier entre 0 et f.lgfile-1) renvoie la (i+1)-` eme personne de la file. 3. Surcharger l’op´ erateur -- pour que celui-ci repr´ esente la sortie de la premi` ere personne d’une file. Un appel ` a cette fonction devra afficher le prenom et le nom de la personne quittant la file, le cas ´ ech´ eant. Pour simplifier, cette fonction n’aura pas de type de retour.1 4. Surcharger l’op´ erateur + pour qu’il puisse r´ ealiser la “somme” d’un objet de type File et celle d’un objet de type Personne, c’est-` a-dire ajouter la personne ` a la file, si tant est qu’il y reste de la place. Un affichage devra permettre de valider si la personne a ´ et´ e ajout´ ee ou non. Pour simplifier, cette fonction n’aura pas de type de retour.2 5. Au vu des contraintes pos´ ees par l’impl´ ementation de la classe File, comment pourrait-on organiser le code des classes des parties 1 et 2 ? 1Si l’on voulait que cet op´ erateur se comporte comme l’op´ erateur -- usuel, il faudrait renvoyer un objet de type File &. 2L` a encore, la logique voudrait que l’on renvoie un objet de type File. 3 Partie 3 : Commerces Dans cette derni` ere partie, on utilisera les propri´ et´ es de la classe File pour d´ efinir des structures de donn´ ees repr´ esentant des commerces. 1. Impl´ ementer deux classes Epicerie et Pharmacie d´ erivant de la classe File et poss´ edant en plus les membres donn´ ees suivants : • Pour la classe Epicerie, un entier stockPaquetsPates, initialis´ e ` a 100; • Pour la classe Pharmacie : un entier stockGelHydroAlco, initialis´ e ` a 1; Dans les deux cas, l’op´ erateur -- devra ˆ etre red´ efini pour diminuer la variable de stock ` a chaque fois que la premi` ere personne de la file sera servie. 2. On souhaite impl´ ementer une classe Supermarche h´ eritant ` a la fois des classes Epicerie et Pharmacie, mais ne comportant qu’une file. Quelle(s) modification(s) doit-on apporter aux classes pr´ ec´ edentes pour cela ? 3. Mˆ eme question si l’on d´ esire en plus que la classe Supermarche comporte un membre donn´ ee de type Policier pouvant contrˆ oler l’ensemble des membres de la file d’attente du supermarch´ e. 4 Correction Correction de l’exercice 1 1) On peut faire une boucle for afin de parcourir tous les ´ el´ ements du tableau; dans le formalisme tableau, on acc` ede au i-` eme ´ el´ ement d’un tableau tab en faisant tab[i]. Un calcul de la somme des ´ el´ ements du tableau peut donc ˆ etre fait comme suit : float s=0; for(int i=0;i<3;i++){ s+=tab[i]; } 2) Plusieurs solutions sont possibles ici. On commence par la plus semblable ` a celle de la question pr´ ec´ edente : // Solution 1 float s=0; for(int i=0;i<3;i++){ s+=*( tab+i);//NB: ne modifie pas le pointeur tab ! } On utilise ici le fait que tab+i pointe vers le (i+1)-` eme ´ el´ ement du tableau. Une autre possibilit´ e consiste ` a utiliser un pointeur auxiliaire, et ` a ne se servir de l’entier i que pour compter le nombre d’it´ erations de la boucle : // Solution 2 float s=0; for(float *p=tab , int i=0;i<3;i++,p++){ s+=*p; } Le pointeur auxiliaire p est ainsi incr´ ement´ e ` a chaque it´ eration. Il est ´ egalement possible de n’utiliser que des pointeurs, et pas de variable enti` ere : // Solution 3 float s=0; for(float *p=tab;p<tab +3;p++){ s+=*p; } 3) Dans le cas d’un tableau ` a deux dimensions, on peut effectuer une double boucle en utilisant le formalisme tableau : int s=0; for(int i=0;i<3;i++){ for(int j=0;j<4;j++){ s+= tab2D[i][j]; } } 5 uploads/Philosophie/ exos-cpp.pdf
Documents similaires










-
42
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Mar 07, 2022
- Catégorie Philosophy / Philo...
- Langue French
- Taille du fichier 0.2782MB