Académique Documents
Professionnel Documents
Culture Documents
Programmation CPP
Programmation CPP
Dune manire gnrale, lobjectif de la programmation est de permettre l automatisation dun certain nombre de tches, laide de machines particulires:
Informatique I
Introduction la programmation
Automates programmables
Un automate est un dispositif capable dassurer, sans intervention humaine, un enchanement doprations, correspondant la ralisation dune tche donne. Comme exemple dautomates, on peut citer: la montre, le rveil-matin, le ramasse-quilles (du bowling).
Lautomate est dit programmable lorsque lenchanement doprations effectues peut tre modifi volont, pour permettre un changement de la tche raliser, ou un changement dans la manire de raliser cette tche. Dans ce cas, la description de la tche accomplir se fait par le biais dun programme , cest--dire une squence dinstructions et de donnes susceptibles dtre traites (i.e. comprises et excutes) par lautomate. Comme exemples dautomates programmables, citons: le mtier tisser Jacquard, lorgue de barbarie, ..., et naturellement lordinateur.
Informatique I
Introduction la programmation
programme
tche
Informatique I
Introduction la programmation
Programmer cest...
En rsum, programmer cest donc dcomposer la tche automatiser sous la forme dune squence dinstructions et de donnes adaptes lautomate utilis.
Ds lors, voyons quelles sont ces instructions et donnes adaptes, dans le cas o lautomate programmable est un ordinateur.
Informatique I
Introduction la programmation
Le jeu dinstructions (~ langage) que lordinateur est capable de traiter est donc tout naturellement dtermin par le processeur.
Les instructions comprises par un processeur sont appeles les instructions machine de ce processeur. Le langage de programmation qui utilise ces instructions est appel le langage machine .
Informatique I
Introduction la programmation
Mettre en correspondance la reprsentation externe des oprations et des donnes avec leur reprsentation sous la forme dune squence de bits sappelle le codage .
Le codage permet donc lordinateur de manipuler des donnes de nature
Informatique I
Introduction la programmation
Au cours du temps, diffrents types de langages de programmation firent leur appartition, et furent regroups [entre autres] en gnrations
Bien quil sagisse dune classification diffrente de celle des machines, les gnrations de langages sont, du moins pour les premires, lies sur le plan chronologique aux gnrations de machines, et aux performances de leurs composants
Informatique I
Introduction la programmation
1 re Gnration
Au dbut tait le langage [de la] machine . 1
Dans le cas des ordinateurs de premires gnrations, la mmoire nest pas encore utilise pour le stockage du programme. Celui-ci est plac sur des cartes et/ou rubans perfors, voir mme totalement volatile , 1 i.e. entr la main laide de panneaux de commutateurs.
On limagine facilement, la production des programmes tait fastidieuse, et leur relecture et modification presque impossible. Par ailleurs, les programmes crits pour une machine ne pouvaient pas tre excuts sur une autre.
Informatique I
Remarquons que la technique des cartes ou rubans perfors a perdur jusqu nos jours (dans des secteurs trs cibls): cest un moyen de stockage de linformation passablement souple, qui offre surtout une trs grande fiabilit en milieu hostile .
1. Notamment en ce qui concerne lamorage du systme, et la connexion/prise en charge du systme de lecture de cartes.
Introduction la programmation
2 me gnration (1)
Puis vint le langage dassemblage .
Afin de rendre les programmes plus faciles crire et corriger, on a rapidement song remplacer les squences de bits par des symboles, les instructions machines tant codes par des mnmoniques et les donnes par les caractres alphanumriques associs.
Informatique I
Introduction la programmation
2 me gnration (2)
Lapparition de priphriques de saisie (clavier) et de visualisation (cran) permet une criture respectivement lecture plus ergonomique des squences de 0 et de 1, sous la forme de squences alphanumriques. Avec lide de Von Neumann denregistrer dans la mmoire le programme excuter ainsi que ses donnes, il devient galement envisageable de faire subir ce programme des traitements avant son excution (prtraitements).
La reprsentation en mmoire du programme en langage dassemblage devient ainsi
elle-mme une donne, pouvant tre traite par un programme spcifique nomm assembleur, dont le rle est sa traduction en langage machine.
Langage dassemblage Langage machine
Codage
LOAD 6 5
L O A D _ 6 _ 5
Assembleur
Format symbolique
Informatique I
Introduction la programmation
10
Code
0000 0001 0011 0100 0101 1111
NOP
Syntaxe
Dfinition
Opration neutre (ne fait rien) Compare la valeur stocke ladresse [addresse] avec la valeur [valeur]. Lexcution se poursuit ladresse courante + 1 en cas dgalit, + 2 sinon. Dcrmente de 1 la valeur stocke en [addresse] Lexcution se poursuit ladresse courante + [saut] Charge la valeur [valeur] ladresse [adresse] Fin dexcution
CMP [adresse] [valeur] DECR [adresse] JUMP [saut] LOAD [adresse] [valeur] END
Code machine
1101 0000 0010 0011 0101 0110
Informatique I
Introduction la programmation
11
6 5 6 0 +3 6 -3
; ... ; ...
01 02 03 04 05 06
Assembleur
mnmoniques
instructions oprateurs arguments oprandes
donnes
adresses
segment de donnes
Informatique I
Introduction la programmation
12
I 0 fin-PC I test-PC 5
Dtermine, lors de la compilation, la valeur du saut relativement la position courante PC Dnit la variable I, et linitialise avec la valeur 5 (lors de la compilation)
00 01 02 03 04 05
Informatique I
Introduction la programmation
13
3 me gnration
Dans la lance apparurent les langages volus . Le but est de fournir au programmeur la possibilit dutiliser des instructions et des structures de donnes de plus haut niveau , afin de rendre plus facile lcriture des programme et damliorer la productivit.
Ces langages sont plus accessibles,
plus proches de notre manire de penser et de conceptualiser les problmes. Les langages volus sont nombreux, et il ne cesse den apparatre de nouveaux. Citons titre dexemple: BASIC, Fortran, Cobol, C, Pascal, Modula-2, Ada, OccamII, Portal, ...
Informatique I
Introduction la programmation
14
ANSI C
/* Ceci est un commentaire */
10 END
Informatique I
Introduction la programmation
15
4 me gnration
Paralllement aux langages volus, des langages encore plus spcialiss , voir des mta-langages , ont fait leur apparition.
On peut par exemple citer les langages dintelligence artificielle (Lisp, Prolog), les langages objets (Smalltalk, Eiffel), certains langages de gestion (L4G), ...
Informatique I
Introduction la programmation
16
Les programmes qui convertissent un programme quelconque crit dans un langage source en un programme crit dans un langage cible sont appels traducteurs .
Selon ses caractristiques, un programme traducteur est appel un assembleur, un compilateur 2 ou un interprteur ; lensemble des instructions et donnes de plus haut niveau que le traducteur est capable de traiter constitue un langage de programmation.
1. Ce qui na rien voir avec la Programmation [Oriente] Objet ! 2. Equivalent dun assembleur, mais fonctionnant avec un langage source volu (non assembleur).
Informatique I
Introduction la programmation
17
Un langage de programmation est donc un moyen formel permettant de dcrire des traitements (i.e. des tches effectuer) sous la forme de programmes (i.e. de squences dinstructions et de donnes de haut niveau, cest--dire comprhensibles par le programmeur) et pour lequel il existe un traducteur permettant lexcution effective des programmes par un ordinateur.
Les aspects syntaxiques (rgles dcriture des programmes) et smantiques (dfinition des instructions) dun langage de programmation doivent tre spcifis de manire prcise, gnralement dans un manuel de rfrence.
Informatique I
Introduction la programmation
18
Informatique I
Introduction la programmation
19
Naturellement, chacune de ces techniques possde des avantages et des inconvnients, qui la rend plus ou moins adapte suivant le contexte:
De manire gnrale, on peut dire que les langages interprts sont bien adapts pour le dveloppement rapide et le prototypage : le cycle de test est plus court quavec les langages compils, il est souvent possible de modifier/rectifier le programme en cours dexcution (test), et ces langages offrent gnralement une plus grande libert dcriture .
Informatique I
Introduction la programmation
20
Informatique I
Remarquons finalement que la compilation permet la diffusion du programme sous sa forme oprationnelle, sans imposer pour autant sa diffusion sous forme conceptuelle (lisible et comprhensible par un humain)
Introduction la programmation
21
Le Langage C++
Dvelopp dans les laboratoires d AT&T Bell au dbut des annes 1980 par Bjarne Stroustrup , le langage C++ est un langage:
typage fort , compil (impratif), et orient objet (POO 1 ).
Effets indsirables et comportement peu intuitif, Programmes exempts de bogues syntaxiques, et consquence de la production automatique de code [un peu] plus robuste, grce au typage fort Syntaxe parfois lourde et peu naturelle Applications efcaces grce la compilation Le langage ne dnit pas de techniques de Compilateur disponible sur pratiquement toutes les rcupration automatique de mmoire (garbage plate-formes et documentation abondante, grce sa collector), de multiprogrammation ou de large diffusion. programmation distribue.
1. Acronyme de Programmation Oriente Objet. Remarquons toutefois que C++ nest pas purement objet (comme le sont par exemple Eiffel ou Smalltak) mais est un langage hybride: on peut trs bien programmer en C++ sans pour autant programmer par objets, cest dailleurs ce qui sera fait pendant tout le premier semestre de ce cours.
Informatique I
23
Compilation en C++
Pour pouvoir tre compil en une squence binaire excutable, le code source doit fournir au compilateur un point dentre .
Par convention, ce point dentre est en C++ une fonction intitule main : Compilateur C++
chier source
chier excutable
hello.cc
hello
0100100101000101110101001 1010101010010100101001010 0000101010100000010001000 0001001001110101010010011 1001000000000000100101011 ...
#include <iostream> void main() { cout << "Hello World !" << endl; }
Informatique I Introduction C++ (I)
24
Ce programme va progressivement tre enrichi... et en particulier, on peut y ajouter des commentaires, qui en C++ peuvent revtir 2 formes diffrentes:
C OMMENTAIRES // // // //
ORIENTS LIGNE :
de la forme // ...
Exemple de commentaires orient ligne, cest--dire commentaire dlimit gauche (//) seulement (implicitement dlimit droite par le caractre de fin de ligne)
Informatique I
25
de la forme /* ... */
/* Exemple de commentaire orient bloc, cest--dire commentaire dlimit gauche ET droite (le commentaire peut stendre sur plusieurs lignes) */
Informatique I
26
Donnes et traitements
Comme dans tout langage de programmation volu, C++ offre la possibilit de dfinir des donnes (aspect statique du langage), et mettre en uvre des traitements (aspect dynamique).
Laspect orient objet de C++ va ensuite permettre dintgrer donnes et traitements dans une structure unique, les objets . Cet aspect du langage sera dvelopp au cours du second semestre.
donnes traitements
Informatique I
27
si = 0 sinon
avec = b2 - 4c
Informatique I Introduction C++ (I) 28
void main() { float b(0.0); float c(0.0); float delta(0.0); cin >> b >> c; delta = b*b - 4*c; if (delta < 0.0){ cout << "Pas de solutions relles !" << endl; } else if (delta == 0.0) { cout << "Une solution unique: " << -b/2.0 << endl; } else { cout << "Deux solutions: [" << (-b-sqrt(delta))/2.0 << ", " << (-b+sqrt(delta))/2.0 << ] << endl; } }
Informatique I Introduction C++ (I)
29
Donnes
#include <cmath> #include <iostream> void main() { float b(0.0); float c(0.0); float delta(0.0); cin >> b >> c; delta = b*b - 4*c; if (delta < 0.0){ cout << "Pas de solutions relles !" << endl; } else if (delta == 0.0) { cout << "Une solution unique: " << -b/2.0 << endl; } else { cout << "Deux solutions: [" << (-b-sqrt(delta))/2.0 << ", " << (-b+sqrt(delta))/2.0 << ] << endl; } }
Informatique I Introduction C++ (I) 30
Variables: dfinition
Pour pouvoir tre utilise dans un programme C++, une donne doit tre associe une variable , cest--dire un lment informatique qui sera manipul par le programme. Une variable est dcrite laide de 3 caractristiques:
Sa valeur littrale : qui permet de dfinir sa valeur. Par exemple, si la donne est un nombre, sa valeur littrale pourra tre (selon les conventions de reprsentation): 123, -18, 3.1415, 2e-13, , 0x3A5, ... Son identificateur : qui est le nom par lequel la donne est dsigne dans le programme. Son type : qui correspond une classification de la donnes, par exemple en fonction des oprations qui peuvent lui tre appliques; cette caractristique sera dveloppe plus en dtails dans la suite du cours, et gnralise en la notion de classe.
Informatique I
31
2. Le compilateur ninterdit pas lutilisation dune variable non initialise, mais il exclut lutilisation de variables non dclares.
Informatique I
32
Dclaration
Les principaux types lmentaires dfinis en C++ sont:
bool int float char
: : : :
valeurs logiques vraie (true) et fausse (false) nombres entiers nombres rels caractres (alphanumriques)
Un identificateur de variable ou de constante peut tre nimporte quelle squence 3 compose de lettres, de chiffres ou du caractre soulign (_), et dbutant par une lettre ou le caractre soulign.
Exemple: x b3 TailleMax nb_etudiants
3. Remarquons toutefois quil existe certaines squences interdites, correspondant des mots rservs du langage.
Informatique I
33
Valeurs littrales
Valeurs littrales de type entier: 1, 12, ... Valeurs littrales de type rel: 0.0, 1.23, ... Remarquons que: 0.123 peut aussi scrire .123 12.3e4 correspond 12.3 . 10 4 (soit 1230000) 12.e-4 correspond 12.3 . 10 -4 (soit 0.00123) Valeurs littrales de type caractres: a, !, ... Remarques: le caractre est reprsent par \ le caractre \ est reprsent par \\4
Remarque: la valeur littrale 0 est une valeur dinitialisation qui peut tre affecte une variable de nimporte quel type lmentaire.
Informatique I
34
Dclarations et initialisation
Il est possible, en C++, daffecter une valeur une variable au moment de sa dclaration.
La syntaxe de la dclaration-initialisation est: < type > < identificateur > ( < valeur > ); O valeur est nimporte quel littral ou expression 5 du type indiqu.
Exemple: int i(2); float exemple_de_variable(3.1415); char c(a); int j(i); float x(2.0*exemple_de_variable);
Informatique I
35
En C++, la nature modifiable (variable) ou non modifiable (constante) dune donne peut tre dfinie lors de la dclaration-initialisation, au moyen du mot rserv const
Exemple:
La constante j de type entier est dclare, et initialise la valeur 2. Cette valeur ne pourra plus tre modifie par le programme , plus exactement toute tentative de modification sera rejete par le compilateur, qui signalera une erreur.
Informatique I
36
Exemple:
int i(3);
Informatique I
37
En C++, la syntaxe dune affectation est: < identificateur > = < valeur > ; o valeur est une valeur littral ou une expression de mme type que la variable rfrence par identificateur.
Exemple: i = 3;
Informatique I
39
cout <<
<expression1>
<<
<expression2>
<expressionn>;
affiche lcran 6 les valeurs des expressions Les chanes de caractres doivent tre indiques entre guillemets anglais " , tandis que les caractres simples sont eux indiqus entre apostrophes .
<expressioni>.
Les valeurs affiches ne sont, pas dlimites par dfaut (pas despaces sparateurs). Les dlimiteurs sont donc i n d i q u e r ex p l i c i t e m e n t , p a r exemple par ou " " .
Exemple
int a(1); cout << [ << -a << ", " << a << ] << end;
[-1, 1]
Informatique I
41
Avec linitialisation:
int i(2); float x(3.14);
linstruction:
cout << "=> " << 2*i+5 << ", " << x << endl;
=> 9, 3.14
Le manipulateur endl reprsente le retour de ligne . Il permet donc de passer la ligne suivante lors de laffichage.
Informatique I
42
cin <<
<var1>
<<
<var2>
<varn>;
permet lutilisateur de saisir au clavier 7 une liste de valeurs val1, val2, ..., valn qui seront stockes dans les variables <vari>.
Exemple
Avec linitialisation:
int i; double x;
linstruction:
cin >> i >> x;
permettra de lire au clavier un entier suivi dun rel, et affectera lentier lu la variable i et le rel la variable x .
7. En ralit sur l entre standard (c.f. plus tard dans le cours).
Informatique I
43
Pour pouvoir utiliser les instructions dE/S, il faut inclure, en dbut de p r o g r a m m e , l e fi c h i e r h e a d e r iostream, au moyen de la directive:
#include <iostream>
L e m a n i p u l a t e u r flush p e r m e t d a s s u r e r l a ffi c h a g e d e l a l i g n e courante, en labsence de saut de ligne (il ordonne le vidage du tampon daffichage)
Informatique I
44
Exemples dexpressions
#include <cmath> #include <iostream> void main() { float b(0.0); float c(0.0); float delta(0.0); cin >> b >> c; delta = b*b - 4*c; if (delta < 0.0){ cout << "Pas de solutions relles !" << endl; } else if (delta == 0.0) { cout << "Une solution unique: " << -b/2.0 << endl; } else { cout << "Deux solutions: [" << (-b-sqrt(delta))/2.0 << ", " << (-b+sqrt(delta))/2.0 << ] << endl; } }
Informatique I Introduction C++ (I) 45
Les expressions sont des squences bien formes combinant (ventuellement laide de parenthses) des oprateurs et des arguments (qui peuvent tre des valeurs littrales, des variables ou des expressions). Par exemple: (2*(13-3)/(1+4)) est une expression numrique bien forme, alors que )3+)5*(-2 ne lest pas.
8. En fait, et on le verra par la suite, il est galement possible de dfinir les oprateurs arithmtiques pour des types non-lmentaires, comme par exemple les nombres complexes.
Informatique I
46
Le modulo est le reste de la division entire. Ces oprateurs sont tous associatifs gauche
Du fait que les oprateurs ont non seulement une syntaxe , mais aussi une dfinition opratoire , une expression peut tre value , cest--dire associe la valeur littrale correspondant au rsultat de lexpression. Ainsi, lvaluation de lexpression (2*(13-3)/(1+4)) correspond la valeur littrale de type entier 4.
Informatique I
47
(1)
(2)
(1)
(1)
(2)
2 (2 ((2 ((2
6
* * * *
3 3) 3) 3)
/ / / /
3 3 3 3)
% % % %
3 8
}
Introduction C++ (I)
valuations
Informatique I
48
Remarque:
C++ (tout comme C) fournit un certain nombre de notations abrges pour des affectations particulires:
Affectation
x = x + y idem pour {-,*,/,%} x = x + 1 idem pour {-}
Notation abrge
x += y ++ x9
9. Ou x++, la diffrence entre les deux notations sera explique dans les mini-rfrences.
Informatique I
49
Si a et b sont entiers , a/b est le quotient de la division entire de a par b. Exemple: 5/2 = 2 et a%b est le reste de cette division. Exemple:
5 % 2 = 1
Si a et/ou b est rel , a/b est le rsultat de la division de a par b. Exemple: 5.0/2 = 2.5
Informatique I
50
Expressions logiques
A
10 Au
sens strict, une expression logique (ou condition ) est une expression boolenne (i.e. de type boolen ), cest--dire une expression qui peut avoit comme rsultat : soit la valeur vraie ( true ) dans ce cas on dit que la condition est vrifie soit la valeur fausse ( false ) et dans ce cas, la condition nest pas vrifie .
E n fa i t , l a d fi n i t i o n d u l a n ga g e C + + p e r m e t d e c o n s i d r e r c o m m e ex p r e s s i o n l o g i q u e u n e ex p r e s s i o n d e n i m p o r t e q u e l t y p e , ave c l a convention suivante: si lvaluation de lexpression est une valeur nulle , elle sera considre comme une condition fausse , sinon elle sera considre comme une condition vraie .
sont 10 :
Exemples dexpressions simples: true, 1, (2+2) sont des expressions values comme vraies . false, (16%2), 0.0 sont des expressions values comme fausses .
10. Il existe une valeur nulle supplmentaire: la valeur void; nous la verrons plus tard dans le cours, lorsque nous aborderons la notion de pointeurs.
Informatique I
51
Oprateurs de comparaison
Des conditions logiques plus complexes peuvent tre construites, laide doprateurs spcifiques: les oprateurs de comparaison et les oprateurs logiques .
Les oprateurs de comparaisons (galement appels oprateurs relationnels ) sont (dans leur ordre de priorit dvaluation): .
Oprateur
<
Opration
strictement infrieur infrieur ou gal strictement suprieur suprieur ou gal galit diffrence (non-galit)
<=
>
>= == !=
Exemples de conditions correspondants des expressions relationnelles: (x >= y) (x+y == 4) ((x > y) == (y > z))
Informatique I Introduction C++ (I) 52
Opration
NON logique (ngation) ET logique (conjonction) OU logique Toujours selon leur ordre de priorit dvaluation.
((z != 0) && (2*(x-y)/z < 3)) ((z) && (2*(x-y)/z < 3)) ((x >= 0) || ((x*y > 0) && !(y*z > 0)))
Informatique I
53
Les oprateurs logiques ET, OU et NON sont dfinis par les tables de vrits usuelles:
X v v f
f
Y v f v
f
non X f f v
v
x ET y v f f
f
x OU y v v v f
Informatique I
54
et ne sont valus que les arguments strictement ncessaires la dtermination de la valeur logique de lexpression.
Plus prcisment: dans lexpression conditionnelle: (X1 && X2 && ... && Xn), largument Xi nest valu que si les arguments Xj ( j<i) sont tous vrais: lvaluation se termine au premier Xj faux rencontr, auquel cas lexpression toute entire est fausse (si un tel Xj nexiste pas, lexpression est naturellement vraie ) dans lexpression conditionnelle: (X1 || X2 || ... || Xn), largument Xi nest valu que si les arguments Xj ( j<i) sont tous faux: lvaluation se termine au premier Xj vrai rencontr, auquel cas lexpression toute entire est vraie (si un tel Xj nexiste pas, lexpression est naturellement fausse )
Informatique I
55
La notion dvaluation paresseuse est trs utile pour construire des expressions logiques dans lesquelles lvaluabilit de certains arguments peut tre conditionne par les arguments prcdents dans lexpression.
Dans ce cas galement, une valuation complte conduirait une erreur lors du calcul de log(x) pour tout x infrieur ou gal 0. Dune manire gnrale, il est toujours bon dconomiser du temps
11. Notez que dans ce cas particulier, on pourrait contourner lobstacle en testant lexpression quivalente: ((x>0) && (4 > 3*x)) || ((x<0) && (4 < 3*x))
Informatique I
56
Le branchement conditionnel: if La slection choix multiples: switch La boucle : while L itration : for
Toutes ces structures vont de plus utiliser la notion [importante] de bloc dinstructions .
Informatique I
58
Squence ou bloc
Pour pouvoir tre utilise, les instructions dun programmes C++ doivent tre regroupes en entits 1 appeles squences dinstructions ou blocs .
Ces squences sont explicitement dlimite par les accolades { et } :
Par convention, on alignera les accolades lune sous lautre 2 , et on indentera la squence dinstructions correspondant au bloc.
1. Parfois imbriques les unes dans les autres 2. Il existe cependant de nombreux cas o il parat judicieux de ne se plier cette convention. Ainsi, dans la suite du cours elle ne sera parfois pas respecte, pour des raisons de prsentation (lespace disponible sur un transparent tant passablement restreint).
Informatique I
59
Lexpression <condition> est tout dabord value. Si la condition est vrifie, la squence dinstructions <instructions1:...> est excute; sinon, cest lventuelle squence alternative <instructions2:...>, introduite par le mot rserv else , qui sera excute.
Exemple if (x != 0) {cout << 1/x << endl;} else {cout << "Erreur! (Infinity)" << endl;}
Informatique I
60
Lexpression <condition 1> est tout dabord value; si elle est vrifie, le bloc <instructions 1:...> est excut, et les alternatives ne sont pas examine. Sinon (1 re condition non vrifie), cest lexpression <condition 2> qui est value, et ainsi de suite. Si aucune des N conditions nest vrifie, et que la partie optionnelle else est prsente, cest le bloc <instructions par dfaut> associ qui sera finalement excut.
} [else {
<instructions par dfaut>
}]
Informatique I
61
Lexpression <expression> est value, puis compare successivement chacune des valeurs 3 <Constantei> introduites par le mot rserv case. En cas dgalit, le bloc (ou linstruction) associe est excute. Dans le cas o il ny a aucune <Constantei> gale la valeur de lexpression, lventuel bloc introduit par le mot rserv default est excut.
3. Pour spcifier ces valeurs, on ne peut uniquement utiliser des expressions constitues de valeurs littrales ou de constantes (lexpression doit tre valuable lors de la compilation)
Informatique I
62
// excut uniquement lorsque // (a+b) vaut 0 // lorsque (a+b) vaut 2 ou 3 // lorsque (a+b) vaut 2,3,4 ou 5 0; // dans tous les autres cas.
Lorsque lexcution des instructions dun case est termine, le contrle ne passe pas la n du switch, mais continue lexcution des instructions suivantes (mme si leur valeur associe nest pas gale lexpression de slection). Pour provoquer la terminaison de linstruction switch, il est ncessaire de placer explicitement une instruction break.
Informatique I
63
La squence dinstructions <actions> est excute tant que lexpression de continuation a posteriori <condition> est vrifie.
Exemple do { cout << "valeur de i (>=0): "; cin >> i; cout << "=> " << i << endl; } while (i<0);
Informatique I Introduction C++ (II) 64
Tant que lexpression de continuation a priori <condition> est vrifie, la squence dinstructions <actions> est excute.
Exemple while (x>0) { cout << x; x /= 2; }
Informatique I
65
{
<actions> <mise jour>;
} }
Informatique I
66
Il est noter que la variable de contrle de la boucle ( i ) est dclare et initialise dans la clause for.
Lorsque plusieurs instructions dinitialisation ou de mise jour sont ncessaires, elles sont spares par des virgules (et sont values de la gauche vers la droite)
0 1 2 3 4 5 0 0 1 3 6 10
for (int i(0),s(0); i<6; s+=i,++i) { cout << i << s << endl; }
Informatique I
67
Informatique I
68
while (condition) { ... /* actions de la boucle */ ... break ... continue ... } /* actions suivant la structure de contrle */
Informatique I
69
Utilisation de break:
Utilisation de continue:
/* une faon de simuler une boucle avec condition darrt: */ while (true) { /* actions */ if (<condition darrt>) { break; } }
for (int x = 0; x<100; ++x) { /* actions excutes pour tout x entre 0 et 99 incl */ if (x%2) { continue; } /* action excutes pour tout x impair /* }
Informatique I
70
les variables dclares lintrieur dun bloc seront appeles variables locales au bloc; elles ne sont accessibles (rfrenables) qu lintrieur de ce bloc; les variables dclares en dehors de tout bloc seront appeles variables globales au programme; elles sont accessibles dans lensemble du programme.
La portion de code dans laquelle une variable est utilisable est appele la porte (ou visibilit 4 ) de la variable, et stend usuellement de la dclaration de la variable jusqu la fin du bloc dans lequel est faite la dclaration
4. La visibilit effective dune variable sera conditionne par des rgles de masquage qui seront vues plus loin dans le cours.
Informatique I
71
// dclarations globales int z(0); ... void main() { // dclaration locales int x,y; ... { // dclaration locales int y; ... x ... ... y ... ... z ... } ... y ... ... z ... }
// dbut du programme int z(0); ... void main() { // bloc niveau 1 int x,y; ... { // niveau 2 int y; ... x ... ... y ... ... z ... } ... y ... ... z ... }
Informatique I
72
for (int i(0); i<10; ++i) { int j(0); cout << i << j << endl; }
int i(0); while (i<10) { int j(0); cout << i << j << endl; ++i; }
Informatique I
73
le programme
const int MAX(5); void main() { int i(120); for (int i(1); i<MAX; ++i) { cout << i << endl; } cout << i << endl; }
donne en sortie:
1 2 3 4 120
Informatique I Introduction C++ (II) 74
le programme
const int MAX(5); void main() { int i(120); int j(0); while (j<MAX) { int i(0); ++j; cout << j << , << i << endl; i=j; } cout << j << , << i << endl; }
donne en sortie:
1,0 2,0 3,0 4,0 5,0 5,120
Informatique I
75
Si la tche ralise par le programme P doit tre excute plusieurs fois, une possibilit est de recopier P autant de fois que ncessaire... ... mais cest [videmment] une trs mauvaise solution !
1. On pourrait galement songer non pas un programme daffichage, mais une fonction mathmatique, telle que SinC(x), soit f ( x) = --------------
sin ( x ) x 76
Informatique I
il faut [manuellement] rpercuter chaque modification de P dans chacune de ses copies cest par consquent une source supplmentaire derreurs , et cela dgrade donc la fiabilit globale du programme.
Cela rduit la lisibilit globale du programme:
la taille du programme source est plus importante, ce qui concourt rendre les modifications et la traque des erreurs plus difficiles.
Cela augmente (de manire injustifie 2 ) la taille donc
loccupation mmoire du programme objet rsultant. Un langage de programmation doit donc fournir des moyens plus efficaces pour permettre la rutilisation de portions existantes de programmes.
2. Cette augmentation de taille est injustifie car il existe une alternative la duplication manuelle du code.
Informatique I
77
De faon image, une fonction est assimilable une expression, dont lvaluation (on dit l appel ) correspond lexcution de la portion de programme qui lui est associe, et produit une valeur (rsultat de lvaluation), la valeur de retour de la fonction.
Informatique I
78
x1
val = f(0.1,3,"ab");
x2 x3
{
Portion rutilisable de programme
f(x,2,"a");
rsultat valeur de retour
return ... }
fonction
Programme
interface de communication
Informatique I
79
Informatique I
80
Prototypage (1)
Tout comme dans le cas des variables, la mise en uvre dune fonction se fait en 2 tapes:
le prototypage ou spcification (quivalent de la dclaration des variables) la dfinition ou implmentation ( peu prs quivalent de linitialisation)
La syntaxe dun prototypage est: < type > < identificateur > ( < arguments > ); O type est le type de la valeur de retour renvoye par la fonction 3 , identificateur est le nom donn la fonction, et arguments est la liste des arguments formels, de la forme: type 1 id-arg 1 , type 2 id-arg 2 , ... , type n id-arg n
Exemple:
Informatique I
81
Prototypage (2)
Dans les prototypes de fonctions, les identificateurs des arguments sont optionnels, mais servent gnralement rendre plus lisible le prototype .
Ainsi, la fonction puissance spcifie prcdemment pourrait tre prototype (de manire quivalente pour le compilateur, mais nettement moins lisible) par:
float puissance(const float, float);
Comme dans le cas des variables, les fonctions ont une porte (et une visibilit). Ceci implique que toute fonction doit tre prototype avant dtre utilise. Les prototypes des fonctions seront ainsi toujours placs avant le corps de la fonction main.
Exemple: float puissance(const float base, float exposant); void main() { ... x = puissance(8.0,3.); ... }
Informatique I
82
Dfinition (1)
La dfinition permet laffectation dun corps (bloc dinstructions) au prototype de la fonction.
La syntaxe dune dfinition est:
<type> <identificateur>(<arguments>)
O corps de la fonction est le bloc dfinissant la fonction, et dans lequel les arguments formels jouent le rle de variables ou constantes locales , initialises avec la valeurs des arguments employs lors de lappel de la fonction.
Une instruction de rupture de squence particulire, return , permet de terminer la fonction en retournant comme rsultat de lexcution la valeur spcifie par valeur.
Informatique I
83
Dfinition (2)
Exemple: #include <iostream> // Prototypages .......................... float moyenne(const float x1, const float x2); // Dfinitions ............................... void main() { cout << moyenne(8.0,3.0) << endl; }
Informatique I
84
Dfinition (3)
Comme dans le cas des variables, il est possible de raliser le prototypage et la dfinition en une seule tape (dans ce cas la syntaxe est simplement celle de la dfinition)
On peut donc directement crire:
float moyenne(const float x1, const float x2) { return (x1+x2)/2.0; } void main() { cout << moyenne(8.0,3.0); }
Cependant, si pour les autres types de donnes il est recommand de toujours initialiser lors de la dclaration, il est prfrable, pour les fonctions, de raliser le prototypage et la dfinition en 2 oprations distinctes. 4
4. Llment prdominant est de rendre le code le plus lisible possible. A cet fin, il est souvent prfrable de regrouper les diffrentes dclarations en un endroit unique (typiquement en dbut de programme), et disposer ainsi dune sorte dindex dans lequel il est ais de retrouver le prototype dune fonction donne.
Informatique I
85
Pour une fonction f dfinie par: int f(t1 x1, t2 x2, ..., tn xn) { ... lvaluation de lappel fonctionnel f(arg1, arg2, ..., argn) seffectue de la faon suivante:
(1)
les arguments arg1, arg2,..., argn sont valus (de la gauche vers la droite), et les valeurs produites sont lies avec les arguments formels x1, x2,..., xn de la fonction f (cela revient concrtement raliser les affectations: x1=val1, x2=val2, ... , xn=valn), o val1, val2,..., valn sont le rsultat de lvaluation des arguments ( vali ( argi)); le bloc correspondant au corps de la fonction f est excut;
(2)
(3)
lexpression (entire dans notre cas) dfinie par le mot clef return est value, et est retourne comme rsultat de lvaluation de lappel fonctionnel.
Informatique I
86
void main(); int f(const int x); void main() { int y,z; ... z=f(y); ... } int f(const int x) { ... ... return (...); }
Informatique I
87
lappel fonctionnel:
La valeur de retour, correspondant lvaluation de lexpression appel fonctionnel, est donc: 3.94948974278
Informatique I
88
Quelle variable est rfrence par le i de linstruction cout << a*i << endl ?
5. Cela est bien naturel, puisque le corps dune fonction nest autre quun bloc.
Informatique I
91
Les arguments formels dune fonction constituent des entits internes sa dfinition. Les rfrences (non ambigus) des entits externes sont possibles 6 . Il est nanmoins prfrables de les viter, en explicitant systmatiquement toute rfrence une entit externe par le biais dun argument formel .
6. Une fonction modifiant des variables externes sera dite effet de bord, ce qui est fortement dconseill.
Informatique I
92
void main(); int f(const int x); int z; void main() { int x,y; ... ... z=f(y); ... }
... ...
... x ... ... y ... ... z ... }
Informatique I
93
Informatique I
94
La variable locale associe un argument formel pass par valeur correspond une copie locale de largument utilis lors de lappel de la fonction. Cest donc une entit distincte, mais de mme valeur littrale, et en consquence, les modifications ventuelles apportes largument formel lintrieur de la fonction naffectent pas la variable originale:
Les modifications effectues lintrieur de la fonction ne sont pas rpercutes lextrieur.
Informatique I
95
La modification de largument formel x effectue dans la fonction f() laisse inchange la valeur de la variable val utilise comme argument (associ x ) lors de lappel de la fonction.. De ce fait, il est tout fait possible dutiliser des valeurs littrales comme argument lors des appels aux fonctions [pour les arguments passs par valeur].
Informatique I
96
Le passage par rfrence doit tre explicitement indiqu. Pour ce faire, on ajoute le symbole & au type des arguments formels concerns (par exemple: int& , bool& , ...).
7. Ce type de variable est appel rfrence, do le nom de passage par rfrence.
Informatique I
97
Remarquons que dans le cas darguments passs par rfrence, les valeurs littrales ne peuvent tre utiliss comme arguments lors de lappel la fonction que pour des arguments formels dclars constants.
Informatique I
98
Une rfrence ne peut pas tre r-assigne. Une fois dclare, elle restera donc toujours associe au mme lment.
8. Il est possible de dclarer des rfrences constantes des variables, mais il nest pas permis de dclarer des rfrences simples des constantes.
Informatique I
99
La syntaxe pour dfinir des arguments avec valeur par dfaut est:
<type> <argument> = <valeur>
Informatique I
100
***** ++++++++
Dans le cas du premier appel ( afficherLigne(*)), la valeur du second argument ntant pas spcifie, celui-ci prend la valeur par dfaut 5. Par contre, il prend la valeur explicitement spcifie (8) dans le cas du second appel ( afficherLigne(+,8)).
Informatique I
101
Attention
Dans le cas dune fonction avec prototype et dfinition distincts, la spcification des arguments avec valeur par dfaut ne doit tre ralise que lors du prototypage . Les arguments avec valeur par dfaut doivent apparatre en dernier dans la liste des arguments de la fonction. Lors de lappel dune telle fonction, avec plusiqurs arguments avec valeur par dfaut, les arguments omis doivent tre les derniers de la liste des arguments optionnels.
Exemple: void f(int x, int y=2, int z=3); // prototype void f(int x, int y, int z) { ... } // dfinition ... f(1) <=> f(1,2,3) f(0,1) <=> f(0,1,3)
Informatique I Introduction C++ (III: fonctions) 102
Un tel mcanisme, appel surcharge [des fonctions], est trs utile pour lcriture de fonctions correspondant des traitements de mme nature, mais sappliquant des entits de types diffrents.
9. La signature dune fonction est donc similaire la notion dattribut identifiant dans le domaine des bases de donnes.
Informatique I
103
Les arguments avec valeur par dfaut ne font pas partie de la signature.
Introduction C++ (III: fonctions) 104
Informatique I
Algorithmique et rcursion
Pour un problme donn, par exemple le tri dune table, de nombreuses solutions algorithmiques peuvent tre applicables.
Le principe de lapproche rcursive est de ramener le problme rsoudre un sous-problme correspondant une instance rduite du problme lui-mme .
Informatique I
105
tri
entre: table de n lments sortie: table trie
tri
1 2 3 4
Informatique I
106
Somme entre: 3
Somme entre: 2
Somme entre: 1
Somme entre: 0
3+
Somme
entre - 1
2+
Somme
entre - 1
1+
Somme
entre - 1
0+
Somme
entre - 1
Informatique I
107
AlgoRcursif
entres: entree si condition de terminaison atteinte alors retourner une valeur de sortie sinon
Informatique I
108
3+
Somme
entre - 1
2+
Somme
entre - 1
1 1+
Somme
entre - 1
Informatique I
109
est:
tri_recursif
entre: tableau de n lments sortie: tableau trie si taille du tableau <= 1, le tableau est tri, et on peut le retourner sinon: tri_recursif du tableau priv de son dernier lment insertion du dernier lment la bonne place dans le sous-tableau tri
Informatique I
110
Une fonction qui, dans sa dfinition, fait appel elle-mme est appele une fonction rcursive 10
Pour tre effectivement utilisable, une fonction rcursive doit possder une condition darrt (conditionnant lexcution ou non de lappel rcursif)
10. Sur le plan syntaxique, une telle fonction nest pas diffrente des autres. La seule diffrence rside dans le fait que la dfinition de la fonction induit un cycle, par un appel elle-mme. Remarquons que lon appelle galement rcursives des fonctions couples (A appelle B qui appelle A).
Informatique I
111
Informatique I
112
Informatique I
113
int bonnePlace(const int index, vector<int>& table) qui retourne la bonne place de llment dindice index dans le tableau table void deplace(const int from, const int to, vector<int>& table) qui dplace llment dindice from vers lindice to, en dcalant les lments de table existant entre from et to
void triRecursif(vector<int>& table, const int from, const int to) { if (from == to) // un seul lment -> (sous-)table trie return; else { triRecursif(table, from, to-1); // appel rcursif deplace(to, bonnePlace(to, table), table); } }
Informatique I
114
triRecursif({3,2,1},0,0)
Informatique I
115
Cependant, de nombreux concepts plus sophistiqus ne se rduisent pas une seule entit lmentaire...
Informatique I
116
hauteur
Si lon ne dispose que de type lmentaires, ces grandeurs seront reprsente indpendamment lune de lautre, et leur relation devra tre indique par le programmeur, par exemple au moyen didentificateurs tels que: rectangle_largeur et rectangle_hauteur. Afin dviter au programmeur davoir assurer la cohsion des entits composites, un langage de programmation doit fournir le moyen de combiner les type lmentaires pour construire et manipuler des objets informatiques plus complexes. Ces types non lmentaires sont gnralement appels types composs .
Informatique I Introduction C++ (IV: types complexes) 117
Rectangle
longueur
20
hauteur
1.75
age 20 35 26 38 22
indice
nom du tableau
En C++, les tableaux sont des ensembles dun nombre fixe dlments:
de mme type, appel type de base (le tableau est donc une structure homogne ); rfrencs par un mme identificateur, lidentificateur du tableau ; individuellement accessibles par le biais dun indice .
valeur du 2e lment
Le type de base est quelconque: il peut sagir de nimporte quel type, lmentaire ou compos. On pourra donc dfinir des tableaux dentiers, de rels, de caractres, ... et de tableaux.
Informatique I
118
Tableaux: dclaration
Un tableau de taille fixe peut tre dclar selon la syntaxe suivante:
< type > < identificateur > [ < taille > ]; Avec type nimporte quel type, lmentaire ou non, et taille une valeur entire littrale ou une expression entire constante (i.e. valuable lors de la compilation) Cette instruction dclare un tableau dsign par identificateur, comprenant taille lments de type type.
Exemple:
age age[0] age[1] age[2] age[3] age[4] 20 35 26 38 22
Informatique I
119
Tableaux: dclaration-initialisation
Naturellement, un tableau de taille fixe peut tre initialis directement, lors de sa dclaration.
La syntaxe est alors: 1 < type > < identificateur > [ < taille > ] = { < val 1 > , ... , < val n > };
Exemple: int age[5] = {20,35,26,38,22};
Remarquons que dans le cas dune dclaration-initialisation , la spcification de la taille du tableau est optionnelle . Ainsi, la dclaration-initialisation prcdente peut galement tre crite:
int age[] = {20,35,26,38,22};
1. Il est galement possible de ninitialiser que les premiers lements du tableau, comme dans: int age[5] = {20,35}.
Informatique I
120
Exemple:
Laccs au premier lment du tableau age sobtient au moyen de lexpression: age[0], et laccs au dernier lment par age[4], comme dans:
age[0] = 3; age[4] = age[1+2]; // soit age[4] = age[3]
2. Indice qui peut tre une expression numrique. 3. Pour tre tout fait prcis, on naccde pas aux lements en spcifiant un rang, mais un dplacement (une distance, dont lunit est llment/exprime en nombre dlments), relativement au premier lment du tableau. Cest pour cela que lindiage dbute 0 et non 1.
Informatique I
121
pourrait tre utilise pour reprsenter la chane "bonjour". Cependant, comme une chane de caractres tant un lment de taille variable, il faut lui associer une information permettant den retrouver la longueur. A linverse de langages comme Pascal , C++ ne code pas explicitement cette longueur, mais dlimite la chane par un caractre spcial \0 , marquant la fin de la chane. La chane "bonjour" sera donc implmente par:
char mot[8] = {b,o,n,j,o,u,r,\0};
Une telle reprsentation des chanes, hrite du langage C, comme inconvnient de fixer la taille de la chane de caractres.
Cette manire de procder impose un certains nombre de contraintes lors doprations sur les chanes de caractres (par exemple laffectation, la concatnation de deux chanes, etc.) Ceci non seulement diminue lefficacit de ces traitements, mais surtout oblige les programmeurs effectuer eux-mmes un certain nombre de manipulations dans le cas doprations sur les chanes qui ne sont pas fournies dans les librairies standards.
Pour pallier ce dfaut, on pourra utiliser, comme nous le verrons plus loin dans le cours, un type issu de lapproche objet de C++, le type string
4. Cette instruction est effectivement quivalente celle vue prcedemment (incluant le caractre \0)
Informatique I
123
cube[0][1][2]
5. En fait, les tableaux informatiques correspondent aux vecteurs mathmatiques, et les tableaux de tableaux des matrices.
Informatique I
124
Les tableaux multidimensionnels sont naturellement initialisables lors de leur dclaration, et chaque lments est accessible individuellement.
Exemple: int matrice[4][3] = {{0,1,2},{3,4,5},{6,7,8},{9,10,11}}; matrice[2][1] = 70;
matrice[][j] matrice[i][]
0 3 6 9 1 4 70 10 2
5
Dans les deux cas, il faut spcifier autant dindices quil y a de dimensions dans le tableau.
8 11
Informatique I
125
Tableaux: sizeof
C++ fournit un oprateur unaire (i.e. 1 argument), sizeof , qui retourne la taille de son oprande, compte en octets.
sizeof( < oprande > )
oprande pouvant tre un type quelconque 6 ,
notamment un tableau, il est possible dutiliser cet oprateur pour dterminer automatiquement le rang du dernier lment dun tableau, et viter ainsi les ennuis causs par un dpassement des limites du tableau:
typedef float vecteur; vecteur v[5] = {0.1, 0.1, 0.3, 0.0, -0.3}; // Affiche le contenu du vecteur v, du dernier lment au // premier, en les sparant par un espace. for (int i(sizeof(v)/sizeof(float)); i>0; --i) { cout << v[i] << ; }
6. Il peut galement sagir dune variable ou une constante, ainsi que dune expression.
Informatique I
126
Informatique I
127
Il sagit dune dclaration de variable ( age) tout fait traditionnelle, dans laquelle la squence vector<int> correspond lindication du type de la variable, en loccurence un tableau dynamique ( vecteur ) dentiers. On voit dans ce cas clairement ressortir la nature composite du type.
Informatique I
128
vector<int> age(5); Correspond la dclaration dun tableau dentiers, initialement compos de 5 lments valant 0.
Informatique I
Exemple:
(b)
vector< type > identificateur ( id-vector ); o id-vector est un identificateur de vecteur de type de base type.
vector<int> vect2(vect1); dclare le vecteur dentiers vect2, avec un contenu initial identique au contenu de vect1 (duplication).
Exemple:
10. Contrairement au cas des tableaux de taille fixe, il nexiste pas de moyen simple pour exprimer la valeur littrale dun vecteur dont les lments nont pas tous la mme valeur.
Informatique I
130
Vecteur : constante
Comme pour tous les autres types, il est possible de dclarer des constantes de type vecteur
La syntaxe est identique celle des autres dclarations de constantes:
const vector< type > identificateur ( initialisation ); identificateur correspond alors un vecteur dont tant le nombre dlments
que la valeur de chacun de ces lments sont fixes (et ne peuvent donc tres modifis).
Exemple: const vector<int> age; Correspond la dclaration dun vecteur constant vide (ne contenant aucun lment) et auquel aucun lment ne pourra tre ajout 11
const vector<int> vect2(vect1);
Il nest pas possible de dclarer des vecteurs de constantes. Ainsi, la syntaxe vector<const type> identificateur bien que licite en soit, nest en pratique pas utilisable.
11. Cette dclaration est bien sr totalement inutile.
Informatique I
131
Attention, dans le cas dune dclaration directe dune telle structure, il est obligatoire de sparer les >, prsents en fin de dfinition du type, par un espace 12 .
5 17 3 7 21 35 18 43 0 22 43 20 0 55 32 1 0 0 5 2 7 8 41 26 4 0 42 41 12
vector<vector<int> >
12. Cette contrainte est en fait une convention adopte pour distinguer ce typage de loprateur >>
Informatique I
132
Vecteur : affectation
Toute variable 13 de type
vector
identificateur = valeur;14
o valeur est une expression de mme type qu identificateur, notamment en ce qui concerne le type de base. Dans ce cas, la modification va porter sur lensemble des lments de la structure:
Exemple: // 1) Dclarations-initialisations vector<int> v1(4,1); vector<int> v2(3,2); vector<char> c3(2,a); // 2) Affectations ......... v2 = v1; v1 = vector<int>(3,8); c3 = vector<int>(4,7); // ILLEGAL
v1 v2 c3
1 1 1 1
2 2 2
a a
v1 v2 c3
8 8 8
1 1 1 1
a a
13. Sauf [naturellement] les constantes. 14. Parmis les oprateurs dfinis pour les vecteurs, on trouve en effet celui daffectation, i.e.
Informatique I
133
Diffrents moyens permettent daccder aux lments, et notamment lindexation comme dans le cas des tableaux de taille fixe:
Les lments dun vecteur de taille n sont sont numrots de 0 n -1. Dans le cas daccs via loprateur [] , Il ny a pas de contrle de dbordement du tableau !
Informatique I
134
Oprateur
<
Opration
strictement infrieur infrieur ou gal strictement suprieur suprieur ou gal galit diffrence (non-galit) comparaison lexicographique des lments.
<=
>
>= == !=
Informatique I
135
Un certain nombre doprations, directement lies laspect ensembliste des vecteurs, sont dfinies dans la librairie STL .
Lutilisation de ces oprations particulires, appeles mthodes 16 , se fait par le biais de la syntaxe suivante:
id-vector.id-methode(arguments);
Exemple:
individus.puch_back(jean);
comme effet dappliquer la mthode push_back, au vecteur individus, en prenant jean comme paramtre [de la mthode]. Comme les fonction, les mthodes peuvent ventuellement retourner une valeur.
16. Les mthodes sont des lments informatiques (squences dinstructions) issus de lextension objet de C++. Pour le moment, il vous suffit de les considrer comme des fonctions ayant une syntaxe dappel un peu particulire.
Informatique I
136
17. Par convention: - vect dsignera la variable vecteur pour laquelle la mthode est invoque; - base-type dsignera le type de base dun vecteur 18. Dans le cas o le sens de parcours est sans importance, on pourra avantageusement remplacer cette squence par cette autre, plus efficace: for (int i(vect.size()-1); i >= 0; --i) { ... }
Informatique I
137
Informatique I
138
base-type back () : renvoie une rfrence vers le dernier lment du vecteur Les squences vect.back() et vect[vect.size()-1] sont quivalentes. Prcondition : le vecteur nest pas vide (le prdicat empty() est faux). Exemple : remplir un vecteur dentiers, en demandant chaque valeur lutilisateur; le vecteur est considr comme plein lorsque lutilisateur entre la valeur 0. do { vect.push_back(saisirEntier) } while (vect.back());
Informatique I
139
Commande typedef
Lutilisation de variables dans un programme implique gnralement que lon spcifie plusieurs fois le type de ces variables (lors de la dclaration des variables, lors du prototypage des fonctions qui en font usage, lors de conversions, etc...)
Lorsque le type est complexe, sa dfinition peut tre ardue, et est gnralement longue, ce qui ne facilite pas la lecture du programme. En outre, les modifications ventuelles apporter la dfinition du type doivent tre opres sur chacune de ses occurences. Comme dans le cas des blocs dinstructions rutilisables (i.e. les fonctions), et pour les mmes raisons, la duplication de la dfinition dun type est viter. La commande typedef permet pour cela de dfinir des synonyme ( alias ) de types, quils soient fondamentaux ou composs:
typedef <type> <alias>;
Cette instruction permettra de dsigner le type type indiffremment par type, ou au moyen de lidentificateur alias ( typedef nintroduit pas de nouveau type, mais un nouveau nom pour le type)
Informatique I
140
Dans ces deux exemples, diametre, rayon et nbCercles sont tous de mme type ( int). Mais, si lon utilise longueur pour exprimer toutes les longeurs (programme de gauche), et que pour une raison quelconque on est amen changer la reprsentations des longueurs (p.ex. par des rels), il suffira doprer ce changement dans la dfinition de lalias longueur, plutt qu chaque occurence de int reprsentant une longueur.
typedef float longueur; longeur diametre, rayon; int nbCercles; ... void traceCercles(longueur d, longueur r, int nombre) { ... }
Informatique I
// pas de typdef // float diametre, rayon; int nbCercles; ... void traceCercles(float d, float r, int nombre) { ... }
141
Dans le cas des tableaux multidimensionnels, on peut se servir avantageusement de cette commande pour rendre plus explicite les dclarations et les usages ultrieurs:
typedef int Vecteur2[2]; // dnis le type Vecteur2 comme un tableau de 2 entiers typedef vector<int> GrilleLoto; // et GrilleLoto comme un ensemble dentiers typedef Vecteur2 Matrice3x2[3]; // dnit le type Matrice3x2 comme un tableau de 3 Vecteur2 typedef vector<GrilleLoto> BulletinLoto; // et BulletinLoto un ensemble de GrilleLoto Matrice3x2 A = {{1,2},{3,4},{5,6}} BulletinLoto fortune;
Informatique I
142
La classe string
Comme dans le cas des tableaux, le type natif ( built-in ) fourni par le langage pour la reprsentation des chanes de caractres (cest--dire un tableau de taille fixe, avec le caractre \0 comme marqueur de fin de chane) nest pas toujours trs pratique.
La librairie standard de C++ met donc disposition du programmeur un nouveau type (en ralit une classe ) dnomm string , permettant une reprsentation efficace des chanes, et offrant une large panoplie de fonctions ncessaires la manipulation et au travail avec de telles chanes:
concatnation de chanes, ajout/retrait dun ou plusieurs caractres, recherche de sous-chanes, substitution de sous-chanes, ...
Pour pouvoir utiliser des string dans un programme, il faut importer les prototypes et dfinitions contenus dans la librairie au moyen de la directive dinclusion: #include <string>
Informatique I
143
Comme pour tout les autres types, les variables correspondant des chanes de caractres string doivent tre dclares; la syntaxe est:
string identificateur ;
Exemple: #include <string> ... string chaine;
Les variables dclares suivant la syntaxe indique ci-dessus sont automatiquement initialises une valeur correspondant la chane vide.
Informatique I
144
La valeur littrale utiliser pour une initialisation explicite une chane vide est: "".
Informatique I
145
o valeur est: Exemple: string chaine; const string chaine2("test"); chaine = c; chaine = string("str-temporaire"); chaine = "built-in str"; chaine = chaine2; // // // // // // chaine chaine2 chaine chaine chaine chaine vaut vaut vaut vaut vaut vaut test c str-temporaire built-in str test soit un caractre (par exemple: i) soit une chane de la forme "..." soit une rfrence une autre entit de type string
Dans le cas de laffectation par un caractre, la valeur affecte la chane est une chane de caractre rduite ce caractre.
Informatique I Introduction C++ (IV: types complexes) 146
Les oprateurs relationnels suivant sont dfinis pour les chanes de type string:
Oprateur
<
Opration
strictement infrieur infrieur ou gal strictement suprieur suprieur ou gal galit diffrence (non-galit) La relation dordre utilise pour ces oprateurs est lordre alphabtique. (plus exactement, ordre lexicographique)
<=
>
>= == !=
Lordre alphabtique nest pas respect dans le cas des caractres accentus, et les majuscules sont considres comme prcdant les minuscules.
Informatique I Introduction C++ (IV: types complexes) 147
Toujours comme dans le cas des tableaux, les lments dune chane sont indics de 0 ( taille - 1), o taille est la longueur de la chane (cest--dire son nombre de caractres).
Informatique I
148
Concatnation de chanes
La concatnation de chanes de type string est ralise par loprateur +
Lexpression chaine1 + chaine2 correspond donc une nouvelle chane , dont la valeur littrale est constitue par la concatnation des valeurs littrales de chaine1 et de chaine2. Les combinaisons suivantes sont possibles:
string + string , string + char, string + "...", char + string , "..." + string ,
Informatique I
149
bool empty () : indique si la chane est vide (ou non). On a lquivalence suivante: str.empty() <=> (str.size() == 0)
19. Pour plus dinformations sur lappel de tels fonctions, se rfrer au chapitre prsentant les vecteurs. 20. Par convention, str dsignera la variable de type string pour laquelle la mthode est invoque
Informatique I
150
string& insert (int pos, const char[] s, int len) string& insert (int pos, const string& s, int start=0, int len=npos)21 Insre, partir de la position indie par pos, une sous-chane de s dbutant la position start (ou 0 dans le cas du premier prototype), et de longueur len. Une rfrence la chane modifie est retourne. Exemple : string("1234").insert(2,string("#$%-!"),3,1) utilise le second prototype 22 , et renvoie une rfrence la chane de type string et de valeur 12-34.
21. Une constante particulire, batise string::npos permet en effet de reprsenter la notion jusqu la fin de la chane. 22. Remarquons que grce la convertion automatique (casting) des chanes de forme "..." vers le type string, la commande peut galement scrire: string("1234").insert(2,"#$%-!",3,1).
Informatique I
151
string& replace (int pos, int long, const char[] s, int len) string& replace (int pos, int long const string& s, int start, int len)23 Substitue la sous-chane de long caractres et dbutant la position pos, par la sous-chane de s de len caractres et dbutant la position start (ou 0 dans le cas du premier prototype). Une rfrence la chane modifie est retourne. Exemple : cout << string("1234").replace(2,1,"-trois-",1,5) produira comme rsultat laffichage de la chane 12trois4 : les caractres de lintervalle [ pos , pos + long -1], soit le caractre [2,2], sont remplacs par la sous-chane de s [ start , start + len -1].
23. Avec les mmes valeurs par dfaut pour start et l que dans le cas de la mthode insert.
Informatique I
152
int rfind (char s, int pos = npos) int rfind (const char[] s, int pos = npos) int rfind (const string& s, int pos = npos) Retourne lindice du premier caractre de loccurrence de s la plus droite dans la chane, ventuellement prive de ses ( taille - pos) derniers lments (la recherche dbute partir de la position pos). Renvoie string::npos dans le cas o aucune occurrence nest trouve. Exemple : string("baabbaabbaab").rfind("ba") renverra 8
Informatique I
153
La mthode rfind effectue une recherche de la fin vers le dbut, en prenant comme fin la position ventuellement spcifie comme position de dpart. Ainsi, str. rfind(s, pos) consiste faire une recherche arrire de s dans la sous-chane prfixe de str et de longueur pos + 1:
s str
0 pos
Informatique I
154
les Chemin de Fer Fdraux voluent, cest--dire progressent. On utilise pour cela une table de correspondance entre les abbrviations (acronymes) et leur signification:
Acronyme
CFF c--d ...
Signification
Chemin de Fer Fdraux cest--dire ...
Informatique I
155
Entres-sorties en C++
En C++, les entres-sorties sont gres par le biais dun ensembles de type (classes) spcialiss, les flots ( streams ).
Lide de base des flots est de sparer laspect logique des entres-sorties (i.e. leur intgration dans des programmes) de leur aspect physique (i.e. leur ralisation par le biais de priphriques particuliers). Ainsi, un flot reprsente un flux de donnes entre le programme et un dispositif dentre-sorties externe (cran, imprimante, ...) ou un fichier. 24 Comme nous lavons dj vu, les oprations de sorties sont ralises laide de l oprateur dinsertion << , tandis que celle d entres le sont laide de l oprateur dextraction , >> . Il existe un certain nombre de variables prdfinies de type stream:
cin : flot li l entre standard , qui par dfaut est le clavier cout : flot li la sortie standard , qui par dfaut est la console cerr : flot li la sortie derreur standard , qui par dfaut est la console. 25
24. Notons que pour obtenir de meilleures performances, un tampon mmoire, par lequel les donnes transitent, est par dfaut associ chaque flot. 25. Remarquons que cerr na pas de tampon mmoire: toutes les donnes introduites sont immdiatement achemines vers la sortie derreur standard. Il nest donc pas ncessaire, pour ce flot, de demander explicitement le vidage du tampon mmoire au moyen de la commande flush.
Informatique I
157
Notion de persistance
Pour rendre disponibles aprs son excution les donnes produites par un programme, laffichage lcran (seule mthode vue jusqu prsent) nest naturellement pas adapt.
Il est par exemple ncessaire:
1) de rendre les donnes (rsultant de lexcution dun programme) disponibles en tout temps p o u r l u t i l i s a t e u r, e t d i ff u s a b l e s o u r u t i l i s a b l e s p a r d a u t r e p e r s o n n e s o u d a u t r e programmes. Exemple: lditeur XEmacs rend persistant le fruit de vos efforts sous la forme dun fichier texte, utilis entre autre par le compilateur qui produira galement un rsultat rutilisable, sous la forme dun fichier (binaire) excutable 26 . 2) dans le cas des programmes interactifs, permettre lutilisateur dinterrompre son travail (mettre momentanment fin linteraction avec le programme) et pouvoir le reprendre plus tard. Exemple: lditeur XEmacs qui vous permet de sauvegarder votre travail, et le poursuivre (reprendre) la semaine suivante 27 .
Pour assurer une telle persistance des donnes informatiques, on utilise la plupart du temps le systme de fichiers mis disposition par le systme dexploitation sous-jacent.
26. Dans ce cas, le format de sauvegarde des donnes (i.e. conventions de reprsentation, organisation) revt une importance particulire: il doit soit tre humainement comprhensible, soit correctement document ou respecter un standard, de manire pouvoir tre interprt par un autre logiciel. 27. Dans ce cas le format de reprsentation des donnes importe peu, et il nest en particulier pas ncessaire de lexpliciter (on parle de format interne).
Informatique I
158
out-stream
output.txt
Systme dexploitation
titi.log
in/out-stream iostr
Informatique I
159
Informatique I
160
ofstream sortie;
(2)
Association de la variable avec un fichier physique, par lappel de la fonction-mthode open, en respectant la syntaxe dappel dfinie dans le paragraphe concernant les vecteurs.
Exemple: entree.open("input.txt");
qui associe le stream entree avec le fichier nomm input.txt (prsent dans le rpertoire courant). (3) Utilisation du stream: par des appels des fonctions-mthodes, et lutilisation des oprateurs dinsertion ( >>) et dextraction ( <<) de donnes. Fermeture du stream, au moyen de la fonction-mthode close
Exemple: entree.close();
(4)
Informatique I
161
ifstream entree("input.txt");
La fonction open admet comme argument une chane de caractres de type "..." (en fait un char[]): il nest donc pas possible dutiliser directement une chane de type string29 . Il faut dans ce cas demander la conversion en type char[] du string, en faisant appel la fonction-mthode c_str:
Exemple:
Informatique I
162
Remarque: Une fonction utile pour tester si le lecture dun fichier est termine est la fonction-mthode eof.
if (entree.eof()) { cout << "Fin du fichier" << endl; }
Informatique I Introduction C++ (IV: types complexes) 163
Plus prcisment, un certain nombre de prdicats sont associs aux streams , et permettent den connatre ltat: 30
bool bool bool bool good() eof() fail() bad()
le stream est dans un tat correct, la prochaine opration (lecture/criture) sera un succs la n du stream t atteinte la prochaine opration (lecture/criture) chouera le stream est corrompu: des donnes ont t perdues (et la prochaine opration chouera)
Informatique I
166
Strings et Streams
Il peut parfois tre utile, en vue deffectuer des traitements particuliers, de disposer dune reprsentation sous forme de chane de caractres des diffrentes variables dun programme.
Une telle convertion de reprsentation est automatiquement ralise lorsque lon insre ces lments dans un stream de sortie, tel que cout. Mais peut-on rcuprer ce qui est transmis dans le flot ? A dfaut de rcuprer ce qui est effectivement transmis, on peut du moins en obtenir lquivalent sous forme de string, en utilisant des strings hybrides, associs des streams. Ces entits hybrides sont dsignes stringstream . Pour pouvoir utiliser les stringstream dans un programme, il faut importer les prototypes et dfinitions contenus dans la librairie, au moyen de la directive dinclusion: #include <sstream> 31
31. La version de gcc utilise dans le cadre du cours utilise une ancienne reprsentation de ces entits, pas tout fait compatible avec la nouvelle norme. Toutefois, une adaptation a t crite pour le besoin du cours, et place dans le rpertoire de la librairie standard.
Informatique I
167
stringstream de sortie
Pour obtenir la reprsentation alphanumrique dune variable, il faut utiliser un stringstream de sortie , dans lequel on insrera les donnes dsires (de la mme manire quavec cout ) avant den extraire lquivalent sous forme de chane de caractre.
Le type (la classe) matrialisant de tels lments est dsign: ostringstream, et lextraction de la reprsentation chane sobtient au moyen de la mthode:
string str () Exemple: #include <sstream> ... string composeMessage(const int errno, const string& description) { ostringstream ost; ost << "Erreur (n" << errno << "): " << description; return ost.str(); }
Informatique I
168
stringstream dentre
Il est galement possible de raliser des entres depuis un string (au lieu du clavier, avec cin ): il suffit dinitialiser un stringstream d entre avec la chane dsire, et dutiliser loprateur dextraction sur le stream ainsi obtenu.
Le type (la classe) utilis est: istringstream.
Exemple: #include <sstream> ... // Extrait les mots dun string, et les affiches // raison de un par ligne void wordByWord(const string& str){ istringstream ist(str); string s; while (ist >> s) {cout << s << endl;} } // en utilisant la fonction prcdante: wordByWord(composeMessage(5, "Fichier non trouv")); }
Informatique I
169
Manipulateurs:
Pour utiliser les manipulateurs, il faut au pralable importer les dfinitions du fichier iomanip au moyen de la directive dinclusion: #include <iomanip> On utilise les manipulateurs trs simplement, en les insrant directement dans le flot, lendroit dsir, exactement comme avec les donnes:
cout << donne << manipulateur << donne << ...
Informatique I
170
Caractre de remplissage: setfill(char) dfinit le caractre utilis pour pour raliser le remplissage lors dun alignement (par dfaut le caractre espace): cout << << cout << << cout << << setw(10) << "un:" setfill(.) << setw(5)<< 1; endl << setw(10) << "cent deux:" setfill(.) << setw(5) << 102; endl << setw(10) << "moins 18:" setfill(.) << setw(5) << -18;
Introduction C++ (IV: types complexes)
Informatique I
171
Prcision en virgule flottante: setprecision(int) dfinit le nombre de chiffres significatifs sur lequel se fera laffichage des nombre en virgules flottantes (par dfaut 6): for (int i(2); i<6; ++i) { cout << setprecision(i) << i << << 314.1592654 << endl; } 2 3 4 5 3.1e+02 314 314.2 314.16
Informatique I
172
Les options dfinies pour les streams de sorties sont configures laide de la fonction (mthode) setf, selon la syntaxe:
flot.setf(ios::option);
Quelques options:
Infos sur la base de reprsentation: showbase la base de reprsentation du nombre est affiche, en suivant les conventions de reprsentation des nombre littraux dans les programmes C++: cout.setf(ios::showbase); cout << "hexa:" << hex << 64 << endl; cout << "octal:" << oct << 64 << endl; cout << "decim:" << dec << 64 << endl; hexa:0x40 octal:0100 decim:64
Informatique I
173
Reprsentation fixe/scientifique: fixed, scientific dtermine un affichage en mode fixe (traditionnel) ou scientifique (en puissance de 10, avec 1 nombre devant la virgule): const float root(sqrt(200)); cout.setf(ios::fixed); cout << root << endl; cout.unsetf(ios::fixed); cout.setf(ios::scientific); cout << root << endl;
14.142136 1.414214e+01
Informatique I
174