Vous êtes sur la page 1sur 46

Université Hassan 2

Faculté des sciences Aïn Chock de Casablanca


Département Mathématiques & Informatique

Solutions des séries des Programmation C & C++

Travaux dirigés SMA – S5


Année universitaire 2016 / 2017

Les solutions proposées dans ce document ne


sont pas les seules possibles

Vous pouvez télécharger ce document, ainsi que les codes sources des exercices
sur le lien ci-dessous

http://goo.gl/SOewR6

chbihi@outlook.com
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 1
Exercice 1 : Le programme suivant contient 8 erreurs.

1 #include <iostream>
2 #include namespace std;
3 float main[]{
4 float x, y; z;
5 cin << x << y;
6 if (y != 0)
7 z = x / y;
8 cout << x << " / " << y << " = " << z << endl
9 } else
10 cerr << "Division sur Zéro impossible" << endl;
11 return;
12 }

Ligne Instruction corrigée Explication

L’utilisation d’un namespace se fait à l’aide de


2 using namespace std ;
l’instruction using

1. La fonction principale main retourne toujours un


entier
3 int main ( ) { 2. main est une fonction donc il faudrait utiliser les
parenthèses à la fin de sa signature (pour les
possibles arguments)

Lors de la déclaration de plusieurs variables du même


4 float x, y, z; type au sein d’une même instruction, il faudrait
séparer les noms des variables par des virgules

5 cin >> x >> y; L’instruction cin utilise l’opérateur de flux entrant : >>

Quand l’instruction « if » comporte plusieurs


6 if (y != 0){ instructions, il est obligatoire d’entourer cette
dernière par des accolades { }

cout << x << " / " L’instruction cout se termine toujours par un point-
8 << y << " = " << z virgule « ; »
<< endl ;

La fonction principale main retourne un entier égal à 0


11 return 0 ;
pour un fin normal et une valeur sinon.

2
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 1
Exercice 2 : Les Namespaces
Ecrivez un programme C++ qui contient 8 fonctions, 4 retournant des entiers et 4 autres des
réels :
 Deux fonctions portant le même nom pour additionner deux nombres (entiers pour
la première et réels pour la seconde)
 Deux fonctions portant le même nom pour soustraire deux nombres (entiers pour la
première et réels pour la seconde)
 Deux fonctions portant le même nom pour multiplier deux nombres (entiers pour la
première et réels pour la seconde)
 Deux fonctions portant le même nom pour diviser deux nombres (entiers pour la
première et réels pour la seconde)
Utilisez les Namespaces pour différencier entre les fonctions portant le même nom.

#include <iostream>
using namespace std;

namespace entier {
int additionner(int a, int b){
return (a + b);
}

int soustraire(int a, int b){


return (a - b);
}

int multiplier(int a, int b){


return (a * b);
}

int diviser(int a, int b){


return (a / b);
}
}

3
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 1

namespace reel {
float additionner(float a, float b){
return (a + b);
}

float soustraire(float a, float b){


return (a - b);
}

float multiplier(float a, float b){


return (a * b);
}

float diviser(float a, float b){


return (a / b);
}
}

int main(){
cout << "2 + 5 = " << entier::additionner(2, 5) << endl;
cout << "2.2 - 5.5 =" << reel::diviser(2.2, 5.5) << endl;
return 0;
}

4
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 1
Exercice 3 : Les manipulateurs de flux

1. Ecrivez un programme C++ qui effectue la lecture d’un nombre entier au clavier et
l’affiche en octal et en hexadécimal. Utilisez les deux possibilités existantes. Aussi, les
caractères alphabétiques hexadécimaux devront être affichés en majuscules.

Proposition 1
#include <iostream>
using namespace std;
int main(){
int n;
cout << "Entrez un entier : ";
cin >> n;

cout << "Octal : " << oct << n << endl;


cout << "Hexadecimal :" << hex << uppercase << n << endl;
return 0;
}

Proposition 2
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
int n;
cout << "Entrez un entier : ";
cin >> n;

cout << "Octal : " << setbase(8) << n << endl;


cout <<"Hexadecimal:"<<setbase(16)<<uppercase<< n <<endl;
return 0;
}

5
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 1
2. Ecrivez un programme C++ qui permet d’afficher une suite de chiffres et leurs
correspondances en octal ou en hexadécimal (selon le choix de l’utilisateur) sous forme
d’un tableau à deux colonnes. La colonne de gauche contient les chiffres décimaux et
celle de droite les correspondances. En plus du choix de l’utilisateur (caractère « H » ou
« O »), il faudrait lire au clavier deux entiers, le premier pour le premier chiffre de la suite
et le second pour le nombre de chiffres à afficher.
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
int n, chiffre;
char choix;

do{
cout << "Choix : ";
cin >> choix;
}while(choix != 'H' && choix != 'O');

cout << "Premier Chiffre : ";


cin >> chiffre;
cout << "Nombre de chiffres :";
cin >> n;

cout << "+-----+-----+" << endl;


cout << "| DEC |";
if (choix == 'H')
cout << " HEX |" << endl;
else
cout << " OCT |" << endl;
cout << "+-----+-----+" << endl;

for(int i = 0; i < n; i++){


cout << "|" << setw(3) << dec << chiffre+i << " | ";
if (choix == 'H')
cout << hex << uppercase;
else
cout << oct;
cout << setw(3) << chiffre+i << " |" << endl;
}

cout << "+-----+-----+" << endl;


return 0;
}
Cette solution permet de faire un affichage pour des nombres ne contenant pas
plus de trois chiffres

6
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 1
Exercice 4 : Autres Ajouts
a. Ecrivez une fonction qui permet de retourner la valeur inverse d’un booléen passé en
paramètre. Proposez deux solutions en utilisant les opérateurs d’inversion logique et le
OU exclusif.

#include <iostream>

using namespace std;

bool inverse_1(bool b){


return !b;
}

bool inverse_2(bool b){


return b^1;
}

int main(){
bool b1 = true;
cout << boolalpha << b1 << "=" << inverse_1(b1) << endl;

bool b2 = false;
cout << b2 << " = " << inverse_2(b2) << endl;

return 0;
}

7
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 1
b. Ecrivez un programme C++ permettant de parcourir un tableau d’entiers et de modifier
son contenu de façon à ce que chaque élément reçoit la somme de sa valeur et celle de
l’élément qui le précède. Le tableau ainsi que sa taille devront être lus depuis l’entrée
standard.
#include <iostream>
using namespace std;

int main(){
int n;
cout << "Saisissez la taille du tableau : ";
cin >> n;

int T[n];
for(int i = 0; i < n; i++){
cout << "T[" << i << "] = ";
cin >> T[i];
}

int som = 0;
for(int &val : T){
val += som;
som = val;
}
cout << "\n\nNouvelles valeurs" << endl;
for(int i = 0; i < n; i++){
cout << "T[" << i << "] = " << T[i] << endl;
}
return 0;
}

c. Soit B une variable contenant une valeur binaire quelconque. Ecrivez un programme
C++ permettant d’afficher à l’écran son équivalent en décimal, octal et hexadécimal.
#include <iostream>
using namespace std;

int main(){
int n = 0b101010;

cout << "Valeur décimale : " << dec << n << endl;
cout << "Valeur hexadécimale : " << hex << n << endl;
cout << "Valeur octale : " << oct << n << endl;

return 0;
}

8
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 2
Exercice 1 : Les tableaux
a. Écrire un programme qui effectue la somme des éléments d’un tableau d’entiers dont
les éléments sont saisis au clavier.

#include <iostream>
using namespace std;

int main(){
int n, som, i;

cout << "Entrez le nombre des cases du tableau : ";


cin >> n;

if (n >= 0){
int E[n];

// remplissage du tableau
for(i = 0; i < n; i++){
cout << "Entez l'element " << i << " : ";
cin >> E[i];
}

// calcul de la somme
som = 0;
for(i = 0; i < n; i++){
som += E[i];
}

cout << "La somme est : " << som << endl;
}
else
cout << "Nombre invalide !" << endl;

return 0;
}

9
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 2
b. Écrire un programme qui recherche une valeur dans un tableau d’entiers, et affiche un
message pour dire si oui ou non la valeur a été retrouvée.
#include <iostream>
using namespace std;

int main(){
int n, r, i;

cout << "Entrez le nombre des cases du tableau : ";


cin >> n;

if (n >= 0){
int E[n];

// remplissage du tableau
for(i = 0; i < n; i++){
cout << "Entez l'element " << i << " : ";
cin >> E[i];
}

cout << "Entrez la valeur à rechercher : ";


cin >> r;

// Recherche
for(i = 0; i < n; i++){
if (E[i] == r){
cout << "La valeur " << r ;
cout << " existe dans le tableau." ;
return 0;
}
}

cout << "La valeur " << r ;


cout << " n'existe pas dans le tableau !" ;
}
else
cout << "Nombre invalide !" << endl;

return 0;
}

10
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 2
c. Écrire un programme qui calcul le produit scalaire de vecteurs dont la taille et les
éléments sont saisis au clavier.
#include <iostream>
using namespace std;

int main(){
int i, n, ps;

cout << "Entrez la taille des vecteurs : ";


cin >> n;

if (n > 0){
int U[n], V[n];

// Remplissage du vecteur U
cout << "Remplissage du vecteur U : " << endl;
for(i = 0; i < n; i++){
cout << "\tU[" << i << "] = ";
cin >> U[i];
}

// Remplissage du vecteur V
cout << "Remplissage du vecteur V : " << endl;
for(i = 0; i < n; i++){
cout << "\tV[" << i << "] = ";
cin >> V[i];
}

// calcul du produit scalaire


ps = 0;
for(i = 0; i < n; i++){
ps += U[i] * V[i];
}
cout << "Le produit scalaire est : " << ps ;
}
else
cout << "Valeur invalide !" << endl;
}

11
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 2

d. Écrire un programme qui affiche Min, Max, et Moyenne d’un tableau d’entiers.
#include <iostream>
using namespace std;

int main(){
int i, n, min, max, som;
float moy;

cout << "Entrez la taille du tableau : ";


cin >> n;

if (n > 0){
int A[n];

// Remplissage du tableau
for(i = 0; i < n; i++){
cout << "Entrez l'element " << i << " : ";
cin >> A[i];
}

// Parcours du tableau
som = A[0];
min = A[0];
max = A[0];
for(i = 1; i < n; i++){
som += A[i];

if (min > A[i])


min = A[i];

if (max < A[i])


max = A[i];
}

// calcul de la moyenne
moy = (float)som / n;

// Affichage des résultats


cout << "La valeur maximale est : " << max << endl;
cout << "La valeur minimale est : " << min << endl;
cout << "La moyenne est : " << moy << endl;
}
else
cout << "Valeur invalide !" << endl;
return 0;
}

12
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 2
e. Écrire un programme qui affiche une matrice carrée unitaire U de dimension N.

#include <iostream>
using namespace std;

int main(){
int n, i, j;

cout << "Entrez la taille de la matrice : ";


cin >> n;

if (n > 0){
int M[n][n];

// Remplissage de la matrice
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
if (i == j)
M[i][j] = 1;
else
M[i][j] = 0;
}
}

// Affichage de la matrice
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
cout << M[i][j] << "\t";
}
cout << endl;
}
}
return 0;
}

13
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 2
f. Écrire un programme qui effectue la multiplication d’une matrice (composée de
nombres entiers) par un nombre réel. La taille de la matrice, ses éléments, ainsi que le
nombre réel sont saisis au clavier.
#include <iostream>
using namespace std;

int main(){
int L, C, i, j;
float R;

cout << "Entrez L, C et R : ";


cin >> L >> C >> R;

int M[L][C];

for(i = 0; i < L; i++){


for(j = 0; j < C; j++){
cout << "M[" << i << "][" << j << "] = ";
cin >> M[i][j];
}
}

cout << endl;


for(i = 0; i < L; i++){
for(j = 0; j < C; j++){
cout << M[i][j] << "\t";
}
cout << endl;
}

cout << endl;


for(i = 0; i < L; i++){
for(j = 0; j < C; j++){
cout << R * M[i][j] << "\t";
}
cout << endl;
}

return 0;
}

14
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 2
g. Ecrire un programme qui effectue la multiplication de deux matrices A et B. Le résultat
de la multiplication sera mémorisé dans une troisième matrice C qui sera ensuite
affichée.

#include <iostream>
using namespace std;

int main(){
int L, C;
cout << "Entrez nombre de lignes : ";
cin >> L;
cout << "Entrez nombre de Colonnes : ";
cin >> C;

int MA[L][C], MB[C][L], MC[L][L];


cout << "Entrez les elements de le premiere matrice : " ;
for(int i = 0; i < L; i++){
for(int j = 0; j < C; j++){
cout << "MA[" << i << "][" << j << "] = ";
cin >> MA[i][j];
}
}

cout << "Entrez les elements de le seconde matrice : ";


for(int i = 0; i < C; i++){
for(int j = 0; j < L; j++){
cout << "MB[" << i << "][" << j << "] = ";
cin >> MB[i][j];
}
}

15
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 2

// Multiplication des deux matrices MA et MB


for(int i = 0; i < L; i++){
for(int j = 0; j < L; j++){
int sum = 0;
for(int k = 0; k < C; k++){
sum += MA[i][k] * MB[k][j];
}
MC[i][j] = sum;
}
}

// Affichage MC
for(int i = 0; i < L; i++) {
for(int j = 0; j < L; j++){
cout << MC[i][j] << "\t";
}
cout << endl;
}

return 0;
}

16
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 2
Exercice 2 : Les chaines de caractères
a. Ecrire un programme qui permet de calculer la langueur d’une chaine de caractères
saisie au clavier. N’utilisez pas la fonction strlen de « string.h » !
#include <iostream>
#include <cstdio>
using namespace std;

int main(){
char chaine[100];
cout << "Entrez une chaine de caracteres : ";
gets(chaine);

// Calcul du nombre de caractères dans la chaine entrée


int i = 0;
while(chaine[i] != '\0')
i++;

cout << "La chaine \"" << chaine << "\" contient " ;
cout << i << " caractères" << endl;
return 0 ;
}
b. Ecrire un programme qui inverse une chaine de caractères saisie au clavier. Le résultat
est mis dans une nouvelle chaine de caractère avant son affichage.
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int main(){
char chaine[100];
cout << "Entrez une chaine de caracteres : ";
gets(chaine);

// Calcul du nombre de caractères dans la chaine entrée


int T = strlen(chaine);
char inverse[T + 1];

// Inversement de la chaine
for(int i = 0; i < T; i++)
inverse[i] = chaine[T - i - 1];

// Ajout du caractère '\0' à la fin de la chaine inversée


inverse[T] = '\0';
cout << "L'inverse est : " << inverse << endl;
return 0;
}

17
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 2
c. On appelle palindrome une suite de caractères qui se lit de la même façon dans les deux
sens (exemple: ''laval'). Ecrire un programme qui permet de lire une chaine de
caractères au clavier et affiche un message pour dire si oui ou non la chaine entrée est
palindrome.

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

int main(){
char chaine[100];
cout << "Entrez une chaine de caracteres : ";
gets(chaine);

/*
Déclaration d'un entier qui sera initialisé à 1 qui servira
de drapeau pour signaler si la chaine est un palindrome ou
pas
*/
short flag = 1;

// Traitements pour tester si la chaine est un palindrome


for(int i = 0; i < strlen(chaine) / 2; i++){
if (chaine[i] != chaine[strlen(chaine) - i - 1]){
flag = 0;
break;
}
}

// Si le drapeau est égal à 1 alors c'est un palindrome


if (flag == 1)
cout << "C'est un palindrome :)";
else
cout << "Ce n'est pas un palindrome !";

return 0;
}

18
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 2
d. Ecrire un programme qui permet de lire un entier positif N au clavier et d’afficher sur
l’écran le nombre de chiffres contenus dans N.
Proposition 1
« Utilisation du Log base 10 »
#include <cmath>
#include <iostream>
using namespace std;

int main(){
double N;
cout << "Entrez un entier : ";
cin >> N;
long nb = (long)(log10(N) + 1);
cout << "Le nombre de caracteres est : " << N;

return 0;
}

Proposition 2
« Traiter le nombre entré comme une chaine de caractères »
#include <cstring>
#include <cstdio>
#include <iostream>
using namespace std;

int main(){
int N;
char nb[20];

cout << "entrez un entier : ";


cin >> N;

// Transformation de l'entier entrée en une chaine


sprintf(nb, "%d", N);

/* Calcul de la taille de la chaine, qui correspond au


nombre de chiffres contenus dans l'entier entré */
cout << "Le nombre de chiffres dans " << N << " est " ;
cout << strlen(nb);

return 0;
}

19
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 2
Exercice 3 : Les types structurés
a. Définir une structure de données Date permettant de représenter une date au
format « jj/mm/aaaa ». Ecrire un programme permettant de lire deux dates et
d’afficher sur l’écran la plus récente.

Proposition 1 : Simples comparaisons

#include <iostream>
Using namespace std;
struct Date {
int jour, mois, annee;
};
void main(){
struct Date d1, d2;
cout << "Saisissez la première date : ";
cin >> d1.jour >> d1.mois >> d1.annee;
cout << "Saisissez la seconde date : ";
cin >> d2.jour >> d2.mois >> d2.annee;

if (d1.annee > d2.annee)


cout << d1.jour << “/” << d1.mois << “/” << d1.annee;
else if (d1.annee < d2.annee)
cout << d2.jour << “/” << d2.mois << “/” << d2.annee;
else {
if (d1.mois > d2.mois)
cout << d1.jour << “/” << d1.mois << “/” << d1.annee;
else if (d1.mois < d2.mois)
cout << d2.jour << “/” << d2.mois << “/” << d2.annee;
else {
if (d1.jour >= d2.jour)
cout << d1.jour << “/” << d1.mois << “/” << d1.annee;
else
cout << d2.jour << “/” << d2.mois << “/” << d2.annee;
}
}
}

20
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 2

Proposition 2 : Transformation des dates en entiers


#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <iomanip>
using namespace std;
struct Date {
int jour;
int mois;
int annee;
};
int main(){
struct Date d1, d2;

// Lecture des dates


cout << "Saisissez la première date : ";
cin >> d1.jour >> d1.mois >> d1.annee;
cout << "Saisissez la seconde date : ";
cin >> d2.jour >> d2.mois >> d2.annee;

/* Transformation des dates en des chaines de caractères sous


la forme AAAAMMJJ */
char ch1[8], ch2[8];
sprintf(ch1, "%d%02d%02d", d1.annee, d1.mois, d1.jour);
sprintf(ch2, "%d%02d%02d", d2.annee, d2.mois, d2.jour);

// Transformation des chaines en des entiers


int i1, i2;
i1 = atoi(ch1);
i2 = atoi(ch2);

/* Comparaison des entiers : la date la plus récente


correspond à l'entier le plus grand */
if (i1 >= i2){
cout << "La plus récente est : " ;
cout << setfill('0') << setw(2) << d1.jour << "/";
cout << setfill('0') << setw(2) << d1.mois << "/";
cout << d1.annee << endl;
}
else{
cout << "La plus récente est : " ;
cout << setfill('0') << setw(2) << d2.jour << "/";
cout << setfill('0') << setw(2) << d2.mois << "/";
cout << d2.annee << endl;
}
return 0;
}

21
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 2
Exercice 4 : Les pointeurs
a. Soit P un pointeur qui "pointe" sur un tableau A:

int A[] = {12, 23, 34, 45, 56, 67, 78, 89, 90};
int *P;
P = A;

Quelles valeurs ou adresses fournissent ces expressions:


 *P+2  A+3  P+(*P-10)
 *(P+2)  &A[7]-P  *(P+*(P+8)-A[7])
 &A[4]-3

Expression Explication

*P+2 incrémentation du premier élément par 2

*(P+2) 3ème élément du tableau

&A[4]-3 Adresse mémoire du second élément

A+3 Adresse mémoire du 4ème élément

Nombre d’éléments séparant le 8ème élément de la position en


&A[7]-P
cours du pointeur

P+(*P-10) Adresse mémoire du 3ème élément

*(P+*(P+8)-A[7]) Valeur du 2ème élément

22
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 2
b. Soient deux tableaux d'entiers T1 et T2. Ecrire un programme en C qui permet de tester
l'égalité entre les deux tableaux : il rend VRAI si les composants des deux tableaux
correspondent position par position, et FAUX sinon. Utilisez deux pointeurs P1 et P2
pour parcourir chacun des tableaux.

#include <iostream>
using namespace std;

int main(){
int N;
cout << "Entrez le nombre des éléments du tableau : ";
cin >> N;

int T1[N], T2[N];


for(int i = 0; i < N; i++){
cout << "T1[" << i << "] = ";
cin >> T1[i];
}

for(int i = 0; i < N; i++){


cout << "T2[" << i << "] = ";
cin >> T2[i];
}

/*
Déclaration de deux pointeurs
Chacun des pointeur pointe sur un des tableaux
Déclaration d'un drapeau dont le changement de valeur
signalera que les tableaux sont différents
*/
int *p1, *p2, flag = 1;
p1 = T1;
p2 = T2;

23
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 2

/*
Parcours des deux tableaux en utilisant les pointeurs
Comparaison des valeurs renvoyées par les pointeurs :
si ces dernières sont différentes on arrête les traitements
--> tableaux differents
*/
for(int i = 0; i < N; i++){
if (*(p1+i) != *(p2+i)){
flag = 0;
break;
}
}

// Affichage des résultats


if (flag == 1)
cout << "\n\n Tableaux similaires";
else
cout << "\n\n Tableaux différents";

return 0;
}

24
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 2
c. Ecrire un programme qui permet de calculer le nombre d’occurrences d’un mot dans
une phrase. Utilisez un pointeur P qui va parcourir les différents mots de la phrase.
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

int main(){
char PHRASE[255] ;
char MOT[30], M[30] ;

cout << "Entrez la phrase : ";


gets(PHRASE);

cout << "Entrez le mot à rechercher : ";


gets(MOT);

int occurs = 0;
char *p = PHRASE;

while (*p != '\0'){


// Construction du mot
int i = 0;
while(*p != ' ' && *p != '\0'){
M[i++] = *p;
p++;
}
M[i] = '\0';

// comparaison
if (!strcmp(MOT, M))
occurs++;

// Passage au mot suivant


if (*p != '\0')
p++;
}

cout << "Le nombre d'occurences est " << occurs;


return 0;
}

25
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 2
Exercice 5 : Les fonctions
Soit T un tableau d’entiers. Ecrivez des fonctions qui permettent de :
 Trouver la valeur maximale des éléments du tableau T,
 Trouver la valeur minimale des éléments du tableau T,
 Calculer la somme des éléments du tableau T,
 Calculer la moyenne des éléments du tableau T,
Ecrivez un programme qui :
 Effectue la lecture d’un entier N depuis l’entrée standard,
 Crée un tableau Tab composé de N éléments, qui sont aussi saisis au clavier,
 Affiche à l’écran : le maximum, le minimum, la somme et la moyenne.

#include <iostream>
Using namespace std ;

int max(int *T, int taille){


int max = T[0];
for(int i = 1; i < taille; i++){
if (max < T[i])
max = T[i];
}
return max;
}

int min(int *T, int taille){


int min = T[0];
for(int i = 1; i < taille; i++){
if (min > T[i])
min = T[i];
}
return min;
}

26
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 2
int somme(int *T, int taille){
int som = 0;
for(int i = 0; i < taille; i++){
som += T[i];
}
return som;
}

float moyenne(int *T, int taille){


int som = somme(T, taille);
return (float)som/taille;
}

int main(){
int N;
cout << "Entrez le nombre des éléments du tableau : ";
cin >> N;

// Déclaration et remplissage du tableau


int T[N];
for(int i = 0; i < N; i++){
cout << "T[" << i << "] = ";
cin >> T[i];
}

// Affichage des résultats


cout << endl;
cout << "Min = " << min(T, N) << endl;
cout << "Max = " << max(T, N) << endl;
cout << "Somme = " << somme(T, N) << endl;
cout << "Moyenne = " << moyenne(T, N) << endl;
return 0;
}

27
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 2
2. Ecrivez deux fonctions nommées successivement division et modulo, qui prennent deux
entiers comme paramètres et qui retournent respectivement un entier et un réel. Le code
des deux fonctions devra gérer le cas de la division sur 0 en utilisant le mécanisme des
exceptions (au milieu des fonctions et aussi dans le code de la fonction principale main).

#include <iostream>
using namespace std;

// Fonction pour le calcul de la division de deux entiers


// Envoi de l'exception dans le cas où la valeur de "b" est nulle
float division(int a, int b){
if (b == 0)
throw b;
else
return (float)a / b;
}

/*
Fonction pour le calcul du reste de la division de deux entiers
Envoi de l'exception dans le cas où la valeur de "b" est nulle
*/
int modulo(int a, int b){
if (b == 0)
throw b;
else
return a % b;
}

28
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 2

int main(){
int x, y;

cout << "Saisissez deux entiers : ";


cin >> x >> y;
/*
Traitement de l'exception susceptible d'être remontée par la
fonction division()
*/
try{
cout << x << " / " << y ;
cout << " = " << division(x, y) << endl;
}catch(int e){
cerr << "Le second paramètre de la DIVISION ne peut pas
être égal à 0" << endl;
}
/*
Traitement de l'exception suceptible d'être remontée par la
fonction modulo()
*/
try{
cout << x << " % " << y ;
cout << " = " << modulo(x, y) << endl;
}catch(int e){
cerr << "Le second paramètre du MODULO ne peut pas être
égal à 0" << endl;
}

return 0;
}

29
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 3
Exercice 1
a. Le code contient 10 erreurs.

Ligne Instruction corrigée Explication

Les instructions du préprocesseur ne se terminent


1 #include <iostream>
pas avec des points-virgules

#include <cstring> En C++, il existe une bibliothèque standard qui


2 s’appelle « string » qui offre d’autres
#include <string.h>
fonctionnalités que celles utilisées dans ce code

Le namspace des instructions des bibliothèques


3 using namespace std;
standards est « std »

Le corps d’une classe est entourée par des


4 class Personne {
accolades { } et non pas des parenthèses

La déclaration de membres privés d’une classe se


5 private :
fait à l’aide du mot clé « private »

Personne(char *nom, char Les paramètres par défaut sont déclarés à partir du
12 *prenom, int age, char
sexe);
dernier argument

Getter permettant de retourner la valeur de


13 char *getNom(); l’attribut « nom » qui est de type chaine de
caractères

Getter permettant de retourner la valeur de


15 char *getPrenom(); l’attribut « prenom » qui est de type chaine de
caractères

Les prototypes de méthodes doivent se terminer


19 char getSexe() ;
par un point-virgule

friend bool siSexesSimilaires Fonction amie permettant de retourner un


22 (const Personne &p1, const
Personne &p2);
booléen

30
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 3
b. Soit « p1, p2 et p3 » des instances de la classe Personne. Que se passera-t-il lors de
l’exécution des instructions suivantes:

Instruction Explication

cout << p.sexe << endl ; Erreur : l’objet « p » n’existe pas

p2.age = 50 ; Erreur : il n’est pas possible d’accéder


directement aux membres privés d’une classe
(l’attribut « age » en est un)

p3.setPrenom("Mohammed") ; Changement de la valeur de l’attribut « prenom »


en appelant le Setter correspondant

p3.siSexesSimilaires(p1, p2); Erreur : siSexesSimilaires est une fonction amie et


non une méthode de la classe « Personne »

Exercice 2
Ecrivez un programme C++ qui contient une classe modélisant l’heure (heures, minutes &
secondes. La classe sera appelé « Time » est devra déclarer tous ses attributs comme étant
privées. De plus, elle devra contenir les méthodes publiques suivantes :
 Un constructeur avec des valeurs par défaut pour chacun des attributs,
 Un constructeur avec comme paramètre une chaine de caractères, qui contient
l’heure sous la forme : « hh:mm:ss ». Par exemple : "05 :15 :56".
 Un constructeur par copie,
 Des getters (un pour chacun des attributs),
 Des setters (un pour chacun des attributs). Le changement de valeurs doit être géré
de manière à ce que l’on puisse gérer les cas où l’utilisateur entre une valeur erronée
pour l’un des attributs (une valeur supérieur à 23 ou inférieur à 0 pour l’heure, ou
une valeur non comprise entre 0 et 59 pour les minutes et les secondes,
 Une fonction amie (compare) qui permet de comparer deux objets « Time » et de
retourner un entier égal à :
o -1 si le premier objet en paramètre est le plus grand,
o 0 si les deux objets sont égaux,
o 1 si le second objet en paramètre est le plus grand,
 Une méthode (changeTime) permettant d’incrémenter ou de décrémenter un objet
en secondes (seul paramètre de la méthode). L’opération doit gérer les cas de
dépassement de valeurs pour l’un des attributs de l’objet concerné.

31
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 3

#include <iostream>
#include <cstdio>
#include <iomanip>

using namespace std;

// Déclaration de la classe
class Time{
private :
int heure;
int minute;
int seconde;
public :
Time(int h = 0, int m = 0, int s = 0);
Time(const char *t);
Time(const Time &t);
int getHeure();
int getMinute();
int getSeconde();
void setHeure(int h);
void setMinute(int m);
void setSeconde(int s);
friend int compare(const Time &t1, const Time &t2);
void changeTime(int s);
};

// Constructeur avec valeurs par défaut


Time::Time(int h, int m, int s){
this->heure = h % 24;
this->minute = m % 60;
this->seconde = s % 60;
}

32
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 3

// Constructeur avec comme paramètre une chaine de caractères


Time::Time(const char *t){
int h, m, s;
sscanf(t, "%d:%d:%d", &h, &m, &s);
this->heure = h % 24;
this->minute = m % 60;
this->seconde = s % 60;
}

// Constructeur pas copie


Time::Time(const Time &t){
this->heure = t.heure;
this->minute = t.minute;
this->seconde = t.seconde;
}

// Getter de l'attribut Heure


int Time::getHeure(){
return this->heure;
}

// Getter de l'attribut Minute


int Time::getMinute(){
return this->minute;
}

// Getter de l'attribut Seconde


int Time::getSeconde(){
return this->seconde;
}

33
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 3

// Setter de l'attribut Heure


void Time::setHeure(int h){
this->heure = h % 24;
}

// Setter de l'attribut Minute


void Time::setMinute(int m){
this->minute = m % 60;
}

// Setter de l'attribut Seconde


void Time::setSeconde(int s){
this->seconde = s % 60;
}

/*
méthode permettant d'incrémenter ou de décrémenter un
objet en secondes
*/
void Time::changeTime(int s){
int MAX = (24 * 60 * 60);
int T = (this->heure * 60 * 60) + (this->minute * 60) +
this->seconde;

int som = T + s;
if (som >= MAX)
som %= MAX;
else if (som < 0)
som += MAX;

this->heure = (som / (60 * 60)) % 24;


this->minute = (som % (60 * 60)) / 60;
this->seconde = ((som % (60 * 60)) % 60);
}

34
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 3

/*
Fonction amie pour la comparaison de deux objets de type
Time
*/
int compare(const Time &t1, const Time &t2){
if (t1.heure > t2.heure)
return -1;
else if (t1.heure < t2.heure)
return 1;
else {
if (t1.minute > t2.minute)
return -1;
else if (t1.minute < t2.minute)
return 1;
else {
if (t1.seconde > t2.seconde)
return -1;
else if (t1.seconde < t2.seconde)
return 1;
else
return 0;
}
}
}

35
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 4
Exercice 1
Ecrivez un programme C++ qui contient une classe modélisant une période. Cette dernière
est caractérisée par :
 Un nombre d’années,
 Un nombre de mois,
 Un nombre de jours,
 Un nombre d’heures,
 Un nombre de minutes,
 Un nombre de secondes,
La classe sera appelée « Periode » est devra déclarer tous ses attributs comme étant privées.
De plus, elle devra contenir les méthodes publiques suivantes :
 Un constructeur avec des valeurs par défaut pour chacun des attributs,
 Un constructeur avec recopie
 Surcharge des opérateurs « + » , « - » , « == » , « != » , « < » , « > » , « = »
Remarques :
L’opération de soustraction ne peut se faire que si la première opérande est supérieure ou
égale à la seconde,
Toutes les opérations de calcul effectuées sur les périodes devront prendre en considération
que :
 60 secondes  1 minute
 60 minutes  1 heure
 24 heures  1 jour
 30 jours  1 mois
 12 mois  1 année

#include <iostream>
using namespace std;

class Periode {
private :
int annee;
int mois;
int jours;
int heures;
int minutes;
int secondes;

36
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 4

public :
Periode(int a = 0, int m = 0, int j = 0, int h = 0, int min =
0, int s =0);

Periode(const Periode &p);


void afficher();
friend Periode operator+(const Periode &p1, const Periode &p2);
friend Periode operator-(const Periode &p1, const Periode &p2);

Periode& operator=(const Periode &p);

friend bool operator==(const Periode &p1, const Periode &p2);


friend bool operator!=(const Periode &p1, const Periode &p2);
friend bool operator<(const Periode &p1, const Periode &p2);
friend bool operator>(const Periode &p1, const Periode &p2);
};

Periode::Periode(int a, int m, int j, int h, int min, int s){


this->annee = a;
this->mois = m;
this->jours = j;
this->heures = h;
this->minutes = min;
this->secondes = s;
}

Periode::Periode(const Periode &p){


this->annee = p.annee;
this->mois = p.mois;
this->jours = p.jours;
this->heures = p.heures;
this->minutes = p.minutes;
this->secondes = p.secondes;
}

void Periode::afficher(){
cout << "Annee : " << this->annee << endl;
cout << "Mois : " << this->mois << endl;
cout << "Jours : " << this->jours << endl;
cout << "Heures : " << this->heures << endl;
cout << "Minutes : " << this->minutes << endl;
cout << "Secondes : " << this->secondes << endl << endl;
}

37
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 4

Periode operator+(const Periode &p1, const Periode &p2){


Periode p;

p.secondes = (p1.secondes + p2.secondes) % 60;


p.minutes = (p1.secondes + p2.secondes) / 60;

p.minutes += p1.minutes + p2.minutes;


p.heures = p.minutes / 60;
p.minutes %= 60;

p.heures += p1.heures + p2.heures;


p.jours = p.heures / 24;
p.heures %= 24;

p.jours += p1.jours + p2.jours;


p.mois = p.jours / 30;
p.jours %= 30;

p.mois = p1.mois + p2.mois;


p.annee = p.mois / 12;
p.mois %= 12;

p.annee += p1.annee + p2.annee;

return p;
}

Periode operator-(const Periode &p1, const Periode &p2){


Periode p;

if (p1 > p2){


p.annee = p1.annee - p2.annee;

// Mois
p.mois = p1.mois - p2.mois;
if (p.mois < 0){
p.mois = 12 + p.mois;
p.annee--;
}

// Jours
p.jours = p1.jours - p2.jours;
if (p.jours < 0){
p.jours = 30 + p.jours;
p.mois--;
}

38
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 4
// Heures
p.heures = p1.heures - p2.heures;
if (p.heures < 0){
p.heures = 24 + p.heures;
p.jours--;
}

// Minutes
p.minutes = p1.minutes - p2.minutes;
if (p.minutes < 0){
p.minutes = 60 + p.minutes;
p.heures--;
}

// Secondes
p.secondes = p1.secondes - p2.secondes;
if (p.secondes < 0){
p.secondes = 60 + p.secondes;
p.minutes--;
}
}

return p;
}

bool operator==(const Periode &p1, const Periode &p2){


if (p1.annee == p2.annee &&
p1.mois == p2.mois &&
p1.jours == p2.jours &&
p1.heures == p2.heures &&
p1.minutes == p2.minutes &&
p1.secondes == p2.secondes)
return true;
else
return false;
}

bool operator!=(const Periode &p1, const Periode &p2){


if (p1.annee != p2.annee ||
p1.mois != p2.mois ||
p1.jours != p2.jours ||
p1.heures != p2.heures ||
p1.minutes != p2.minutes ||
p1.secondes != p2.secondes)
return true;
else
return false;
}

39
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 4

bool operator<(const Periode &p1, const Periode &p2){


if (p1.annee < p2.annee)
return true;
else if (p1.annee > p2.annee)
return false;
else {
if (p1.mois < p2.mois)
return true;
else if (p1.mois > p2.mois)
return false;
else {
if (p1.jours < p2.jours)
return true;
else if (p1.jours > p2.jours)
return false;
else {
if (p1.heures < p2.heures)
return true;
else if (p1.heures > p2.heures)
return false;
else {
if (p1.minutes < p2.minutes)
return true;
else if (p1.minutes > p2.minutes)
return false;
else {
if (p1.secondes < p2.secondes)
return true;
else
return false;
}
}
}
}
}
}

bool operator>(const Periode &p1, const Periode &p2){


if (p1.annee < p2.annee)
return false;
else if (p1.annee > p2.annee)
return true;
else {
if (p1.mois < p2.mois)
return false;
else if (p1.mois > p2.mois)
return true;

40
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 4
else {
if (p1.jours < p2.jours)
return false;
else if (p1.jours > p2.jours)
return true;
else {
if (p1.heures < p2.heures)
return false;
else if (p1.heures > p2.heures)
return true;
else {
if (p1.minutes < p2.minutes)
return false;
else if (p1.minutes > p2.minutes)
return true;
else {
if (p1.secondes > p2.secondes)
return true;
else
return false;
}
}
}
}
}
}

Periode& Periode::operator=(const Periode &p){


this->annee = p.annee;
this->mois = p.mois;
this->jours = p.jours;
this->heures = p.heures;
this->minutes = p.minutes;
this->secondes = p.secondes;
return *this;
}

41
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 4
Exercice 2
Soit la classe Abstraite « Personne » permettant de représenter un être humain suivant les
caractéristiques suivantes :
 Nom : chaine de caractères
 Prénom : chaine de caractères
 Age : nombre entier
La classe doit aussi posséder les méthodes suivantes :
 Un constructeur permettant d’initialiser chacun des attributs de la classe,
 Un constructeur par copie,
 Getter pour chaque attribut,
 Setter pour chaque attribut,
 Une méthode pour afficher toutes les informations d’une personne,
Soient « Etudiant » et « Fonctionnaire » deux classes qui héritent de la classe abstraite
« Personne ».
La classe « Etudiant » possède un attribut CNE de type chaine de caractères, ainsi que les
méthodes suivantes :
 Un constructeur permettant d’initialiser chacun des attributs de la classe,
 Un constructeur par copie,
 Getter pour le CNE,
 Setter pour le CNE,
 Une méthode pour afficher toutes les informations d’une personne (redéfinition de
la classe mère),
La classe « Fonctionnaire » possède un attribut salaire de type réel, ainsi que les méthodes
suivantes :
 Un constructeur permettant d’initialiser chacun des attributs de la classe,
 Un constructeur par copie,
 Getter pour le salaire,
 Setter pour le salaire,
 Une méthode pour afficher toutes les informations d’une personne (redéfinition de
la classe mère),
Réalisez un programme permettant d’implémenter les trois classes définies précédemment,
avec une fonction principale (main) dans laquelle vous créez des instances des classes
« Etudiant » et « Fonctionnaire » et vous affichez leurs contenus.

42
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 4

Classe Personne

class Personne {
protected:
char *nom;
char *prenom;
int age;

public :
Personne(char *n, char *p, int a);
Personne(const Personne &p);

char* getNom();
char* getPrenom();
int getAge();

void setNom(char *n);


void setPrenom(char *p);
void setAge(int a);

virtual void afficher() = 0;


};

Personne::Personne(char *n, char *p, int a){


this->nom = n;
this->prenom = p;
this->age = a;
}

Personne::Personne(const Personne &p){


this->nom = p.nom;
this->prenom = p.prenom;
this->age = p.age;
}

char* Personne::getNom(){
return this->nom;
}

char* Personne::getPrenom(){
return this->prenom;
}

int Personne::getAge(){
return this->age;
}

43
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 4
void Personne::setNom(char *n){
this->nom = n;
}

void Personne::setPrenom(char *p){


this->prenom = p;
}

void Personne::setAge(int a){


this->age = a;
}

void Personne::afficher(){
cout << "Nom : " << this->nom << endl;
cout << "Prenom : " << this->prenom << endl;
cout << "Age : " << this->age << endl;
}

Classe Etudiant
class Etudiant : public Personne {
private :
char *cne;

public :
Etudiant(char *n, char *p, int a, char *cne);
Etudiant(const Etudiant &e);

char* getCNE();
void setCNE(char *cne);

void afficher();
};

Etudiant::Etudiant(char *n, char *p, int a, char*cne):


Personne(n,p, a){
this->cne = cne;
}

Etudiant::Etudiant(const Etudiant &e):


Personne(e.nom, e.prenom, e.age){
this->cne = e.cne;
}

char *Etudiant::getCNE(){
return this->cne;
}

44
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 4

void Etudiant::setCNE(char *cne){


this->cne = cne;
}

void Etudiant::afficher(){
Personne::afficher();
cout << "CNE : " << this->cne << endl;
}

Classe Fonctionnaire
class Fonctionnaire : public Personne {
private :
float salaire;
public :
Fonctionnaire(char *n, char *p, int a, float s);
Fonctionnaire(const Fonctionnaire &s);

float getSalaire();
void setSalaire(float s);

void afficher();
};

Fonctionnaire::Fonctionnaire(char *n, char *p, int a,float s):


Personne(n, p, a){
this->salaire = s;
}

Fonctionnaire::Fonctionnaire(const Fonctionnaire &s):


Personne(s.nom, s.prenom, s.age){
this->salaire = s.salaire;
}

float Fonctionnaire::getSalaire(){
return this->salaire;
}

void Fonctionnaire::setSalaire(float s){


this->salaire = s;
}

void Fonctionnaire::afficher(){
Personne::afficher();
cout << "Salaire : " << this->salaire << endl;
}

45
Université Hassan 2
Faculté des sciences Aïn Chock de Casablanca
Département Mathématiques & Informatique
Série de TD N° 4

Fonction principale Main


#include <iostream>
#include "personne.cpp"
#include "Etudiant.cpp"
#include "Fonctionnaire.cpp"
using namespace std;

int main(){

Etudiant e("Mohammadi", "Mohamed", 22, "235689555");


e.afficher();
cout << endl;
e.setAge(30);
e.afficher();
cout << endl;

Fonctionnaire f("SAADI", "SAida", 25, 25000);


f.afficher();
cout << endl;

Etudiant e1(e);
e1.afficher();
cout << endl;

Fonctionnaire f1(f);
f1.afficher();
cout << endl;

return 0;
}

46

Vous aimerez peut-être aussi