Accueil > Dossiers > C++

C++ (tutorial 5)

Indications pour ceux qui veulent lire vite...

Les titres principaux des parties sont centrés en gras et soulignés. Les sous-parties sont alignées dans la gauche, en gras-italique et marron. Les récapitulatifs sont en bleu. Les codes C++ sont écrit en type "codé" et gras.


SOMMAIRE DU TUTORIAL 5

Plus loin dans les variables
1.1 Variables de caractères
1.2 Initialisation de variables booléennes par condition
1.3 Relation entre variables booléennes et nombres
1.4 Les tableaux
1.5 Application des tableaux



Plus loin dans les variables >> vers le sommaire

1.1 Variables de caractères >> vers le sommaire

Il n'existe pas que des variables de nombres et booléennes mais aussi des variables de caractères. Celles-ci sont reconnues par le type char ; voici l'exemple de la création de la variable essai :
char essai('A');

Cette variable contiendra la lettre A. Sachant ceci, ouvrez le projet base et videz le pour qu'il ne fasse plus qu'afficher le mot "Hello" en utilisant uniquement des variables. Le code sera le suivant :
#include <iostream.h>

main()
{
char car1('H'), car2('e'), car3('l'), car4('o');
cout << car1 << car2 << car3 << car3 << car4 << "\n";
}

Il y a plusieurs manières d'initialiser ce genre de variable et notamment en utilisant le code ASCII. Ce code associe à chaque chiffre un caractère ; vous pouvez donc imaginer que l'initialisation de la variable par char essai=66; donnera le caractère associé à ce numéro. Voici le tableau des codes ASCII :

Tableau des fonctions de contrôle
Valeur décimale
Valeur héxadécimale
Caractère
Contrôle
000
00
null
NUL
001
01
-smiley-
SOH
002
02
-petit rond-
STX
003
03
-coeur-
ETX
004
04
-pique-
EOT
005
05
-trèfle-
END
006
06
-carreau-
ACK
007
07
-petit rond-
BEL (Audible Bell)
008
08
Retour
009
09
HT
010
0A
LF (Line feed)
011
0B
VT (Vertical Tab)

Caractères standard
Valeur décimale
Valeur héxadécimale
Caractère
Contrôle
012
0C
FF (Form feed)
013
0D
CR (Carriage return
014
0E
SO
015
0F
-rond vide-
SI
016
10
DLE
017
11
DC1
018
12
DC2
019
13
DC3
020
14
DC4
021
15
NAK
022
16
SYN
023
17
ETB
024
18
CAN
025
19
EM
026
1A
-flèche vers la droite-
SUB
027
1B
-flèche vers la gauche
ESC (Echap)
028
1C
-sorte de L-
FS
029
1D
GS
030
1E
RS
031
1F
US

Caractères et symboles nationaux
Valeur décimale
Valeur héxadécimale
Caractère
Valeur décimale
Valeur héxadicamel
Caractère
032
20
Space
080
50
P
033
21
!
081
51
Q
034
22
"
082
52
R
035
23
#
083
53
S
036
24
$
084
54
T
037
25
%
085
55
U
038
26
&
086
56
V
039
27
'
087
57
W
040
28
(
088
58
X
041
29
)
089
59
Y
042
2A
*
090
5A
Z
043
2B
+
091
5B
[
044
2C
,
092
5C
\
045
2D
-
093
5D
]
046
2E
.
094
5E
^
047
2F
/
095
5F
_
048
30
0
096
60
`
049
31
1
097
61
a
050
32
2
098
62
b
051
33
3
099
63
c
052
34
4
100
64
d
053
35
5
101
65
e
054
36
6
102
66
f
055
37
7
103
67
g
056
38
8
104
68
h
057
39
9
105
69
i
058
3A
:
106
6A
j
059
3B
;
107
6B
k
060
3C
<
108
6C
l
061
3D
=
109
6D
m
062
3E
>
110
6E
n
063
3F
?
111
6F
o
064
40
@
112
70
p
065
41
A
113
71
q
066
42
B
114
72
r
067
43
C
115
73
s
068
44
D
116
74
t
069
45
E
117
75
u
070
46
F
118
76
v
071
47
G
119
77
w
072
48
H
120
78
x
073
49
I
121
79
y
074
4A
J
122
7A
z
075
4B
K
123
7B
{
076
4C
L
124
7C
|
077
4D
M
125
7D
}
078
4E
N
126
7E
~
079
4F
O
127
7F
delete

Je vous conseilles particulièrement d'imprimer ces tableaux. A titre d'exemple, initialisez la variable var1 pour qu'elle contienne les caractères suivants en utilisant les tableaux :
1. @
2. Un smiley
3. b

Les réponses sont :
1. char var1(64);
2. char var1(1);
3. char var1(98);

Il existe aussi un autre moyen d'accéder au tableau : si on ne donne pas une entrée décimale, on peut utiliser une entrée héxadécimale. Cependant, afin de ne pas confondre les deux types d'entrées, on précise qu'il s'agit d'héxadécimale en ajoutant 0x. Voici un exemple : char var1(0x6F); donne la lettre o. Initialisez la variable var1 pour qu'elle contienne le caractère G de 3 manières différentes.

Voici les réponses :
1. char var1('G');
2. char var1(71);
3. char var1(0x47);

Récapitulatif sur les variables de caractères :
- Elles contiennent des caractères de contrôle, standard et nationaux
- On les déclare avec le type char
- On peut les initialiser de trois manières, correspondants à des façons différentes d'accéder aux tableaux des caractères. On peut donner le caractère (exemple : char exemple='A'), la valeur décimale (exemple : char exemple=65) ou la valeur héxadécimale qui commence par 0x (exemple : char exemple=0x41).

1.2 Initialisation de variables booléennes par condition >> vers le sommaire

Bjarne Stroustrup expose dans son excellent livre "Le langage C++" d'autres initialisations possibles pour les variables booléennes, que je vais présenter ici. Je n'ai jamais eu à m'en servir, mais vous pourrez peut-être les rencontrer. Voici donc la nouvelle idée à retenir : on peut initialiser une variable booléenne en testant des conditions ; si la condition est remplie, la variable est vrai, et sinon elle est fausse. Voici un exemple de code :
#include <iostream.h>

main()
{
int a(15),b(5);
bool test=a!=b;
}

La condition associée à la variable test est "si a est différent de b" ; puisque a vaut 15 et b 5, alors la condition est remplie, et la variable test est vrai. Voici un autre exemple de code :
#include <iostream.h>

main()
{
int a(15),b(5),c(10);
bool test=a==b || b+c==a;
}

D'après vous, test est-il vrai ou faux ? Nous allons examiner sa condition. Pour cela, on regarde d'abord les associativités "et" qui ont la priorité, puis les "ou". Puisqu'il n'y a pas de "et" ici, on regarde le "ou", de gauche à droite. On a donc "a est égale à b" : cette condition n'est pas remplie. On regarde la seconde : "b + c est égal à a" ; or, b+c=5+10=15 et a=5, donc la condition est remplie. Les conditions étant liées par un ou inclusif, on a donc la variable test qui est vraie.

Récapitulatif sur l'initialisation de variables booléennes par condition :
- On déclare la variable habituelle et on l'associe à une condition (exemple : bool mavariable=a!=b && b<a). Si la condition est remplie, la variable est vrai et sinon elle est fausse.

1.3 Relations entre variables booléennes et nombres >> vers le sommaire

Voici une bonne introduction écrite par F. Degoulange et R. Clément sur l'algèbre booléenne : "L'étude de la logique formelle est due au précurseur G. Boole (1815-1864) qui [...] a créé une nouvelle sorte de logique, plus rigoureuse dans laquelle on admet que les propositions formulées ne peuvent être que vraies ou fausses."

Jusqu'à présent nous savions que les variables booléennes pouvaient prendre deux valeurs, true et false. La première nouveauté est que ces valeurs correspondent à des nombres : true=1 et false=0. Dans notre projet Base habituel, vitez tout, taper le code suivant et regardez le résultat :
#include <iostream.h>

main()
{
bool a(true),b(false);
cout << "a vaut " << a << " et b vaut " << b << "\n";

}

Voici le résultat :

Nous allons maintenant nous livrer à quelques petits calculs en algèbre booléenne adaptée à l'informatique. Il y a peu de probabilités que vous les utilisiez, mais cela ne peut pas vous faire de mal ; à signaler que leur étude est au programme de seconde générale à option I.S.I. et en première S s.i. Créez un nouveau code et déclarez 2 variables booléennes a et b, valant respectivement 0 et 1, puis une variable de même type c sans valeur. Vous aurez ce code :
#include <iostream.h>

main()
{
bool a(0),b(1),c;

}

Maintenant, imaginez le résultat de l'opération c= a+b;. C'est très simple, l'opérateur + fonctionne comme d'habitude, et on ajoute les nombres. On obtient donc c= a+b = 0 + 1 = 1. Par conséquent, c est vrai. Nous allons faire un test plus intéressant : calculez c = a + 4 et affichez le résultat. Votre code sera le suivant :
#include <iostream.h>

main()
{
bool a(0),b(1),c;
c=a+4;
cout << "c vaut : " << c << "\n";
}

Le résultat sera le suivant :

Il est peu courant de voir des calculs comme c=a+4=1+4=1. Le compilateur vous signale aussi l'étrangeté :

En effet, on sait que les variables booléennes ne prennent comme valeur que 0 ou 1. Toute valeur qui n'entre pas dans cet ensemble est automatiquement rapportée à 1 ; vous obtiendrez toujours 1 avec 4-78 ou 2+3. A signaler aussi que le fonctionnement des opérateurs courants (- / % *) reste le même.

Récapitulatif sur les relations entre variables booléennes et nombres :
- true est équivalent à 1.
- false est équivalent à 0.
- tout ce qui ne vaut pas 1 ou 0 est automatiquement rapporté à 1.
- les calculs logiques sur des variables qui ne prennent comme valeurs que 0 ou 1 sont relatifs à l'algèbre booléen
- en algèbre booléen, les opérateurs +, -, /, % et * fonctionnent normalement

1.4 Les tableaux >> vers le sommaire

Il est possible de créer un tableau d'autant de dimensions qu'on le souhaite, contenant un seul type de variables ; on a l'habitude d'appeller ceci un "vecteur". Voici un exemple :
int tableau[5][3];

Nous venons de créer un tableau de 5 lignes et trois colonnes. Le nombre de [] est le nombre de dimensions ; le contenu des crochets est le nombre de cases allouées. Créez maintenant un tableau de double à 4 dimensions, chacune disposant d'une place pour 3 éléments. Voici le code correspondant :
double essai[3][3][3][3];

Pour accéder aux cases d'un tableau, il suffit de donner leurs coordonnées. Par exemple :
double tableau[3][4];
tableau[2][1]=5.6;

Nous venons de donner la valeur 5,6 à la case de la troisième ligne et de la seconde colonne. Pourquoi troisième ligne alors que nous avons marqué [2] et seconde colonne quand nous avons marqué [1] ? Simplement parce qu'on peut accéder au tableau avec des coordonnés nuls. Prenons un exemple :
double tableau[2][2];
tableau[0][0]=0.5;
tableau[0][1]=1.0;
tableau[1][0]=1.5;
tableau[1][1]=2.0;

Nous avons rempli tout le tableau. Mais vous allez peut-être tenter d'accéder à tableau[2][2] ou tableau[1][2] voire tableau[2][1] ? C'est impossible. En effet, la dernière case d'une dimension est intouchable car elle est réservée. Ainsi, un tableau de 2*2 cases contient bien 4 cases et tout rentre dans l'ordre.

Pour être certain que vous n'ayez pas de difficulté, vous allez répondre à quelques questions sur le code suivant :
int tableau[3][5];
tableau[1][0]=1;
tableau[1][1]=2;
tableau[1][2]=3;
tableau[1][3]=4;

tableau[1][4]=5;
tableau[2][2]=6;
tableau[2
][3]=7;
tableau[2][4]=8;

Questions :
1. Initialisez la toute première case du tableau à 9.
2. On considère que la première dimension donne les lignes et la seconde les colonnes. Quelle est la valeur de la case se trouve au croisement de la troisième ligne et de la cinquième colonne ?
3. Quelle est la valeur de la case se trouvant au croisement de la seconde ligne et de la troisième colonne ?
4. Quelle est la valeur de la case se trouvant au croisement de la première ligne et de la quatrième colonne ?
5. Initialisez à 10 la case se trouvant au croisement de la quatrième ligne et de la troisième colonne.
6. Initialisez à 11 la case se trouvant au croisement de la troisième ligne et de la première colonne.

Réponses :
1. tableau[0][0]=9;
2. La case est celle de tableau[2][4], ayant pour valeur 8
3. La case est celle de tableau[1][2], ayant pour valeur 3
4. La case est celle de tableau[0][3], or la première ligne n'a pas été initialisée donc vous ne pouvez pas répondre
5. Il s'agit d'un tableau à 3 lignes, vous ne pouvez pas initialiser une case de la quatrième ligne : elle n'existe pas.
6. tableau[2][0]=11;

A présent, un cas intéressant : comment initialiser chacune des cases de notre tableau à 0 ? Initialisez tous les éléments d'un tableau de double d'une dimension et 7 cases. Voici le code que vous taperez probablement :
double tableau[7];
tableau[0]=0.0;
tableau[1]=0.0;
tableau[2]=0.0;
tableau[3]=0.0;
tableau[4]=0.0;
tableau[5]=0.0;
tableau[6]=0.0;

Si on vous demandes d'initialiser un tableau de 2000 cases, vous ne pourriez plus utiliser cette méthode. Pour initialiser des tableaux, le plus logique est l'utilisation des boucles. Voici le code que vous auriez dû taper :
double tableau[7];
for(int i=0;i<7;i++)
{
tableau[i]=0.0;
}

Dans le même esprit, tapez le code pour initialiser un tableau de double contenant 1000 cases.
double tableau[100][10];
for(int i=0;i<100;i++)
{
for(int j=0,j<10,j++)
{
tableau[i][j]=0.0;
}
}

Ce système de boucles for imbriqués est très courant pour l'initialiser des tableaux.

Récapitulatif sur les tableaux :
- Ils peuvent contenir un seul type de variable.
- La syntaxe de création est typedevariable nom[nombredecases]; Par exemple, si vous souhaitez un tableau de int contenant deux dimensions disposant chacune de 10 emplacements alloués, le code est
int exemple[10][10];

- Pour accéder à une case du tableau il suffit d'entrer ses coordonnés, chacun inférieur d'une unité à ce que vous attendez. Par exemple, si je veux la case se trouvant au croisement de la troisième ligne et de la vingtième colonne, on utilisera exemple[2][19];
- Pour initialiser un tableau, il est recommandé d'utiliser des boucles for dont le nombre est égal au nombre de dimensions du tableau ; elles seront imbriquées.

1.5 Application des tableaux >> vers le sommaire

On peut utiliser des tableaux pour des chaînes de caractères, bien qu'on préférera pour cela utiliser la bibliothèque standard (que vous ne connaissez pas encore). Créez un tableau qui contienne tout l'alphabet en lettres majuscules ; l'utilisateur doit pouvoir donner le chiffre correspondant dans l'alphabet à une une lettre et voir cette dernière s'affichée. A vous de réaliser le code.

Voici celui que je propose :

Commentaires sur le code :
- Ligne 5 for(int i=65;i<91;i++) On veut que le tableau contienne l'alphabet en lettres majuscules. Or, d'après le tableau des caractères et symboles nationaux, la lettre A correspond à la valeur 65 et la lettre Z à la valeur 90. On fait donc commencer laboucle à la valeur 65 et on l'arrête avant la valeur 91.
- Ligne 7 alphabet[i-65]=i; On commence à remplir le tableau d'alphabet à partir de alphabet[0]. Puisque la variable i de la boucle a commencé à 65, alors on la baisse avec le -65 à 0. Quand i vaudra 66, on sera dans alphabet[1] et ainsi de suite.
- Ligne 12 cout << "La lettre correspondant est " << alphabet[number-1] << "\n"; On sait que pour obtenir la 5ème case du tableau, il faut demander alphabet[4] Or, le problème se pose aussi ici : si l'utilisateur demande une lettre, par exemple la première, il faut lui donner alphabet[0] C'est pour cela qu'on utiliser number-1

Maintenant, un autre exercice. Le programme que vous devez créez va demander à l'utilisateur 12 mesures réparties en 3 séries égales ; par exemple, "entrez la première mesure de la première série". Une fois ces mesures entrées, le programme affichera la moyenne de chacune des séries.

Le code que je propose est un peu particulier :

L'accent est mit sur l'automatisation complète du système. Si vous avez la même demande avec un programme de 12 séries chacune de 12 chiffres, plutôt que de marquer tous les cout imaginaires et possibles, on les gèrera avec des switch. Enfin, pour le calcul de la moyenne, dans les cas ou le nombre de mesures est beaucoup plus long on pourra utiliser une boucle. Voici un exemple de boucle envisageable dans notre cas :
for(int calcul(0);calcul<4;calcul++)
{
moyenne+=mesures[m][calcul];
}
moyenne/=calcul+1;


Aller au tutorial suivant (tutorial 6) >>