ENSA D’AL Hoceima
2014/2015
Génie Informatique 1 : Programmation orienté objet en C++ Série N°1 TD/TP
Exercice 1 Soit l’extrait d’un programme source en langage C++ :
A cout << int n = cout << cout << cout cout char cout
"BONJOUR"; 25; "Valeur: "; n;
// équivalent à
puts("BONJOUR");
// équivalent à // équivalent à
puts("Valeur"); printf("%d",n);
<<"Valeur:" << n; <<"\n "; // pour aller à la ligne c = ‘a’; << c; // affiche le caractère, il faut utiliser // printf (formatage), pour obtenir le code ASCII
B int i,n=25,*p; char *tc="On essaie cout !"; float x = 123.456; cout<<"BONJOUR\n"; cout<
p= "<
C int n; cout<<"Saisir un entier: "; cin >> n; // équivalent à scanf("%d",&n); int a, b; cin >> a >> b; // saisie de 2 entiers séparés par un Retour Charriot
1. Créez un projet de type console et codez chaque extrait (A, B ou C) dans une fonction principale main en ajoutant les éléments nécessaires (librairies, instructions) 2. Exécutez ces programmes et analysez les résultats.
Exercice 2 C++ autorise les conversions de type entre variables de type char, int, float, double: char c=0x56,d=25,e; float r=678.9,s; j = c; j = r; s = d; e = i;
int i=0x1234,j; // // // //
j j s e
vaut vaut vaut vaut
? ? ? ?
Programmer et afficher les valeurs des variables dans la console.
Exercice 3 Ecrire un programme qui permet de faire des opérations sur un entier (valeur initiale à 0). Le programme affiche la valeur de l'entier puis affiche le menu suivant : 1. 2. 3. 4.
Ajouter 1 Multiplier par 2 Soustraire 3 Quitter
Le programme demande alors de taper un entier entre 1 et 4. Si l'utilisateur tape une valeur entre 1 et 3, on effectue l'opération, on affiche la nouvelle valeur de l'entier puis on réaffiche le menu et ainsi de suite jusqu'à ce qu'on tape 4. Lorsqu'on tape 4, le programme se termine.
Exercice 4 Séries TD/TP C++
elallaouicours.hol.es
1
ENSA D’AL Hoceima
2014/2015
Ecrire un programme qui demande à l'utilisateur de taper des entiers strictement positifs et qui affiche leur moyenne. Lorsqu'on tape une valeur négative, le programme affiche ERREUR et demande de retaper une valeur. Lorsqu'on tape 0, cela signifie que le dernier entier a été tapé. On affiche alors la moyenne. Si le nombre d'entiers tapés est égal à 0, on affiche PAS DE MOYENNE.
Exercice 5 Ecrire une fonction f ayant en paramètre un entier et qui renvoie par un return un booléen : true si l'entier est premier false sinon. Tester cette fonction.
Exercice 6 Soit le modèle de structure suivant : struct T { int n ; float x ; } ;
Écrire une fonction nommée zero permettant de remettre à zéro les 2 champs d’une structure de ce type transmise en argument : a) par adresse ; b) par référence. Dans les deux cas, on écrira un petit programme d’essai de la fonction ; il affichera les valeurs d’une structure de ce type, après appel de ladite fonction.
Exercice 7 Soient les déclarations (C++) suivantes : int fct (int) ; // fonction I int fct (float) ; // fonction II void fct (int, float) ; // fonction III void fct (float, int) ; // fonction IV int n, p ; float x, y ; char c ; double z ;
Les appels suivants sont-ils corrects et, si oui, quelles seront les fonctions effectivement appelées et les conversions éventuellement mises en place ? a. b. c. d. e. f. g. h. i.
fct fct fct fct fct fct fct fct fct
(n) (x) (n, (x, (c) (n, (n, (n, (z,
; ; x) n) ; p) c) z) z)
; ; ; ; ; ;
Exercice 8 Écrire plus simplement en C++ les instructions suivantes, en utilisant les opérateurs new et delete : int * adi ; double * add ; ..... adi = malloc (sizeof (int) ) ; add = malloc (sizeof (double) * 100 ) ;
Exercice 9 Séries TD/TP C++
: Déclarer un tableau de 5 réels. Calculer et afficher leur moyenne. elallaouicours.hol.es
2
ENSA D’AL Hoceima
2014/2015
Génie Informatique 1 : Programmation orienté objet en C++ Série N°2 TD/TP Exercice 1
: classe Point
Définissez une classe Point permettant de manipuler un point du plan. Cette classe contiendra : • • • •
un constructeur, les méthodes d'accès et de modification des coordonnées (getter et setter), une méthode deplacer() qui effectue une translation définie par les arguments, une méthode afficher() qui affiche les coordonnées d'un point sous la forme '' (x , y) ''.,
On donnera un exemple d'utilisation avec une méthode main
Exercice 2
: classe Cercle
Programmer la classe Cercle ayant comme attributs un rayon r et les coordonnées du centre (x et y). Déclarez ensuite le constructeur, le destructeur, les «getter» et les «setter» correspondantes. Ajoutez ensuite les méthodes (faisant partie de l'interface) : • void setCentre(double x, double y) { ... } • double surface() const qui calcule et retourne la surface du cercle (pi *r*r); • bool estInterieur(double x, double y) const qui teste si le point de coordonnées (x,y) passé en paramètre fait ou non partie du cercle (frontière comprise : disque fermé). La méthode retournera true si le test est positif, et false dans le cas contraire. 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. Remarque : la constante pi est souvent définie comme M_PI dans le module cmath (#include
).
Exercice 3
: classe Cercle1
Programmer la classe Cercle 1 caractérisé par un rayon r et un centre p de type Point et les méthodes suivantes : 1. Constructeur, destructeur, getter et setter 2. surface() ; pour calculer la surface du cercle(pi*r*r) 3. circonference(); pour calculer du circonférence(2*pi*r*r) 4. deplacer(a,b); pour déplacer le cercle par translation (a,b) 5. afficher() ; pour afficher les information du cercle Tester cette classe en créant deux objets. Tester toutes les méthodes.
Exercice 4
: classe Point3D
Définir une classe Point3D représentant un point dans l'espace par ses trois coordonnées, et possédant les méthodes suivantes : • Constructeur : permettant d'initialiser les trois coordonnées d'un objet Point3D à partir de trois valeurs de type double reçus en paramètres ; • affiche : permettant l'affichage de coordonnées d'un objet Point3D ; • compare : permettant de comparer (tester l'égalité des coordonnées) l'objet courant à un autre objet de type Point3D passé en paramètre. Dans le main, créer trois points (trois instances) dont deux avec des coordonnées identiques et tester les deux méthodes précédentes.
Séries TD/TP C++
elallaouicours.hol.es
3
ENSA D’AL Hoceima
2014/2015
Exercice 5
: classe Personne
Programmer la classe Personne en respectant ses fonctionnalités : • les variables d'instances sont privées (inaccessibles d'une autre classe): nom, prenom, adresse, sexe et age; • des constructeurs : Personne (string lenom) {..} Personne (string leprenom, string lesexe, int lage) {..} Personne(string lenom, string leprenom, string ladresse, string lesexe, int lage) { ...} • des méthodes d'instances publiques pour accéder aux variables privées getNom(), setNom() .... anniversaire() incrémente l'âge presenteToi() pour afficher un texte comme : Je m'appelle ... ..... Je suis un [homme | femme] J'ai .... ans
Exercice 6
: classe Rectangle
Attributs Point p (coordonnée du sommet haut gauche), longueur, largeur Méthodes 1. 2. 3. 4. 5.
perimetre(); surface() diagonale(); pour calculer la longueur d'une diagonale doublerDim(); pour doubler la dimension deplacer(a,b); pour déplacer le rectangle par translation (a,b) différents constructeurs pour initialiser : aucun attribut (par défaut) seulement la position p (x, y) seulement les dimensions les 3 attributs Programmer et tester cette classe : créer 3 objets et tester ses méthodes.
Exercice 7 • • • • •
: classe Segment
Un segment est caractérisé par deux attributs de type Point, p1 et p2 (2 objets de la classe Point déjà crée, représentant les coordonnées des extrémités d'un segment dans un repère. la méthode longueur() retournant la longueur du segment. Constructeur et destructeur. la méthode appartient(), indiquant si un point de coordonnées entières est donnée en argument appartient ou non au segment une méthode affiche() qui permet d’écrire un segment d'extrémités A(4,14) et B(12,-35) (par exemple) sous la forme : segment [ A(4,14) ; B(12,-35) ] programmer et tester la classe Segment : instancie deux objets (Segment) et tester ses méthodes.
Exercice 8 •
Adapter la classe point de l’exercice1, de manière que la fonction membre affiche fournisse, en plus des coordonnées du point, le nombre d’objets de type point ;
• •
Ajouter une fonction membre getNombre() qui retourne le nombre d’objet crée ; Tester la classe en créant 6 objets, Tester ses méthodes.
Séries TD/TP C++
elallaouicours.hol.es
4
ENSA D’AL Hoceima
2014/2015
Génie Informatique 1 : Programmation orienté objet en C++ Série N°3 TD/TP
Exercice 1 Créer une classe point ne contenant qu’un constructeur sans arguments, un destructeur et un membre donnée privé représentant un numéro de point (le premier créé portera le numéro 1, le suivant le numéro 2...). Le constructeur affichera le numéro du point créé et le destructeur affichera le numéro du point détruit. Écrire un petit programme d’utilisation créant dynamiquement un tableau de 4 points et le détruisant.
Exercice 2 Dans une classe PileEntiers de la forme1 : class PileEntiers{ int dim ;
// nombre maxi d'éléments de la pile
int * adr ;
// adresse du tableau représentant la pile
int nelem ;
// nombre d'éléments courant de la pile
public : PileEntiers (int n) {...} ~PileEntiers () {...} ..... }
Introduisez les opérateurs > et < tels que si p est un objet de type PileEntier s et n une variable entière : • •
p < n ajoute la valeur de n sur la pile p (en ne renvoyant aucune valeur), p > n supprime la valeur du haut de la pile et la place dans n.
On prévoira les deux situations : a) fonctions membres ;
b) fonctions amies.
Exercice 3 Le but de cet exercice est d'implémenter la classe Complexe et de définir les opérateurs nécessaires pour écrire des opérations arithmétiques simples mettant en jeu des nombre complexes et réels. 1.
Définir la classe Complexe, en utilisant la représentation cartésienne des nombres complexes (i.e. avec deux attributs double représentant respectivement les parties réelle et imaginaire du nombre complexe).
2.
Ajouter à cette classe les constructeurs et destructeur nécessaires pour que le main suivant compile :
main(){ Complexe defaut; Complexe zero(0.0, 0.0); Complexe un(1.0, 0.0); Complexe i(0.0, 1.0); Complexe j;
} 3.
Définir les opérateurs nécessaires (fonction membre, ordinaire, ou amie) pour que cette suite de la fonction main compile et s'exécute correctement : cout << zero << " ==? " << defaut; if (zero == defaut) cout << " oui" << endl; else
Séries TD/TP C++
elallaouicours.hol.es
5
ENSA D’AL Hoceima
2014/2015 cout << " non" << endl; cout << zero << " ==? " << i; if (zero == i) cout << " oui" << endl; else cout << " non" << endl;
Le prototype de l’opérateur << est : ostream& operator<<(ostream&, const Complexe&); 4.
Continuer avec des opérateurs arithmétiques simples (là encore, des opérateurs externes seront nécessaires) : j = un + i; cout << un << " + " << i << " = " << j << endl; Complexe trois(un); trois += un; trois += 1.0; cout << un << " + " << un << " + 1.0 = " << trois << endl; Complexe deux(trois); deux -= un; cout << trois << " - " << un << " = " << deux << endl; trois = 1.0 + deux; cout << "1.0 + " << deux << " = " << trois << endl;
5.
Passer ensuite aux multiplications et divisions : Complexe z(i*i); cout << i << " * " << i << " = " << z << endl; cout << z << " / " << i << " = " << z/i << " = "; cout << (z/=i) << endl;
6.
Et pour finir, les quelques opérateurs arithmétiques qui manquent encore : % Complexe k(2.0,-3.0); z = k; z *= 2.0; z *= i; cout << k << " * 2.0 * " << i << " = " << z << endl; z = 2.0 * k * i / 1.0; cout << " 2.0 * " << k << " * " << i << " / 1 = " << z << endl;
Indication : Soient z1=(x1,y1) et z2=(x2,y2) deux complexes; On a : z1⋅z2 = (x1⋅x2 − y1⋅y2 , x1⋅y2 + y1⋅x2) z1/z2 = (x1⋅x2 + y1⋅y2/x2⋅x2 + y2⋅y2
Séries TD/TP C++
,
y1⋅x2 − x1⋅y2/x2⋅x2 + y2⋅y2)
elallaouicours.hol.es
6