Vous êtes sur la page 1sur 32

Indications:

Pour chacune des questions de ce devoir, lisez bien attentivement la question avant
d'y répondre. Une fois toutes les réponses fournies:

utiliser le menu /Fichier/Imprimer (ou le racourcis clavier CTRL+P) pour créer et


sauvegarder une version pdf de votre notebook sur votre machine locale, puiq
remettre cette version sur l'ENT comme compte rendu de votre devoir au plus
tard le 31 mai 2022 à 23h:59.

#Devoir 2: Concepts avancés (à rendre


au plus tard le 31 mai 2022)
* Nom : mahjabi
* Prénom:lamiaa

* Code Apogeé: 20501670


* Code Apogeé: 20501670

Devoir 2: Concepts avancés (à rendre au plus tard le


31 mai 2022)
Nom : mahjabi

Prénom:lamiaa

Code Apogeé: 20501670

Question 0:
Créer le Xchier smps4.hpp en exécutant la cellule de code suivante, puis

vériXer l'existence de ce Xchier dans votre répertoire de travail courant,


aZcher son contenu en utilisant au moins trois commandes Linux différentes.
:
Double-cliquez (ou appuyez sur Entrée) pour modiXer

Double-cliquez (ou appuyez sur Entrée) pour modiXer

Double-cliquez (ou appuyez sur Entrée) pour modiXer

%%writefile smps4.hpp
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <limits.h>
#include <float.h>
#include <fstream>

using namespace std;

Writing smps4.hpp

# Vérification de l'existance de smps4.hpp (ajouter votre commande puis l'exécut


!g++ smps4.hpp

smps4.hpp:8:20: error: expected ‘;’ before ‘,’ token


using namespace std,float.h
^
smps4.hpp:8:20: error: expected unqualified-id before ‘,’ token
smps4.hpp:8:21: error: expected unqualified-id before ‘float’
using namespace std,float.h
^~~~~
:
# Affichage du contenu de smps4.hpp (commande 1)
!ls-l

# Affichage de smps4.hpp (commande 2)


!gedit smps4.hpp

/bin/bash: gedit: command not found

# Affichage de smps4.hpp (Commande 3)


!ls_l
:
Question 1:
La forme générale de la boucle for en C, C++ et Java est: for (expr1; expr2; expr3)
Bloc_à_Répéter;

a) Donner la signiXcation des trois expressions:

expr1: initialisation s'exécute une seule fois au début

expr2: les conditions s'éxecute avant chaque itération

expr3: l'itération s'éxécute après chaque répétition

b) Laquelle de ces expressions est exécutée:

Avant chaque répétion: les conditions


Après chaque répétion: l'itération
Une seule fois, avant de démarrer les répétitions: initialisation

c) Quand est-ce que cette structure de boucle est la plus commode?:

Lorsque le nombre de répétions n'est pas connu, mais doit être au moins égal à
1,

d) Donnez l'équivalent du code: for (expr1; expr2; expr3) Bloc_à_Répéter;

En utilisant la structure do ... while (2 instructions): Int expr1; Do {


Bloc_à_Repeter); Expr3; } While (Expr2);

En utilisant la structure while (2 instructions): int Expr1; While (expr2); {


Bloc_a_repeter; } Expr3;
:
Question 2:
Soit l'instruction de déclaration suivante: @oat x;

1) Donner l'expression C++ qui représente:

La taille en octet de la zone mémoire réservée à la variable x par le système


d'exploitation: sizeof hoat;
L'adresse de début de cette zone : &x;

2) Donner les noms des constantes prédéXnies qui représentent les bornes de
l'intervalle des valeurs possibles que peut prendre x:

Valeur minimale: -3.4*10^-38


Valeur maximale: 3.4*10^38

Question 3:
On se propose de déterminer la valeur du plus petit réel positif simple précision, c'est-
à-dire le plus petit réel positif de type @oat, qu'on nommera @oateps, pour lequel 1 +
@oateps ≠ 1.
Pour cela, on peut initialiser une variable @oateps à 1 puis la diviser répétitivement par
2 jusqu'à ce que la condition 1 + @oateps ≠ 1 n'est plus vériXée.
En utilisant la boucle do cette méthode peut être simplement codée comme suit:

float floateps = 1.0F;


do floateps /= 2; while (1 + floateps != 1 && 1 + floatepses/2 != 1);

On se propose de transformer ce code en une fonction utile et réuilsable.

1) Rappeler la déXnition d'une fonction C/C++; réponse: une fonction C/C++ est
un bloc de code nommé qui rélise une tâche utile et réutilisiable qu'on peut
programmer une seule fois et la réutiliser pour toujours, sans la reprogrammer.

2) La cellule de code suivante contient une implémentation incomplète de cette


fonction, nommée @oateps. Compléter ce code puis exécuter la cellule pour le
sauvegarder dans un Xchier source nommé devoir2.cpp.
:
Question 4:
On se propose maintenant de compiler le module devoir2.cpp sans édition de liens et
produire un code objet sous le nom devoir2.o.

1) Quelle option du compilateur g++ doit-on utiliser pour cela?

Réponse: g++ devoir2.cpp..........................

2) Ajouter à la cellule de code suivante la commande qui permet la réalisation de cette


tâche puis exécuter la cellule.

# Compilation séparée du module devoir2.cpp


!

g++: error: devoir2.cpp.: No such file or directory


g++: fatal error: no input files
compilation terminated.

Question 5:
Compléter la cellule de code suivante par la commande qui permet d'aZcher les
caractréistiques de tous les Xchiers du répertoire courant dont le nom commence par
devoir2, puis exécuter la cellule.

# Affichage des caractérisyiques des fichiers dont le nom commence par devoir2
!g++ devoir2.cpp

devoir2.cpp:1:10: fatal error: spms4.hpp: No such file or directory


#include "spms4.hpp"
^~~~~~~~~~~
compilation terminated.
:
Question 6:
1) Quelle est la nature et l'utilité du Xchier devoir2.o?

Nature:

Utilité: stockage

2) Expliquer la différence de la taille en octet des deux Xchiers devoir2.cpp et


devoir2.o.

Réponse: ........................................

Question 7:
Le programme suivant fait appel à la fonction @oateps déXnie dans le module devoir2
pour déterminer et aZcher la valeur de l'epsilon machine des réels simple précision
pour la machine sur laquelle le programme est exécuté, et la comparer à la valeur de la
constante prédéXnie FLT_EPSILON.

Sauvegarder ce programme puis compilez-le sans édition des liens.

Writing test_devoir2.cpp

Ajouter à la cellule de code uivante la commande qui permet de compiler le


programme test_devoir2.cpp sans édition des liens, puis exécuter la cellule.
:
# Compilation séparée de test_devoir2.cpp
!g++ test_devoir2.cpp

In file included from test_devoir2.cpp:1:0:


smps4.hpp:8:20: error: expected ‘;’ before ‘,’ token
using namespace std,float.h
^
smps4.hpp:8:20: error: expected unqualified-id before ‘,’ token
smps4.hpp:8:21: error: expected unqualified-id before ‘float’
using namespace std,float.h
^~~~~
test_devoir2.cpp: In function ‘int main()’:
test_devoir2.cpp:6:28: error: ‘floateps’ was not declared in this scope
cout << "floateps = " << floateps() << endl
^~~~~~~~
test_devoir2.cpp:6:28: note: suggested alternative: ‘float_t’
cout << "floateps = " << floateps() << endl
^~~~~~~~
float_t

Ajouter à la cellule suivante la commande qui permet de lister les caractéristiques du


Xchier test_devoir2.o produit à l'étape précédente puis exécuter la cellule.

# Caractéristiques du fichier objet test_devoir2.o


!

-rw-r--r-- 1 root root 3152 May 19 16:24 test_devoir2.o


-rw-r--r-- 1 root root 170 May 19 16:24 test_devoir2.cpp
-rwxr-xr-x 1 root root 13576 May 19 15:49 test_fcts
-rw-r--r-- 1 root root 468 May 19 15:49 test_fcts.cpp
-rwxr-xr-x 1 root root 13248 May 19 15:31 test_devoir2

Question 8:
1) Expliquer la nature et l'utilité du Xchier test_devoir2.o

Nature: .......................................
Utilité: ......................................

2) Peut-on exécuter le Xchier test_devoir2.o? JustiXez votre réponse.

Réponse: ......................................
:
Question 9:
Compléter la cellule de code suivante par la commande qui permet de construire un
exécutable nommé test_devoir2 à partir des deux Xchiers déjà séparémment
compilés devoir2.o et test_devoir2.o, puis exécuter la cellule.

# Construction de l'exécutable test_devoir2


!

Utiliser la cellule de code suivante pour exécuter le programme test_devoir2

# exécution de test_devoir2
!./test_devoir2

/bin/bash: ./test_devoir2: No such file or directory

Question 10:
1) Comparer la valeur retournée par la fonction hoateps à la constante FLT_EPSILON
et interpréter le résultat de la comparaison.

Réponse: ........................................

2) Pour chaque sous-type de réels, la valeur de l'epsioln machine dépend:

a) du langage de programmation?
b) de la machine?
c) du système d'exploitation?

Réponse: ........................................

Question 11:
La cellule de code suivante reprend le code du programme test_devoir2.cpp où la ligne
4, qui contient la déclaration de la fonction hoateps, est transformée en commentaire.

Recompiler ce programme et analyser bien attentivement le message d'erreur renvoyé


par le compilateur.
:
%%writefile test_devoir2.cpp
#include "smps4.hpp"

//float floateps();

int main() {
cout << "floateps = " << floateps() << endl
<< "FLT_EPSILON = " << FLT_EPSILON << endl;
return 0;
}

Overwriting test_devoir2.cpp

# Tentative de recompilation de test_devoir2.cpp


!g++ test_devoir2.cpp

test_devoir2.cpp:1:10: fatal error: smps4.hpp: No such file or directory


#include "smps4.hpp"
^~~~~~~~~~~
compilation terminated.

Question 12:
Expliquer l'origine du message d'erreur de la commande précédente:

Réponse: ................................................

Question 13:
La cellule de code suivante reprend le contenu du Xchier à inclure smps4.hpp. Ajouter
l'instruction de déclaration de la fonction @oateps dans la ligne 9 de cette cellule puis
sauvegarder la nouvelle version de smps4.hpp en exécutant la cellule.
:
%%writefile smps4.hpp
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <limits.h>
#include <float.h>
#include <fstream>

using namespace std;

// Ajouter votre instruction ici

Overwriting smps4.hpp

Question 14:
La cellule suivante reprend le code du programme test_devoir2.cpp sans l'instruction
de déclaration de la fonct hoateps. Sauvegarder ce code en exécutant la cellule, puis
recompiler le programme.

%%writefile test_devoir2.cpp
#include "smps4.hpp"

int main() {
cout << "floateps = " << floateps() << endl
<< "FLT_EPSILON = " << FLT_EPSILON << endl;
return 0;
}

Overwriting test_devoir2.cpp

Recompiler le programme test_devoir2.cpp en exécutant la cellule de code suivante,


puis noter le nouveau message d'erreur obtenu.
:
# Recompilation de test_devoir2.cpp
! g++ test_devoir2.cpp

test_devoir2.cpp: In function ‘int main()’:


test_devoir2.cpp:4:28: error: ‘floateps’ was not declared in this scope
cout << "floateps = " << floateps() << endl
^~~~~~~~
test_devoir2.cpp:4:28: note: suggested alternative: ‘float_t’
cout << "floateps = " << floateps() << endl
^~~~~~~~
float_t

Donner l'interprétation du message d'erreur de la question précédente.

Réponse: .........................................

Recompiler le même programme en exécutant la commande de la cellule suivante,


puis expliquer le résultat obtenu.

# Recompilation sans erreur de test_devoir2.cpp


!g++ test_devoir2.cpp devoir2.o

g++: error: devoir2.o: No such file or directory

Exécuter le programme ainsi obtenu, puis interpréter la différence avec les


commandes précédentes.

!./a.out

/bin/bash: ./a.out: No such file or directory

Expliquer pourquoi le programme s'est compilé cette fois-ci sans problème?

Réponse: ........................................
:
Question 15 (++):
𝑖
1) Donner les représentations binaires sur huit bits des nombres 2 avec 0 ≤ 𝑖 ≤ 7.
Réponse:

20 = 00000001. 21 =00000010
22 = 00000100 23 =00001000
24 =00010000 25 =00100000
26 = 01000000 27 =10000000
2) Rappeler l'opération que réalise l'opérateur bit à bit "<<" sur les entiers non signés.

Réponse: ......................................

3) Donner les représentations binaires sur huit bits des valeurs de l'expression
(1 << 𝑖) pour 1 ≤ 𝑖 ≤ 7.
Réponse:

1 << 1 =00000001 1 << 2 = ........


1 << 3 = ........ 1 << 4 = ........
1 << 5 = ........ 1 << 6 = ........
1 << 7 = ........
:
Question 16 (++):
1) Rappeler l'opération que réalise l'opérateur bit à bit "&" sur les données de type int.

Réponse: ........................................

2) Donner la représentation binaire sur 8 bits de l'expression 𝑎 & 𝑏 avec


𝑎 = 00001000 et 𝑏 = 11110111 .
Réponse: 00001000 & 11110111 = ........................

3) Dans la représentation binaire de l'expression (1 << 𝑖) :


a) combien de bits sont à 1?

Réponse: .....................

b) en numérotant les positions des bits de droite vers la gauche et en


commençant par la position 0, donner en fonction de 𝑖 la position ou les
positions de ce bit ou de ces bits.

Réponse: ......................................

4) Vrai ou Faux: La valeur de l'expression arithmétique 𝑛 & (1 << 𝑖) ne dépend que


du ième bit du nombre 𝑛 .

Réponse: .......................................

5) Vrai ou Faux: Quelle que soit la valeur du nombre 𝑛 , l'expression arithmétique 𝑛 &
(1 << 𝑖) ne peut prendre que deux valeurs possibles.
Réponse: .......................................

6) Si vous avez répondu par Vrai à la question précédente, préciser les deux valeurs
possibles.

Réponse: .......................................

Question 17 (++):
Considérons la ligne de commande:

g++ test_devoir2.cpp devoir2.o -o test_devoir2

Le premier mot de cette ligne, g++, est le nom de la commande à exécuter et les mots
:
suivants sont des arguments passés à cette commande par le programme appelant,
Linux.

1) Sachant que g++ est en fait un programme écrit en C, expliquer le principe de la


méthode utilisée par ce programme pour accéder aux arguments qui lui sont passés
par ligne de commande.

Réponse: ........................................

2) Quel est l'avantage de cette méthode par rapport à celle où le programme demande
ces arguments à l'utilisateur qui les saisie au clavier?

Réponse: ........................................

3) Sachant que la fonction principale du programme g++ est de la forme:

int main(int argc, char *argv[]) {


.....
.....
return 0;
}

Donner la signiXcation, le type et le mode de passage des deux paramètres argc et


argv.

Réponse:

SigniXcation de argc: .......................


Type de argc: ................................
Mode de passage de argc: .....................
SigniXcation de argv: .......................
Type de argv: ................................
Mode de passage de argv: .....................

4) Sachant que argc et argv prennent leur valeurs de la ligne de commande servant à
lancer le programme dès validation de la ligne par l'utilisateur, donner ces valeurs
dans le cas de la ligne de commande:

g++ test_devoir2.cpp devoir2.o -o test_devoir2

Réponse:

Valeur de argc: ...............................


:
Valeur de argv: ...............................

Question 18 (++):
On se propose d'écrire un programme qui détermine et aZche les bits d'un nombre
entier et dont l'exécution peut être faite à l'aide d'une ligne de commande de la forme:

int2bin n

où n est le nombre à aZcher en binaire.

1) Donner l'en-tête de la fonction principale de ce programme.

Réponse: int main(...............................)

3) Donner le bloc d'instruction qui permet de quitter le programme après aZchage


d'un message d'erreur si la ligne de commande utilisée pour le lancer est incorrecte.

Réponse:

if(..................) {
cout << "..............................." << endl;
..........................;
}

4) Sachant que les mots qui forment une ligne de commande sont tous considérés
comme des chaînes de caractères, et qu'une chaîne de la forme "123" peut être
convertie en entier grâce à la fonction standard atoi, donner l'instruction qui permet
d'extraire la valeur du nombre n à partir de la ligne de commande.

Réponse: int n = ........................;

5) Sachant que la taille de n en nombre de bits est donnée par l'expression


sizeof(int)*8 -1 et que la valeur du bit de chaque position i peut être déduit de
l'expression n & (1<<i), dont la valeur ne dépend que du bit i, et est nulle si ce bit est 0
et non nulle s'il est à 1, donner la boucle qui permet d'aZcher les bits de n de gauche
vers la droite.

Réponse:

for(int i = siezof(int)*8-1; ........; .....) {


:
if(...............) cout << ..............;
else cout << .............;
} cout << endl;

6) En utilisant l'opérateur conditionnel ? : donner l'équivalent des deux instructions if


et else de la question précédente sans utiliser ni le mot if ni le mot else.

Réponse: .......................................

7) Quel est l'avantage de l'opérateur conditionnel par rapport à la structure de test if ...
else?

Réponse: .......................................

Question 19:
La cellule de code suivante contient le code incomplet du programme int2bin de la
question précédente. En vous servant de vos réponses précédentes, complèter ce
programme puis sauvegarder le en exécutant la cellule.

%%writefile int2bin.cpp
#include "smps4.hpp"

int main(int argc, char *argv[]) {


if (..........) {
cout << "Erreur de syntaxe." << endl;
.................... // Quitter le programme
}
int n = atoi(......);
for(int i = sizeof(int)*8-1;..........;....... ) {
cout << (n & (1<<i) ? ..... : ......);
} cout << endl;
return 0;
}

Overwriting int2bin.cpp

Ajouter à la cellule suivante la commande qui permet de compiler le code int2bin.cpp


pour céer un exécutable sous le nom int2bin, puis exécuter la cellule.
:
# Création de l'exécutable int2bin
!

Tester l'exécutable ainsi obtenu pour différentes valeurs de n

!./int2bin

Erreur de syntaxe.

!./int2bin 142

142 = 00000000000000000000000010001110

!./int2bin 19

19 = 00000000000000000000000000010011

!./int2bin -1

-1 = 11111111111111111111111111111111
:
Question 20 (++):
1) Donner la déXnition d'un tableau.

Réponse:.........................................

2) Donner les instructions C++ qui permettent de réaliser les tâches suivantes:

Déclrarer un tableau t1 de 20 composantes de type int: ...int t1[20]


Déclarer un tableau t2 de 500 composantes où chaque composante est elle-
même composée de 6 composantes de type hoat: .hoat T2[500] .................
AZcher la taille des zones mémoires allouées à t1 et t2: .................................
AZcher la première composante de t1: cout<<t[1];
AZcher la dernière composante de t2: cout<<t[500];

3) En utilisant l'opérateur "[ ]" donner l'équivalent des expressions suivantes:

*t1:
*(t1+i): ...........t1[i].......................

4) En utilisant l'opérateur"*" donner l'équivalent des expressions suivantes:

t2[i]: ..................................
t2[i][j]: ...............................

Question 21 (++):
L'objet de cet exercice est de:

Créer un tableau t de n entiers aléatoires compris entre deux limites a et b;


Trier les composantes de ce tableau en utilisant l'algorithme de tri par sélection
(Implémentation en Itik Itik Dance);
AZcher le tableau avant et après l'opération de tri.

1) Connaissant la valeur de n donner l'instruction qui permet de déclarer le tableau t:


........................................

2) Connaissant a et b, pour générer les n composantes aléatoires nous utiliserons la


fonction suivante:

int randint(int a, int b) {


return a + rand()%(b-a+1);
:
}

Donner la boucle qui permet d'affecter à chacune des n composantes de t un entier


aléatoire compris entre a et b:

Réponse: ...........................................

3) Pour coder l'algorithme de tri par sélection sous forme d'une fonction utile et
réutilisable, nous utiliserons le pseudo code suivant:

Pour i = 0 à n-1 {
imin = i; // Indice du ième minimum
Pour j = i+1 à n-1
Si (t[j] < t[imin]) imin = j;
permute(t[i],t[imin]);
}

Compléter le code suivant pour avoir cette fonction:

void triParSelection(int *t, int n) {


for(int i = 0; i < n-2; i++ {
int imin = ......;
for(j = i+1; ....; ....)
if(.............) ...............;
permute(t[i],t[imin]);
}
}

4) Pour la tâche de permutation deux entiers la fonction de tri fait appel à la fonction
réutilsable suivante (Code C++ à compléter):

void permute(int &a, int &b) {


int tmp = a;
a = ...........;
b = ..........;
}

Quel est le mode de passage d'arguments utilisée par la fonction permute?

Réponse: .......................................
:
Quel est l'avantahe de ce mode par rappaort à son équivalent en C?

Réponse: .......................................

5) Pour aZcher le tableau avant et après l'opération de tri, nous utiliserons la fonction
C++ suivante (à compléter):

void print(int *t, int n) {


cout << "[";
for(int i = 0; i < n-2; i) cout << ........;
cout << ....... << endl;
}

Question 22 (++):
La cellule de code suivante reprend le contenu du Xchier à inclure smps4.hpp. Ajouter
à ce Xchier les instructions de déclaration des 4 fonctions de la question précédente:

randint,
triParSelection,
permute, et
print

puis sauvegarder le nouveau contenu en exécutant la cellule.


:
%%writefile smps4.hpp
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <limits.h>
#include <float.h>
#include <fstream>

using namespace std;


Devoir 2: Concepts avancés (à rendre au plus tard le 31 mai 2022)

Devoir 2: Concepts avancés (à rendre au plus tard le


31 mai 2022)
Nom : mahjabi

Prénom:lamiaa

Code Apogeé: 20501670


:
:
:
:
:
:
:
:
:
:
:

Vous aimerez peut-être aussi