Vous êtes sur la page 1sur 14

Université Ibn Tofail Année Universitaire: 2022- 2023

Faculté des Sciences- Kénitra SMA 5


Département d’Informatique

Enoncés et Solutions des séries de TP C++

J.Alami Chentoufi
Université Ibn Tofail Année Universitaire: 2022- 2023
Faculté des Sciences- Kénitra SMA 5
Département d’Informatique

Série 1: Initiation au langage C++

Exercice 1
Ecrire une fonction estPremier(…) qui teste si un nombre fourni est
premier.
Ecrire un petit programme de test de la fonction.
Exercice 2
1. Écrivez 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. Est-il nécessaire d’avoir des noms de fonctions différents pour la
version avec adresse et la version avec référence ? Tester.
Exercice 3
Écrire une fonction permettant d’ajouter une valeur fournie en
argument à une variable fournie également en argument. Par exemple,
l’appel (n et p étant entiers) : ajoutera la valeur de l’expression 2*p+1 à
la variable n. Écrire un petit programme de test de la fonction.
Exercice 4
Écrire une fonction qui ne renvoie aucune valeur et qui détermine la
valeur maximale et la valeur minimale d’un tableau d’entiers de taille
quelconque. On prévoira 4 arguments : le tableau, sa dimension, le
maximum et le minimum. Pour chacun d’entre ces paramètres, on
choisira le mode de transmission le plus approprié (par valeur ou par
référence). Dans le cas où la transmission par référence est nécessaire,
proposer deux solutions : l’une utilisant effectivement cette notion de
référence, l’autre la « simulant » à l’aide de pointeurs. Écrire un petit
programme d’essai.
Exercice 5
Ecrire une fonction alloueTab qui alloue dynamiquement un tableau de
nombres entiers et qui puisse répondre aux trois appels suivants :
T = alloueTab(25, 10) ; \\ Allocation d’un tableau de 25 entiers
initialisés à 10 ;
T = alloueTab(25) ; \\ Allocation d’un tableau de 25 entiers initialisés à -
1;
T = alloueTab() ; \\ Allocation d’un tableau de 10 entiers initialisés à -1 ;
Ecrivez un programme principal pour tester votre fonction dans les
trois situations.

J.Alami Chentoufi
Université Ibn Tofail Année Universitaire: 2022- 2023
Faculté des Sciences- Kénitra SMA 5
Département d’Informatique

SÉRIE II. (NOTION DE CLASSES, CONSTRUCTEURS ET DESTRUCTEURS)

Exercice 1
Définir une classe point permettant de manipuler un point d’un plan. On prévoira :
Ø un constructeur recevant en arguments les coordonnées (float) d’un point ;
Ø deux fonctions membres : getAbscisse et getOrdonnee fournissant
respectivement l’abscisse et l’ordonnée d’un point
Ø deux fonctions membres : setAbscisse et setOrdonnee modifiant
respectivement l’abscisse et l’ordonnée d’un point
Ø une fonction membre translater effectuant une translation définie par ses
deux arguments (float) ;
Ø une fonction membre afficher se contentant d’afficher les coordonnées d’un
point.
Ø une fonction distance qui permet de retourner la distance séparant le point
courant à un second point qui est indiqué par ces coordonnées à la fonction.
La déclaration de la classe doit se faire dans un fichier d’entête et sa définition
dans un fichier source.
Écrire dans un autre fichier source un petit programme de test (main) déclarant
un point, l’affichant, le déplaçant et l’affichant à nouveau
Exercice 2
Écrivez un programme dans lequel vous définissez une classe Cercle ayant comme
attributs un rayon et les coordonnées d’un point qui représente le centre du cercle.
Déclarez ensuite les méthodes «get» et «set» correspondantes.
Ajoutez ensuite les méthodes :
Ø double surface() const : qui calcule et retourne la surface du cercle (pi fois le
carré du rayon);
bool estInterieur() const : qui teste si le point de coordonnées (x,y) passé en
paramètre fait partie ou non du cercle (frontière comprise : disque fermé).
Dans le main(), instanciez deux objets de la classe Cercle, affectez des valeurs de
votre choix à leur attributs et testez vos méthodes surface et estInterieur.
Exercice 3
Créer une classe appelée Article qui possède une donnée membre: numSerie
contenant le numéro de série de chaque article. En effet, le premier article créé
doit avoir le numéro de série égale à 1, le second 2, etc. Pour cela, vous aurez
besoin d’une autre donnée membre nombreArticle qui enregistre le nombre
d’articles qui ont été créés et celle ci doit être commune à tous les objets de la
classe. Tester la classe Article.
Exercice 5
Soit la classe Complexe définie par le code suivant:
class Complexe {
public:
Complexe(const double re = 0.0, const double im = 0.0);
Complexe(const Complexe&);
~Complexe();

J.Alami Chentoufi
Université Ibn Tofail Année Universitaire: 2022- 2023
Faculté des Sciences- Kénitra SMA 5
Département d’Informatique

double getReel() const;


void setReel(double);
double getImag() const;
void setImag(double);
Complexe& operator=(const Complexe &);
Complexe& operator+=(const Complexe&);
Complexe& operator-=(const Complexe &);
Complexe& operator*=(const Complexe &);
Complexe& operator/=(const Complexe &);
bool operator==(const Complexe &) const;
Complexe operator+(const Complexe &) const;
Complexe operator-(const Complexe &) const;
Complexe operator*(const Complexe &) const;
Complexe operator/(const Complexe &) const;
private:
double* re;
double* im;
};
Définir les 2 fonctions non membres de la classe Complexes:
Ø Surcharger les opérateurs << et >> qui permettent respectivement d’afficher
et de lire un complexe.
Ø Surcharger l’opérateur + qui retourne la somme de deux complexes.

J.Alami Chentoufi
Université Ibn Tofail Année Universitaire: 2022- 2023
Faculté des Sciences- Kénitra SMA 5
Département d’Informatique

Solution série 1: Initiation au langage C++

Exercice 1
//Définition de la fonction estPremier
bool estPremier (int a){
int i=2;
while (a%i ≠0 && i<=a/2)
i= i+1;
if (i<=a/2)
return false;
else
return true;
}

//Programme de test
#include<iostream>
using namespace std;

int main( ){
int N;
cout<< "donner un entier :";
cin>> N;
if (estPremier (N)== true)
cout<<"Le nombre fourni est premier";
else
cout<<"Le nombre fourni n'est pas premier";
return 0;
}

Exercice 2
// Définition des deux fonctions Permuter2A et Permuter2R
void Permuter2A(int *x, int *y){
int temp = *x;
*x = *y;
*y = temp;
}

void Permuter2R( int &x, int &y){


int temp = x;
x = y;
y = temp;
}

J.Alami Chentoufi
Université Ibn Tofail Année Universitaire: 2022- 2023
Faculté des Sciences- Kénitra SMA 5
Département d’Informatique

//Programme de test
#include<iostream>
using namespace std;
int main( ){
int N,M;
cout<< "donner 2 entiers :”;
cin>> N>>M;
Permuter2A(&N, &M);
cout<< "Appel à la fonction Permuter2A, N = "<<N <<"et M= "<<M<<endl;
Permuter2R(N,M);
cout<< "Appel à la fonction Permuter2R, N = "<<N <<"et M= "<<M<<endl;
return 0;
}

Exercice 3
// Définition de la fonction Ajout
void Ajout(int &n, int p){
n = n+2*p+1;
}
//Programme de test
#include<iostream>
using namespace std;
int main( ){
int N,P;
cout<< "donner 2 entiers :";
cin>> N>>P;
Ajout(N,P);
cout<<"après l'appel de la fonction Ajout N = "<<N;
return 0;
}

Exercice 4
//En utilisant le passage par référence
void MaxMinTableau (int *Tab, int N, int &max, int &min){
max = min = *Tab; //max = min = Tab[0];
for (int i = 1; i < N ; i++){
if (*(Tab+i) < min )
min = *(Tab+i);
if (*(Tab+i) > max)
max = *(Tab+i);
}
}
//En utilisant le passage par adresse

J.Alami Chentoufi
Université Ibn Tofail Année Universitaire: 2022- 2023
Faculté des Sciences- Kénitra SMA 5
Département d’Informatique

void MaxMinTableau (int *Tab, int N, int *max, int *min){


*max = *min = *Tab; //*max = *min = Tab[0];
for (int i = 1; i < N ; i++){
if (*(Tab+i) < *min )
*min = *(Tab+i);
if (*(Tab+i) > *max)
*max = *(Tab+i);}
}
//Programme de test
#include<iostream>
using namespace std;
int main( ){
int N,*Tab, max, min;
cout<< "donner la dimension du tableau :";
cin>> N;
Tab = new int [N];
for (int i = 0; i <N; i++)
cin>>*(Tab+i);
//Appel à la première fonction: Passage par référence
MaxMinTableau(Tab, N, max, min);
cout<<"La max du Tableau est : "<<max<<endl;
cout<< "Le min du Tableau est :”<<min<<endl;
//Appel à la deuxième fonction: Passage par adresse
MaxMinTableau(Tab, N, &max, &min);
cout<<"La max du Tableau est : "<<max<<endl;
cout<< "Le min du Tableau est :”<<min<<endl;
return 0;
}

Exercice 5
//Définition de la fonction avec des paramètres par défaut
int *alloueTab (int dim =10, int val =-1){
int *Tab = new int [dim];
for (int i =0; i<dim ; i++)
*(Tab+i) = val;
return Tab;
}

J.Alami Chentoufi
Université Ibn Tofail Année Universitaire: 2022- 2023
Faculté des Sciences- Kénitra SMA 5
Département d’Informatique

Solution série 2: (Notion de Classes, Constructeurs et Destructeurs)

Exercice 1
#include <math.h>
#include<iostream>
using namespace std;
class Point{
private:
float x, y;
public:
Point(float px, float py );
float getAbscisse () const;
float getOrdonnee () const;
void setAbscisse (float px) ;
void setOrdonnee (float py) ;
void translater (float dx, float dy);
float distance (Point P);
void afficher () const;
};
Point::Point (float px, float py){
x = px;
y = py;
}
float Point::getAbscisse() const{
return x;
}
float Point::getOrdonnee()const{
return y;
}
void Point::setAbscisse(float px) {
x = px;
}
void Point::setOrdonnee(float py) {
y= py;
}
void Point::translater (float dx, float dy){
x = x + dx;
y = y + dy;
}
float Point::distance (Point P){
return sqrt(pow(P.x - this->x,2)+pow(P.y -this->y,2));
}
void Point::afficher() const{
cout<<"Le point est de coordonnées : ("<<x<<" , "<<y<<" ) "<<endl;
}

J.Alami Chentoufi
Université Ibn Tofail Année Universitaire: 2022- 2023
Faculté des Sciences- Kénitra SMA 5
Département d’Informatique

//Programme de test
int main( ){
Point P(1.0, 2.0);
Point Q(2.0, 3.0);
P.afficher();
Q.afficher();
P.translater(-1, -1);
Q.translater(-1, -1);
cout<<"Aprés translation :"<<endl;
P.afficher();
Q.afficher();
cout<<Q.distance(P);
return 1;
}

Exercice 2
class Cercle {
private:
Point C; //le centre du cercle
Float R; // Rayon du cercle
public:
Cercle (Point , float);
Point getcentre( );
float getrayon();
void setcentre (Point);
void setrayon( float);
float surface ( );
bool estInterieur ( Point);
};
Cercle :: Cercle(Point a, float r): Point(a){
R=r;
}
Point Cercle :: getcentre( ) {
return C ;
}
float Cercle::getrayon( ) {
return R ;
}
void Cercle::setcentre(Point A ) {
setAbscisse(A.getAbscisse());
setOrdonnee (A.getOrdonnee());
}
void Cercle::setrayon(float r ) {
R=r;

J.Alami Chentoufi
Université Ibn Tofail Année Universitaire: 2022- 2023
Faculté des Sciences- Kénitra SMA 5
Département d’Informatique

}
float Cercle :: surface( ) {
float S = 4*Pi*pow(R,2);
return S;
}
bool Cercle::estInterieur ( Point a) {
float d= distance (a) ;
if ( d <= R)
return true ;
else
return false ;
}

//Programme de test
int main( ){
Point C(1.0, 2.5);
Cercle A(C, 5); // construction d’un cercle A de centre C et rayon 5
cout<<”la surface du cercle est: “<<A.surface()<<endl;
Point B (-1.2, 2.5);
bool t = A.estInterieur(B);
if (t== true)
cout<<"Le point B est à l’intérieur du cercle"<<endl;
else
cout<<" Le point B n’est pas à l’intérieur du cercle "<<endl;
return 1;
}
Exercice 3
class Object{
private:
const int serialNumber;
static int numberOfObj;
public:
Object( );
static int getNumberOfObj( ) ;
int getSerialNumber( )const;
};
int Object::numberOfObj = 0;
Object::Object( ): serialNumber(++numberOfObj){
}
int Object::getNumberOfObj() {
return numberOfObj;
}
int Object::getSerialNumber() const{
return serialNumber;

J.Alami Chentoufi
Université Ibn Tofail Année Universitaire: 2022- 2023
Faculté des Sciences- Kénitra SMA 5
Département d’Informatique

}
//Programme de test
int main( ){
Object O;
cout <<"Le numéro de série de O est : "<<O.getSerialNumber()<<endl;
Object P;
cout<<"Le numéro de sérien de P est :”<<P.getSerialNumber()<<endl; cout<<"Le
nombre d'objets crées est :"<<Object::getNumberOfObj()<<endl;
}

Exercice 4
class Complexe {
public:
Complexe(const double re = 0.0, const double im = 0.0);
Complexe(const Complexe&);
~Complexe();
double getReel() const;
void setReel(double);
double getImag() const;
void setImag(double);
Complexe& operator=(const Complexe &);
Complexe& operator+=(const Complexe&);
Complexe& operator-=(const Complexe &);
Complexe& operator*=(const Complexe &);
bool operator==(const Complexe &) const;
Complexe operator+(const Complexe &) const;
Complexe operator-(const Complexe &) const;
Complexe operator*(const Complexe &) const;
private:
double * re;
double * im;
};
Complexe :: Complexe (const double r, const double i){
re = new double;
im = new double;
*re=r;
*im=i;
}
Complexe::Complexe(const Complexe &C){
*re= *(C.re);
*im= *(C.im);
}
Complexe ::~Complexe(){
delete re;

J.Alami Chentoufi
Université Ibn Tofail Année Universitaire: 2022- 2023
Faculté des Sciences- Kénitra SMA 5
Département d’Informatique

delete im;
}
double Complexe::getImag()const{
return *im;
}
double Complexe::getReel()const{
return *re;
}
void Complexe::setImag(double I){
*im = I;
}
void Complexe::setReel(double R){
*re = R;
}
Complexe& Complexe::operator=(const Complexe &C){
*re= *(C.re);
*im=*(C.im);
return *this;
}
Complexe& Complexe::operator+=(const Complexe& C){
*re=*re+(*(C.re));
*im=*im+(*(C.im));
return *this;
}
Complexe& Complexe::operator-=(const Complexe& C){
*re=*re -*(C.re);
*im=*im -*(C.im);
return *this;
}
Complexe& Complexe::operator*=(const Complexe& C){
*re=(*re*(*(C.re)))-(*im*(*(C.im)));
*im=(*im*(*(C.re)))+(*re*(*(C.im)));
return *this;}
bool Complexe::operator==(const Complexe &C) const{
if(*re ==*(C.re)&& *im==*(C.im))
return true;
else return false;
}
Complexe Complexe::operator+(const Complexe &C) const{
double R = *re +*(C.re);
double I= *im +*(C.im);
return Complexe( R,I );
}
Complexe Complexe::operator-(const Complexe &C) const{
double R = *re -*(C.re);

J.Alami Chentoufi
Université Ibn Tofail Année Universitaire: 2022- 2023
Faculté des Sciences- Kénitra SMA 5
Département d’Informatique

double I = *im -*(C.im);


return Complexe(R, I);
}
Complexe Complexe :: operator*(const Complexe &C) const{
double R = (*re*(*(C.re)))-(*im)*(*(C.im)));
double I = (*im*(*(C.re)))+(* re*(*(C.im)));
return Complexe(R,I);
}
ostream & operator <<(ostream &out, const complexe & C) {
out <<C.getReel()<< “ +i “<< C.getImag()<<endl;
return out;
}
istream & operator >>(istream &in, complexe & C) {
float r, i;
cout << “ donner la partie réelle et la partie imaginaire du complexe:”<< endl;
in >> r>>i;
C.setReel(r);
C.setImag(i);
return in;
}

//Programme de test
int main( ){
Complexe C1(1,2), C2(2,3);
Complexe Res = C1+C2;
cout<<"C1+C2 = "<<Res;
Res = C1-C2;
cout<<"C1-C2 = "<<Res;
Res= C1*C2;
cout<<"C1*C2 = "<<Res;
Res = C1/C2;
cout<<"C1/C2 = "<<Res;
C1+=C2;
cout<<"C1+=C2 = "<<C1;
C1/=C2;
cout<<"C1/=C2 = "<<C1;
C1= C2;
cout<<"C1=C2 : “<<C1;
return 1;
}

J.Alami Chentoufi
Université Ibn Tofail Année Universitaire: 2022- 2023
Faculté des Sciences- Kénitra SMA 5
Département d’Informatique

J.Alami Chentoufi

Vous aimerez peut-être aussi