La définition de la classe en découle assez naturellement :
/* définition de la classe set_char */
#include "setchar1.h"
set_char::set_char ()
{ int i ;
for (i=0 ; i }
void set_char::ajoute (unsigned char c)
{ ens[c] = 1 ;
}
int set_char::appartient (unsigned char c)
{ return ens[c] ;
}
int set_char::cardinal ()
{ int i, n ;
for (i=0, n=0 ; i return n ;
}
Il en va de même pour le programme d’utilisation :
/* utilisation de la classe set_char */
#include
#include "setchar1.h"
#include
using namespace std ;
main()
{ set_char ens ;
char mot [81] ;
cout << "donnez un mot " ;
cin >> mot ;
int i ;
for (i=0 ; i cout << "il contient " << ens.cardinal () << " caractères différents" ;
if (ens.appartient('e')) cout << "le caractère e est présent\n" ;
else cout << "le caractère e n'est pas présent\n" ;
}
Si l’on avait déclaré de type char les arguments de ajoute et appartient, on aurait alors pu
aboutir soit au type unsigned char, soit au type signed char, selon l’environnement utilisé.
Dans le dernier cas, on aurait couru le risque de transmettre à l’une des fonctions
membre citées une valeur négative, et partant d’accéder à l’extérieur du tableau ens.
Discussion
Le tableau ens [N_CHAR_MAX] occupe un octet par caractère ; chacun de ces octets ne prend
que l’une des valeurs 0 ou 1 ; on pourrait économiser de l’espace mémoire en prévoyant
seulement 1 bit par caractère. Les fonctions membre y perdraient toutefois en
simplicité, ainsi qu’en vitesse.
145
Précédent

- 146/398

Suivant