Vous êtes sur la page 1sur 8

Année académique 2023-2024

Classe : L2IT
Date : 03/11/2023
Enseignant : M. LOYA

TP n°2 de C++
Le TP comporte huit pages
Objectif : Comprendre les extensions procédurales de C++ (entrées/sorties, nouveaux opérateurs, nouveaux types,
fonctions, …)

Exercice 1 : Utiliser la bibliothèque C++ iostream (cout et cin) pour gérer les entrées-sorties
Quelle est la sortie du code C++ suivant ?
#include <iostream>
int main(int argc, char const *argv[]) [ ] Bienvenue au cours de C++
{ [ ] Erreur lors de la compilation
cout << "Bienvenue au cours de C++"; [ ] Erreur d’exécution
return 0; [ ] Faute de segmentation
}

Exercice 2 : Utiliser la bibliothèque C++ iostream (cout et cin) pour gérer les entrées-sorties
Ecrire un programme C++ qui demande un nombre x et:
1. affiche le carré et la racine carré de x;
2. affiche le périmètre et l’aire du cercle de rayon x;
3. affiche la longueur de la diagonale d’un carré de côté x.
Exemple d’exécution :
Entrer un nombre x : 4
Le carre de 4 est: 16
La racine carre de 4 est: 2
Le perimetre du cercle de rayon 4 est: 25.1429
L'aire du cercle de rayon 4 est: 50.2857
La longueur de la diagonale d'un carre de cote 4 est: 5.65685
Indication : PI= 22/7

Exercice 3 : Comprendre les manipulateurs


Qu’affiche le programme suivant :
#include <iostream>
#include <iomanip>
int main() {
int n=123;
cout << setw(6) << n <<n<<endl;
cout << setw(2) << n <<endl;
cout << setfill('*') << setw(6) << n <<endl;
cout << hex << n << endl;
cout << oct << n << endl;
return 0;
}

Exercice 4 : Comprendre les manipulateurs


Qu’affiche le programme suivant :
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
cout << "On affiche le booléen true sous forme textuelle: ";
cout << boolalpha << true << endl;
cout << "On repasse en mode binaire pour "; cout << "afficher le booléen false: ";
cout << noboolalpha << false << endl;
cout << "Hex permet aussi d’afficher les booléens ";
cout << "en mode binaire: ";
cout << hex << false << endl;
cout << "On écrit le nombre 63 en hexadécimal:";
cout << hex << 63 << endl;
cout << "En majuscules: ";

1
cout << uppercase << 63 << endl;
cout << "On repasse en base 10 pour afficher 63: ";
cout << dec << 63 << endl;
cout << "Avec le signe: ";
cout << showpos << 63 << endl;
cout << "On affiche un flottant sur 15 caractères minimum, ";
cout << "en remplissant les vides avec des *:";
cout << setfill(‘*’) << setw(15) << 3.151592 << endl;
cout << "On recommence avec un alignement à gauche";
cout << "sans le signe: ";
cout << left << noshowpos << setw(15) << 3.151592 << endl;
return 0;
}

Exercice 5 : Comprendre les manipulateurs


Qu’affiche le programme suivant :
#include<iostream>
#include<iomanip>
using namespace std;
int main() {
double x = 12345.6789012345;
int n;
// Notation standard, fixe ou scientifique -----------------------------------
cout << "x=" << x << endl; // affiche en notation standard
cout << fixed; // passe en notation fixe pour les cout suivants
cout << "x=" << x << endl;
cout << scientific; // passe en notation scientifique pour les cout suivants
cout << "x=" << x << endl;
cout.unsetf(ios_base::floatfield); // revient en notation standard
cout << "x=" << x << endl << endl;
// Précision (nombre de chiffres affichés) --------------------------------------------
n = cout.precision(); // stocke la précision actuelle dans la variable entière n
cout << "La précision actuelle est : " << n << endl;
cout << "x=" << x << endl;
cout << setprecision(15); // fixe la précision à 15 pour les cout suivants
cout << "x=" << x << endl;
cout << setprecision(n); // revient à la précision initiale
cout << "x=" << x << endl;
// Largeur minimum consacrée à chaque affichage ----------------------------------------
cout << "x=" << setw(10) << x << endl; // impose une largeur minimum, n'agit que sur
// l'élément suivant (largeur nulle par défaut)
return 0;
}

Exercice 6 : Comprendre quelques opérateurs


1° Quelle est la sortie du code suivant ?
#include<iostream>
using namespace std;
int main()
{int a = 1, b = 1, c = 1;
cout << (++a or ++b and ++c ) << endl;
cout << a << " " << b << " " << c ;
return 0;
}
[ ]0 [ ]1 [ ]1 [ ]1
211 211 222 221

2° Quelle est la sortie du code suivant ?


#include<iostream>
using namespace std;
int main()
{int a = 1 , b = 1;
cout << ( ++a and ++b ) << endl;
cout << a << " " << b;
return 0; }

[ ]1 [ ] 0 [ ]1 [ ] Erreur de compilation.
11 22 22

2
Exercice 7 : Utiliser des opérateurs new et delete
1° En C++, l’opérateur new permet de :
[ ] créer un objet alloué dynamiquement [ ] définir une nouvelle classe
[ ] définir un nouveau type alloué dynamiquement [ ] d’initialiser un nouveau type

2° En C++, l’instruction delete [] p; :


[ ] supprime les éléments du tableau p alloués dynamiquement [ ] supprime la variable p
[ ] supprime le premier élément du tableau p [ ] déclare un tableau p de type delete

3° Écrire le programme suivant, en ne faisant appel qu'aux nouvelles possibilités du langage C++ :
#include <stdio.h>
#include <malloc.h>
#define NbrValeurs 25
int main(){
float *Valeurs, Somme=0.0;
int i;
/*réservation d’un espace mémoire pour les valeurs*/
Valeurs = (float*)malloc(sizeof(float) * NbrValeurs);
for(i=0;i<NbrValeurs;i++)
{
printf("donner la moyenne N°%d\n",i);
scanf("%f",&Valeurs[i]);
Somme= Somme + Valeurs[i];
}
printf("La somme de ces %d réels=%f",NbrValeurs,Somme);
free(Valeurs) ;
return 0;
}

4° Lesquelles des instructions suivantes sont valables pour allouer de la mémoire dynamiquement pour un entier en C++ ?
[ ] int *ptr = new int(100); [ ] int *ptr; ptr=new int; *ptr=100; [ ] int *ptr=NULL; ptr=new int; *ptr=100;
[ ] Toutes les réponses sont vraies

Exercice 8
1° Quel type de base ne fait pas partie du standard C++ ?
[ ] bool [ ] int [ ] double [ ] real [ ] wchar_t

2° Lequel des types suivants n’est pas présent en C mais présent en C++ ?
[ ] void [ ] bool [ ] float [ ] int

3° Les chaînes en C++


[ ] Font partie du langage, comme les entiers
[ ] Font partie de la bibliothèque standard [ ] N’existent pas

Exercice 9 : Comprendre la différence entre les références et les pointeurs


1° Ecrire un programme C++ qui :
1. déclare un entier a;
2. déclare une référence vers cet entier ref_a;
3. déclare un pointeur vers cet entier p_a;
4. affiche les variables, leurs adresses, la valeur pointée.
Commenter le résultat

2° Quelle syntaxe permet de modifier la cible d'un pointeur p ?


[ ] *p = a; [ ] p = a; [ ] &p = a; [ ] c'est impossible

3° Quelle syntaxe permet de modifier la cible d'une référence r ?


[ ] *r = a; [ ]r = a; [ ]&r = a; [ ] c'est impossible

Exercice 10 : Comprendre les chaînes de caractères


1° Quelle fonction est utilisée pour obtenir la longueur d’une chaîne de caractères en C++?
[ ] str.length() [ ] str.size() [ ] str.max_size() [ ] Les deux fonctions size() et length()

2° Quel fichier d’en-tête est utilisé pour inclure les fonctions de string dans C++?
[ ] #include <string.cpp> [ ] #include <string.h> [ ] #include <string> [ ] #include <cstring

3
Exercice 11 : manipuler les chaînes de caractères
Ecrire un programme en C++ qui affiche la conjugaison au présent de l’indicatif d’un verbe du 1er groupe. On utilisera :
− Les tableaux dynamiques vector
− Les tableaux statiques array
On testera les trois manières de parcourir un tableau : Par indice -Par itérateur-Par élément

Exercice 12 : manipuler les chaînes de caractères


Ecrire un programme en C++ qui, après avoir enregistré les noms des m étudiants de L2IT et les noms des n étudiants de
L2EEA, classe les deux listes par ordre alphabétique, les fusionne dans une liste commune L2ITEEA et recherche par
dichotomie dans la liste commune la présence d’un nom donné.
Indication :
Utiliser :
− Le type vector
− Les algorithmes sort (), merge(), binary_search() de STL

Exercice 13 : manipuler les chaînes de caractères


Ecrire un programme qui permet d’avoir une chaîne de caractères contenant une date (JJ/MM/AAAA) et une heure (HH:
NN) sous la forme JJMMAAAAHHNN et permet d'extraire les différents champs et de les afficher. Par exemple
010920091123 représente la date du 1er septembre 2009 à 11h23.
Exercice 14 : Comprendre les tableaux vector
1° Observer le fragment de programme suivant :

a) Quel est le type de retour de la fonction lireTableau ?

b) Indiquer le numéro de la ou les lignes de la fonction lireTableau qui

Déclarent le tableau t :

Allouent le tableau t :

Initialisent le tableau t :

c) En une phrase, décrire ce que fait ce programme.

2° Après l’exécution du code suivant :


std::vector<int> v = { 1, 3, 6 };
v.push_back(9);
v.insert(v.begin()+2,-1);
v est égal à :
[ ] 1 3 -1 -1 9 [ ] 1 3 -1 6 9 [ ] 1 -1 3 6 9 [ ] 9 1 3 -1 6

Exercice 15 : Manipuler les tableaux vector


(1) Écrire une fonction nommée contientNegatif qui prend en paramètre un tableau d’entiers t et renvoie true si t contient au
4
moins un nombre strictement négatif et false sinon.

bool contientNegatif(vector<int> t) {

(2) Si ce n’est déjà fait, réécrivez la fonction précédente en utilisant une boucle for each (parcours par les éléments) :

bool contientNegatif(vector<int> t) {

Exercice 16 : comprendre les modes de passage


1° Soit le code suivant:
#include <iostream> int main( ) {
void trio(int a, int b, int c) { int a = 1, b = 2, c = 3;
a = b + c; trio(a, b, c);
b = c + a; std ::cout<<a<<" "<<b" "<<c<<endl;
c = a + b; return 0;
}
}
Le programme :
[ ] ne compile pas [ ] provoque une erreur à l’exécution (erreur de segmentation par exemple)
[ ] affiche 5 4 3 [ ] affiche 5 8 13 [ ] affiche 1 2 3 [ ] affiche 3 6 9 [ ] affiche 1 3 6

2° Soit le code suivant :


#include <iostream>
void trio(int *a, int *b, int *c) {
*a = *b + *c;
*b = *c + *a;
*c = *a + *b;
}
int main( ) {
int a = 1, b = 2, c = 3;
trio(&a, &b, &c);
std ::cout<<a<<" "<<b" "<<c<<endl;
return 0;
}
Le programme :
[ ] ne compile pas [ ] provoque une erreur à l’exécution (erreur de segmentation par exemple)
[ ] affiche 5 4 3 [ ] affiche 5 8 13 [ ] affiche 1 2 3 [ ] affiche 3 6 9 [ ] affiche 1 3 6

3° Quelle est la sortie du code C++ suivant ?


#include <iostream> int main()
using namespace std; { int a = 2, b =1;
void Somme(int a, int b, int & c) Somme(a, b, b);
{ a = b + c; cout << a << " " << b;
b = a + c; return 0;
c = a + b; }
}

[ ]21 [ ] 23 [ ]25 [ ]35

5
Exercice 17 : Comprendre les fonctions à paramètres à valeur par défaut
Quelle est la sortie du code C++ suivant?
#include<iostream>
using namespace std; [ ] 2
int fon(int a = 0, int b = 0, int c) [ ] 0
{ return (a + b + c); } [ ] Erreur de compilation.
int main() [ ] Aucune de ces réponses n’est vraie.
{ cout << fon(2);
return 0;
}

Exercice 18 : Comprendre les fonctions à paramètres à valeur par défaut


1) Créer UNE fonction qui alloue dynamiquement un vecteur de nombres entiers et qui puisse répondre aux trois
appels suivants :
T = AlloueVect(25, -8);//tableau de 25 éléments initialisés à –8 ;
T = AlloueVect(25);//tableau de 25 éléments initialisés à 4 ;
T = AlloueVect();//tableau de 10 éléments initialisés à 4 ;
2) Ecrire un programme principal pour tester la fonction dans les trois situations.

Exercice 19 : Comprendre les fonctions en ligne


Après la macro-définition #define f(x, y) x*y, quelle sera la valeur de z après l’exécution de z = f(2+4, 4-6)
[ ] -12 [ ] Il y a une erreur de syntaxe [ ] 12 [ ] 26 [ ] -6

Exercice 20 : Comprendre les fonctions en ligne


1) Ecrire une fonction en ligne qui soit équivalente à la macro :
#define ABS(x) ((x)>0 ? (x): (-x))
2) Comparer le comportement de la macro et de la fonction en ligne :
• au niveau du typage : int abs(int i), double abs(double d)
• des effets de bord : abs(i++), abs(x++)

Exercice 21 : Comprendre les fonctions en ligne


Écrire les résultats de ce programme. Chaque résultat doit être justifié.
#include <iostream>
using namespace std ;
#define cube(x) x*x*x
inline int CUBE(int X){ return X*X*X;}
int main() {
int a = 1 ;
int b = cube(a) ;
int c = cube(a++);
int f = cube(++a);
cout <<"a ="<< a <<" b="<< b <<" c="<< c << " f="<< f <<endl;
int D = 2;
int E = CUBE(D);
int H = CUBE(D++);
int K = CUBE(++D);
cout <<"D ="<< D <<" E="<< E<<" H="<< H << " K="<< K <<endl;
return 0;
}

Exercice 22 : Comprendre la surdéfinition des fonctions et les fonctions génériques


1) Écrire deux fonctions …Permuter2A(…) et …Permuter2R(…) qui échangent le contenu de deux variables entières
en passant, respectivement, les paramètres par adresse et par référence. Ecrire un programme principal qui demande
les deux valeurs à l’utilisateur et affiche le résultat de la transformation.
2) De manière similaire, écrire deux fonctions …Permuter3A(…) et …Permuter3R(…) qui permutent circulairement
le contenu de trois variables. Ecrire un programme principal qui demande les trois valeurs à l’utilisateur et affiche le
résultat de la transformation.
3) Est-il nécessaire d’avoir des noms de fonctions différents pour les versions avec adresse et les versions avec référence?
Tester.
Est-il nécessaire d’avoir des noms de fonctions différents pour les versions avec deux entiers et les versions avec trois
entiers ? Tester.
Comment s’appelle le mécanisme mis en œuvre ?

6
4) Ces fonctions sont d’un intérêt limité dans la mesure où elles ne fonctionnent que pour des variables de type int.
Programmer une version générique de …Permuter3(…). Vérifier que la fonction fonctionne correctement dans les
cas de figure suivants :
▪ des entiers (int),
▪ des caractères (char),
▪ des nombres réels (double),

Exercice 23 : Comprendre le type agrégat


1° Lequel des énoncés suivants est correct ?
[ ] Le mot clé « struct » est requise en C et C++ tout en déclarant un objet de structure.
[ ] Le mot clé « struct » n’est pas requis en C mais requis en C++ lors de la déclaration d’un objet de structure.
[ ] Le mot clé « struct » n’est pas requis en C++ mais requis en C lors de la déclaration d’un objet de structure.
[ ] Le mot clé « struct » n’est pas requise en C et C++ lors de la déclaration d’un objet de structure.

2° Lequel des énoncés suivants est correct ?


[ ] Une structure ne peut pas avoir de fonction membre en C, mais il est possible en C++.
[ ] Une structure ne peut pas avoir de fonction membre en C++ mais il est possible en C.
[ ] Une structure ne peut pas avoir de fonction membre en C et en C++.
[ ] Une structure peut avoir une fonction membre en C et en C++.

Exercice 24
On veut écrire un programme pour aider à la gestion de la billetterie des différentes salles d’un complexe
cinématographique.
Chaque salle de projection dispose d’un certain nombre de places (nbPlaces). Le nombre de places maximum que peut
avoir une salle est CAPSAL= 200.
Les places dans une salle peuvent être vendues selon deux tarifs :
) Le tarif normal (pu) qui dépend du film projeté et de la qualité de la salle.
) Le tarif réduit (pour les familles nombreuses, chômeurs, étudiants, …) qui offre un taux de réduction (TAUXRED)
de 20% par rapport au tarif plein.
Une salle de projection est caractérisée, lors d’une séance, par les informations suivantes :
• Le titre du film projeté (film), chaîne de caractères de caractères ;
• Le nombre de places (nbPlaces) de la salle de projection ;
• Le tarif normal (pu) d’une place de la salle de projection ;
• Le nombre de places vendues au tarif normal (nbPlacesNormal) au cours de la séance ;
• Le nombre de places vendues au tarif réduit (nbPlacesReduit) au cours de la séance ;
On souhaite écrire la fonction principale assurant la gestion d’une salle de projection selon le menu suivant :

1-> Préparer la vente des billets pour la salle


2-> Consulter le nombre de places disponibles
3-> Vendre des billets
4-> Consulter le taux de remplissage de la salle
5-> Consulter le chiffre d’affaires de la salle
6-> Terminer les ventes de la salle
0-> Quitter

Votre choix :

Travail à faire
1°) Créer un projet C++, nommé "sallecinema", à enregistrer dans le dossier " sallecinema" à créer.
2°) Enregistrer le fichier principal sous le nom "main.cpp"
3°) Ajouter au projet le fichier d'entête "salle.h". Dans le fichier :
a) Définir le taux de réduction (TAUXRED) des places, fixé 0.20
b) Définir la capacité maximale (CAPSAL) des salles du complexe, fixée à 200 places
c) Proposer une structure de données en C++ pour représenter les salles de projection.
d) Déclarer dans la structure les fonctions suivantes :
affichSalle() qui prend en paramètre la référence constante d’une salle et affiche les propriétés de la salle.

7
initSalle() qui prend en paramètre la référence d’une salle, puis renseigne (ie lit), le titre du film joué, le nombre
de places de la salle(compris 1 et CAPSAL), le tarif normal d’une place et met à zéro le nombre de places vendues
au tarif normal, le nombre de vendues au tarif réduit et le chiffre d’affaires de la salle.
nbPlacesDisponibles() qui prend en paramètre la référence constante d’une salle de projection et renvoie le
nombre de places disponibles dans la salle.
vendrePlaces() qui, à partir de la référence d’une salle, du nombre de places à acheter et du mode de tarification
(réduction ou non, donc de type bool ; généralement, il n’y a pas de réduction ):
▪ vérifie qu’il y a des places disponibles ;
▪ S’il y a de la place :
• met à jour, en fonction du mode de tarification, le nombre de places vendues à tarif normal ou le
nombre de places vendues à tarif réduit ;
• détermine et afficher le montant de la vente ;
▪ S’il n’y a pas de place, la vente n’est pas effectuée.
tauxRempl() qui prend la référence constante d’une salle et retourne son taux de remplissage sous de pourcentage.
chiffreAffaire() qui prend la référence constante d’une salle et retourne le chiffre d’affaires produit par la salle
au cours de cette séance.
e) Déclarer la fonction menu() permettant le menu et de retourner le choix de l’utilisateur
4°) Ajouter au projet le fichier de définition salle.cpp". Y inclure le fichier "salle.h" et définir les fonctions ci-dessus.
5°) Ouvrir le fichier principal "main.cpp". Y inclure le fichier "salle.h" et écrire la fonction principale permettant d’itérer
sur le menu ci-dessus en appelant convenablement les fonctions définies ci-dessus

Exercice 25
Quel est la sortie du code suivant en C++ ?
#include <iostream>
using namespace std; [ ] abcd [ ] Avertissement
int main() [ ] Erreur : la chaîne de caractères dans le tableau est trop longue.
{ char tab[4] = "abcd"; [ ] Aucune de ces réponses n’est vraie.
cout << tab;
return 0;
}

Vous aimerez peut-être aussi