




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.
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 :
|
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)
|
|
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
|
|
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) >>