Previous Next Contents




Pour aller plus loin : sommaire


Pour aller plus loin  1


Généricité

--> Généricité : possibilité de paramétrer les définitions de fonction ou de classe


Pour aller plus loin  2




Fonction générique (1)

template <class T> // template = gabarit
T Min(T a,T b) {
   return (a<b)?a:b ;
}
int main() {
   int i=1, j=3, k; float x=1.4, y=2.5, z;
   myClass a, b, c;
   ...
   k = Min(i,j);
   z = Min(x,y);
   c = Min(a,b); // OK
   // (si operator<(myClass,myClass) défini)
}


Pour aller plus loin  3




Fonction générique (2)


Pour aller plus loin  4


Classe générique (1)


Pour aller plus loin  5




Classe générique (2)


Pour aller plus loin  6


Syntaxe de la généricité


Pour aller plus loin  7




Héritage et généricité

Pour aller plus loin  8




Relations d'amitiés génériques (1)


Pour aller plus loin  9




Relations d'amitiés génériques (2)


Pour aller plus loin  10


Exemple : Tableau générique

#ifndef _tableau_h
#define _tableau_h
template < class T> class tableau {
public:
   // construteurs
   tableau(unsigned int nbElts);
   tableau(unsigned int nbElts, T valInit);
   tableau(const tableau<T>&);
   //destructeur
   ~tableau();
   // operateurs
   virtual T& operator[] (unsigned int ind) const;
   // fonctions
   unsigned int longueur(void) const;
   unsigned int setnbElts(unsigned int nbElts);
   // Modif. _nbElts + valeur initiale
   unsigned int setnbElts(unsigned int nbElts,
         T& valInit);
protected:
   T * data;
   unsigned int _nbElts;
};
#endif


Pour aller plus loin  11


Constructeurs de la classe Tableau

#include <assert.h>
#include "tableau.h"
template<class T>
tableau<T>::tableau(unsigned int nbElts)
      : _nbElts(nbElts)
{    data = new T[_nbElts];
   assert(data!=0); }
template<class T>
tableau<T>::tableau(unsigned int nbElts,
      T valinit) : _nbElts(nbElts)
{    data = new T[_nbElts];
   assert(data!=0);
   for (int i=0; i<_nbElts; i++)
      data[i]=valinit; }
template<class T>
tableau<T>::tableau(const tableau<T> & source)
      : _nbElts(source._nbElts)
{    data = new T[_nbElts];
   assert(data!=0);
   for (int i=0; i<_nbElts; i++)
      data[i]=source.data[i]; }


Pour aller plus loin  12


Destructeur
template <class T> tableau<T>::~tableau()
{    delete [] data;
   data = 0;
   _nbElts = 0; }

Opérateurs
template<class T>
T & tableau<T>::operator[] (unsigned int ind) const
{    assert((ind<_nbElts) && (0<=ind));
   return(data[ind]); }
template<class T>
unsigned int
tableau<T>::setnbElts(unsigned int nbElts)
{    T * newData = new T[nbElts];
   assert(newData!=0);
   int fin = min(nbElts,_nbElts);
   for(int i=0;i<fin;i++)
      newData[i]=data[i];
   delete [] data;
   _nbElts = nbElts; data = newData;
   return _nbElts; }


Pour aller plus loin  13


Opérateurs (suite)

template<class T>
unsigned int
tableau<T>::setnbElts(unsigned int nbElts,
         T & valinit)
{    T * newData = new T[nbElts];
   assert(newData!=0);
   int fin = min(nbElts,_nbElts);
   for(int i=0;i<fin;i++)
      newData[i]=data[i];
   _nbElts = nbElts;
   for(int i=fin;i<_nbElts;i++)
      newData[i]=valinit;
   delete [] data;
   data = newData;
   return _nbElts; }
template<class T>
unsigned int tableau<T>::longueur(void) const
{    return _nbElts; }


Pour aller plus loin  14


Exemple : File générique

#ifndef file_h
#define file_h
#include <iostream.h>
// Déclaration avant définition
template <class Type> class File;
// Element d'une file
template <class Type>
class EltFile {
public:
   friend class File<Type>;
   EltFile( const Type &t ) : elemt( t )
      { next = 0; }
private:
   Type elemt;
   EltFile *next;
};
template <class Type>
ostream&
operator<<(ostream&,EltFile<Type>&);


Pour aller plus loin  15


File (suite)

template <class Type>
class File {
public:
   File() { tete = queue = 0; }
   ~File();
   void enleve();
   Type valeur();
   void ajoute( const Type& );
   int vide() { return tete==0 ? TRUE : FALSE; }
private:
   EltFile<Type> *tete;
   EltFile<Type> *queue;
};
template <class Type>
ostream&
operator<<(ostream&,File<Type>&);
#endif


Pour aller plus loin  16


Assertions Exceptions
  1. Correction et validité
  2. Assertion
  3. (Pré-/Post-)condition
  4. Invariant
  5. Exception

Pour aller plus loin  17


Correction et validité


Pour aller plus loin  18


Assertions et programmation par objets


Pour aller plus loin  19


Expression des assertions


Pour aller plus loin  20


(Pré-/Post-)condition

Pour aller plus loin  21


Invariant

Pour aller plus loin  22


Suspension de vérification
ß

  1. Ne mettre aucune instruction indispensable au sein d'une assertion,
  2. La robustesse n'est pas améliorée par les assertions.

Pour aller plus loin  23


Exception


Pour aller plus loin  24




Exemple (1)






// Sans les exceptions :
action1 ;
if erreur1 { ...}
else {
      action2 ;
      if erreur2 { ...}
      else {
         action3 ;
         if erreur3 { ...}
         else { ...


Pour aller plus loin  25


Expression des exceptions


Pour aller plus loin  26


Gestion des exceptions


Pour aller plus loin  27


Propagation des exceptions


Pour aller plus loin  28


Exemple (2)

// Solution avec les exceptions :
class exc1;
class exc2;
class exc3;
try {
   // module de détection
   action1 ;
   if erreur1 throw exc1( ...) ;
   action2 ;
   if erreur2 throw exc2( ...) ;
   action3 ;
   if erreur3 throw exc3( ...) ;
}
// module de traitement
catch (exc1& e) { ...} ;
catch (exc2& e) { ...} ;
catch (exc3& e) { ...} ;


Pour aller plus loin  29


Exemple : Pile

Pile.h

#ifndef _pile_h
#define _pile_h
template <class type>
class pile {
protected:
   int taille;
   int i;
   type *rep;
   int invariant() const;
public:
   pile(int i=10);
   ~pile();
   void empiler(type element);
   void depiler();
   const type& sommet() const;
   int vide() const;
   int pleine() const;
};
#endif


Pour aller plus loin  30




Pile.cpp

#include <assert.h>
#include "pile.h"
template <class type>
pile<type>::pile(int t):i(0),taille(t) {
   rep = new type[taille];
   assert(invariant()); }
template <class type>
pile<type>::~pile(void) {
   delete [] rep; }
template <class type>
int pile<type>::vide(void) const {
   return i==0; }
template <class type>
int pile<type>::pleine(void) const {
   return i==taille; }
template<class type>
void pile<type>::depiler(void) {
   if (vide())
      throw "impossible: pile vide";
   i--;
   assert(invariant()); }




Pour aller plus loin  31




Pile.cpp (suite)

template <class type>
void pile<type>::empiler(type element) {
   if (pleine())
      throw "impossible: pile pleine";
   rep[i++] = element;
   assert(invariant());
   // post-condition
   assert(sommet() ==element); }
template <class type>
const type& pile<type>::sommet(void) const {
   if (vide())
      throw "impossible: pile vide";
   return rep[i-1]; }
template <class type>
int pile<type>::invariant(void) const {
   int v = (rep != 0);
   v &&= (taille >= 0);
   v &&= (i <= taille);
   v &&= (i>=0);
   return v; }


Pour aller plus loin  32




Programme principal

#include <iostream.h>
#include <stdlib.h>
#include "pile.h"
const line = 80;
int main(void)
{
   pile<int> p1;
   char rep[line];
   do
   {
      cout << "Entrer une commande (edsq) : ";
      cin >> rep[0];
      try
      {
         switch(rep[0]) {
         case 'e' :
            cout << "Entrer une valeur : ";
            cin >> rep;
            p1.empiler(atoi(rep));
            break;
         case 'd' :
            p1.depiler();
            break;


Pour aller plus loin  33




Programme principal (suite)

         case 's' :
            cout << "sommet : " ;
            cout << p1.sommet() << "\n";
            break;
         case 'q' :
            break;
         default :
            throw "Attention a la syntaxe";
            break;
         }
      }
      catch (const char* msg)
      {
         cerr << msg << endl;
         cerr << "Commande ignoree\n";
      }
   } while (rep[0] != 'q');
   return 0;
}


Pour aller plus loin  34


Bibliothèque standard C ISO

ou ``bibliothèque d'exécution'' ou ``runtime library''


Pour aller plus loin  35


Fichiers d'en-tête standards
<assert.h> : diagnostic

<ctype.h> : tests sur les caractères

<float.h> : constantes d'implantation des types flottants

<limits.h> : constantes d'implantation des types scalaires

<math.h> : fonctions mathématiques

<setjmp.h> : les goto non locaux

<signal.h> : manipulation des exceptions

<stdarg.h> : liste d'arguments de nombre variable

<stdio.h> : entrées-sorties

<stdlib.h> : fonctions utilitaires

<string.h> : manipulation de chaînes de caractères

<time.h> : accès à la date et à l'heure


Pour aller plus loin  36


<string.h>

- Longueur d'une chaîne :
int strlen(char *s)


- Comparaison de chaînes :
int strcmp(char *s1, char *s2)
int strncmp(char *s1,char *s2,int n)


- Concaténation de chaînes :
char *strcat(char *dest, char *orig)
char *strncat(char *dest,char *orig,int n)


- Copie de chaînes :
char *strcpy(char *dest, char *orig)
char *strncpy(char *dest,char *orig,int n)


- ...


Pour aller plus loin  37


<stdlib.h>

Comporte de nombreuses fonctions absolument essentielles :

Pour aller plus loin  38


<ctype.h>

Fonctions de test sur les caractères : Valeur de retour : 1 si vrai, 0 si faux.


Pour aller plus loin  39


<math.h>




Remarques :
- arguments: double (sauf n: integer);
- type de retour: double (y compris ceil et floor);
- angles en radians.


Pour aller plus loin  40


<time.h>

Donne accès à la date et à l'heure.


Exemple :
struct tm *stm;
long lg;
int day;


lg=time(0);

stm=localtime(&lg);




/* day reçoit le numéro du jour dans le mois. */
day=stm.tm_mday;




fprintf(stdout,"%s
\n",asctime(stm));


Nota-bene : pour ``dormir'' n secondes :

sleep(durée-en-secondes);






Previous Next Contents