Programmation en
This presentation is the property of its rightful owner.
Sponsored Links
1 / 170

Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons PowerPoint PPT Presentation


  • 50 Views
  • Uploaded on
  • Presentation posted in: General

Programmation en. Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed . Benjelloun @fpms.ac.be 2005-2006. Qu'est-ce qu'un bon programme?. Il doit résoudre le PROBLEME !. Efficacité  Rapidité?. DUREE DE VIE ?. INSTANTANE !. Lisible Structuré. Portabilité.

Download Presentation

Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Mohammed benjelloun service d informatique facult polytechnique de mons

Programmation en

Mohammed BENJELLOUN

Service d’Informatique

Faculté Polytechnique de Mons

[email protected]

2005-2006


Mohammed benjelloun service d informatique facult polytechnique de mons

Qu'est-ce qu'un bon programme?

Il doit résoudre le PROBLEME !

Efficacité Rapidité?

DUREE DE VIE ?

INSTANTANE !

  • Lisible

  • Structuré

Portabilité


Mohammed benjelloun service d informatique facult polytechnique de mons

Types de base en C++

Les autres types seront dérivés de ceux-ci.

booléen: bool qui s'accompagne des mots-clés true et false.

sizeof(i);retourne la taille en octet de la variable i


Mohammed benjelloun service d informatique facult polytechnique de mons

Pour commencer

Tout programme doit avoir un point d’entrée nommé main()

void main(void)

{

/* corps du programme*/

déclaration des Cstes et Var ;

instruction1 ;

instruction2 ;

….

}

main(void)  main()

void main(void): La fonction main ne prend aucun paramètre et ne retourne pas de valeur.

int main(void): La fonction main retourne une valeur entière à l'aide de l'instruction return (0 si pas d’erreur).

main() est la fonction appelée lors de l’exécution du programme.

{ et }délimitent le corps de la fonction, bloc, la succession d'actions à réaliser.

Chaque expression (instruction) doit finir par ;

Commentaire : texte encadré par les symboles ‘/*’ et ‘*/’ ou une ligne

commençant par le symbole ‘//’


Mohammed benjelloun service d informatique facult polytechnique de mons

initialisations

Variables : déclarations,

Syntaxe : Type identificateur1, id2,…. ;

int i=9; ou int i;

i=9;

char c1= 'A'; ou char c1;

c1= 'A';

Exemple:

char c1, c2, c3;

int i, j, var_ent;


Mohammed benjelloun service d informatique facult polytechnique de mons

Identificateurs

  • Les identificateurs nomment les objets C++ (fonctions, variables ...).

  • Le C++ distingue les minuscules des majuscules.

  • Exemple: abc, Abc, ABC

  • sont des identificateurs valides et tous différents.

  • Identificateurs valides :

  • xx y1 somme_5 _position Noms Programme_1

    • Identificateurs invalides :

    • 3eme commence par un chiffre

    • x#y caractère non autorisé (#)

    • no-commande caractère non autorisé (-)

    • taux change caractère non autorisé (espace)


Mohammed benjelloun service d informatique facult polytechnique de mons

asm

auto

bool

break

case

catch

char

class

const

continue

default

delete

do

double

else

enum

extern

float

for

friend

goto

if

inline

int

long

mutable

namespace

new

operator

private

protected

public

register

return

short

signed

sizeof

static

struct

switch

template

this

typedef

union

unsigned

using

virtual

void

volatile

while

Un identificateur ne peut pas être un mot réservé du langage :

Les mots réservés du langage C++ doivent être écrits en minuscules.


Mohammed benjelloun service d informatique facult polytechnique de mons

Les entrées /sorties : cin et cout

:

  • cout, le flux standard de sortie, habituellement associé à l'écran,

  • Syntaxe : cout<< expression << expression << expression … ;

  • cin, le flux standard d’entrée, habituellement associé au clavier,

  • Syntaxe : cin>>valeur >> valeur >> valeur … ;

7

cinet cout sont définies dans la librairie <iostream.h>.

#include <iostream.h>

void main(void) {

cout<<" Salut a vous tous" << endl;

cout << " oui tous " ;

}

endl signifie un saut de ligne


Mohammed benjelloun service d informatique facult polytechnique de mons

#include <iostream.h>

void main () {

int n=2;

float x= 3.4;

char C= 'A' ;

cout << " Entier n = "<< n << " ; Entrez un nouveau = " ;

cin >> n ;

cout << " Float x = "<< x << " ; Entrez un nouveau = " ;

cin >> x ;

cout << " Char C = "<< C << " ; Entrez un nouveau = " ;

cin >> C ;

cout << "\n L'entier vaut maintenant : " << n << endl;

cout << " Le flottant vaut maintenant :" << x << endl;

cout << " Le caractere vaut maintenant :" << C << endl ;

}

int n=2;

float x= 3.4;

char C= 'A' ;

cout << "Entrez n, x et C : ";

cin >> n >> x >> C;

cout << C << ' ' << x << ' ' << n

Entrez n, x et C : 5 9.9 V

V 9.9 5

Entier n = 2 ; Entrez un nouveau = 3

Float x = 3.4 ; Entrez un nouveau = 5.67

Char C = A ; Entrez un nouveau = y

L'entier vaut maintenant : 3

Le flottant vaut maintenant :5.67

Le caractere vaut maintenant :y


Mohammed benjelloun service d informatique facult polytechnique de mons

L’initialisation desconstantes est obligatoire lors de leur déclaration.

Les variables doivent être déclarées avant leur utilisation dans un début de bloc (juste après{),

zone des déclarations:

void main(void)

{

const int Nmax=10;

char c;

int i, k;

c = 'A';

i = 50;

K=10; 

void main(void)

{

const int Nmax=10;

char c = 'A';

int i=50, k;

k=10;

est équivalent à

Les constantes caractères s’écrivent entre quottes simples :

'A''s''2''['

= opérateur d’affectation

Cette règle s'applique à tous : char, int, float ...


Mohammed benjelloun service d informatique facult polytechnique de mons

Les opérateurs arithmétiques

Le C++ propose les opérateurs suivants :

+ addition

- soustraction

* multiplication

/ division

% modulo (reste de la division entière )

% ne peut être utilisé qu'avec des entiers

7/2

7.0/2

7/2.0

7.0/2.0

3

3.5


Mohammed benjelloun service d informatique facult polytechnique de mons

if( choix == 2) {

Correction 

!

Les opérateurs de comparaison

<plus petit

<=plus petit ou égal

>plus grand

>=plus grand ou égal

==égal

!=différent

Le résultat d'une expression logique est un booléen. Il vaut true si elle est vraie et false sinon.

Toute valeur non nulle est considérée comme vraie et la valeur nulle comme fausse.

!

== et pas =

if( choix = 2){


Mohammed benjelloun service d informatique facult polytechnique de mons

Les structures de contrôle

Alternative: if-else

Itérations: for, while, do-while

Rupture de Contrôle: break, continue, return …

Choix Multiple: switch-case

programme

programme

oui

non

Condition

vraie

Condition

vraie

oui

non

Bloc d’instructions

Bloc 1 d’instructions

Bloc 2 d’instructions

Suite du programme

do-while

Bloc d’instructions

oui

Condition

vraie

Suite du programme

non

Suite du programme

if-else

while


Mohammed benjelloun service d informatique facult polytechnique de mons

  Les décisions - if else

programme

if(Condition vraie)

{

BLOC 1 D'INSTRUCTIONS

}

else

{

BLOC 2 D'INSTRUCTIONS

}

if (Condition vraie)

instruction 1;

else

instruction 2;

Condition

vraie

oui

non

Bloc 1 d’instructions

Bloc 2 d’instructions

if(a<b)

min=a;

else

min=b;

Suite du programme

if (Condition vraie)

{

instruction 1;

instruction 2;

instruction 3;

instruction N;

}

if (Condition vraie)

instruction 1;

Condition

vraie

oui

non

if ( temperature > 70.0)

cout << " Alarme "<<endl;

Bloc 1 d’instructions

Suite du programme


Mohammed benjelloun service d informatique facult polytechnique de mons

int i = 1;

if(i < 0)

cout <<" i < 0 \n";

cout <<" Il faut un i > 0 \n";

cout <<" alors!! \n";

non

oui

Condition

vraie

Bloc 1 d’instructions

Il faut un i > 0

alors!!

int i = 1;

if(i < 0){

cout <<" i < 0 \n";

cout <<" Il faut un i > 0" << endl;

}

cout <<" alors!! \n";

alors!!


Mohammed benjelloun service d informatique facult polytechnique de mons

int i = -1;

if(i < 0){

cout <<" i < 0 \n";

cout <<" Il faut un i > 0" << endl;

}

cout <<" alors!! \n";

i < 0

Il faut un i > 0

alors!!

non

oui

int i = -1;

if(i < 0){

cout <<" i < 0 \n";

cout <<" Il faut un i > 0" << endl;

}

else {

cout <<" alors!! \n";

}

Condition

vraie

Bloc 2 d’instructions

Bloc 1 d’instructions

i < 0

Il faut un i > 0


Mohammed benjelloun service d informatique facult polytechnique de mons

– for

for( init ;(Condition vraie); itération)

{

/* liste d'instructions */

}

Les itérations

#include <iostream.h>

void main()

{

int i=0;

cout << "i = " << i << endl;

i++;

cout << "i = " << i << endl;

i++;

cout << "i = " << i << endl;

i++;

cout << "i = " << i << endl;

}

i=0

i=1

i=2

i=3

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

cout << "i = " << i << endl;

}

for (i = 0; i <4; ) {

cout << "i = " << i << endl;

i++ ;

}


Mohammed benjelloun service d informatique facult polytechnique de mons

La boucleTANT QUE ... FAIRE ...

Boucle pré-testée

Il s'agit de l'instruction while :

tant que (expression vraie)

faire{ BLOC D'INSTRUCTIONS }

Organigramme:

(Boucles)

tant que, pas jusqu’à ce que!

Syntaxe:

while(Condition vraie)

{

............; /* bloc d'instructions */

............;

............;

}

Le test se fait d'abord, le bloc d'instructions n'est pas forcément exécuté.

Condition

vraie

oui

non

Bloc 1 d’instructions

Suite du programme


Mohammed benjelloun service d informatique facult polytechnique de mons

do while= REPETER … tant que

(garantit l’exécution au moins une fois)

do

{

............;/* bloc d'instructions */

............;

}

while (Condition vraie);

programme

Bloc d’instructions

oui

non

Condition

vraie

Suite du programme

int j = 5;

do

cout<<"j = "<<j--<<endl;

while(j > 0);

cout <<"stop\n";

int j = 5;

do {

cout<<"j = "<<j <<endl;

j--;

} while(j > 0);

cout <<"stop\n";

j = 5

j = 4

j = 3

j = 2

j = 1

stop


Mohammed benjelloun service d informatique facult polytechnique de mons

switch = AU CAS OU ... FAIRE ...

switch(variable de type char ou int)// au cas où la variable vaut:

{

case valeur1: ......; // variable=valeur1 : exécutez ce bloc d'instructions.

.......;

break; /* L'instruction d'échappementbreak;

permet de quitter la boucle ou l'aiguillage le plus proche.*/

casevaleur2:........; // cette valeur2: exécutez ce bloc d'instructions.

........;

break;

.

. //etc ...

.

default: .......; /* aucune des valeurs précédentes: exécuter ce bloc

........; d'instructions, pas de "break" ici.*/

}

Le bloc "default" n'est pas obligatoire. valeur1, valeur2, …. doivent être des expressions constantes. L’instruction switch correspond à une cascade d’instructions if ...else


Mohammed benjelloun service d informatique facult polytechnique de mons

switch : instruction commode pour les "menus":

int choix;

switch(choix)

{

case 1: …

char choix;

cout << "Ensemble_instruction1 : TAPEZ 1 " << endl;

cout << "Ensemble_instruction2 : TAPEZ 2" << endl;

cout << "POUR SORTIR : TAPEZ 3 " << endl;

cout << " \n\t\t VOTRE CHOIX: " << endl;

cin >> choix ;

switch(choix){

case '1': cout << "Ensemble_instruction1 : case 1" << endl;

break;

case '2': cout << "Ensemble_instruction2 : case 2" << endl;

break;

case '3': cout << " case 3 : FIN DU PROGRAMME ...." << endl;

break;

default : cout << "\nCE CHOIX N'EST PAS PREVU "<< endl;

}

float f;

switch(f) {

case 2:

....

!

switch(i) {

case 2 * j:

....


Mohammed benjelloun service d informatique facult polytechnique de mons

tab[0]

tab[1]

tab[2]

tab[3]

Tableaux et Strings

Un tableau est une collection de variables de même type, appelées éléments

Type Nom_Tableau[dim];

int tab[4]; déclare un tableau de 4 valeurs entières

const int SIZE = 5;

int A[SIZE] // A est un vecteur de 5 entiers

float B[5]

Déclaration

intA[SIZE] = { 10, 20, 30, 40, 50 };

intpremier[] = { 1, 2, 3, 5, 7, 11, 13 };

char Tab_Char[4] = { 'A', 'C', 'F', 'G' };

intTab[50] = { 0 };

Initialisation

inti = 10;

inta[i];

intprimes[];

Interdiction


Mohammed benjelloun service d informatique facult polytechnique de mons

'H'

'e'

'l'

'l'

'o'

'\0'

Chaînes de caractères ou String

S[0]

S[1]

S[2]

S[3]

S[4]

S[5]

En C++, il y a deux façons pour traiter et manipuler unechaînede caractères:

  • Un tableau de char à une dimension: charIdent[dim];

  • Un type spécial string : stringIdent; // Il faut inclure <string.h>

Initialisation

charIdent[dim];

Pour terminer la chaîne, on place en fin de chaîne le caractère nul '\0', de code ASCII 0.

Ce caractère est soit ajouté automatiquement par le compilateur, soit introduit par le programmeur, selon les fonctions utilisées.

char S[] = {'H','e','l','l','o','\0'};

char S[6] = "Hello";

char S[] = "Le main";


Mohammed benjelloun service d informatique facult polytechnique de mons

Pourquoi utiliser string Ident; plutôt que charIdent[dim]; ?

char S1[6] = "Salut", S2[6] = "Hello", S3[12];

S1= S2; S1= "Hooo"; S3=S1+S2; if(S1= =S2) …

Interdit

string S1 = "Salut", S2 = "Hello", S3;

S1= S2; S1= "Hooo"; S3=S1+S2; if(S1= =S2) …

Autorisé

S1= "Hello"

S1= "Hooo"

S3= "HoooHello"

false


Mohammed benjelloun service d informatique facult polytechnique de mons

Fonctions en C++

Fonctions … pourquoi ?

void fonction1()

{

cout<<"\n fonction1 \n";

void fonction2()

{

cout<<"\n fonction2 \n";

}

}

Définition

L'imbrication de fonctions

n'est pas autorisée


Mohammed benjelloun service d informatique facult polytechnique de mons

Résumé

#include …

intfonct (int a)

{

a=1 ;

return a;

}

voidmain(void){

int var = 5;

var = fonct (var);

cout << var << endl;

}

#include …

void fonct (int a)

{

a=1 ;

}

voidmain(void){

int var = 5;

fonct (var);

cout << var << endl;

}

#include …

void fonct (int &a)

{

a=1 ;

}

voidmain(void){

int var = 5;

fonct (var);

cout << var << endl;

}

1

1

5


Mohammed benjelloun service d informatique facult polytechnique de mons

Structure d'un programme C++

Directives du préprocesseur :

accès avant la compilation

#include <iostream>

using namespace std;

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

int fonc1(int x);

void fonc2(int y);

int Var_Glob;

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

void main(void)

{ /* début du bloc de la fonction main*/

int i, j=5, k; // définition des variables locales

i = 0 ;

j=fonc1(i) ;

fonc2(i) ;

} // fin du bloc de la fonction main

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

int fonc1( int var){

….. ;

return var ;

}

void fonc2( int t){ /* Corps de la fonction fonc2 */

….. ;

}

Déclarations

Programme

principal

Définitions des

fonctions


Mohammed benjelloun service d informatique facult polytechnique de mons

Passer des tableaux aux fonctions

  • Les tableaux peuvent être passés comme paramètres d'une fonction.

  • Ils ne peuvent pas être retournés comme résultat d'une fonction.

  • La longueur du tableau ne doit pas être définie à la déclaration de la fonction.

  • Un tableau peut être modifié dans une fonction. Il est passé par référence (adresse) et non par valeur.

!

#include …

void Modif(inta[]){

a[0] = 5;

a[1] = 6;

}

void main(void){

int p[2] = { 1, 2 };

cout << p[0] << " ; " << p[1];

Modif(p);

cout << p[0] << " ; " << p[1];

}

1 ; 2

5 ; 6


Mohammed benjelloun service d informatique facult polytechnique de mons

Appel par valeurs, pointeurs, références ??!!

par Valeur

Pointeur

Référence

#include …

void Modifier(int v);

void main(){

int v = 5;

Modifier(v);

cout << "\nmain: v = " << v;

}

void Modifier(int v){

v = v *100;

cout << "Modifier: v = "<< v;

}

#include …

void Modifier(int*v);

void main(){

int v = 5;

Modifier(&v);

cout << "\nmain: v = " << v;

}

void Modifier(int *v){

*v = *v *100;

cout << "Modifier: *v = "<< *v;

}

#include …

void Modifier(int &v);

void main(){

int v = 5;

Modifier(v);

cout << "\nmain: v = " << v;

}

void Modifier(int &v){

v = v *100;

cout << "Modifier: v = "<< v;

}

Modifier: v = 500

main: v = 5

Modifier: *v = 500

main: v = 500

Modifier: v = 500

main: v = 500

var = 5

var = 5

var = 500

var = 500


Mohammed benjelloun service d informatique facult polytechnique de mons

10

9

9

Règles de visibilité des variables

#include …

int globale;

void fonc(int x);

void main(void) {

inti = 5, j;

float f = 2.8, g;

d = 3.7;

globale =10;

cout << " valeur de j= " << j ;

cout << "\nglobale = " << globale ;

fonc (i);

cout << "\nglobale = " << globale ;

}

void fonc(int v) {

double d, f;

i++;

globale --;

}

// variable globale;; initialisation à 0

(0)

(1)

(2)

(3)

// locales à fonc

(4)

(5)


Mohammed benjelloun service d informatique facult polytechnique de mons

#include …

int g;

void affichage(int un, int deux) {

cout << un << " " << deux << " " << g << endl;

}

#include …

int g;

void affichage(int un, int deux, int g) {

cout << un << " " << deux << " " << g << endl;

}


Mohammed benjelloun service d informatique facult polytechnique de mons

Allocation dynamique de la mémoire

Tableaux  réserver plus de places en mémoire que nécessaire.

Création d’un tableau de taille quelconquel'allocation dynamique

#include <iostream> …

void affiche(int T[], int d, char C[]){

for(int i=0; i<d; i++)

cout<< "\n T["<<i<<"] = " << T[i] << " C["<<i<<"] = " <<C[i];

cout << endl;

}

void main(){

int N, *T, i;

cout << " N = " ; cin >> N;

char *C = new char[N];

T= new int[N];affiche(T, N, C);

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

T[i]=i;

C[i]='A'+i;

}

affiche(T, N, C);

delete[] T;affiche(T, N, C);

delete[] C;affiche(T, N, C);

}

T[0] = -842150451 C[0] = ◙

T[1] = -842150451 C[1] = ◙

T[2] = -842150451 C[2] = ◙

T[0] = 0 C[0] = A

T[1] = 1 C[1] = B

T[2] = 2 C[2] = C

T[0] = -572662307 C[0] = A

T[1] = -572662307 C[1] = B

T[2] = -572662307 C[2] = C

T[0] = -572662307 C[0] = ¦

T[1] = -572662307 C[1] = ¦

T[2] = -572662307 C[2] = ¦


Mohammed benjelloun service d informatique facult polytechnique de mons

char *C = new char[N]; et Equiv à char *C;

C = new char [N];

*C = new char[N];


Mohammed benjelloun service d informatique facult polytechnique de mons

Tableau de taille quelconque

tab = new int [n];

delete [] tab;

#include <…

void saisie_vect(int Tab[], int n){

int i;

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

cin >> Tab[i];

}

}

void Affiche(int Tab[], int dim){

int i;

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

cout << "Tab[" << i <<"]="

<<i<<Tab[i];

}

}

Allocation dynamique du tableau

void main()

{

int *tab, n;

cout << " N= ";

cin >> n;

saisie_vect(tab, n);

Affiche(tab, n);

}


Mohammed benjelloun service d informatique facult polytechnique de mons

Les Structures

Une structure est un ensemble de variables (de types éventuellement différents), définissant un nouveau type sous un seul nom.

Les structures sont définies en utilisant le mot-clé struct.

structDate{

intjour;

intmois;

intan;

};

struct Etudiant{

charnom[30], *adresse;

intnumero;

float poids;

struct Date D_Nais;

};

/* champs

ou

membres */

Déclarer des instances

struct Date {

intjour, mois, an;

} hier , demain;

struct Date paques, semaine[7];

Date noël;// pas de struct

Date nouvel_an = { 1, 1, 2005 };

Une fois la structure définie, les instances peuvent être déclarées. Par abus de langage, on appellera structure une instance de structure

Déclaration avant ‘;’

Initialisation


Mohammed benjelloun service d informatique facult polytechnique de mons

Des structures dans des structures

struct Date

{

intjour;

intmois;

intan;

};

struct Etudiant{

char nom[30];

char *adresse;

int numero;

float poids

struct Date D_Nais;

};

Etudiant JD = {

"Dupont",

"rue de Houdain, 9, 7000 Mons",

102,

60.7,

{ 15, 10, 1986 }

};

Les membres sont accédés par le nom de l’instance, suivi de . , suivi du nom du membre

cout <<"nom = "<< JD.nom;

cout <<"\n numero = "<< JD.numero<< endl;

cout << " jour de naissance "<<JD.D_Nais.jour;


Mohammed benjelloun service d informatique facult polytechnique de mons

L'imbrication de structures

n'est pas autorisée

struct Etudiant{

char nom[30];

char *adresse;

int numero;

float poids

struct Date

{

intjour;

intmois;

intan;

};

};


Mohammed benjelloun service d informatique facult polytechnique de mons

plus_art[0]

plus_art[1]

plus_art[2]

#include …

struct Article{

char nom[30];

int prix;

};

void Affiche(Article AR){

cout << "\n\t Nom = " << AR.nom << " Prix = " << AR.prix;

}

void main(void){

Article un_article, plus_art[5];

cout << "Entrez le nom : "; cin >> un_article.nom;

cout << " \nEntrez le prix "; cin >> un_article.prix;

Affiche(un_article);

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

cout << "Entrez le nom : "; cin >> plus_art[i].nom;

cout << "\nEntrez le prix "; cin >> plus_art[i].prix;

Affiche(plus_art[i]);

}

}


Mohammed benjelloun service d informatique facult polytechnique de mons

Une structure peut être passée, comme une autre variable, par valeur ou par adresse

Passer par valeur n’est pas toujours efficace (recopiage à l’entrée)

Passer par adresse ne nécessite pas de recopiage

void Saisie(Article &AR){

Entrez le nom : Television

Entrez le prix : 300

Nom = TelevisionPrix = 300

#include …

struct Article{

char nom[30]; // ou string nom;

int prix;

};

void Affiche(Article AR){

cout << "\n\t Nom = " << AR.nom

<< " Prix = " << AR.prix;

}

void Saisie(Article AR){

cout << "Entrez le nom : "; cin >> AR.nom;

cout << "\nEntrez le prix:"; cin >> AR.prix;

}

void main(void){

Article un_article;

Saisie(un_article);

Affiche(un_article);

}

Entrez le nom : Television

Entrez le prix : 300

Nom = ╠╠╠╠Prix = -858993


Mohammed benjelloun service d informatique facult polytechnique de mons

#include …

struct Article{

char nom[30];

int prix;

};

void Saisie(Article &AR){

cout << "Entrez le nom : "; cin >> AR.nom;

cout << "\nEntrez le prix:"; cin >> AR.prix;

}

void main(void){

Article T1[5];

for (int i=0; i<5; i++)

Saisie(T1[i]);

}

Article Nouv(){

Article AA;

cout << "Entrez le nom : "; cin >> AA.nom;

cout << "\nEntrez le prix:"; cin >> AA.prix;

return AA;

}

L’opération d’affectation = peut se faire avec des structures

T1[i]=Nouv();


Mohammed benjelloun service d informatique facult polytechnique de mons

struct Person{

string nom;

char *adresse;

int res[Nmax];

char code;

};

Person Tab[dim_cnst];

Ou

Person *Tab;

Sexe


Mohammed benjelloun service d informatique facult polytechnique de mons

Gestion des fichiers en C++

Pour manipuler un fichier en C++il faut #include <fstream.h>

  • On y trouve essentiellement les classes:

    • ofstream (output file stream) permet d’écrire les données dans le fichier ;

    • ifstream (input file stream) permet de lire les données du fichier ;

Ouverture et fermeture d’un fichier :

Écriture :

ofstream output;

output.open("Res.txt"); ou output.open("c:\\labojeudi\\Res.txt");

Lecture :

ifstream input ;

input.open("Data.txt"); ou input.open("c:\\labojeudi\\Data.txt");


Mohammed benjelloun service d informatique facult polytechnique de mons

Test!

Mes Donnees

H ; 1

e ; 2

l ; 3

l ; 4

o ; 5

o ; 5

??

#include <fstream.h>

void main() {

ofstreamEcri;

char Tab1[6]="Hello";

int Tab2[5]={1,2,3,4,5};

Ecri.open("Mon_fichier.txt");

Ecri << "Mes Donnees" << endl;

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

Ecri << Tab1[i] << " "

<< Tab2[i]<<endl;

}

Ecri.close();

}

#include <fstream.h>

void main() {

ifstreamLec;

char Tab1[6], char Titre[100];

int Tab2[5], i=0;

Lec.open("Mon_fichier.txt");

Lec.getline(Titre,100); cout << Titre << endl;

while(!Lec.eof()){

Lec >> Tab1[i] >> Tab2[i];

cout << Tab1[i] << " ; " << Tab2[i]<< endl;

i++;

}

Lec.close();

}

Mes Donnees

H 1

e 2

l 3

l 4

o 5

ici


Mohammed benjelloun service d informatique facult polytechnique de mons

Ecri.open("Mon_fichier.txt");

if(Ecri){ // on vérifie si l'ouverture se passe bien

Ecri << "Mes Donnees" << endl;

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

Ecri << Tab1[i] << " "

<< Tab2[i]<<endl;

}

}

else {// si échec à l'ouverture

cout<<"Erreur"<<endl;

}

Ecri.close();


Mohammed benjelloun service d informatique facult polytechnique de mons

N+1

TEST

Recherche dichotomique

 Et pos

N+1

Nmax

un tableau trié + un élément

N

Nmax

+ 6

Element  ou pas ??

Element Position ??

6


Mohammed benjelloun service d informatique facult polytechnique de mons

Recherche dichotomique

 Et pos

-7

N--


Mohammed benjelloun service d informatique facult polytechnique de mons

int dicho(struct Element T[], int n, string nom, int &pos);

int dicho(struct Element T[], int n, string nom, int &pos)

{

int debut,fin,m;

debut = 0;

fin = n;

while (debut<fin) {

m = (debut+fin)/2;

if (T[m].nom<nom) debut = m+1;

else fin = m;

}

pos = fin;

if (T[fin].nom==nom) return 1;

else return 0;

}


Mohammed benjelloun service d informatique facult polytechnique de mons

const int NMax = 5;

struct Etudiant{

char *nom ;

int numero ;

int Matieres[NMax] ;

} ;

void saisie(Element T[], int n, int NM)

{

n?

NM?

}

void affichage( )

{

}


Mohammed benjelloun service d informatique facult polytechnique de mons

void saisie(struct Element T[], int &n, int &NM)

{

int i, j, size;

string name;

? n et NM

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

cout << " nom[" i << " ] = ";

cin>> name;

T[i].nom = new char[size+1];

T[i].nom = name;

cout <<" num " ;

cin >> T[i].num;

for(j=0;j< NM;j++){

}

}

}

size = name.length(); ou

size = name.size();


Mohammed benjelloun service d informatique facult polytechnique de mons

Le Plus


Mohammed benjelloun service d informatique facult polytechnique de mons

Tableaux et structures

struct point

{

int x ;

int y ;

} ;

Sgm[0]

Sgm[1]

Sgm[2]

struct point Sgm[7];

// Sgm[3].yest le champ yde la 4è position : 4

Avantages: Facilité de création et de manipulation (accès à un élément, …)

Inconvénients : place mémoire, difficilement extensible, insertion n’est

possible que par décalage de tous les éléments suivants.

struct point Sgm[7];ou

struct Date *Sgm;avec new


Mohammed benjelloun service d informatique facult polytechnique de mons

Listes Chaînées

  • JJ

Les listes sont des structures de données dynamiques, linéaires. Elles sont composées de celluleschaînées les unes aux autres parpointeurs.


Mohammed benjelloun service d informatique facult polytechnique de mons

Une liste chaînée (linked list) est composée de nœuds (node), chacun ayant un pointeur vers le nœud suivant de la liste. Chaque nœud « contient » ou « est » une entité.

Ainsi, le nœud A pointe sur le nœud B, le nœud B pointe sur le nœud C, etc., jusqu'au dernier nœud, le E, qui pointe sur NULL. L'avantage ici, c'est que l'on peut faire exécuter la même fonction pour chaque nœud de la liste en n'appelant cette fonction que pour le premier nœud.


Mohammed benjelloun service d informatique facult polytechnique de mons

Une liste simplement chaînée : une cellule est un enregistrement qui peut être déclarée comme suit:

struct Node {

intdata; //les informations

struct Node*suiv; // le lien

};

Une liste doublement chaînée

struct Node {

intdata; // les informations

struct Node*suiv; // lien vers le suivant

struct Node*prec; // lien vers le précédent

};


Mohammed benjelloun service d informatique facult polytechnique de mons

Elm1

Elm2

Elm3

Elm4

Tête

Listes Chaînées

Liste simplement chaînée

Une cellule étant une structure qui contient un élément à stocker et un pointeur sur la prochaine cellule de la liste.

struct Cellule{

ELEMENT Data;// une structure définie préalablement

struct Cellule*suiv;// pointeur sur le prochain maillon

};

Modéliser une liste chaînée consiste à allouer dynamiquement les cellules chaque fois que cela est nécessaire.


Mohammed benjelloun service d informatique facult polytechnique de mons

Elem1

@ 0700

Elem2

@ 0900

Elem3

@ 2170

Elem4

NULL

Elem1

@ 0700

Elem2

@ 0900

Elem3

@ 2170

Elem4

NULL

@4000

Tête_List

@0700

@0900

@2170

@4000

Autres modélisations

@2170

Fin_List

@4000

Tête_List

@0700

@0900

@2170

@4000


Mohammed benjelloun service d informatique facult polytechnique de mons

Elem1

@ 0700

Elem2

@ 0900

Elem3

@ 2170

Elem4

NULL

Elem4

@4000

Elem3

@ 2170

Elem2

@ 0900

Elem1

@ 0700

@0700

Courant_List

@2170

Fin_List

@4000

Tête_List

@0700

@0900

@2170

@4000

@4000

Tête_List

@0700

@0900

@2170

@4000

Liste circulaire


Mohammed benjelloun service d informatique facult polytechnique de mons

Les différentes opérations et fonctions

Initialiser une liste

Initialiser les valeurs de la structure représentant la liste pointée par Debut pour que celle-ci soit vide. Une liste est vide lorsque Tête_List (Fin_List) pointe sur Vide.

typedef struct Cellule{

Type Data;

struct Cellule*next;// pointeur sur la prochainecellule

}CEL;

typedef: mot réservé, crée de nouveaux noms de types de données

Ex : typedef char * STRING; fait de STRING un synonyme de "char * "  

Portée : comme les variables.

CEL *debut;

debut = new (CEL);


Mohammed benjelloun service d informatique facult polytechnique de mons

Allouer et assigner une Cellule

Cette fonction réserve l'espace mémoire nécessaire pour une nouvelle Cellule dans la liste, assigne les données, et retourne un pointeur sur cette Cellule.

typedef struct Cellule{

Type Data;

struct Cellule* suiv;

}CEL;

CEL * new_node(Type value)

{

CEL * nouv;

nouv = new CEL;

nouvData = value;

nouvsuiv = NULL;

return nouv;

}

NULL

nouv


Mohammed benjelloun service d informatique facult polytechnique de mons

typedef struct Cellule{

int Data;

}CEL;

CEL cel, *Pcel;

Cel .Data = 10;

Pcel Data = 20;


Nouvelle cellule dans une liste cha n e vide

debut

Si

typedef struct Cellule{

string nom;

struct Cellule* suiv;

}CEL;

Nouvelle cellule dans une liste chaînée vide

typedef struct Cellule{

Type Data;

struct Cellule* suiv;

}CEL;

CEL *debut;

debut = new CEL;

debutname = "Denis";

debutsuiv = NULL;

Denis\0

NULL

Le début de la liste est indiqué par un pointeur indépendant (debut) et la fin par NULL


Mohammed benjelloun service d informatique facult polytechnique de mons

debut

Claire

prec

Ajouter une nouvelle cellule en tête de liste

CEL*prec;

prec = new CEL;

precname= "Claire";

precsuiv = debut;

debut = prec;

Denis

NULL

debut


Mohammed benjelloun service d informatique facult polytechnique de mons

CEL *prec;

prec = new CEL;

precname = "Claire";

precsuiv = debut;

debut = prec;

Claire

Denis

NULL

debut

Ajouter une nouvelle cellule en tête de liste

prec

CEL *insere_en_tete(string nom , CEL*deb )

{

CEL*prec;

prec = new CEL ; // créer une cellule

if (prec!=NULL){

precname = nom;// assignation de nom

precsuiv=deb; // assignation de suivant : chaîner avec la première cellule de la liste

deb=prec; // chaînage : faire pointer la tête de liste vers la nouvelle cellule.

}

return (deb);

}


Mohammed benjelloun service d informatique facult polytechnique de mons

CEL *p;

p = new CEL;

pname = "Alfred";

psuiv = precsuiv;

precsuiv = p;

Alfred

Alfred

Claire

Denis

Claire

Denis

p

p

NULL

prec

debut

Insérer une nouvelle cellule après la cellule prec

OK?

debut

NULL

prec


Mohammed benjelloun service d informatique facult polytechnique de mons

Alfred

Claire

Denis

p

Que fait ce code ?

CEL *p;

p = new CEL;

pname = "Alfred";

psuiv = precsuiv;

precsuiv = p;

CEL *p;

p = new CEL;

pname = "Alfred";

precsuiv = p;

psuiv = precsuiv;

debut

NULL

prec


Mohammed benjelloun service d informatique facult polytechnique de mons

Alfred

Claire

Denis

Que pensez-vous de la fonction Affichage?

CEL *p;

..

p=Saisie(..);

Affichage(..);

Affichage(..);

p=Ajout(..);

Affichage(..);

void Affichage (CEL *debut)

{

while (debut != NULL) {

cout << debutname;

debut = debutsuiv;

}

}

NULL

debut


Parcourir une liste

Alfred

Claire

Denis

p

p

p

Parcourir une liste

debut est un pointeur sur la cellule qui contient le premier élément de la

liste

void parcours (CEL *debut)

{

CEL *p;

p = debut;

while ( p != NULL) {

cout << pname;

p = psuiv;

}

}

Liste identifier par l'adresse de sa première cellule

NULL

debut


Mohammed benjelloun service d informatique facult polytechnique de mons

Alfred

Claire

Denis

Liberation

Ici gp2

NULL

tmp

void liberation (CEL *L)

{

CEL *tmp;

while ( L != NULL) {

tmp = L;

L=Lsuiv;

delete tmp;

}

}

  • void liberation(CEL *L){

    • if (L) {

      • CEL *tmp = Lsuiv;

      • delete L;

      • liberation(tmp);

    • }

  • }


Mohammed benjelloun service d informatique facult polytechnique de mons

Liberation

Si

typedef struct Cellule{

char *nom;

struct Cellule * suiv;

}CEL;

new

new

void liberation (CEL *L){

delete nom;

delete tmp;

}

Pour chaque Cellule


Mohammed benjelloun service d informatique facult polytechnique de mons

Alfred

Alfred

Claire

Denis

Claire

Denis

2

1

3

TRI

NULL

NULL


Mohammed benjelloun service d informatique facult polytechnique de mons

Alfred

Claire

Claire

Denis

Alfred

Denis

2

NULL

2

3

1

1

3

TRI

NULL


Mohammed benjelloun service d informatique facult polytechnique de mons

Autres fonctions

Supprimer une cellule

Libérer une cellule

Rechercher unecellule

Ajouter en queue de liste

Retirer la tête de liste …

En résumé, une liste chaînée par pointeurs permet une insertion et une suppression rapide des éléments. Cependant, contrairement au tableau, une liste chaînée interdit un accès direct aux éléments (mis à part la tête et la queue).

Si l’ordre d’insertion et de suppression des éléments dans la liste

importe, deux structures dedonnées sont particulièrement adaptées :

la pile et la file.


Mohammed benjelloun service d informatique facult polytechnique de mons

PILE [stack, lifo]

Une pile est une liste qui respecte la régle “dernier arrivé, premier sorti”. C’est une structure de données pour laquelle l’ajout et la suppression d’un élément ne sont autorisés qu’à une seule extrémité, appelée sommet de la pile.

Quant on ajoute un élément, celui-ci devient le sommet de la pile. Quant on retire un élément de la pile, on retire toujours le sommet. Pour résumer, le dernier entré/premier sorti liste LIFO(Last In, First Out).

Les piles sont souvent commodes pour dé-récursiver un problème.

Modélisation

Modéliser une pile consiste à utiliser une liste chaînée en n'utilisant que les opérations ajouterTete et retirerTete. Dans ce cas, on s'aperçoit que le dernier élément entré est toujours le premier élément sorti.


Mohammed benjelloun service d informatique facult polytechnique de mons

Exemples


Mohammed benjelloun service d informatique facult polytechnique de mons

Elm1

Elm2

Elm3

Nouv

Tête

Empiler un élément sur une pile

Cette fonction empile l'élément Nouv au sommet de la pile pointée par p. Cela revient à ajouter l'élément Nouv en tête de la liste. VRAI est retournée si l'élément a bien été ajouté.

fonction BOOLEEN empilerElement(CEL * p, ELEMENT Nouv)

{

return(ajouterTete(p, Nouv) );

}


Mohammed benjelloun service d informatique facult polytechnique de mons

Elm1

Elm1

Elm1

Elm2

Elm2

Elm2

Elm3

Elm3

Elm3

Nouv

Tête

Dépiler un élément d'une pile

Cette fonction dépile l'élément au sommet de la pile pointée par p et stocke sa valeur à l'adresse e. Cela revient à récupérer la valeur del'élément en tête de liste avant de le supprimer de cette dernière. VRAI est retournée si la pilen'est pas déjà vide.

fonction BOOLEEN depilerElement(PILE * p, ELEMENT * e)

{

if ( ! pileVide(*p)) {

*e = sommet(*p);

return ( retirerTete(p) ) ;

}

else{

return FAUX;

}

}

Il ne faut pas oublier de libérer la mémoire à chaque retrait du sommet de la pile.


Mohammed benjelloun service d informatique facult polytechnique de mons

Exemple

LIFO

Last-In-First-Out

  • Le dernier élément ajouté dans la liste, est le premier à en sortir.

  • Opérations:

  • Créer la pile,

  • Ajouter un élément (Push),

  • Effacer un élément (Pop),

  • Eliminer la pile .


Mohammed benjelloun service d informatique facult polytechnique de mons

7

3

9

Push(9)

Push(3)

debut

debut

debut

debut

Push(7)

Push procédure

Push(5)

5

NULL


Mohammed benjelloun service d informatique facult polytechnique de mons

struct NODE *pLifoStart;

int Push( int nombre)

{

NODE *pNew;

pNew = new NODE;

if( pNew == NULL ) return 0;

pNew->nombre = nombre;

pNew->next = pLifoStart;

pLifoStart = pNew;

return 1;

}


Mohammed benjelloun service d informatique facult polytechnique de mons

5! = 5*4!

4! = 4*3!

3! = 3*2!

2! = 2*1!

1! = 1*0!

0

0! = 1

1

2

3

4

5

Simulation de la factorielle

5! = ??

while ( num >0 )

{

Push( num );

num--;

}


Mohammed benjelloun service d informatique facult polytechnique de mons

0! = 1

1! =

1

*1 = 1

2! =

2

*1 = 2

3! =

3

*2 = 6

4! =

4

*6 = 24

5! =

5

*24 = 120

Simulation de la factorielle

5! = ??

5! = 5*4!

4! = 4*3!

3! = 3*2!

LIFO

2! = 2*1!

1! = 1*0!

0

0! = 1

1

2

3

while ( Pop(&temp) )

{

fact *= temp;

}

4

5


Mohammed benjelloun service d informatique facult polytechnique de mons

int Pop( int *pNombre ) // == supprimer début de liste

{

NODE *pTemp;

récupérer l'élément en tête de liste avant de le supprimer

delete pTemp;

return 1;

}


Mohammed benjelloun service d informatique facult polytechnique de mons

void CalculFact( int num)

{

int fact = 1;

int temp;

while ( num >0 )

{

Push( num );

num--;

}

while ( Pop(&temp) )

{

fact *= temp;

}

printf( "La factorielle est %i\n\n", fact);

}

Les piles sont commodes pour

dé-récursiver un problème.


Mohammed benjelloun service d informatique facult polytechnique de mons

FILE D'ATTENTE , queue [queue, FiFo]

Une file d'attente est une structure de données pour laquelle l’ajout et la suppression d’un élément ne sont autorisés qu’aux seules extrémités, appelées la tête et la queue de la file. Les éléments sont ajoutés en queue de file et sont retirés en tête de file. Pour résumer, le premier entré/ le premier sorti liste FIFO (First In, First Out).

Exemple : Imprimante en réseau


Mohammed benjelloun service d informatique facult polytechnique de mons

Simulation du déroulement d'une partie du jeu de cartes ‘’Bataille’’

Jeu de 52 cartes (4 couleurs et 13 puissances).

Le jeu est d'abord mélangé pour ensuite être coupé afin de constituer deuxtas de 26cartes


Mohammed benjelloun service d informatique facult polytechnique de mons

3 joueurs

4 joueurs


Mohammed benjelloun service d informatique facult polytechnique de mons

?

. . .

NULL

debut

. . .


Mohammed benjelloun service d informatique facult polytechnique de mons

typedef struct Node Cel;

Cel *debut, *fin, *act;

int dim = sizeof(Cel);

debut = (Cel *) malloc(dim);

fin = (Cel *) malloc(dim);

debut

fin

Listes doublement chaînées

struct Node {

intdata; // les informations

struct Node*prev; // lien vers le précédent struct Node*next; // lien vers le suivant

};

prev

data

next


Mohammed benjelloun service d informatique facult polytechnique de mons

debutprev = NULL;

debutnext = fin;

finprev = debut;

finnext = NULL;

NULL

NULL

prev

data

next

fin

debut


Mohammed benjelloun service d informatique facult polytechnique de mons

Déclaration d'une structure comportant 

des fonctions membres 

struct point

{ int x ;

int y ;

} ;

Supposons que nous souhaitions associer à la structure trois fonctions :

• initialise pour attribuer des valeurs aux "coordonnées" d'un point ;

• deplace pour modifier les coordonnées d'un point ;

• affiche pour afficher un point .

Voici comment nous pourrions déclarer notre structure point :

struct point

{

int x ; // déclaration "classique" des données

int y ;

// déclaration des fonctions membre (méthodes)

void initialise (int, int) ;

void deplace (int, int) ;

void affiche () ;

} ;


Mohammed benjelloun service d informatique facult polytechnique de mons

Définition des fonctions membres

// Définition des fonctions membres du type point

#include <iostream>

using namespace std ;

void point::initialise (int abs, int ord)

{

x = abs ; y = ord ;

}

void point::deplace (int dx, int dy)

{

x += dx ; y += dy ;

}

void point::affiche ()

{

cout << "Je suis en " << x << " " << y << "\n" ;

}

point::initialise

opérateur de "résolution de portée"

Il signifie que l'identificateur initialiseconcerné est celui défini dans point. En l'absence de ce "préfixe" (point::), nous définirions effectivement une fonction nommée initialise(), mais celle-ci ne serait plus associée à point ; il s'agirait d'une fonction "ordinaire" nommée initialise, et non plus de la fonction membre initialise de la structure point.


Mohammed benjelloun service d informatique facult polytechnique de mons

void point::affiche ()

{

cout << "Je suis en " << x << " " << y << "\n" ;

}

void main()

{

point a, b ;

// on peut accéder aux "membre " avec.

a.initialise (5, 2) ; a.affiche () ;

a.deplace (-2, 4) ; a.affiche () ;

b.initialise (1,-1) ; b.affiche () ;

}

Je suis en 5 2

Je suis en 3 6

Je suis en 1 -1

struct point

{

int x ; int y ;

void initialise (int, int) ;

void deplace (int, int) ;

void affiche () ;

} ;


Mohammed benjelloun service d informatique facult polytechnique de mons

struct Personne {

int id;

string nom;

void saisie();

void affiche();

};

TP1

Tableaux et structures

struct point

{

int x ;

int y ;

void initialise (int, int) ;

void deplace (int, int) ;

void affiche () ;

} ;

struct point Segm[7];

// Segm[3].yest le champ yde la 4è position : 4

Avantages: Facilité de création et de manipulation (accès à un élément, …)

Inconvénients : place mémoire, difficilement extensible, insertion n’est

possible que par décalage de tous les éléments suivants.

struct point Segm[7];ou

struct Date *Segm;avec new


Mohammed benjelloun service d informatique facult polytechnique de mons

Objet et classe

Le fondement de la programmation orientée objet (POO) est de pouvoir protéger certaines données d’une structure, d’où la nécessité des classes.

La notion de classe donne en fait la Définition d'un objet.

En C++ la structure est un cas particulier de la classe. Plus précisément, une classe sera une structure dans laquelle seulement certains membres et/ou fonctions membres seront "publics", c'est-à-dire accessibles "de l'extérieur", les autres membres étant dits "privés".


Mohammed benjelloun service d informatique facult polytechnique de mons

Définition d'une classe

La déclaration d'une classe est voisine de celle d'une structure. Il suffit de:

• remplacer le mot clé structpar le mot clé class,

• préciser quels sont les membres publics (fonctions ou données) et les membres privés en utilisant les mots clés public et private.

  • class Client

  • {

  • private:

  • // Données membres

  • string Nom, Prenom;

  • int Solde;

  • public:

    • // Déclaration fonctions membres

    • void Saisir ();

    • void Afficher ();

    • bool Etat_Client();

  • };

Cachées aux

fonctions externes

  • struct Client

  • {

  • // Données membres

  • string Nom, Prenom;

  • int Solde;

  • // Déclaration fonctions membres

    • void Saisir ();

    • void Afficher ();

    • bool Etat_Client();

  • };

Accessibles depuis

l'extérieur de la classe


Mohammed benjelloun service d informatique facult polytechnique de mons

private:

// Données membres

string Nom, Prenom;

int Solde;

Classe avec :

  • struct Patient

  • { string Nom, Prenom;

  • string maladies;

    • void Saisir ();

    • void Afficher ();

    • bool Etat_Patient();

  • };

  • struct Client

  • { string Nom, Prenom;

  • int Solde;

    • void Saisir ();

    • void Afficher ();

    • bool Etat_Client();

  • };

Encapsulation des données

Les divers champs d'une structure sont accessibles en n'importe quel endroit du programme. Une opération telle que celle-ci est donc faisable :

clientele[0].Solde = 25000;

Le solde d'un client peut donc être modifié sans passer par une méthode dont ce serait le but.


Mohammed benjelloun service d informatique facult polytechnique de mons

Encapsulation

(masquage des données)

L'encapsulation est un mécanisme consistant à rassembler les données et les méthodes au sein d'une structure en cachant l'implémentation de l'objet. Cacher l'information contenue dans un objet et de ne proposer que des méthodes de manipulation de cet objet.

Ainsi les propriétés contenues dans l'objet seront assurés/validés par les méthodes de l'objet et ne seront plus de la responsabilité de l'utilisateur extérieur.

L'utilisateur extérieur ne pourra pas modifier directement l'information et risquer de mettre en péril les propriétés comportementales de l'objet.

L'encapsulation permet donc de garantir l'intégrité des données contenues dans l'objet.


Mohammed benjelloun service d informatique facult polytechnique de mons

Que signifient public, private et protected ?

Un membre déclaré public dans une classe peut être accédé par toutes les autres classes et fonctions.

Un membre déclaré private dans une classe ne peut être accédé que par les autres membres de cette même classe.

Un membre déclaré protected dans une classe ne peut être accédé que par les autres membres de cette même classe ainsi que par les membres des classes dérivées.


Mohammed benjelloun service d informatique facult polytechnique de mons

class point

{

private : // déclaration des membres privés

int x ;

int y ;

public : // déclaration des membres publics

void initialise (int, int) ;

void deplace (int, int) ;

void affiche () ;

} ;

class point

{

int x ;

int y ;

public :

void initialise (int, int) ;

void deplace (int, int) ;

void affiche () ;

} ;

Un membre public d'une classe peut être accédé partout où il est visible ; un membre privé ne peut être accédé que depuis une fonction membre de la classe .

void point::initialise (int abs, int ord)

{

x = abs ; y = ord ;

}


Mohammed benjelloun service d informatique facult polytechnique de mons

Un objet

Un objet est donc une instanciation d’une classe.

Cet objet possède tous les attributs et toutes les fonctions membres de la classe, mais avec des valeurs d’attributs propres à l’objet.

class Liste

{

public:

int i;

string nom;

Liste *Suiv;

void AffListe(void);

};

// pointeur sur le premier élément de la liste

Liste *debut=NULL;

void main()

{ point a, b ;


Mohammed benjelloun service d informatique facult polytechnique de mons

void main()

{ point a, b ; // 2 objets de type point

// on peut accéder aux "membre public" avec.

a.initialise (5, 2) ; a.affiche () ;

a.deplace (-2, 4) ; a.affiche () ;

b.initialise (1,-1) ; b.affiche () ;

}

Je suis en 5 2

Je suis en 3 6

Je suis en 1 -1


Mohammed benjelloun service d informatique facult polytechnique de mons

Les mots clés public et private peuvent apparaître à plusieurs reprises dans la définition d'une classe, comme dans cet exemple :

class X

{ private :

...

public :

...

private :

...

} ;

Si l'on rend publics tous les membres d'une classe, on obtient l'équivalent d'une structure. Ainsi, ces deux déclarations définissent le même type point :

struct pointclass point

{ int x ; { public :

int y ; int x ;

void initialise (...) ; int y ;

..... void initialise (...) ;

} ; .. ..

} ;


Mohammed benjelloun service d informatique facult polytechnique de mons

private??

public??

class vecteur {

//définition des attributs, objets

float x,y,z;

//déclaration des méthodes

void saisir(void);

void afficher(void);

float norme(void);

};

void vecteur::afficher(void) {

cout<<"["<<x<<","<<y<<","<<z<<"]";

}

void vecteur::saisir(void) {

cout<<"x?"; cin>>x;

cout<<"y?"; cin>>y;

cout<<"z?"; cin>>z;

}

float vecteur::norme(void) {

float r;

r=sqrt(x*x+y*y+z*z);

return r;

}


Mohammed benjelloun service d informatique facult polytechnique de mons

class point

{

int x ;

int y ;

public :

void initialise (int, int) ;

void deplace (int, int) ;

void affiche () ;

} ;

void point::initialise (int abs, int ord)

{

x = abs ; y = ord ;

}

class point

{

int x ;

int y ;

public :

void initialise (int abs, int ord){

x = abs ; y = ord ;

}

void deplace (int, int) ;

void affiche () ;

} ;

meilleure lisibilité du programme.


Mohammed benjelloun service d informatique facult polytechnique de mons

#include <iostream>

using namespace std;

class CRec

{

public:

int Long;

int Larg;

int CalcSurf() { return (Long*Larg); }

};

void main()

{

CRec Rc1, Rc2;

int Surface = 0;

Rc1.Long = 30;

Rc1.Larg = 24;

Rc2.Long = Rc1.Long/2;

Rc2.Larg = Rc1.Larg*2;

Surface = Rc1.CalcSurf();

cout << endl

<< "Surface rectangle 1 = " << Surface;

cout << endl

<< " Surface rectangle 2 = "

<< Rc2.CalcSurf();

}

#include <iostream>

using namespace std;

class CRec

{

public:

int Long;

int Larg;

};

void main()

{

CRec Rc1, Rc2;

int Surface = 0;

Rc1.Long = 30;

Rc1.Larg = 24;

Rc2.Long = Rc1.Long/2;

Rc2.Larg = Rc1.Larg*2;

Surface = Rc1.Long * Rc1.Larg;

cout << endl

<< "Surface rectangle 1 = " << Surface;

cout << endl

<< " Surface rectangle 2 = "

<< Rc2.Long * Rc2.Larg;

}


Mohammed benjelloun service d informatique facult polytechnique de mons

Constructeur et destructeur

Un constructeur est une fonction membre d’initialisation (définie comme les autres fonctions membres) qui sera exécutée automatiquement à chaque création d'un objet.

Le constructeur :

porte le nom de sa classe,

définit l'initialisation d'une instance,

appelé implicitement à toute création d'instance,

ne peut retourner aucune valeur, (fonction membre non typée même pas void ),

peut admettre des arguments qui sont en fait les valeurs d’initialisation

des différents champs de la variable.

class point

{ /* déclaration des membres privés */

int x, y ;

public : // déclaration des membres publics

point (int, int) ; // constructeur

point (float, float) ; // constructeur

point () ; // constructeur

} ;

Il peut y avoir autant de constructeurs que l’on veut (tant qu’ils diffèrent par leur nombre et types d’arguments), ce qui est très intéressant pour initialiser les variables avec différents types; mais il n’y a qu’un seul destructeur par classe !


Mohammed benjelloun service d informatique facult polytechnique de mons

De même,

le destructeur est une fonction membre appelée automatiquement au moment de la destruction de l'objet, il :

porte le nom de sa classe précédé d'un tilde (~),

n'a pas de type de retour (même pas void),

définit la "désinitialisation" d'une instance,

appelé implicitement à toute disparition d'instance,

fonction membre non typée et sans paramètre.

mais il n’y a qu’un seul destructeur par classe !

point ::point () {

cout << "In constructeur \n" ;

x=0; y = 0;

}

class point

{ /* déclaration des membres privés */

int x, y ;

public : // déclaration des membres publics

point () ;// constructeur

~point (); //prototype du destructeur

} ;

point ::~point () {

cout << "In destructeur \n" ;

x=0; y = 0;

}


Mohammed benjelloun service d informatique facult polytechnique de mons

Constructeurs par défaut

Par définition, le constructeur par défaut est : A::A(); // Avec aucun paramètre !

Rôle : il crée une instance non initialisée quand aucun autre constructeur fourni n’est applicable.

class Liste

{

public:

int i;

Liste *Suiv;

void AffListe(void);

};

// pointeur sur le premier élément de la liste

Liste *debut=NULL;

Liste::Liste () // Constructeur par défaut

{

Tete = new noeud ;

}

Liste::~Liste () // Destructeur

{

while ( Tete != NULL )

{

Courant = Tete ;

Tete = Tete->Suiv ;

delete Courant ;

}

}

Point::Point()

{

X = 0;

Y = 0;

}


Mohammed benjelloun service d informatique facult polytechnique de mons

  • class Pile {

  • private:

  • noeud * Deb; // sommet de la pile

  • int size; // nombre d’élément dans la pile

  • public:

  • Pile () // constructeur

  • {

  • Deb = NULL;

  • size = 0;

  • }

  • ~Pile() { clear(); } // Destructeur

    • void clear() {

    • while (Deb != NULL) {

    • noeud * temp = Deb;

    • Deb = Deb->suiv;

    • delete temp;

    • }

    • size = 0;

    • }

  • };


Mohammed benjelloun service d informatique facult polytechnique de mons

CLAS :: CLAS () {

cout << "Creation Objet \n" ;

}

CLAS :: ~CLAS () {

cout << "Destruction Objet \n" ;

}

Comment concevoir le type de classe CLAS de façon que ce programme :

void main() {

CLAS x;

cout << " Salut \n" ;

}

Fournisse les résultats suivants :

Creation Objet

Salut

Destruction Objet.


Mohammed benjelloun service d informatique facult polytechnique de mons

Constructeurs par paramètres

class CRec

{

public:

int Long;

int Larg;

CRec( int Lo, int La){

Long = Lo;

Larg = La;

}

};

class noeud

{

public :

string nom ;

noeud * Suiv ;

noeud ( string info, noeud * suiv ) {

nom = info ;

Suiv = suiv ;

}

~noeud () {

}

};

Tab:: Tab ( int taille ) // Constructeur

{

TabElement = new TElement [taille] ;

}

Tab ::~ Tab () // Destructeur

{

delete [] TabElement ;

}


Mohammed benjelloun service d informatique facult polytechnique de mons

Ex2

class point

{ /* déclaration des membres privés */

int x, y ;

public : // déclaration des membres publics

point (int, int) ;// constructeur

~point (); //prototype du destructeur

} ;

Ex1

class point

{ /* déclaration des membres privés */

int x, y ;

public : // déclaration des membres publics

point () ;// constructeur

~point (); //prototype du destructeur

} ;

La déclaration suivante convient-elle

toujours ?

point a ;

à partir du moment où un constructeur est défini, il doit pouvoir être appelé (automatiquement) lors de la création de l'objet a. Ici (Ex2), le constructeur a besoin de deux arguments.

Ceux-ci doivent obligatoirement être fournis dans notre déclaration, par exemple :

point a(2,5) ;


Mohammed benjelloun service d informatique facult polytechnique de mons

class x {

int i,j ;

public:

x(int , int ) ;

} ;

x::x(int ii,int jj) {...}

void main(void) {

x vx1(2,3) ; // ok

x vx1= x(3,5) ; // ok

x vx ; // déclenche une erreur de compilation.

...

Le programme ci-dessus déclenche une erreur car à la déclaration de la variable vx, le compilateur recherche une fonction sans paramètres.


Mohammed benjelloun service d informatique facult polytechnique de mons

#include <iostream>

using namespace std;

class CRec

{

public:

int Long, Larg;

CRec (int Lo, int La){

cout << “In Constructeur Param“<< endl ;

Long = Lo;

Larg = La;

}

CRec (){

cout << “In Constructeur 0“<< endl ;

}

int CalcSurf() { return (Long*Larg); }

};

Initialisation et affectation

void main()

{

CRec Rc1(10,20), Rc2, Rc3;

int Surface = 0;

Surface = Rc1.CalcSurf();

cout << endl

<< "Surface rectangle 1 = " << Surface;

cout << endl

<< " Surface rectangle 2 = "

<< Rc2.CalcSurf();

Rc3.Long = 30;

Rc3.Larg = 24;

cout << endl

<< " Surface rectangle 3 = "

<< Rc3.CalcSurf();

}

In Constructeur Param

In Constructeur 0

In Constructeur 0

Surface rectangle 1 = 200

Surface rectangle 2 = 687194768

Surface rectangle 3 = 720


Mohammed benjelloun service d informatique facult polytechnique de mons

private:

Erreur

error C2248: 'Long' : cannot access private member declared in class 'CRec'

Initialisation et affectation

#include <iostream>

using namespace std;

class CRec

{

int Long, Larg;

public:

CRec (int Lo, int La){

cout << “In Constructeur Param“<< endl ;

Long = Lo;

Larg = La;

}

CRec (){

cout << “In Constructeur 0“<< endl ;

}

int CalcSurf() { return (Long*Larg); }

};

void main()

{

CRec Rc1(10,20), Rc2, Rc3;

int Surface = 0;

Surface = Rc1.CalcSurf();

cout << endl

<< "Surface rectangle 1 = " << Surface;

cout << endl

<< " Surface rectangle 2 = "

<< Rc2.CalcSurf();

Rc3.Long = 30;

Rc3.Larg = 24;

cout << endl

<< " Surface rectangle 2 = "

<< Rc3.CalcSurf();

}


Mohammed benjelloun service d informatique facult polytechnique de mons

Initialisation, affectation d’un objet par un autre de la même classe

Pas de constructeur

#include <iostream>

using namespace std;

class CRec

{ int Long, Larg;

public:

CRec (int Lo, int La){

cout << “In Constructeur Param“<< endl ;

Long = Lo;

Larg = La;

}

CRec (){

cout << “In Constructeur 0“<< endl ;

}

int CalcSurf() { return (Long*Larg); }

};

void main()

{

CRec Rc1(10,20), Rc2;

int Surface = 0;

Rc2 = Rc1;

Surface = Rc1.CalcSurf();

cout << "\n Surface rectangle 1 = " << Surface;

cout << "\n Surface rectangle 2 = " << Rc2.CalcSurf();

Rc1=CRec(5,15);

cout << "\n Surface rectangle 1 = " << Rc1.CalcSurf();

CRec Rc3=Rc1; // initialisation

CRec Rc4(Rc1); // idem (syntaxe équivalente)

cout << "\n Surface rectangle 3 = " << Rc3.CalcSurf();

cout << "\n Surface rectangle 4 = " << Rc4.CalcSurf();

}

In Constructeur Param

In Constructeur 0

Surface rectangle 1 = 200

Surface rectangle 2 = 200 In Constructeur Param

Surface rectangle 1 = 75

Surface rectangle 3 = 75

Surface rectangle 4 = 75


Mohammed benjelloun service d informatique facult polytechnique de mons

constructeur I (0, 1 ou 2 arguments)

CRec X; // OK

CRec Y(1); // OK

CRec Z(1,2); // OK

Constructeurs par défaut et par paramètres

Un constructeur par défaut et par paramètres :

Constructeur possédant des paramètres avec des valeurs de défaut.

class CRec

{

int Long;

int Larg;

public:

CRec( int Lo=0, int La=0){

Long = Lo;

Larg = La;

}

};

ICI GP2


Mohammed benjelloun service d informatique facult polytechnique de mons

?

#include <iostream>

using namespace std ;

class point

{ int x, y ;

public :

point (int abs, int ord) // constructeur ("inline") avec param

{ x = abs ; y = ord ;

cout << "++ Construction d'un point : " << x << " " << y << "\n" ;

}

~point () // destructeur ("inline")

{ cout << "-- Destruction du point : " << x << " " << y << "\n" ;

}

} ;

point a(1,1) ; // instanciation d’un objet de classe point

void main()

{

cout << "****** Debut main *****\n" ;

point b(10,10) ; // un objet automatique de classe point

point c(3,3) ;

int i ;

for (i=1 ; i<=3 ; i++)

{ cout << "** Boucle tour numero " << i << "\n" ;

point b(i,2*i) ; // objets créés dans un bloc

}

cout << "****** Fin main ******\n" ;

}

++ Construction d'un point : 1 1

****** Debut main *****

++ Construction d'un point : 10 10

++ Construction d'un point : 3 3

** Boucle tour numero 1

++ Construction d'un point : 1 2

-- Destruction du point : 1 2

** Boucle tour numero 2

++ Construction d'un point : 2 4

-- Destruction du point : 2 4

** Boucle tour numero 3

++ Construction d'un point : 3 6

-- Destruction du point : 3 6

****** Fin main ******

-- Destruction du point : 3 3

-- Destruction du point : 10 10


Mohammed benjelloun service d informatique facult polytechnique de mons

?

void main()

{

cout << "****** Debut main *****\n" ;

point b(10,10) ;

point c(3,3) ;

int i ;

for (i=1 ; i<=3 ; i++)

{ cout << "** Boucle tour numero " << i << "\n" ;

point b(i,2*i) ; // objets créés dans un bloc

}

cout << "****** Fin main ******\n" ;

}

void main()

{

cout << "****** Debut main *****\n" ;

point b(10,10) ;

point c(3,3) ;

cout << "** Boucle tour numero " << 1 << "\n" ;

point b(1,2) ; // objets créés dans un bloc

cout << "** Boucle tour numero " << 2 << "\n" ;

point b(2,4) ; // objets créés dans un bloc

cout << "** Boucle tour numero " << 3 << "\n" ;

point b(3,6) ; // objets créés dans un bloc

cout << "****** Fin main ******\n" ;

}


Mohammed benjelloun service d informatique facult polytechnique de mons

void main()

{

test a(1) ;

fct(1) ;

fct(2) ;

}

Sans Prob

Param local dans une fonction

#include <iostream>

using namespace std ;

class test

{

public :

int num ;

test (int) ; // déclaration constructeur

~test () ; // déclaration destructeur

} ;

test::test (int n) // définition constructeur

{ num = n ;

cout << "++ Appel constructeur - num = " << num << "\n" ;

}

test::~test () // définition destructeur

{ cout << "-- Appel destructeur - num = " << num << "\n" ;

}

void fct (int p)

{ test x(3*p) ; // notez l'expression (non constante) : 3*p

}

++ Appel constructeur - num = 1

++ Appel constructeur - num = 3

-- Appel destructeur - num = 3

++ Appel constructeur - num = 6

-- Appel destructeur - num = 6

-- Appel destructeur - num = 1

void main()

{

test a(1) ;

for (int i=1 ; i<=2 ; i++)

fct(i) ;

}


Mohammed benjelloun service d informatique facult polytechnique de mons

#include <iostream>

using namespace std ;

class point

{ int x, y ;

public :

point (int abs, int ord) // constructeur ("inline")

{ x = abs ; y = ord ;

cout << "++ Constr. point " << x << " " << y << "\n" ;

}

~point () // destructeur ("inline")

{ cout << "-- Destr. point " << x << " " << y << "\n" ;

}

} ;

void main()

{

point a(0,0) ; // un objet automatique de classe point

a = point (1, 2) ; // un objet temporaire

a = point (3, 5) ; // un autre objet temporaire

cout << "****** Fin main ******\n" ;

}

Objet temporaire, affectation

++ Constr. point 0 0

++ Constr. point 1 2

-- Destr. point 1 2

++ Constr. point 3 5

-- Destr. point 3 5

****** Fin main ******

-- Destr. point 3 5


Mohammed benjelloun service d informatique facult polytechnique de mons

Création d’un objet de type point,

par appel d’un constructeur à 2 arguments.

(*C).affiche(); ou

Caffiche();

delete C;

Objet dynamique

void main()

{ point a, b ; // 2 objets de type point

// point * C;

// C = new point(5,2);

// on peut accéder aux "membre public" avec.

a.initialise (5, 2) ; a.affiche () ;

a.deplace (-2, 4) ; a.affiche () ;

b.initialise (1,-1) ; b.affiche () ;

}

Je suis en 5 2

Je suis en 3 6

Je suis en 1 -1


Mohammed benjelloun service d informatique facult polytechnique de mons

#include <iostream>

using namespace std ;

class point { int x, y ;

public :

point (int abs, int ord) // constructeur

{ x=abs ; y=ord ;

cout << "++ Appel Constructeur \n" ;

}

~point () // destructeur (en fait, inutile ici)

{ cout << "-- Appel Destructeur \n" ;

}

} ;

void fct (point *) ; // prototype fonction fct

void main()

{ point * adr ;

cout << "** Debut main \n" ;

adr = new point (3,7) ; // création dynamique d'un objet

fct (adr) ;

cout << "** Fin main \n" ;

}

void fct (point * adp)

{ cout << "** Debut fct \n" ;

delete adp ; // destruction de cet objet

cout << "** Fin fct \n" ;

}

Objet dynamique

** Debut main

++ Appel Constructeur

** Debut fct

-- Appel Destructeur

** Fin fct

** Fin main


Mohammed benjelloun service d informatique facult polytechnique de mons

Un constructeur qui sert à créer un objet identique à l’objet reçu en paramètre.

Quels sont les résultats fournis par l’exécution de ce programme?

#include <iostream>

using namespace std ;

class demo

{ int x, y ;

public :

demo (int abs=1, int ord=0) // constructeur I (0, 1 ou 2 arguments)

{ x = abs ; y = ord ;

cout << "constructeur I : " << x << " " << y << "\n" ;

}

demo (demo &) ; // constructeur II (par recopie)

~demo () ; // destructeur

} ;

demo::demo (demo & d) // ou demo::demo (const demo & d)

{ cout << "constructeur II (recopie) : " << d.x << " " << d.y << "\n" ;

x = d.x ; y = d.y ;

}

demo::~demo ()

{ cout << "destruction : " << x << " " << y << "\n" ;

}

void fct (demo d, demo * add)

{ cout << "entrée fct\n" ;

delete add ;

cout << "sortie fct\n" ;

}

void main ()

{

cout << "début main\n" ;

demo a ;

demo b = 2 ;

demo c = a ;

demo * adr = new demo (3,3) ;

fct (a, adr) ;

demo d = demo (4,4) ;

c = demo (5,5) ;

cout << "fin main\n" ;

}


Mohammed benjelloun service d informatique facult polytechnique de mons

#include <iostream>

using namespace std ;

class demo

{ int x, y ;

public :

demo (int abs=1, int ord=0) // constructeur I (0, 1 ou 2 arguments)

{ x = abs ; y = ord ;

cout << "constructeur I : " << x << " " << y << "\n" ;

}

demo (demo &) ; // constructeur II (par recopie)

~demo () ; // destructeur

} ;

demo::demo (demo & d) // ou demo::demo (const demo & d)

{ cout << "constructeur II (recopie) : " << d.x << " " << d.y << "\n" ;

x = d.x ; y = d.y ;

}

demo::~demo ()

{ cout << "destruction : " << x << " " << y << "\n" ;

}

debut main

constructeur I : 1 0

constructeur I : 2 0

constructeur II (recopie) : 1 0

constructeur I : 3 3

constructeur II (recopie) : 1 0

entree fct

destruction : 3 3

sortie fct

destruction : 1 0

constructeur I : 4 4

constructeur I : 5 5

destruction : 5 5

fin main

destruction : 4 4

destruction : 5 5

destruction : 2 0

destruction : 1 0

void main ()

{ cout << "debut main\n" ;

demo a ;

demo b = 2 ;

demo c = a ;

demo * adr = new demo (3,3) ;

fct (a, adr) ;

demo d = demo (4,4) ;

c = demo (5,5) ;

cout << "fin main\n" ;

}

void fct (demo d, demo * add)

{ cout << "entree fct\n" ;

delete add ;

cout << "sortie fct\n" ;

}


Mohammed benjelloun service d informatique facult polytechnique de mons

Synthèse

class MyClass {

public:

MyClass(char* name, int id);

void fct1(int i); // valeur

void fct2(int& i); // reference

void fct3(const string& s); // const reference

....

};

Passage par valeur

l'argument est recopié dans le paramètre

=> l'argument n'est jamais modifié

Passage par référence

l'argument et le paramètre référencent la même entité

=> l'argument peut être modifié

Passage par const référence

l'argument et le paramètre référencent la même entité

mais le paramètre ne peut pas être modifié

=> l'argument n'est jamais modifié


Mohammed benjelloun service d informatique facult polytechnique de mons

#include <iostream>

using namespace std ;

class point

{ int x, y ;

public :

point () ; // constructeur 1 (sans arguments)

point (int) ; // constructeur 2 (un argument)

point (int, int) ; // constructeur 3 (deux arguments)

void affiche () ; // fonction affiche 1 (sans arguments)

void affiche (char []) ; // fonction affiche 2 (un argument chaîne)

} ;

point::point () // constructeur 1

{ x = 0 ; y = 0 ;

}

point::point (int abs) // constructeur 2

{ x = y = abs ;

}

point::point (int abs, int ord) // constructeur 3

{ x = abs ; y = ord ;

}

void point::affiche () // fonction affiche 1

{ cout << "Je suis en : " << x << " " << y << "\n" ;

}

void point::affiche (char message[]) // fonction affiche 2

{ cout << message ;

affiche () ;

}

Une fonction membre peut

appeler une autre.

Je suis en : 0 0

Point b - Je suis en : 5 5

Hello ---- Je suis en : 3 12

void main()

{

point a ; // appel constructeur 1

a.affiche () ; // appel fonction affiche 1

point b (5) ; // appel constructeur 2

b.affiche ("Point b - ") ; // appel fonction affiche 2

point c (3, 12) ; // appel constructeur 3

c.affiche ("Hello ---- ") ; // appel fonction affiche 2

}


Mohammed benjelloun service d informatique facult polytechnique de mons

Un constructeur de valeurs aléatoires

Le rôle du constructeur ne se limite pas toujours à une initialisation de l'objet. Le travail réalisé par le constructeur peut être beaucoup plus élaboré.

Voici un programme exploitant une classe nommée hasard, dans laquelle le constructeur fabrique dix valeurs entières aléatoires qu'il range dans le membre donnée val (ces valeurs sont comprises entre zéro et la valeur qui lui est fournie en argument) :

#include <iostream>

#include <cstdlib> // pour la fonction rand

using namespace std ;

class hasard

{ int val[10] ;

public :

hasard (int) ;

void affiche () ;

} ;

hasard::hasard (int max) // constructeur : il tire 10 valeurs au hasard

// rappel : rand fournit un entier entre 0 et RAND_MAX

{ int i ;

for (i=0 ; i<10 ; i++) val[i] = double (rand()) / RAND_MAX * max ;

}

void hasard::affiche () // pour afficher les 10 valeurs

{ int i ;

for (i=0 ; i<10 ; i++) cout << val[i] << " " ;

cout << "\n" ;

}

void main()

{ hasard suite1 (5) ;

suite1.affiche () ;

hasard suite2 (12) ;

suite2.affiche () ;

}

0 2 0 4 2 2 1 4 4 3

2 10 8 6 3 0 1 4 1 1


Mohammed benjelloun service d informatique facult polytechnique de mons

#include <iostream>

#include <cstdlib> // pour la fonction rand

using namespace std ;

class hasard

{

int nbval ; // nombre de valeurs

int * val ; // pointeur sur les valeurs

public :

hasard (int, int) ; // constructeur

~hasard () ; // destructeur

void affiche () ;

} ;

hasard::hasard (int nb, int max)

{ int i ;

val = new int [nbval = nb] ;

for (i=0 ; i<nb ; i++) val[i] = double (rand()) / RAND_MAX * max ;

}

hasard::~hasard ()

{ delete val ;

}

void hasard::affiche () // pour afficher les nbavl valeurs

{ int i ;

for (i=0 ; i<nbval ; i++) cout << val[i] << " " ;

cout << "\n" ;

}

void main()

{

hasard suite1 (10, 5) ; // 10 valeurs entre 0 et 5

suite1.affiche () ;

hasard suite2 (6, 12) ; // 6 valeurs entre 0 et 12

suite2.affiche () ;

}

0 2 0 4 2 2 1 4 4 3

2 10 8 6 3 0

Dans le constructeur, l'instruction :

val = new [nbval = nb] ;

joue le même rôle que :

nbval = nb ;

val = new [nbval] ;


Mohammed benjelloun service d informatique facult polytechnique de mons

Le pointeur spécial d’instance : this

  • Le mot this est un mot réservé contenant l’adresse de l’objet courant.

  • Ce pointeur sert, entre autres, à retourner une référence à cet objet pour les appels en cascade.

Dans certaines conditions particulières, il est nécessaire de disposer d’un moyen de désigner depuis une fonction membre, non pas les données membres, mais l’instance elle-même de la classe sur laquelle la méthode membre est appelée.

Le mot clé « this » permet de désigner l’adresse de l’instance sur laquelle la fonction membre a été appelée (utile pour liste chaînées) .


Mohammed benjelloun service d informatique facult polytechnique de mons

#include <iostream>

using namespace std ;

class point

{

int x, y ;

public :

point (int abs, int ord) // constructeur ("inline")

{ x = abs ; y = ord ;

cout << "++ Constr. point " << x << " " << y

<< " a l'adresse : " << this << "\n" ;

}

~point () // destructeur ("inline")

{ cout << "-- Destr. point " << x << " " << y

<< " a l'adresse : " << this << "\n" ;

}

} ;

void main()

{

point a(0,0) ; // un objet automatique de classe point

a = point (1, 2) ; // un objet temporaire

a = point (3, 5) ; // un autre objet temporaire

cout << "****** Fin main ******\n" ;

}

0bjet temporaire + this

++ Constr. point 0 0 a l'adresse : 0012FF6C

++ Constr. point 1 2 a l'adresse : 0012FF64

-- Destr. point 1 2 a l'adresse : 0012FF64

++ Constr. point 3 5 a l'adresse : 0012FF5C

-- Destr. point 3 5 a l'adresse : 0012FF5C

****** Fin main ******

-- Destr. point 3 5 a l'adresse : 0012FF6C


Mohammed benjelloun service d informatique facult polytechnique de mons

#include <iostream>

using namespace std ;

class point {

int x, y ;

public :

point (int abs=0, int ord=0) // Un constructeur ("inline")

{ x=abs; y=ord ; }

void affiche () ; // Une fonction affiche

} ;

void point::affiche ()

{ cout << "Adresse : " << this << " - Coordonnees " << x << " " << y << "\n" ;

}

main() // Un petit programme d'essai

{ point a(5), b(3,15) ;

a.affiche ();

b.affiche ();

}

Adresse : 006AFDF0 – Coordonnees 5 0

Adresse : 006AFDE8 – Coordonnees 3 15


Mohammed benjelloun service d informatique facult polytechnique de mons

delete [] Dcourbe;

Les tableaux d’objets

class point

{ /* déclaration des membres privés */

int x, y ;

public : // déclaration des membres publics

point () ;// constructeur

~point (); //prototype du destructeur

} ;

Tableau courbe de 10 objets de type point

point courbe[10], *Dcourbe;

Dcourbe = new point[30];

Allocation mémoire pour 30 objets de type point


Mohammed benjelloun service d informatique facult polytechnique de mons

Ex2

class point

{ /* déclaration des membres privés */

int x, y ;

public : // déclaration des membres publics

point (int, int) ;// constructeur

~point (); //prototype du destructeur

} ;

Erreur de compilation

Une des solutions : ??????

point Tab[] = { point(1,1) , point(4,5), point (7,8) } ;

La déclaration de ce tableau convient-elle ?

point Tab[3] ;


Mohammed benjelloun service d informatique facult polytechnique de mons

#include <iostream>

using namespace std ;

class point

{

int x, y ;

public :

point (int abs=0, int ord=0)

{ x=abs ; y =ord ;

cout << "++ Constr. point : " << x << " " << y << "\n" ;

}

~point ()

{ cout << "-- Destr. point : " << x << " " << y << "\n" ;

}

} ;

void main()

{ int n = 3 ;

point courbe[5] = { 7, n, 2*n+5, point(1,2) } ;

cout << "*** fin programme ***\n" ;

}

++ Constr. point : 7 0

++ Constr. point : 3 0

++ Constr. point : 11 0

++ Constr. point : 1 2

++ Constr. point : 0 0

*** fin programme ***

-- Destr. point : 0 0

-- Destr. point : 1 2

-- Destr. point : 11 0

-- Destr. point : 3 0

-- Destr. point : 7 0


Mohammed benjelloun service d informatique facult polytechnique de mons

patron de fonctions

#include <iostream>

using namespace std ;

// création d'un patron de fonctions

template <class T> T min (T a, T b)

{ if (a < b) return a ; // ou return a < b ? a : b ;

else return b ;

}

void main()

{

int n=4, p=12 ;

float x=2.5, y=3.25 ;

char a='A', b='B';

cout << "min (n, p) = " << min (n, p) << "\n" ; // int min(int, int)

cout << "min (x, y) = " << min (x, y) << "\n" ; // float min (float, float)

cout << "min (a, b) = " << min (a, b) << "\n" ; // char min (char, char)

}

min (n, p) = 4

min (x, y) = 2.5

min (a, b) = A


Mohammed benjelloun service d informatique facult polytechnique de mons

    template<class T>    void swap(T& x, T& y)    {      T tmp = x;      x = y;      y = tmp;    }

    void main()    {      int    i,j; /*...*/  swap(i,j);  // Instancie swap pour int      float  a,b;  /*...*/  swap(a,b);  // Instancie swap pour float      char   c,d;  /*...*/  swap(c,d);  // Instancie swap pour char      string s,t;  /*...*/  swap(s,t);  // Instancie swap pour String    }


Mohammed benjelloun service d informatique facult polytechnique de mons

#include <iostream>

#include <string>

using namespace std ;

// création d'un patron de classe

template <class T> class point {

T x ; T y ;

public :

point (T abs=0, T ord=0) {

x = abs ; y = ord ;

}

void affiche () ;

} ;

template <class T> void point<T>::affiche () {

cout << "Paire : " << x << " " << y << "\n" ;

}

void main ()

{

point <int> ai (3, 5) ; ai.affiche () ;

point <char> ac ('d', 'y') ; ac.affiche () ;

point <double> ad (3.5, 2.3) ; ad.affiche () ;

point <string> as ("Salut", " A vous") ; as.affiche () ;

}

patron de classe

Paire : 3 5

Paire : d y

Paire : 3.5 2.3

Paire : Salut A vous

T prend la valeur int pour la classe point


Mohammed benjelloun service d informatique facult polytechnique de mons

friend

#include <iostream>

#include <string>

using namespace std ;

class Copain;

class Qui {

string LeNom;

public:

void sonnom(string n) { LeNom=n; }

friend Copain;

// Les fonctions membres de la classe Copain ont ainsi accès

// aux attributs privés de la classe Qui.

};

class Copain {

string nom;

public:

void sonnom(string n) { nom=n; }

void moi() { cout << nom << " "; }

void monami(Qui &q) {

cout << q. LeNom << " "; // accès au membre private de Qui

// si pas de friend Copain; dans Qui

//  cannot access private member declared in class 'Qui'

}

};

Classe amie

void main() {

Qui QQui;

Copain Cop;

QQui.sonnom("Laurel");

Cop.sonnom("Hardy");

Cop.moi();

cout << "est l'ami de ";

Cop.monami(QQui);

cout << endl;

}

Hardy est l'ami de Laurel


Mohammed benjelloun service d informatique facult polytechnique de mons

La réutilisation

L’héritage

L'héritage est un principe propre à la programmation orientée objet, permettant de créer une nouvelle classe à partir d'une classe existante.

Permet l’extension d'une classe de base afin de lui ajouter des fonctionnalités particulières tout en conservant les fonctionnalités déjà définies dans la classe de base.

Un omnivore est un animal mais pas forcement l’inverse

Il est possible de représenter sous forme de hiérarchie de classes, parfois appelée arborescence de classes, la relation de parenté qui existe entre les différentes classes. L'arborescence commence par une classe générale appelée superclasse (parfois classe de base, classe parent, classe mère ou père). Puis les classes dérivées (classe fille ou sous-classe) deviennent de plus en plus spécialisées. Ainsi, on peut généralement exprimer la relation qui lie une classe fille à sa mère par la phrase "est un" .


Mohammed benjelloun service d informatique facult polytechnique de mons

En C++, il existe l’héritage simple, et l’héritage multiple. Dans ce cours, nous ne nous intéresserons qu’à l’héritage simple.

Dans la définition de la classe dérivée, afin d’utiliser l’héritage, on ajoute le symbole : après le nom de la classe en précisant par la suite quelle est la classe de base.

Ex:class ClasseDerivee:public ClasseBase{...}

Principe de l’héritage

  • Les classes dérivées sont un mécanisme simple pour définir une nouvelle classe en ajoutant des facilités à une classe existante sans reprogrammer ou recompiler la classe de base.

  • On peut ainsi utiliser l’héritage pour les besoins de généralisation, de réutilisation.

  • La classe dérivée hérite des attributs et des fonctions de la classe de base.

  • La classe dérivée est plus spécifique que la classe en ajoutant des attributs et des fonctions membres.


Mohammed benjelloun service d informatique facult polytechnique de mons

Comment exprime t-on l'héritage en C++?

class Personne {

public:

Personne(string nom){…}

};

class Travailleur : public Personne {

public: …

};

class Employeur : public Personne {

...

};

class Enfant : public Personne {

};

..

  • class Vehicule {    …

  •     };

  • class voiture : public Vehicule {    public:// ...    };

  • On mentionne cette relation de plusieurs manières:

  • voiture est  une sorte de Vehicule

  • voiture est "dérivée de" Vehicule

  • voiture est un Vehicule spécialisé.

  • voiture est une "sous-classe" de Vehicule

  • Vehicule est une "classe de base" de voiture

  • Vehicule est la "superclasse" de voiture


Mohammed benjelloun service d informatique facult polytechnique de mons

Mode de dérivation

class ClasseDerivee : ModeClasseBase{...}

Lors de la définition de la classe dérivée il est possible de spécifier le mode de dérivation par l'emploi d'un des mots-clé suivants :

public, protected ou private.

Ce mode de dérivation détermine quels membres de la classe de base sont accessibles dans la classe dérivée.

Par défaut, le type d’héritage est privé (par défaut le mot-clé private.)

Les membres privés de la classe de base ne sont jamais accessibles par les membres des classes dérivées.


Mohammed benjelloun service d informatique facult polytechnique de mons

Héritage Public: Les types d’attributs

C'est la forme la plus courante d'héritage

class CptBanque {

int ident; float solde;

public:

CptBanque(int id, float so = 0);

void deposer(float);

void retirer(float);

float getSolde();

};

class CptPlus : public CptBanque {

float prelev;

public:

void prelever();

CptPlus(int id, float pr, float so);

};

La classe CptPlus est un CptBanque avec de nouvelles fonctionnalités (un prélèvement automatique). Elle hérite des champs et méthodes de CptBanque et possède en plus un champ prelev et de la méthode prelever.

Qualifier la classe CptPlus comme héritant public de CptBanque, signifie que tous les champs et méthodes public de la classe CompteBanque (classe de base) sont définis implicitement public dans la classe ComptePrelevementAuto (classe dérivée public).

héritage simple public


Mohammed benjelloun service d informatique facult polytechnique de mons

Héritage Public: Les types d’attributs

C'est la forme la plus courante d'héritage

class ClasseDerivee : public ClasseBase

class Vehicule {

public: void pub1();

protected: void prot1();

private: void priv1();

};

class Voiture : public Vehicule {

public:

int pub2() {

pub1(); // OK

prot1(); // OK

priv1(); // ERREUR

}

};

Voiture X;

X.pub1(); // OK

X.pub2(); // OK

Les attributs private, protected et public de la classe de base restent les mêmes pour la classe dérivée.

protégés (protected), c'est à dire accessibles aux membres de la classe et ses classes dérivées (par héritage);

Le type d’attribut protected est

le plus utilisé lors de l’héritage.


Mohammed benjelloun service d informatique facult polytechnique de mons

Héritage Privé: Les types d’attributs

Il permet de modéliser les relations "Y est composé de un ou plusieurs X" .

Plutôt que d'hériter de façon privée de la classe de base X, on peut faire de la classe de base une donnée membre (composition).

class TXT {

public:

int length();

// ...

};

class Dim : private TXT {

void f1() {

// ...

l = length(); // OK

};

Dim ObjtDim;

cout << ObjtDim.length(); // ERREUR

Tous les attributs de la classe de base deviennent private pour la classe dérivée.


Mohammed benjelloun service d informatique facult polytechnique de mons

Héritage Protégé: Les types d’attributs

Il peut être intéressant d'avoir des données d'une classe qui soient privés en dehors d'utilisation de l'héritage mais publics dans une chaîne d'héritage.  les données protégés (protected).

class TXT {

protected:

int n;

};

class Dim : protectedTXT {

protected:

void f2() { n++; } // OK

};

class Dim_number : public Dim {

protected:

void f3() { n++; } // OK

};

Les attributs public de la classe de base deviennent protégés pour la classe dérivée.


Mohammed benjelloun service d informatique facult polytechnique de mons

REDEFINITION DE METHODES DANS LA CLASSE DERIVEE

Les méthodes (fonctions, …) de la classe de base peuvent être redéfinies dans la classe dérivée (le même nom que dans la classe de base). Elles demeurent accessibles via l'opérateur de résolution de portée ("::").

void Y::f3() {

f1(); // appel de f1 de la classe X

f2(); // appel de f2 de la classe Y

X::f2(); // f2 de la classe X

X::xxx = 5; // accès au membre xxx de la classe X

cout << "\n In F3 xxx =" << xxx;

xxx = 14; // accès au membre xxx de la classe X

cout << "\n In F3 xxx =" << xxx;

}

void main() {

X A;

Y B;

A.f2();

B.f3();

}

#include <iostream>

using namespace std;

class X {

public:

void f1(){ cout << "\n In F1 X"; }

void f2(){ cout << "\n In F2 X"; }

protected:

int xxx;

};

class Y : public X {

public:

void f2() { cout << "\n In F2 Y"; }

void f3();

};

In F2 X

In F1 X

In F2 Y

In F2 X

In F3 xxx =5

In F3 xxx =14


Mohammed benjelloun service d informatique facult polytechnique de mons

#include <iostream>

using namespace std ;

// ------------ Déclaration de la classe point

class point

{ /* déclaration des membres privés */

private :

int x ;

int y ;

/* déclaration des membres publics */

public :

void initialise (int, int) ;

void deplace (int, int) ;

void affiche () ;

} ;

//Définition des fonctions membres de la classe point

void point::initialise (int abs, int ord)

{

x = abs ; y = ord ;

}

void point::deplace (int dx, int dy)

{

x = x + dx ; y = y + dy ;

}

void point::affiche ()

{

cout << "Je suis en " << x << " " << y << "\n" ;

}

/* --- Déclaration et définition de la classe pointcol ----- */

class pointcol : public point// pointcol dérive de point

{ int couleur ;

public :

void colore (int cl) {

couleur = cl;

cout << "\n couleur = " << couleur << "\n" ; }

} ;

void main()

{ pointcol p ;

p.initialise (10,20) ; p.colore (5) ;

p.affiche () ;

p.deplace (2,4) ;

p.affiche () ;

}

couleur = 5

Je suis en 10 20

Je suis en 12 24

Les membres publics de la classe de base (point)

seront des membres publics de la classe dérivée (pointcol).


Mohammed benjelloun service d informatique facult polytechnique de mons

Conversions automatiques : si B hérite de A, alors toutes les instances de B sont aussi des instances de A, et il est donc possible de faire :

A a; B b; a=b;

#include <iostream>

using namespace std ;

class point

{ /* déclaration des membres privés */

private :

int x ;

int y ;

/* déclaration des membres publics */

public :

void initialise (int, int) ;

void deplace (int, int) ;

void affiche () ;

} ;

void point::initialise (int abs, int ord)

{

x = abs ; y = ord ;

}

void point::deplace (int dx, int dy)

{

x = x + dx ; y = y + dy ;

}

void point::affiche ()

{

cout << "Je suis en " << x << " " << y << "\n" ;

}

class pointcol : public point// pointcol dérive de point

{ int couleur ;

public :

void colore (int cl) {

couleur = cl;

cout << "\n couleur = " << couleur << "\n" ; }

} ;

void main()

{ point A;

pointcol B;

A.initialise (5,10); A.affiche () ;

B.initialise (20,30); B.affiche () ;

A=B;

A.affiche () ;

B.affiche () ;

}

Je suis en 5 10

Je suis en 20 30

Je suis en 20 30

Je suis en 20 30


Mohammed benjelloun service d informatique facult polytechnique de mons

Utilisation de pointcol

#include <iostream>

#include "point.h" /* déclaration de la classe point (nécessaire */

/* pour compiler la définition de pointcol) */

using namespace std ;

class pointcol : public point

{ int couleur ;

public :

void colore (int cl)

{ couleur = cl ; }

void affichec () ;

void initialisec (int, int, int) ;

} ;

void pointcol::affichec ()

{ affiche () ;

cout << " et ma couleur est : " << couleur << "\n" ;

}

void pointcol::initialisec (int abs, int ord, int cl)

{ initialise (abs, ord) ;

couleur = cl ;

}

void main()

{

pointcol p ;

p.initialisec (10,20, 5) ; p.affichec () ; p.affiche () ;

p.deplace (2,4) ; p.affichec () ;

p.colore (2) ; p.affichec () ;

}

Je suis en 10 20

et ma couleur est : 5

Je suis en 10 20

Je suis en 12 24

et ma couleur est : 5

Je suis en 12 24

et ma couleur est : 2


Mohammed benjelloun service d informatique facult polytechnique de mons

héritage Constructeurs

#include <iostream>

using namespace std ;

class point

{ int x, y ;

public :

point (int abs=0, int ord=0) // constructeur de point ("inline")

{ cout << "++ constr. point : " << abs << " " << ord << "\n" ;

x = abs ; y =ord ;

}

} ;

class pointcol : public point

{ int couleur ;

public :

pointcol (int, int, int) ; // déclaration constructeur pointcol

} ;

pointcol::pointcol (int abs=0, int ord=0, int cl=1)

{ cout << "++ constr. pointcol : " << abs << " " << ord << " " << cl << "\n" ;

couleur = cl ;

}

void main() {

pointcol a(10,15,3);

}

++ constr. point : 0 0

++ constr. pointcol : 10 15 3


Mohammed benjelloun service d informatique facult polytechnique de mons

héritage Constructeurs

#include <iostream>

using namespace std ;

class point

{ int x, y ;

public :

point (int abs=0, int ord=0) // constructeur de point ("inline")

{ cout << "++ constr. point : " << abs << " " << ord << "\n" ;

x = abs ; y =ord ;

}

} ;

class pointcol : public point

{ int couleur ;

public :

pointcol (int, int, int) ; // déclaration constructeur pointcol

} ;

pointcol::pointcol (int abs=0, int ord=0, int cl=1): point (abs, ord)

{ cout << "++ constr. pointcol : " << abs << " " << ord << " " << cl << "\n" ;

couleur = cl ;

}

void main() {

pointcol a(10,15,3);

}

++ constr. point : 10 15

++ constr. pointcol : 10 15 3


Mohammed benjelloun service d informatique facult polytechnique de mons

héritage Constructeurs et destructeurs

void main()

{ pointcol a(10,15,3) ; // objets

pointcol b (2,3) ; // automatiques

pointcol c (12) ; // .....

pointcol * adr ;

adr = new pointcol (12,25) ; // objet dynamique

delete adr ;

}

#include <iostream>

using namespace std ;

class point

{ int x, y ;

public :

point (int abs=0, int ord=0) // constructeur de point ("inline")

{ cout << "++ constr. point : " << abs << " " << ord << "\n" ;

x = abs ; y =ord ;

}

~point () // destructeur de point ("inline")

{ cout << "-- destr. point : " << x << " " << y << "\n" ;

}

} ;

class pointcol : public point

{ int couleur ;

public :

pointcol (int, int, int) ; // déclaration constructeur pointcol

~pointcol () // destructeur de pointcol ("inline")

{ cout << "-- dest. pointcol - couleur : " << couleur << "\n" ;

}

} ;

pointcol::pointcol (int abs=0, int ord=0, int cl=1) : point (abs, ord)

{ cout << "++ constr. pointcol : " << abs << " " << ord << " " << cl << "\n" ;

couleur = cl ;

}

++ constr. point : 10 15

++ constr. pointcol : 10 15 3

++ constr. point : 2 3

++ constr. pointcol : 2 3 1

++ constr. point : 12 0

++ constr. pointcol : 12 0 1

++ constr. point : 12 25

++ constr. pointcol : 12 25 1

-- dest. pointcol - couleur : 1

-- destr. point : 12 25

-- dest. pointcol - couleur : 1

-- destr. point : 12 0

-- dest. pointcol - couleur : 1

-- destr. point : 2 3

-- dest. pointcol - couleur : 3

-- destr. point : 10 15


Mohammed benjelloun service d informatique facult polytechnique de mons

Template et héritage : Classe CycleList dérivée du modèle List

// classe de base pour liste chaînée

template<class Elem> class List {

public :

List() { Deb=NULL;}

~List();

void insertElem(Elem *);

void sort();

private :

Elem * Deb;

};

//classe dérivée pour liste circulaire

template<class Elem> class CycleList : public List<Elem> {

//...

public :

CycleList();

~CycleList();

void insertElem(Elem *);

void sort();

//...

}

//Utilisation

void main()

{

List<int> liste;

CycleList<int> cListe;

//...

}


Mohammed benjelloun service d informatique facult polytechnique de mons

Qu'est ce que la "STL"?

La STL ("Standard Templates Library") est une librairie qui est constituée principalement par des classes containers (Conteneurs :collections d'objets;

très efficace), ainsi que des fonctionnalités pour parcourir (iterator) leur contenu et des algorithmes pour travailler sur leur contenu.

STL :

C++ Algorithms

C++ Vectors

C++ Double-Ended Queues

C++ Lists

C++ Priority Queues

C++ Queues

C++ Stacks

C++ Sets

C++ Multisets

C++ Maps

C++ Multimaps

C++ Bitsets

Iterators

STL


Mohammed benjelloun service d informatique facult polytechnique de mons

C++ Lists :


Mohammed benjelloun service d informatique facult polytechnique de mons

Utilisation du conteneur séquentiel list

#include <list>

#include <iostream>

using namespace std;

void main() {

//creer une liste (fifo)

list<int> listInt;

//rajouter des valeurs a la fin de la liste

listInt.push_back(33);

listInt.push_back(10);

//afficher et enlever des valeurs au debut de la liste

cout <<listInt.front() <<endl;

listInt.pop_front();

//rajouter des valeurs a la fin de la liste

listInt.push_back(44);

//afficher et enlever des valeurs au debut de la liste

cout <<listInt.front() <<endl;

listInt.pop_front();

cout <<listInt.front() <<endl;

listInt.pop_front();

}

33

10

44


Mohammed benjelloun service d informatique facult polytechnique de mons

Utilisation du conteneur séquentiel vector

#include <vector>

#include <iostream>

using namespace std;

void main() {

int MAX=10;

//créer un vecteur qui stocke MAX entiers

vector<int> vecInt(MAX);

//remplir vecteur

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

vecInt[i] = i+1;

}

//afficher vecteur

for (int i=MAX-1; i>=0; i--) {

cout <<vecInt[i] <<endl;

}

}

10

9

8

7

6

5

4

3

2

1


Mohammed benjelloun service d informatique facult polytechnique de mons

#include <string>

#include <iostream>

#include <map>

using namespace std;

void main(){

map<string, int, less<string > > age; // age est une map de string à int

age["Fred"] = 42; // Fred a 42 ans de

age["Barney"] = 37; // Barney a 37 ans

++age["Fred"]; // incrémente l'âge de Fred.

cout << "Fred a " << age["Fred"] << " an(s)\n";

--age["Barney"];

cout << "Barney a " << age["Barney"] << " an(s)\n";

}


Mohammed benjelloun service d informatique facult polytechnique de mons

#pragma warning(disable: 4786)

#include <iostream>

#include <string>

#include <map> // Pour STL type map

using namespace std;

typedef map < string, int > MyMap;

void main() {

MyMap ListeMap;// Liste

MyMap :: iterator my_it;// iterateur

char buffer[5];

ListeMap["Mary"] = 1234567; // Mary est un string

ListeMap["Mary"] = 5551212; // Le numéro de Mary a changé

// Inserser en utilisant la fonction <tt>insert</tt>: TRi croissant

ListeMap.insert( MyMap :: value_type( "Xavier", 777 ) );

ListeMap.insert( MyMap :: value_type( "Chuck", 1234567 ) );

ListeMap.insert( MyMap :: value_type( "James Bond", 007 ) );

ListeMap.insert( MyMap :: value_type( "Rob", 666 ) );

ListeMap.insert( MyMap :: value_type( "Xavier", 777 ) );

ListeMap.insert( MyMap :: value_type( "Chuck", 1234567 ) );

// Parcourir et afficher la liste

for( my_it = ListeMap.begin(); my_it != ListeMap.end(); my_it++ )

cout << (*my_it).first << " " << (*my_it).second << endl;

// Effacer la liste de la mémoire

ListeMap.erase(ListeMap.begin(), ListeMap.end());

cout << "\n FIN \n";

}

Chuck 1234567

James Bond 7

Mary 5551212

Rob 666

Xavier 777

FIN


Mohammed benjelloun service d informatique facult polytechnique de mons

//Utilisation du conteneur associatif map

#include <map>

#include <iostream>

#include <string>

using namespace std;

void main() {

//creer un map

map<char,string> avion;

//ajouter des elements dans le map

avion['A'] = "Alpha";

avion['E'] = "Echo";

avion['T'] = "Tango";

avion['Z'] = "Zulu";

//afficher des elements du map

cout <<avion['A'] <<endl;

cout <<avion['T'] <<endl;

//enlever un element

avion.erase('A');

avion.erase('Z');

//afficher des elements du map qui restent

map<char,string>::iterator it;

for (it = avion.begin() ; it != avion.end() ; it++) {

cout << (*it).first <<" --> " <<(*it).second <<endl ;

}

}

Alpha

Tango

E --> Echo

T --> Tango


Mohammed benjelloun service d informatique facult polytechnique de mons

struct Personne {

int id;

string nom;

void saisie();

void affiche();

};

TP1

void main(){

struct Personne TAB[dim];

}

TAB[2]

TAB[0]

TAB[1]


Mohammed benjelloun service d informatique facult polytechnique de mons

Elm1

Elm2

Elm5

1 :

2 :

2 :

Elm 3

3 :

TP1

struct Personne {

int id;

string nom;

void saisie();

void affiche();

};

Menu

1 : Saisie et Affichage

2 : Ajouter au (début, milieu ou fin) et Affichage

3 : Supprimer le début et Affichage

4 : Tri selon NOM et Affichage

5 : Tri selon Id et Affichage

6 : Quitter


Mohammed benjelloun service d informatique facult polytechnique de mons

void main() {

struct Element Tab_Elem[MAX];

int rep_menu, n;

do{

rep_menu=menu();

switch(rep_menu) {

case 1: Saisie(…); Affichage(…); break;

case 2: Ajouter(…);Affichage(…); break;

case 3: Effacer(…);Affichage(…); break;

case 4: triabulle_nom(…);Affichage(…); break;

case 5: triabulle_Code(…);Affichage(…); break;

case 6: cout <<"\n\n Fin du Programme \n\n"; break;

default : cout<<" Il faut choisir entre 1) .... et 6) \n";

}

}while (rep_menu!=6);

}


Mohammed benjelloun service d informatique facult polytechnique de mons

struct ListePersonnes

{

Personne Element;

ListePersonnes *pNext;

};

void Personne::saisie ()

{

cout << "donnez un identifiant"<< endl;

cin >> id;

cout << "donnez un nom"<< endl;

cin >> nom;

}

ListePersonnes *insereTete(Personne X, ListePersonnes *Tete)

{

ListePersonnes *nouveau=new ListePersonnes; // création du nouveau noeud

nouveau->Element.id=X.id;

nouveau->Element.nom=X.nom;

nouveau->pNext=Tete; // positionnement en tete-chainage

return nouveau; // retour de la nouvelle position

}

struct Personne {

int id;

string nom;

void saisie();

void affiche();

};

TP2

+ Classes


  • Login