C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

31
C++ 5ème cours Patrick Reuter maître de conférences http://www.labri.fr/~preuter/c++

Transcript of C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

Page 1: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

C++

5ème cours

Patrick Reutermaître de conférences

http://www.labri.fr/~preuter/c++

Page 2: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

Les classes

• class Matrix2x2 { .. }

– Définition : fichier en-tête Matrix2.2.h (avec les prototypes des méthodes/fonctions membres)

– Implémentation : fichier source Matrix2x2.cpp (avec les implémentations des méthodes/fonctions membres)

Page 3: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

• #ifndef MATRIX2x2_H• #define MATRIX2x2_H• class Matrix2x2 { • private: • float _matrix[2][2];• public: • // constructeur par defaut• Matrix2x2(); • // constructeur• Matrix2x2(const float e00, const float e01, const float e10, const float e11);• // destructeur par defaut• ~Matrix2x2(); • // Accès aux éléments • float getElement(const unsigned int line, const unsigned int column) const; • // Affecter les éléments • void makeZero();• // Affecter les éléments • void makeIdentity();• // Affecter les éléments • void setElement( const unsigned int line, • const unsigned int column, const float value);• // Affecter les éléments • void setElements( const float e00, const float e01,• const float e10, const float e11);• • // Calculer le determinant • float determinant() const;• • void afficher() const;• • Matrix2x2 addition (const Matrix2x2 matrix) const;• Matrix2x2 operator+(const Matrix2x2 matrix) const;• Matrix2x2 multiplication(const float k) const;• Matrix2x2 operator*(const float k) const;• };

• #endif // define MATRIX_H

• Attributs ou propriétés

• Méthodes ou fonctions membres

Page 4: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

• #ifndef MATRIX2x2_H• #define MATRIX2x2_H• class Matrix2x2 { • private: • float _matrix[2][2];• public: • // constructeur par defaut• Matrix2x2(); • // constructeur• Matrix2x2(const float e00, const float e01, const float e10, const float e11);• // destructeur par defaut• ~Matrix2x2(); • // Accès aux éléments • float getElement(const unsigned int line, const unsigned int column) const; • // Affecter les éléments • void makeZero();• // Affecter les éléments • void makeIdentity();• // Affecter les éléments • void setElement( const unsigned int line, • const unsigned int column, const float value);• // Affecter les éléments • void setElements( const float e00, const float e01,• const float e10, const float e11);• • // Calculer le determinant • float determinant() const;• • void afficher() const;• • Matrix2x2 addition (const Matrix2x2 matrix) const;• Matrix2x2 operator+(const Matrix2x2 matrix) const;• Matrix2x2 multiplication(const float k) const;• Matrix2x2 operator*(const float k) const;• };

• #endif // define MATRIX_H

Encapsulation

• privatePropriétés etfonctions qui nepeuvent pas êtreaccédées en dehors de la classe

• public Propriétés et fonctions peuvent être accédées en dehors de la classe

Page 5: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

• #ifndef MATRIX2x2_H• #define MATRIX2x2_H• class Matrix2x2 { • private: • float _matrix[2][2];• public: • // constructeur par defaut• Matrix2x2(); • // constructeur• Matrix2x2(const float e00, const float e01, const float e10, const float e11);• // destructeur par defaut• ~Matrix2x2(); • // Accès aux éléments • float getElement(const unsigned int line, const unsigned int column) const; • // Affecter les éléments • void makeZero();• // Affecter les éléments • void makeIdentity();• // Affecter les éléments • void setElement( const unsigned int line, • const unsigned int column, const float value);• // Affecter les éléments • void setElements( const float e00, const float e01,• const float e10, const float e11);• • // Calculer le determinant • float determinant() const;• • void afficher() const;• • Matrix2x2 addition (const Matrix2x2 matrix) const;• Matrix2x2 operator+(const Matrix2x2 matrix) const;• Matrix2x2 multiplication(const float k) const;• Matrix2x2 operator*(const float k) const;• };

• #endif // define MATRIX_H

• Constructeurest appelé lors dela création d’un objet de la classe,porte le même nomque la classe

• Destructeur est appelé lors de la destruction d’un objet de la classe, porte le même nom que la classe précédé d'un tilde ~ (explicitement par delete p.ex.)

Page 6: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

• #ifndef MATRIX2x2_H• #define MATRIX2x2_H• class Matrix2x2 { • private: • float _matrix[2][2];• public: • // constructeur par defaut• Matrix2x2(); • // constructeur• Matrix2x2(const float e00, const float e01, const float e10, const float e11);• // destructeur par defaut• ~Matrix2x2(); • // Accès aux éléments • float getElement(const unsigned int line, const unsigned int column) const; • // Affecter les éléments • void makeZero();• // Affecter les éléments • void makeIdentity();• // Affecter les éléments • void setElement( const unsigned int line, • const unsigned int column, const float value);• // Affecter les éléments • void setElements( const float e00, const float e01,• const float e10, const float e11);• • // Calculer le determinant • float determinant() const;• • void afficher() const;• • Matrix2x2 addition (const Matrix2x2 matrix) const;• Matrix2x2 operator+(const Matrix2x2 matrix) const;• Matrix2x2 multiplication(const float k) const;• Matrix2x2 operator*(const float k) const;• };

• #endif // define MATRIX_H

• AccesseursFonctions membresqui permettent d’accéder auxdonnées membres(get

• Mutateur Fonctions membres qui permettent de modifier les données membres

(set)

Page 7: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

Surdéfinition d’operateurs

• Binaire (p.ex. 2+3 = 5)

• Unaire (p.ex. -3)

Page 8: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

Opérateur binaire

Matrix2x2 addition (const Matrix2x2 matrix) const;Matrix2x2 operator+(const Matrix2x2 matrix) const;

• la syntaxe de l'opération + est semblable à celle de addition().

• matrix est le paramètre de l'opérateur +.

• lorsque l'on écrit A=B*C, – l'opérateur + est appelé pour l'objet B qui se trouve à gauche de

+; à l'appel de cette opération, le paramètre de la fonction se trouve à droite de *. (alors C)

• les symboles possibles pour un opérateur binaire sont: (),[ ], -> , *,/,%,+,-, <<,>>,<, <=,>,>=,==,!=,&,, ||,&&,|,=, +=,-=,*=,/=,%=,&=,=,|=,<<=,>>=,et la virgule ,.

Surdéfinition d’operateurs

Page 9: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

Operateur unaire

Matrix2x2 operator-() const;

–W=-V • la seule entrée de - est l'objet V de la classe qui

se trouve à droite. (il n'y a pas d'entrée à gauche).

–   Les symboles possibles pour un opérateur unaire sont:

 +,-,++,-,!,~,*,&,new,new[],delete,(cast) 

Surdéfinition d’operateurs

Page 10: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

Les flots << et >>

• Rappel : Flot de sortie

std::cout << "Hello World" << std::endl;

• Rappel : Flot d’entrée

int x;

std::cin >> x;

Page 11: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

Operateur<<

Fichier .h (en dehors de classe { .. }

std::ostream& operator<<(std::ostream& f, Matrix2x2 matrix);

Fichier .cpp

std::ostream& operator<<(std::ostream& f, Matrix2x2 matrix)

{

return f << "((" << matrix.getElement(0,0) << "," << matrix.getElement(0,1)

<<"),(" << matrix.getElement(1,0) << ", " << matrix.getElement(1,1) << "))";

}

Surdéfinition d’operateurs

Page 12: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

Ecrire dans un fichier

• void Matrix2x2::save(std::string nomFichier) const• {• std::ofstream fichierSortie(nomFichier.c_str());• fichierSortie << _matrix[0][0];• fichierSortie << " ";• fichierSortie << _matrix[0][1];• fichierSortie << " ";• fichierSortie << _matrix[1][0];• fichierSortie << " ";• fichierSortie << _matrix[1][1];• }

Flots et fichiers

Page 13: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

Ecrire dans un fichier

• void Matrix2x2::save(std::string nomFichier) const• {• std::ofstream fichierSortie(nomFichier.c_str());• if ( !fichierSortie )• {• std::cerr << "Erreur d'ouverture\n";• return; • }• fichierSortie << _matrix[0][0];• if ( !fichierSortie )• {• std::cerr << "Erreur d'écriture\n";• return; • }• fichierSortie << " ";• if ( !fichierSortie )• {• std::cerr << "Erreur d'écriture\n";• return; • }• fichierSortie << _matrix[0][1];• if ( !fichierSortie )• {• std::cerr << "Erreur d'écriture\n";• return; • }•

Flots et fichiers• fichierSortie << " ";• if ( !fichierSortie )• {• std::cerr << "Erreur d'écriture\n";• return; • }• fichierSortie << _matrix[1][0];• if ( !fichierSortie )• {• std::cerr << "Erreur d'écriture\n";• return; • }• fichierSortie << " ";• if ( !fichierSortie )• {• std::cerr << "Erreur d'écriture\n";• return; • }• fichierSortie << _matrix[1][1];• if ( !fichierSortie )• {• std::cerr << "Erreur d'écriture\n";• return; • }• }

Page 14: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

Lire dans un fichier

• void Matrix2x2::load(std::string nomFichier)• {• std::ifstream fichierEntree(nomFichier.c_str());• fichierEntree >> _matrix[0][0];• fichierEntree >> _matrix[0][1];• fichierEntree >> _matrix[1][0];• fichierEntree >> _matrix[1][1];• }

Flots et fichiers

Page 15: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

Lire dans un fichier

• void Matrix2x2::load(std::string nomFichier)• {• std::ifstream fichierEntree(nomFichier.c_str() );• if ( !fichierEntree )• {• std::cerr << "Erreur d'ouverture\n";• return;• }• if ( ! ( fichierEntree >> _matrix[0][0] ) )• {• std::cerr << "Erreur de lecture\n";• return;• }• if ( ! ( fichierEntree >> _matrix[0][1] ) )• {• std::cerr << "Erreur de lecture\n";• return;• }• if ( ! ( fichierEntree >> _matrix[1][0] ) )• {• std::cerr << "Erreur de lecture\n";• return;• }• if ( ! ( fichierEntree >> _matrix[1][1] ) )• {• std::cerr << "Erreur de lecture\n";• return;• }• • }

Flots et fichiers

Page 16: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

Récapitulatif

• Types de base (bool, unsigned char, signed char, unsigned int, float, double)

• Type enumerateur enum t_etat {gaz=0, solide=1, liquide=4};

• Type tableau type nom_du_tableau[taille]; - structure de données la plus connu- structure homogène, chaque élément est du même type

• Organisation de la mémoire

Page 17: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

Déclaration de variables

int counter;

float diviseur;

char c;

double precision;

string nom;

bool masculin;

diviseur = 1.1;compteur = 1;Nom = « Gerhard »;

// Nombre entier

// Nombre à virgule flottante

// Nombre à virgule flottante avec double précision

// caractère

// Chaîne de caractère

// VRAI/FAUX

Page 18: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

Mémoire vive

Proc 64bit

2,93 GHz : 2,93 Giga-Instructions par seconde

Page 19: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

Organisation de la mémoirechar jours[13]; {13 octets, statique!}

jours[1]=31; jours[2]=30; …

#0

jours[1] #2001

...

#536.870.910#536.870.911

...

jours[3] #2003

jours[12] #2012

...

jours[2] #2002312831

31

...jours[0] #2000

Occupe de la place successivedans la mémoire

jours[index] #(2000+index)

Page 20: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

Organisation de la mémoire

char a;

#0#1#2#3

a #4#5

...

#536.870.910#536.870.911

#1.000

...

Page 21: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

Organisation de la mémoirechar a;a = 97;

#0#1#2#3

a #4#5

...

#536.870.910#536.870.911

#1.000

...

97

Page 22: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

Organisation de la mémoirechar a;a = 97;

#0#1#2#3

a #4#5

...

#536.870.910#536.870.911

#1.000

...

97

Comment connaître l’adresse de a ? &a

Page 23: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

Organisation de la mémoirechar a;a = 97;p_a = &a; { Sauvegarder l’adresse }

#0#1#2#3

a #4#5

...

#536.870.910#536.870.911

#1.000

...

97

Comment connaître l’adresse de a ? &a

Page 24: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

char a;char *p_a; {4 octets, lire : pointeur vers a}a = 97;p_a = &a; { Sauvegarder l’adresse }

#0#1#2#3

a #4#5

...

#536.870.910#536.870.911

p_a #1.0000

97

Comment connaître l’adresse de a ? Addr(a)

p_a #1.001p_a #1.002p_a #1.003

4

00

« p_a pointe vers a »

Page 25: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

char a;

char *p_a; {4 octets, lire : pointeur vers a}

a = 97;

p_a = &a; { Sauvegarder l’adresse }

*p_a = 10;

a = 10; { Déréférencement }

#0#1#2#3

a #4#5

...

#536.870.910#536.870.911

p_a #1.0000

10

Comment connaître l’adresse de a ?&a

p_a #1.001p_a #1.002p_a #1.003

4

00

Page 26: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

char *p_a; {4 octets, lire : pointeur vers a}

p_a = new p_a;

*p_a = 10;

#0#1#2#3

*p_a #4#5

...

#536.870.910#536.870.911

p_a #1.0000

10

Comment connaître l’adresse de a ?&a

p_a #1.001p_a #1.002p_a #1.003

4

00

Page 27: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

char a;

char *p_a; {4 octets, lire : pointeur vers a}

a = 97;

p_a = &a; { Sauvegarder l’adresse }

*p_a = 10;

a = 10; { Déréférencement }

#0#1#2#3

a #4#5

...

#536.870.910#536.870.911

p_a #1.0000

10

Comment connaître l’adresse de a ?&a

p_a #1.001p_a #1.002p_a #1.003

4

00

Page 28: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

Tableaux dynamiquesL’operateur new crée un objet en mémoire et

renvoie un pointeur vers l'adresse de cet objet. • char* jours;• jours = new char[13];• • jours[1] = 31;• jours[2] = 28;• jours[3] = 31;

Page 29: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

• char *jours;• jours = new char[13];•

#0#1#2#3

&jours #4#5

...

#536.870.910#536.870.911

jours[0] #1.00031jours[1] #1.001

jours[2] #1.002jours[3] #1.003

0

2831

Page 30: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

Tableau dynamique• const int WIDTH = 800;• const int HEIGHT = 600;

• int i, x, y;  char **tab;  // le tableau à 2 dimensions = pointeur de pointeur

•  tab = new char*[WIDTH]; •  • for( i=0; i<WIDTH; i++ )

  tab[i] = new char[HEIGHT];

•  // Exemple d'affectation dans le tableau -> c'est identique à  // l'ancienne méthode

•  for( y=0; y<HEIGHT; y++ )   for( x=0; x<WIDTH; x++ )    tab[x][y] = '1' + x+y;

•  // Libération de la mémoire  for( i=0; i<WIDTH; i++ )     delete []tab[i];  delete []tab; }

Page 31: C++ 5ème cours Patrick Reuter maître de conférences preuter/c++

Format de fichier PPM

P3#exemple.ppm 4 4 255 0 0 0 16 16 16 32 32 32 48 48 48 64 64 64 80 80 80 96 96 96 112 112 112 128 128 128 143 143 143 159 159 159 175 175

175 191 191 191 207 207 207 223 223 223 239 239

239