Vous êtes sur la page 1sur 174

Quest-ce que la Programmation ?

Dune manire gnrale, lobjectif de la programmation est de permettre l automatisation dun certain nombre de tches, laide de machines particulires:

les automates programmables

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

Exemple dautomate programmable


automate

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

Instructions et langage machine


Nous lavons vu, un ordinateur est, en schmatisant lextrme, constitu:
dun [ micro ] processeur, capable dexcuter (raliser) un jeu donn doprations lmentaires. dune mmoire centrale , dans laquelle sont stockes les donnes en cours de traitement, ainsi que le programme lui-mme; de bus, ports dentres-sorties et priphriques;

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

Langage machine: format interne


 Pour que les oprations et les donnes manipules soient comprhensibles par le processeur, elles doivents tre exprimes dans le seul format quil peut prendre en compte: le format interne , qui est [presque 1 ] toujours un format binaire .
Ce format nutilise que deux symboles lmentaires

(gnralement 0 et 1 ) appels bits 2 .

 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

et de type divers sous la forme dune reprsentation unique.


1. Il y eu quelques tentatives pour construire des machines supportant dautre formats, en particulier en URSS le format ternaire. Si au niveau lectrique il y a un intrt certain disposer ainsi de trois tats (actif, inactif, neutre), cela ne concerne pas le niveau logique. Lavantage de la reprsentation binaire est quelle est techniquement facile raliser (au moyen de bistables), que les oprations fondamentales sont relativement simple effectuer sous forme de circuits logiques et que de plus, comme la dmontr Shannon, tous les calculs logiques et arithmtiques peuvent tre raliss partir de larithmtique binaire. 2. Contraction de lexpression anglaise binary digit.

Informatique I

Introduction la programmation

Les gnrations de langage

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.

Le nouveau langage ainsi produit sappelle un langage dassemblage , ou langage assembleur.


Exemple 0101 LOAD 0110 6 0101 5

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

01001100 01001111 01000001 01000100 10100000 00110110 10100000 00110101

Assembleur

0101 LOAD 0110 6 0101 5


Format binaire

Format symbolique

Informatique I

Introduction la programmation

10

Exemple de langage dassemblage (1)


Exemple de langage dassemblage: (machine mots de 4 bits et alignement sur 12) Mnmonique
NOP CMP DECR JUMP LOAD END

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

Codage des donnes: (codage sur 4 bits, en complment 2) Donnes


-3 0 2 3 5 6

Code machine
1101 0000 0010 0011 0101 0110

Informatique I

Introduction la programmation

11

Exemple de langage dassemblage (2)

Programme (langage assembleur)


commentaires

Programme (langage machine)


segment de code 00 010101100101

LOAD CMP JUMP DECR JUMP END

6 5 6 0 +3 6 -3

; ... ; ...

01 02 03 04 05 06

000101100000 010000110000 001101100000 010011010000 111100000000 000000000000

Assembleur
mnmoniques
instructions oprateurs arguments oprandes

donnes

adresses

segment de donnes

Informatique I

Introduction la programmation

12

Exemple de langage dassemblage (3)


 Un langage dassemblage tel que celui dcrit prcdemment est appel langage dassemblage pur, cest dire quil y a biunivocit entre les instructions machine et les mnmoniques (le code source en langage dassemblage comportent le mme nombre dlements (dinstructions) que le code machine rsultant). Les tout premiers assembleurs taient purs , mais cette proprit disparut rapidement, avec lapparition des langages offrant des macros-commandes (pour dfinir une seule fois des portions de codes frquentes) ainsi que des pseudo-instructions (rservation & initialisation de mmoire, chargement de modules spars,...). La traduction effectue par les assembleurs correspondants a permis de rendre le code portable (i.e. rutilisable, moyennant son assemblage, sur une autre machine), en masquant la couche matrielle ( abstraction de la machine ).
tiquettes

test: CMP JUMP DECR JUMP fin: END I: DD

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

000101010000 010000110000 001101010000 010011010000 111100000000 010100000000

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

Exemples de langages volus

Exemples de langage de programmation de haut niveau: Vieux BASIC


1 4 5 6 7 REM Ceci est un commentaire LET N = 5 IF (N = 0) THEN GOTO 10 ELSE LET N = N-1 GOTO 5 int n = 5; while (n != 0) do --n;

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

Langage de programmation (1)


Cependant, si nous utilisons des intructions sophistiques, comment les rendre comprhensible pour lordinateur qui doit les excuter ?  Nous lavons vu, une solution est de disposer dun programme capable de transformer une squence dinstructions de haut niveau (aussi appele code source ) en une squence dinstructions machine (aussi appele code objet 1 ou binaire ).

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

Langage de programmation (2)

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

Interprteur v.s. Compilateur (1)


Il est important de bien comprendre la diffrence entre traduction effectue par un assembleur ou un compilateur et celle ralise un interprteur.
Les compilateurs et assembleurs traduisent tous deux les programmes dans leur ensemble : tout le programme doit tre fourni au compilateur pour la traduction. Une fois cette traduction effectue, son rsultat (code objet) peut tre soumis au processeur pour traitement. Un langage de programmation pour lequel un compilateur est disponible est appel un langage compil . Les interprteurs traduisent les programmes instruction par instruction , et soumettent immdiatement chaque instruction traduite au processeur, pour excution. Un langage de programmation pour lequel un interprteur est disponible est appel un langage interpret .
Remarquons que pour certains langages (par exemple Lisp), il existe la fois des compilateurs et des interprteurs.

Informatique I

Introduction la programmation

19

Interprteur v.s. Compilateur (2)

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

Interprteur v.s. Compilateur (3)


 A linverse, les langages compils sont utiliser de prfrence pour les ralisations oprationnelles , ou les programmes de grande envergure : Les programmes obtenus sont plus efficaces : dune part, le compilateur peut effectuer des optimisations plus facilement que linterprteur, puisquil possde une visibilit globale sur le programme, et dautre part, leffort de traduction nest fait quune seule fois, qui plus est en prtraitement. Par ailleurs, la visibilit globale offerte au compilateur, alli une structuration plus rigoureuse et un typage plus ou moins contraint, permet une meilleur dtection des erreurs , lors de la compilation.

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

Varit des applications


Lutilisation de linformatique dans les 3 types dapplications calcul scientifique, gestion dinformations et commande de processus conduit la production dune grande diversit de programmes:
Petits utilitaires , drivers (librairie de fonctions permettant de piloter un matriel), et autre mini-programmes. Effort: ~ 1 2 personnes mois , de ~1000 10000 lignes de code (source), quipes dune deux personnes. Petits logiciels (maileur, gestionnaire de fichiers, agenda lectronique, ...) Effort: ~ 3 12 personnes mois , de 1000 50000 lignes, petites quipes de dveloppement (1 5 personnes). Progiciels , logiciels complet (traitement de textes, commande de central tlphonique,...) Effort: ~ 1 10 personnes ans , de 10000 1000000 lignes, quipes de dveloppement moyennes (de 5 20 personnes) Gros systmes (aronautique, systmes dexploitation, systmes experts, ...) Effort: ~ plus de 100 personnes ans , plusieurs centaines de millions de lignes de code, grosses quipes de dveloppement (plusieurs milliers de personnes).
Informatique I Introduction la programmation 22

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

Schmatiquement: C++ = C + typage fort + objets (classes)


Avantages Dfauts

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

Introduction C++ (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

commande: c++ hello.cc -o hello

hello
0100100101000101110101001 1010101010010100101001010 0000101010100000010001000 0001001001110101010010011 1001000000000000100101011 ...

#include <iostream> void main() { cout << "Hello World !" << endl; }
Informatique I Introduction C++ (I)

24

Structure gnrale dun programme C++ (1)


Le programme C++ le plus simple, ... et le plus inutile (puisquil ne fait rien) est:
void main () { }

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

Introduction C++ (I)

25

Structure gnrale dun programme C++ (2)


C OMMENTAIRES
ORIENTS BLOC :

de la forme /* ... */

/* Exemple de commentaire orient bloc, cest--dire commentaire dlimit gauche ET droite (le commentaire peut stendre sur plusieurs lignes) */

Une version commente du programme prcdent pourrait donc tre:


// Exemple de petit programme C++ ne faisant rien // (Le formattage nest bien sur l // que pour faciliter la lecture) void main () { /* corps du programme ( dfinir par la suite) */ }

Informatique I

Introduction C++ (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

Introduction C++ (I)

27

Exemple de programme C++ (1)


On veut raliser un programme qui rsout une quation du second degr: x2 + bx + c = 0 Pour b et c fixs, les solutions relles dune telle quation sont: b ---------------------- 2 b ---- 2 si > 0

si = 0 sinon

avec = b2 - 4c
Informatique I Introduction C++ (I) 28

Exemple de programme C++ (2)


#include <cmath> #include <iostream>
donnes traitements structures de contrle

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

Introduction C++ (I)

31

Dclaration et initialisation de variables


Dans les langages fortement typs comme C++, la cration dune variable se fait laide dune dclaration , et lassociation effective dune valeur la variable cre se fait laide dune initialisation .  Les dclarations doivent obligatoirement tre faites
avant toute utilisation de la variable;

 les initialisations doivent imprativement tre faites


avant toute utilisation de la variable 2 . En C++, la syntaxe de la dclaration dune variable est: < type > < identificateur > ; O type est lidentificateur du type de la variable dclare, et identificateur est lidentificateur de la variable.
Exemple: int i; float exemple_de_variable

2. Le compilateur ninterdit pas lutilisation dune variable non initialise, mais il exclut lutilisation de variables non dclares.

Informatique I

Introduction C++ (I)

32

Dclaration
Les principaux types lmentaires dfinis en C++ sont:
bool int float char

: : : :

les les les les

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

Introduction C++ (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.

4. Le caractre backslash \ est ainsi appel un caractre dchappement.

Informatique I

Introduction C++ (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);

5. La notion dexpression sera dfinie en dtail dans la suite du cours.

Informatique I

Introduction C++ (I)

35

Variables v.s. constantes

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:

const int j(2);

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

Introduction C++ (I)

36

Dclaration et initialisation de variables


En rsum, en C++ une donne est donc un lment informatique caractris par:
son type son identificateur sa valeur

dnis lors de la dclaration dnie lors de linitialisation

Exemple:

int i(3);

dclare une donne de type entier, didentificateur i et linitialise la valeur 3

Informatique I

Introduction C++ (I)

37

Premiers exemples de traitements


#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) 38

Une instruction simple: laffectation

 Linstruction d affectation consiste attribuer ( affecter ) une valeur une variable .

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

Introduction C++ (I)

39

Interagir avec lextrieur: entres/sorties


Les instructions dentres/sorties (E/S) permettent les interactions du programme avec son environnement (extrieur). Les mcanismes dE/S doivent en particulier donner au programmeur la possibilit:
De prendre en compte, au sein du programme, des donnes issues de lextrieur, comme des informations saisies au clavier ou lues dans des fichiers. requiert des fonctions spcifiques, appeles fonctions dentres , permettant dassocier des informations externes aux variables dfinies dans le programme. Dafficher des donnes lcran requiert des fonctions spcifiques, appeles fonctions de sorties , permettant de visualiser des valeurs, en spcifiant ventuellement un format daffichage. De sauvegarder les rsultats produits pour dventuelles rutilisations. requiert des fonctions spcifiques, appeles fonctions de lecture/criture , permettant de stocker les donnes produites par les programmes dans des fichiers , et de rcuprer ces donnes par la suite (notion de persistence des donnes).
Informatique I Introduction C++ (I) 40

Instructions dentres/sorties (1)


Instructions lmentaires pour laffichage lcran:

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]

6. En ralit sur la sortie standard (c.f. plus tard dans le cours).

Informatique I

Introduction C++ (I)

41

Instructions dentres/sorties (2)


Exemple dutilisation de cout :

Avec linitialisation:
int i(2); float x(3.14);

linstruction:
cout << "=> " << 2*i+5 << ", " << x << endl;

produira lcran laffichage suivant:

=> 9, 3.14

Le manipulateur endl reprsente le retour de ligne . Il permet donc de passer la ligne suivante lors de laffichage.

Informatique I

Introduction C++ (I)

42

Instructions dentres/sorties (3)


Instructions lmentaires pour la lecture au clavier:

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

Introduction C++ (I)

43

Instructions dentres/sorties (4)


Exemple de programme: #include <iostream> void main() { int i; double x; cout << "Valeurs pour i et x: " << flush; cin >> i >> x; cout << "=> " << i << ", " << x << endl; }

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

Introduction C++ (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

Oprateurs et expressions (1)


 En plus des instructions, tout langage de programmation fournit des oprateurs permettant de manipuler les lments prdfinis. Les dfinitions des oprateurs sont souvent troitement associes au type des lments sur lesquels ils sont capables doprer. Ainsi, les oprateurs arithmtiques ( +, -, *, /, ...) sont dfinis pour les types numriques (entiers et rels par exemple 8 ), et les oprateurs logiques ( !, &&, ||) sont dfinis eux (en particulier) pour les types boolens.

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

Introduction C++ (I)

46

Oprateurs et expressions (2)

Les oprateurs arithmtiques sont (dans leur ordre de priorit dvaluation):


* / % + multiplication division modulo addition soustraction

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

Introduction C++ (I)

47

Oprateurs et expressions (3)


Fonctionnement de lordre de priorit des oprateurs:

(1)

(2)

(1)

(1)

(2)

2 (2 ((2 ((2
6

* * * *

3 3) 3) 3)

- 21 - (21 - (21 -((21


7 3

/ / / /

3 3 3 3)

% % % %

4 + 5 4) + (5) 4))+ (5) 4))+ (5)

gestion des priorits

3 8

}
Introduction C++ (I)

valuations

Informatique I

48

Oprateurs et expressions (4)


Exemple dutilisation dexpressions pour laffectation: 9 Z = (x+3) % y; Z = (3*x+y)/10; Z = (x = 3*y)+2;

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

Introduction C++ (I)

49

Oprateurs et expressions (4)

Remarques propos de loprateur de division en C++:

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

donc, si a et b sont entiers , on a: (a/b)*b+(a%b) = a

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

Introduction C++ (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 .

Les valeurs nulles

sont 10 :

les zros numriques: 0 et 0. la valeur boolenne false

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

Introduction C++ (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

Oprateurs logiques (1)


Les oprateurs logiques permettent de combiner plusieurs conditions entre-elles.
Oprateur ! &&
||

Opration
NON logique (ngation) ET logique (conjonction) OU logique Toujours selon leur ordre de priorit dvaluation.

Exemples de conditions complexes:

((z != 0) && (2*(x-y)/z < 3)) ((z) && (2*(x-y)/z < 3)) ((x >= 0) || ((x*y > 0) && !(y*z > 0)))

indique 2 conditions logiquement quivalentes

Informatique I

Introduction C++ (I)

53

Oprateurs logiques (2)

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

Introduction C++ (I)

54

Evaluation paresseuse (1)


 Les oprateurs logiques && et || effectuent une valuation paresseuse ( lazy evaluation ) de leur arguments:
lvaluation des arguments se fait de la gauche vers la droite ,

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

Introduction C++ (I)

55

Evaluation paresseuse (2)


11

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.

Exemple: (x != 0) && 4/x > 3)

S i l va l u a t i o n n t a i t p a s p a r e s s e u s e , l a d t e r m i n a t i o n d e lexpression conduirait une erreur lorsque x vaut 0 (division par 0) 11


(x <= 0 || log(x) == 4)

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

Introduction C++ (I)

56

Structures de contrle (1)


#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++ (II) 57

Structures de contrle (2)


 Une structure de contrle sert modifier lordre linaire normal dexcution (i.e. le flux dexcution ) des instructions dun programme. Les principales structures de contrle sont:

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

Introduction C++ (II)

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 } :

{ int tmp(a); // change du contenu a = b; // de deux variables b = tmp; }

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

Introduction C++ (II)

59

Branchement conditionnel: if (1)


Le branchement conditionel est une structure de contrle qui permet la mise en uvre de traitements variables , dfinit par des conditions dapplications spcifiques (i.e. le traitement dalternatives ).
La syntaxe gnrale dun branchement conditionnel est:
if (<condition>) { <instructions1: si condition vrie> } [ else { <instructions2: si condition non-vrie> } ]
la notation [...] indique une partie optionnelle

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

Introduction C++ (II)

60

Branchement conditionnel: if (2)


Il est galement possible denchaner plusieurs conditions:
if (<condition 1>) {
<instructions 1: si condition 1 vrie>

} else if (<condition 2>) {


<instructions 2: si condition 2 vrie>

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 if (<condition N>) {


<instructions N: si condition N vrie>

} [else {
<instructions par dfaut>

}]

Informatique I

Introduction C++ (II)

61

Slection choix multiples: switch (1)


La slection choix multiples permet parfois de remplacer avantageusement un enchanement de branchements conditionnels, en permettant de slectionner une instruction en fonction des valeurs possible dune expression de type entier ou caractre.
La syntaxe gnrale dune slection choix multiples est:
switch (<expression>) { case <Constante1> : <instructions1> ; ... case <Constanten> : <instructionsn>; [ default : <instructions>; ] }

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

Introduction C++ (II)

62

Slection choix multiples: switch (2)


Exemple de slection switch (a+b) { case 0: a = b; break; case 2: case 3: b = a; case 4: case 5: a = 0; break; default: a = b = }

// 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

Introduction C++ (II)

63

Boucles: while (1)


Les boucles permettent la mise en uvre rptitive dun traitement, contrl a posteriori ou a priori par une condition de continuation.
La syntaxe gnrale dune boucle avec condition de continuation a posteriori est:
do {
<actions> } while (<condition>);

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

Boucles: while (2)


La syntaxe gnrale dune boucle avec condition de continuation a priori est:
while (<condition>) {
<actions>

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

Introduction C++ (II)

65

Litration: for (1)


Les itrations permettent lapplication itrative dun traitement, contrle par une opration dinitialisation, une condition darrt, et une opration de mise jour des variables de contrle de litration.
La syntaxe gnrale dune itration est:
for (<initialisation>;<condition>;<mise jour>) {
<actions>

Une itration for est quivalente la boucle while suivante:


{
<initialisation>; while (<condition>)

{
<actions> <mise jour>;

} }

Informatique I

Introduction C++ (II)

66

Litration: for (2)


Exemple: afchage du carr des nombres entre 0 et 10 for (int i(0); i<=10; ++i) { cout << i*i << endl; }

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

Introduction C++ (II)

67

Ruptures de squence (1)


C++ fournit galement des instructions de rupture de squence , permettant de contrler de faon plus fine le droulement des structures de contrles.
Parmis ces instructions, on trouve break et continue . Linstruction break : Elle ne peut apparatre quau sein dune boucle ou dune clause de slection. Elle permet dinterrompre le droulement de la boucle (quelque soit ltat de la condition de continuation) ou de linstruction de slection, en provoquant un saut vers linstruction suivant la structure de contrle. Linstruction continue: Elle ne peut apparatre quau sein dune boucle. Elle interrompt lexcution des instructions du bloc, et provoque la r-valuation de la condition de continuation, afin de dterminer si lexcution de la boucle doit tre poursuivie (avec une nouvelle itration).

Informatique I

Introduction C++ (II)

68

Ruptures de squence (2)

while (condition) { ... /* actions de la boucle */ ... break ... continue ... } /* actions suivant la structure de contrle */

Informatique I

Introduction C++ (II)

69

Ruptures de squence (3)

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

Introduction C++ (II)

70

Porte: variables locales/globales (1)


Les blocs ont une grande autonomie en C++. 4 Ils peuvent contenir leurs propres dclarations (et initialisations) de variables:

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

Introduction C++ (II)

71

Porte: variables locales/globales (2)


porte globale

// dclarations globales int z(0); ... void main() { // dclaration locales int x,y; ... { // dclaration locales int y; ... x ... ... y ... ... z ... } ... y ... ... z ... }

porte locale fonction main

porte locale bloc interne

// 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

Introduction C++ (II)

72

Porte: variables locales/globales (3)


En particulier, la dclaration dune variable lintrieur dune boucle est une dclaration locale au bloc associ la structure de boucle.
Ainsi dans la structure de boucle
while (<condition>) { int i(0); ... }

la variable i est locale la boucle


{

Et de mme dans litration

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

Introduction C++ (II)

73

Porte: variables locales/globales (4)


Exemple:

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

Porte: variables locales/globales (5)


Autre exemple:

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

Introduction C++ (II)

75

Notion de rutilisabilit (1)


A ce point du cours, un programme nest rien de plus quune squence bien forme dinstructions simples ou composes (i.e. comprenant des structures de contrle).
Exemple: soit P le programme dafchage suivant1 cout << "************************" cout << "Ceci est un petit texte" << " permettant " << "dafficher quelque chose" << " lcran " cout << "************************" << << << << << << endl; endl endl endl endl; endl;

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

Introduction C++ (III: fonctions)

Notion de rutilisabilit (2)


La duplication de larges portions identiques de code est poscrire , car:
Cela rend la mise jour du programme fastidieuse :

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

Introduction C++ (III: fonctions)

77

Rutilisabilit: les fonctions (1)


Pour mettre en uvre la rutilisabilit , la plupart des langages de programmation fournissent des mcanismes permettant de manipuler des portions de programmes . En C++, ces mcanismes vont sappuyer sur la notion de fonction

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

Introduction C++ (III: fonctions)

78

Rutilisabilit: les fonctions (2)


Une fonction est donc une portion rutilisable de programme, associe la dfinition dune interface explicite avec le reste du programme (permettant de dfinir la manire dutiliser cette fonction), par le biais dune spcification des arguments formels (les entres) et de la valeur de retour (les sorties).
arguments formels

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

Introduction C++ (III: fonctions)

79

Rutilisabilit: les fonctions (3)


Plus prcisment, une fonction est un lment informatique caractris par:
un identificateur, qui nest autre quune rfrence particulire llment fonction lui-mme; un ensemble darguments formels , qui correspondent en fait un ensemble de rfrences formelles des entits dfinies lextrieur de la fonction, mais dont les valeurs seront potentiellement utilises par la fonction; un type de retour, qui permet de prciser la nature du rsultat retourn par la fonction un corps , qui correspond un bloc (la portion de code rutilisable qui justifie la cration de la fonction) et qui induit galement une porte locale pour les lments (variables, constantes) dfinis au sein de la fonction.

Informatique I

Introduction C++ (III: fonctions)

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:

float puissance(const float base, float exposant);

3. On dit souvent (par extension), le type de la fonction

Informatique I

Introduction C++ (III: fonctions)

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

Introduction C++ (III: fonctions)

82

Dfinition (1)
La dfinition permet laffectation dun corps (bloc dinstructions) au prototype de la fonction.
La syntaxe dune dfinition est:
<type> <identificateur>(<arguments>)

{ <corps de la fonction> [return <valeur>] }

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

Introduction C++ (III: fonctions)

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; }

float moyenne(const float x1, const float x2) { return (x1+x2)/2.0; }

Informatique I

Introduction C++ (III: fonctions)

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

Introduction C++ (III: fonctions)

85

Evaluation dun appel fonctionnel (1)

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

Introduction C++ (III: fonctions)

86

Evaluation dun appel fonctionnel (2)


Lvaluation de lappel fonctionnel peut tre schmatis de la faon suivante:

void main(); int f(const int x); void main() { int y,z; ... z=f(y); ... } int f(const int x) { ... ... return (...); }

Informatique I

Introduction C++ (III: fonctions)

87

Evaluation dun appel fonctionnel (3)


Pour la fonction
1
moyenne() prcdemment dfinie, soit moyenne((sqrt(2*3*4)+1), 12%5)

lappel fonctionnel:

Evaluation des arguments et liaison avec les arguments formels:


x1 = (sqrt(2*3*4)+1) => x1 = 5.89897948557 x2 = 12%5 => x2 = 2.0

Excution du corps de la fonction:


moyenne = (x1+x2)/2.0 => moyenne = 3.94948974278

La valeur de retour, correspondant lvaluation de lexpression appel fonctionnel, est donc: 3.94948974278

Lappel est alors quivalent lexcution du bloc:


float moyenne; { const float x1(sqrt(2*3*4)+1); const float x2(12%5); moyenne = (x1+x2)/2.0; }

Informatique I

Introduction C++ (III: fonctions)

88

Fonctions sans valeur de retours


Il est galement possible de dfinir des fonctions sans valeur de retour (i.e. des fonctions qui ne renvoient rien, et donc peu prs quivalentes de simple sous-programme).
Cette absence de valeur de retour sera indique, dans le prototype et la dfinition de la fonction, par un type de retour particulier, le type void Dans ce cas, le mot rserv return nest pas requis, lexcution de la fonction se terminant la fin du bloc constituant son corps. Il est toutefois possible linstruction return (dans ce cas sans indication dexpression de retour), afin de provoquer explicitement (et gnralement prmaturment) la terminaison de la fonction.
Exemple: void afficheEntiers(const int n) { for (int i(0); i<n; ++i) cout << i << endl; return; }
Informatique I

void main() { int n(10); afficheEntiers(n+1); }


89

Introduction C++ (III: fonctions)

Fonctions sans arguments


De mme, il est possible de dfinir des fonctions sans arguments .
Dans ce cas, la liste des arguments du prototype et de la dfinition est tout simplement vide (mais les parenthses dlimitant cette liste vide doivent tre prsentes)
Exemple: int saisieEntiers(); void main() { int val = saisieEntiers(); cout << val << endl; } int saisieEntiers() { int i; cout << "Entrez un entier: "; cin >> i; return i; }
Informatique I Introduction C++ (III: fonctions) 90

Notion de porte locale (1)


Les notions de porte locale v.s. globale dfinies pour les blocs sont galement valides dans le cadre des fonctions 5 .
Comme dans le cas des blocs, la porte permet de rsoudre les problmes de conflits de rfrenage entre entits externes (i.e. dfinies lextrieur du corps de la fonction) et entits internes (i.e. dfinies dans le corps-mme de la fonction).
Exemple: int i(2); void f(int a); void main { f(i); } void f(int a) { int i(10); cout << a*i << endl; }

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

Introduction C++ (III: fonctions)

91

Notion de porte locale (2)


Les rgles utilises en C++ sont: 
En cas de conflit de rfrence entre une entit interne et une entit externe, lentit interne est systmatiquement choisie ; on dit que les rfrences internes sont de porte locale , i.e. limites aux entits internes de la fonction. On dit galement que les entits internes masquent les entits externes.

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

Introduction C++ (III: fonctions)

92

Notion de porte locale (3)


Schmatiquement, ces rgles peuvent se reprsenter par:

void main(); int f(const int x); int z; void main() { int x,y; ... ... z=f(y); ... }

int f(const int x) { int y;

... ...
... x ... ... y ... ... z ... }

Informatique I

Introduction C++ (III: fonctions)

93

Le passage des arguments


En C++, on distingue pour les fonctions 2 types de passage darguments :

 le passage par valeur :


dans lequel la fonction travaille sur des copies locales des arguments transmis

 et le passage par rfrence :


dans lequel la fonction travaille effectivement largument transmis lui-mme .

Informatique I

Introduction C++ (III: fonctions)

94

Passage par valeur (1)

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

Introduction C++ (III: fonctions)

95

Passage par valeur (2)


Exemple void f(int x) { x = x + 2; cout << "x vaut: " << x << endl; } void main() { int val(0); f(val); cout << "val vaut: " << val << endl; }

x vaut: 2 val vaut: 0

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

Introduction C++ (III: fonctions)

96

Passage par rfrence (1)


La variable locale associe un argument formel pass par rfrence ne correspond qu un autre nom (synonyme local) pour largument utilis lors de lappel de la fonction 7 . Aucune nouvelle variable nest cre, et en consquence, les modifications ventuelles apportes largument formel lintrieur de la fonction affectent galement largument original:
Les modifications effectues lintrieur de la fonction sont rpercutes lextrieur.

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

Introduction C++ (III: fonctions)

97

Passage par rfrence (2)


Exemple void f(int& x) { x = x + 2; cout << "x vaut: " << x << endl; } void main() { int val(0); f(val); cout << "val vaut: " << val << endl; }

x vaut: 2 val vaut: 2

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

Introduction C++ (III: fonctions)

98

Entits de type rfrence


De manire gnrale, les entits de type rfrence (appele plus simplement des rfrences ) permettent de dfinir de nouveaux noms ( synonymes ou alias ) pour des variables ou constantes existantes.
Leur dclaration se fait de la mme manire quen paramtre des fonctions; la syntaxe est: [ const ] <type> & <alias> ( <entit> ); O entit est une variable, une constante ou une rfrence de type type. 8
Exemple: char c(a); const int i(2); ... // un simple synonyme de c char& c_alias(c); const int& i_alias(i); // un synonyme (obligatoirement) constant de la constante i const char& c_alias2(c_alias); // un synonyme constant de la variable c

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

Introduction C++ (III: fonctions)

99

Arguments par dfaut (1)


Lors de sa dfinition, une fonction peut tre munie d arguments avec valeur par dfaut , pour lesquels il nest alors pas obligatoire de fournir de valeur lors de lappel de la fonction.

La syntaxe pour dfinir des arguments avec valeur par dfaut est:
<type> <argument> = <valeur>

Informatique I

Introduction C++ (III: fonctions)

100

Arguments par dfaut (2)


Exemple void afficheLigne(const char c, const int n = 5) { for (int i(0); i<n; cout << c, ++i); cout << endl; } void main() { afficheLigne(*); afficheLigne(+,8); }

***** ++++++++

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

Introduction C++ (III: fonctions)

101

Arguments par dfaut (3)

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

Surcharge des fonctions (1)


On appel signature dune fonction le couple constitu de lidentificateur de la fonction et de la liste de types de ses arguments formels.
(le type de retour de la fonction ne fait pas partie de la signature !) Comme cest par le biais de leur signature que le compilateur identifie les fonctions utilises par le programmeur 9 , il est de ce fait tout fait possible de dfinir plusieurs fonctions avec un mme identificateur (nom), mais de listes darguments diffrentes (soit par le nombre darguments, soit par leur type).

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

Introduction C++ (III: fonctions)

103

Surcharge des fonctions (2)


Exemple: void affiche(const int x) { cout << "entier: " << x << endl; } void affiche(const float x) { cout << "rel: " << x << endl; } void affiche(const int x1, const int x2) { cout << "couple: (" << x1 << , << x2 << ) << endl; } void main() { affiche(1.0); affiche(1); affiche(5,2); }

rel: 1.0 entier: 1 couple: (5,2)

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.

Une catgorie particulire de solutions sont les rsolutions rcursives .

Le principe de lapproche rcursive est de ramener le problme rsoudre un sous-problme correspondant une instance rduite du problme lui-mme .

Informatique I

Introduction C++ (III: fonctions)

105

Exemple de rcursion applique au tri

tri
entre: table de n lments sortie: table trie

tri (instance rduite du problme)


tri
entre: table de n-1 lments sortie: table trie ... insertion: insertion (au bon endroit) du ne lment dans le tableau tri de n-1 lments 1 2 3 5 6 insertion 4

tri
1 2 3 4

Informatique I

Introduction C++ (III: fonctions)

106

Algorithme rcursif (1)


Attention Pour que la rsolution rcursive soit correcte, il faut une condition de terminaison portant sur les entres.
Sinon, on risque fort de boucler indfiniment !
Exemple: la somme des n premiers entiers positifs

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

Introduction C++ (III: fonctions)

107

Algorithme rcursif (1)


Le schma gnral dun algorithme rcursif correct est donc:

AlgoRcursif
entres: entree si condition de terminaison atteinte alors retourner une valeur de sortie sinon

AlgoRcursif (instance rduite)


entre: entre de linstance rduite ... terminer le traitement et retourner une valeur de sortie.

Informatique I

Introduction C++ (III: fonctions)

108

Algorithme rcursif (2)


Appliqu lexemple de la somme des n premiers entiers positifs, on obtient lalgorithme correct suivant:

Somme entre: 3 si entree <= 1


retourner entree sinon retourner

Somme entre: 2 si entree <= 1


retourner entree sinon retourner

Somme entre: 1 si entree <= 1


retourner entree sinon retourner

3+

Somme
entre - 1

2+

Somme
entre - 1

1 1+

Somme
entre - 1

Informatique I

Introduction C++ (III: fonctions)

109

Algorithme rcursif (3)


Par exemple, le schma de lalgorithme rcursif
tri_recursif

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

Introduction C++ (III: fonctions)

110

Les fonctions rcursives (1)


Concrtement, un algorithme rcursif sera implment par une fonction rcursive . 10
Comme la dfinition dune fonction (i.e. son corps) peut faire appel toute fonction prcdemment prototype dans le mme programme, elle peut donc, en particulier, faire appel elle-mme .

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

Introduction C++ (III: fonctions)

111

Les fonctions rcursives (2)


Le schma gnral dune fonction rcursive est donc le suivant:
typeret fonctionRec(type1 x1, type2 x2, ...) { typeres result; if (terminaison(x1, x2, ...) { ... result = ... } else { type1 y1 = ... type2 y2 = ... ... result = ... fonctionRec(y1, y2, ...) } return result; }

Informatique I

Introduction C++ (III: fonctions)

112

Les fonctions rcursives (3)


Exemple: la somme des n premiers entiers positifs // prototypage int somme(const int n); // dfinition int somme(const int n) { if (n >= 1) // condition darrt { return n; } else { return (n + somme(n-1)); // appel rcursif } }

Informatique I

Introduction C++ (III: fonctions)

113

Les fonctions rcursives (4)


Second exemple: on reprend lalgorithme de tri propos prcedemment: On suppose en outre disposer des fonctions suivantes:

 

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

Introduction C++ (III: fonctions)

114

Les fonctions rcursives (5)


Le scma des appels rcursifs pour un appel tel que: triRecursif({3,2,1},0,2) :

{1,2,3} triRecursif({3,2,1},0,2) {2,3,1} triRecursif({3,2,1},0,1) deplace(1,0,{3,2,1}) deplace(2,0,{2,3,1})

triRecursif({3,2,1},0,0)

Informatique I

Introduction C++ (III: fonctions)

115

Structures de donnes: types composs


Les types lmentaires (nombres entiers, rels, caractres, boolens, ...) permettent de reprsenter des concepts simples du monde rel: des dimensions, des sommes, des tailles, ...
Les identificateurs associs permettent de donner une signification aux divers entits manipules (pour cette raison, il faut toujours utiliser des noms aussi explicites que possible)
Exemples:
age = 18; poids = 62.5; taille = 1.78; ...

Cependant, de nombreux concepts plus sophistiqus ne se rduisent pas une seule entit lmentaire...

Informatique I

Introduction C++ (IV: types complexes)

116

Exemple de type compos


Un rectangle par exemple peut tre dfinis par 2 grandeurs lmentaires: sa largeur et sa hauteur.
largeur

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

Types composs: les tableaux


Une premire faon de composer des types lmentaires est de regrouper une collection dentits (de mme type) dans une structure tabulaire: le tableau
nom dun lment

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 .

age[0] age[1] age[2] age[3] age[4]

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

Introduction C++ (IV: types complexes)

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

Ainsi, le tableau age vu prcdemment peut tre dclar par:


int age[5];

Informatique I

Introduction C++ (IV: types complexes)

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

Introduction C++ (IV: types complexes)

120

Tableaux: accs aux lments


Chaque lment du tableau est accessible individuellement .
Pour cela, on utilise un indice 2 plac entre crochets [] , indiquant le rang de llment dans le tableau 3 . Les lments dun tableau de taille n sont sont numrots de 0 n -1. Il ny a pas de contrle de dbordement du tableau !

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

Introduction C++ (IV: types complexes)

121

Tableaux: tableaux de caractres (1)


Les tableaux de caractres forment une catgorie particulire de tableaux. Ils sont en particulier utiliss pour reprsenter les chanes de caractres (dlimites par les guillemets anglais "").
Ainsi, une dfinition tel que:
char mot[7] = {b,o,n,j,o,u,r};

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};

et sa taille sera de 8 caractres , et non pas 7 !


Informatique I Introduction C++ (IV: types complexes) 122

Tableaux: tableaux de caractres (2)


La syntaxe de C++ autorise cependant une initialisation plus pratique des tableaux-chane de caractres:
char mot[] = "bonjour";4

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

Introduction C++ (IV: types complexes)

123

Tableaux: tableaux multidimensionnels (1)


Le type de base dun tableau est peut tre un type quelconque, y compris compos. En particulier, le type de base dun tableau peut tre lui-mme un tableau.
La syntaxe est alors: < type > < identificateur > [ < dim 1 > ][ < dim 2 > ][ ... ][ < dim n > ]; Les entits dun tel type sont alors des tableaux de tableaux, soit des tableaux multidimensionnels 5 .
Exemple: int matrice[4][3]; float cube[3][3][3];

matrice[2][1] matrice (transpose) cube

cube[0][1][2]

5. En fait, les tableaux informatiques correspondent aux vecteurs mathmatiques, et les tableaux de tableaux des matrices.

Informatique I

Introduction C++ (IV: types complexes)

124

Tableaux: tableaux multidimensionnels (2)

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

Introduction C++ (IV: types complexes)

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

Introduction C++ (IV: types complexes)

126

Tableaux dynamiques: vecteurs


Pour pallier les dfauts inhrents la rigidit des tableaux de taille fixe ( built-in array ), la librairie (gnrique) standard 7 de C++ fournit un type de donne 8 dnomme vector ( vecteur ), offrant au programmeur un moyen trs efficace pour construire des structures de donnes permettant de reprsenter des tableaux de tailles variables (i.e. tableaux dynamiques ) 9 .
La taille de ces tableaux nest pas obligatoirement prdfinie, et peut donc varier en cours dutilisation. Pour pouvoir utiliser ces vecteurs dans un programme, il faut, comme dans le cas des entres-sorties, importer les prototypes et dfinitions contenus dans la librairie, au moyen de la directive dinclusion: #include <vector>
7. Le nom officiel de cette librairie est STL (Standard Template Library) 8. En fait de type, il sagit en ralit dun chablon de classe (template classe), cest--dire une dfinition gnrique (valide et rutilisable pour nimporte quel type, de base ou complexe). 9. Pour tre exact, les vectors sont plus que de simples tableaux dynamiques; ils sinscrivent dans un famille plus gnrale dlments, utiliss comme briques de bases pour les structures de donnes complexes, lments que lon appelle conteneurs (containers) ou collections, et pour lesquels un ensembre de caractristiques et contraintes trs prcises sont dfinies, comme par exemples les performances minimales des algorithmes daccs et de recherche.

Informatique I

Introduction C++ (IV: types complexes)

127

Vecteur : dclaration (1)


Un vecteur peut tre dclar selon la syntaxe suivante:
vector< type > identificateur ; Avec type nimporte quel type, lmentaire ou non, et correspondant au type de base du tableau.
Exemple: #include <vector> ... vector<int> age;

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

Introduction C++ (IV: types complexes)

128

Vecteur : dclaration (2)


Le fait que lon sintresse ici des collections dun nombre potentiellement variable dlments explique que la dclaration puisse ne comporter aucune indication sur la taille initiale du tableau. Une variable ainsi dclare correspond alors tout simplement un tableau vide.
Cependant, une taille initiale peut, si ncessaire, tre indique; la syntaxe de la dclaration est alors: vector< type > identificateur ( taille ); Un tableau nomm identificateur comportant taille lments de type type sera cr, chacun des lments ayant comme valeur la valeur par dfaut de type gnralement une valeur drive de lexpression (0).
Exemple:
age[0] age 0 0 0 0 0
129

vector<int> age(5); Correspond la dclaration dun tableau dentiers, initialement compos de 5 lments valant 0.

age[1] age[2] age[3] age[4]

Informatique I

Introduction C++ (IV: types complexes)

Vecteur : dclaration avec initialisation


La dclaration dun vecteur peut tre associe une initialisation explicite des lments initiaux; cependant, cette initialisation ne pourra consister quen (a) une duplication dun mme lment, ou (b) en une duplication dun vecteur pr-existant: 10
(a) vector< type > identificateur ( taille , valeur ); o valeur est une expression de type type, dont le rsultat sera pris comme valeur intiale des taille lments du tableau identificateur.
vector<int> vect1(5,8); dclare le vecteur dentiers vect1 avec un contenu initial de 5 entiers valant 8

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

Introduction C++ (IV: types complexes)

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);

Correspond la dclaration dune copie fige ( snapshot ) du vecteur 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

Introduction C++ (IV: types complexes)

131

Vecteur : vecteur de vecteur


Le type de base dun vecteur est peut tre un type quelconque, y compris compos. En particulier, le type de base dun vecteur peut tre lui-mme un vecteur.
vector<vector<int> > matrice;

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

Dun point de vue smantique, les vecteurs de vecteurs ne correspondent pas

(ncessairement) des matrices, mais simplement des ensembles densembles dlments.

vector<vector<int> >
12. Cette contrainte est en fait une convention adopte pour distinguer ce typage de loprateur >>

Informatique I

Introduction C++ (IV: types complexes)

132

Vecteur : affectation
Toute variable 13 de type
vector

peut tre modifie (globalement) par affectation:

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

Introduction C++ (IV: types complexes)

133

Vecteur : accs aux lments

Chaque lment dun vecteur est accessible individuellement .

Diffrents moyens permettent daccder aux lments, et notamment lindexation comme dans le cas des tableaux de taille fixe:

L indice 15 , plac entre crochets [] , indique le rang de llment dans le tableau.

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 !

15. Indice qui peut tre une expression numrique.

Informatique I

Introduction C++ (IV: types complexes)

134

Vecteur : oprateurs relationnels

Les oprateurs relationnels suivant sont dfinis pour les vecteurs:

Oprateur
<

Opration
strictement infrieur infrieur ou gal strictement suprieur suprieur ou gal galit diffrence (non-galit) comparaison lexicographique des lments.

<=
>

>= == !=

Informatique I

Introduction C++ (IV: types complexes)

135

Vecteur : mthodes (1)

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

Introduction C++ (IV: types complexes)

136

Vecteur : mthodes prdicats


Parmi les mthodes disponibles, on trouve 17 :
Prdicats: int size () : renvoie la taille du vecteur (i.e. son nombre dlments). 18 Une manire usuelle pour parcourir les lments dun vecteur est donc litration for suivante: for (int i(0); i<vect.size(); ++i)18 { // traitements } bool empty () : indique si le vecteur est vide (ou non). On a lquivalence suivante: vect.empty() <=> (vect.size() == 0)

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

Introduction C++ (IV: types complexes)

137

Vecteur : mthodes de mise jour


Modificateurs: void Aprs void void clear () : vide le vecteur, en supprimant tous ses lments. linvocation de cette mthode, le prdicat empty est forcment vrai. pop_back () : supprime le dernier lment du vecteur. push_back (const base-type element) : ajoute element la fin du vecteur; element devient donc le nouveau dernier lment du vecteur. Exemple : La boucle suivante initialise un vecteur dentiers positifs, de taille 8, en demandant lutilisateur de saisir les valeurs initiales. Lors de la saisie, lutilisateur a la possibilit deffacer la valeur prcedemment saisie, en indiquant un chiffre ngatif, ou deffacer tout le vecteur, en entrant 0. while (vect.size() < 8) { int val; cout << "Entrez coefficient " << vect.size() << : << flush; cin >> val; if (val < 0) {vect.pop_back(); continue;} if (val == 0) {vect.clear(); continue;} vect.push_back(val); }

Informatique I

Introduction C++ (IV: types complexes)

138

Vecteur : mthodes daccs


Accs: base-type front () : renvoie une rfrence vers le premier lment du vecteur Les squences vect.front() et vect[0] sont donc quivalentes. Prcondition : le vecteur nest pas vide (le prdicat empty() est faux). Exemple : Litration suivante a comme effet de diviser tous les lments dun vecteur ( lexception du premier), par le premier lment du vecteur. for (int i(1); i<vect.size(); ++i) {vect[i] /= vect.front();}

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

Introduction C++ (IV: types complexes)

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

Introduction C++ (IV: types complexes)

140

Commande typedef : exemple


typedef int longueur; longeur diametre, rayon; int nbCercles; ... void traceCercles(longueur d, longueur r, int nombre) { ... } // pas de typdef // int diametre, rayon; int nbCercles; ... void traceCercles(int d, int r, int nombre) { ... }

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

Introduction C++ (IV: types complexes)

typedef et types composs


Comme dans pratiquement tous les cas de types composs, la commande typedef permet de simplifier les dclarations (plus de lisibilit).
Par exemple dans la cas des tableaux ( built-in ou vecteurs ), en fournissant un alias pour le couple ( indication de tableau , type de base):
typedef type-base alias[taille] typedef vector<type-base> alias

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

Introduction C++ (IV: types complexes)

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

Introduction C++ (IV: types complexes)

143

Dclaration dune chane

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

Introduction C++ (IV: types complexes)

144

Dclaration+initialisation dune chane


La syntaxe dune dclaration avec initialisation est:
string identificateur ( valeur );
o valeur est: soit une chane de caractres de la forme "..." soit une variable, constante ou rfrence de type string

Exemple: string str("une chane"); string chaine(str);

La valeur littrale utiliser pour une initialisation explicite une chane vide est: "".

Informatique I

Introduction C++ (IV: types complexes)

145

Affectation dune chane


Toute variable de type string peut tre modifie par affectation:
identificateur = valeur;

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

Oprateurs relationnels entre chanes

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

Accs aux caractres


Comme dans le cas des tableaux, il est possible daccder individuellement chaque caractre constitutif dune chane:
Si str est une chane de type string, lexpression str[i] fait rfrence au (i+1) me caractre de str. Chacun des lments str[i] dune chane str de type string est de type char.

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

Introduction C++ (IV: types complexes)

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

Introduction C++ (IV: types complexes)

149

Mthodes de string : prdicats


Parmi les fonctions ( mthodes ) 19 disponibles, on trouve 20 :
Prdicats: int size () int length () Toutes deux renvoient la longueur de la chane (i.e. le nombre de caractres). Une manire usuelle pour parcourir un un les caractres dune chane est donc litration for suivante: for (int i(0); i<str.size(); ++i) { // traitements avec str[i] }

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

Introduction C++ (IV: types complexes)

150

Mthodes de string : insertions


string& insert (int pos, const char[] s) string& insert (int pos, const string& s) Insre, partir de la position indie par pos, la chane s, et renvoie une rfrence la chane modifie. Exemple : string("1234").insert(2,"-xx-") utilise le premier des prototypes spcifis ci-dessus, et renvoie une rfrence la chane de type string et de valeur 12-xx-34.

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

Introduction C++ (IV: types complexes)

151

Mthodes de string : remplacements


string& replace (int pos, int long, const char[] s) string& replace (int pos, int long, const string& s) Substitue s au long caractres de la chane, partir de la position indie par pos. Renvoie une rfrence la chane modifie. Exemple : cout << string("1234").replace(2,1,"-trois-") produira comme rsultat laffichage de la chane 12-trois-4 : les caractres de lintervalle [ pos , pos + long -1], soit le caractre [2,2], sont remplacs par la chane s.

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

Introduction C++ (IV: types complexes)

152

Mthodes de string : recherches


int find (char s, int pos = 0) int find (const char[] s, int pos = 0) int find (const string& s, int pos = 0) Retourne lindice du premier caractre de loccurrence de s la plus gauche dans la chane, ventuellement prive de ses pos premiers lments (la recherche dbute partir de la position pos). Renvoie string::npos dans le cas o aucune occurrence nest trouve. Exemple : string("baabbaabbaab").find("ba",2) renverra 4

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

Introduction C++ (IV: types complexes)

153

Fonctionnement de find et rfind


La mthode find effectue une recherche du dbut vers la fin, en prenant comme dbut la position ventuellement spcifie comme position de dpart. Ainsi, str. find(s, pos) consiste faire une recherche de s dans str, prive de ses pos premiers lments:
s str
0 pos

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

Introduction C++ (IV: types complexes)

154

Exemple dutilisation des strings (1)


On dsire raliser une extension automatique des abbrviations dans un texte:
les CFF voluent, c--d progressent.

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

Introduction C++ (IV: types complexes)

155

Exemple dutilisation des strings (2)


#include <string> #include <vector> // Dfinition des composants de la table associative typedef vector<string> Strings; // Table associative, globale (externe) Strings acronymes; Strings significations; // Fonction de remplacement: // utilise les variables externes dfinissant les acronymes, // mais uniquement en lecture (pas deffet de bord). void expliciteAcronymes(string& str) { int debutAbbrev; for (int i(0); i<acronymes.size(); ++i) while ((debutAbbrev=str.find(acronymes[i])) != string::npos) str.replace(debutAbbrev,acronymes[i].size(),significations[i]); } ...
Informatique I Introduction C++ (IV: types complexes) 156

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

Introduction C++ (IV: types complexes)

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

Introduction C++ (IV: types complexes)

158

Entres sorties avec des fichiers (1)


Le lien entre les fichiers du systme dexploitation et le programme se fait en C++ par le biais des streams .
Un flot de donnes de type stream orient ou bidirectionnel peut tre associ un fichier, et sutilise de la mme manire que les flots vers ou en provenance de la console ( cin, cout, cerr) ou un string ( ostringstream, istringstream): Programme
sortie entree

out-stream

output.txt

in-stream input.txt istr2 in-stream

Systme dexploitation
titi.log

in/out-stream iostr

Informatique I

Introduction C++ (IV: types complexes)

159

Entres sorties avec des fichiers (2)


Pour pouvoir utiliser les streams lis aux fichiers 28 , il faut importer, en dbut de programme, les prototypes et dfinitions contenus dans la librairie, au moyen de la directive dinclusion:
#include <fstream> Deux types (classes) [en particulier] sont alors disponibles:
ifstream ( input file stream ) stream dentre associ un fichier ouvert en mode lecture (similaire cin) ofstream ( output file stream ) stream de sortie, associ un fichier ouvert en mode criture (similaire cout).
28. Les streams de la librairie standard ne vhiculent que des donnes en mode texte. Pour lire/crire des fichiers binaires, il faut soit utiliser des fonctions ad hoc spcifiques, soit tendre manuellement la bibliothques de streams.

Informatique I

Introduction C++ (IV: types complexes)

160

Entres sorties avec des fichiers (3)


Le mcanisme gnral pour la mise en uvre dentre-sorties via les fichiers est:
(1) Cration dun stream (dentre ou de sortie), par la dclaration dune variable de type ifstream ou ofstream.
Exemple: ifstream entree;

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

Introduction C++ (IV: types complexes)

161

Entres sorties avec des fichiers (4)


Les oprations (1) et (2), savoir la dclaration de la variable et son association avec un fichier, peuvent se raliser en une seule tape.
Linitialisation lors de la dclaration se fait alors en spcifiant entre parenthses le nom du fichier lier au stream:
Exemple:

ifstream entree("input.txt");

On peut considrer que linitialisation fait directement appel la fonction open.

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:

string str("output.txt"); ifstream entree2; ofstream sortie(str.c_str()); entree2.open(str.c_str());


29. En effet, sil y a conversion implicite des chanes de la forme "..." vers les strings (promotion), linverse nest pas vrai.

Informatique I

Introduction C++ (IV: types complexes)

162

Entres sorties avec des fichiers (5)


Lutilisation dans le programme des variables de type fstream pour effectuer des entres-sorties se fait de la mme manire que pour les streams cin et cout , cest--dire laide des oprateurs dinsertion >> et dextraction <<
Exemple:
ifstream entree("input.txt"); ofstream sortie("output.txt"); string mot; int n; entree >> mot >> n; sortie << "Le mot lu est: " << mot << " et le " << "nombre est: " << n << "." << endl;

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

Exemple dcriture dans un fichier


Le programme ci-dessous saisit une phrase via lentre standard (clavier), et lcrit (un mot par ligne) dans un fichier texte nomm phrase.txt
#include <iostream> #include <fstream> #include <string> void main() { string motSaisit; string nomFichier("phrase.txt"); ofstream sortie(nomFichier.c_str()); cout << "Entrez une phrase termine par ." << endl; do { cin >> motSaisit; sortie << endl << motSaisit; } while (motSaisit != "."); sortie.close(); }
Informatique I Introduction C++ (IV: types complexes) 164

Exemple de lecture partir dun fichier


Le programme ci-dessous relit le fichier cr par le programme prcdant, et affiche la phrase lcran, et remettant les mots sur une mme ligne.
#include <iostream> #include <fstream> #include <string> void main() { string motSaisit; ifstream entree("phrase.txt"); while (!entree.eof()) { entree >> motSaisit; cout << motSaisit << ; } cout << endl; entree.close(); }
Informatique I Introduction C++ (IV: types complexes) 165

Robustesse des accs aux fichiers


De mme quil est conseill de contrler la conformit des valeurs entres par un utilisateur, il est bon de vrifier que lassociation dun stream avec un fichier sest correctement ralise (i.e. que le fichier existe, est lisible, etc).
Pour cela, on peut valuer le stream, aprs lappel la fonction open. Si tout cest bien pass, le rsultat de cette valuation sera true, et il sera false en cas de problme:
Exemple: entree.open("fichier-inexistant"); if (!entree) cout << "Oops, le fichier nest pas lisible!" << endl; else << cout << "Ok, le fichier existe et est lisible!" << endl;

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)

30. Lvaluation dun stream revient en partivulier tester le prdicat fail.

Informatique I

Introduction C++ (IV: types complexes)

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

Introduction C++ (IV: types complexes)

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

Introduction C++ (IV: types complexes)

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")); }

Erreur (n5): Fichier non trouv

Informatique I

Introduction C++ (IV: types complexes)

169

Sorties formates (1)


Un certain nombre de paramtres pour le format des sorties peuvent tre explicitement spcifis.
Ces paramtres sont de deux formes:
Soit des manipulateurs , appliqus loprateur << Soit des options de configurations , appliqus directement au stream de sortie

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

Introduction C++ (IV: types complexes)

170

Sorties formates (2)


 Longueur de la reprsentation: setw(taille) la donne qui suit ce manipulateur est affich sur (au moins) taille caractres, avec (par dfaut) un cadrage droite, fort pratique lors de la reprsentation en colonnes des nombres. cout << << cout << << cout << <<  setw(10) << "un:" setw(5) << 1 << endl; setw(10) << "cent deux:" setw(5) << 102 << endl; setw(10) << "moins 18:" setw(5) << -18 << endl; un: cent deux: moins 18: 1 102 -18

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)

un:....1 cent deux:..102 moins 18:..-18

Informatique I

171

Sorties formates (3)


 Bases numrique: hex, dec, oct les donnes numriques sont affiches ou lues en assumant une base de reprsentation diffrente de la base par dfaut (dcimale). cout << "hexa:" << hex << 64 << endl; cout << "octal:" << oct << 64 << endl; cout << "decim:" << dec << 64 << endl; hexa:40 octal:100 decim:64

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

Introduction C++ (IV: types complexes)

172

Sorties formates (4)


Options de configuration:

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

Introduction C++ (IV: types complexes)

173

Sorties formates (5)


 Partie fractionnaire: showpoint la partie fractionnaire des nombres en virgule flottante est explicitement reprsente: cout << 16.000 << endl; cout.setf(ios::showpoint); cout << 16.000 << endl; cout << 16.100 << endl; cout << 16 << endl; 16 16.0000 16.1000 16

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

Introduction C++ (IV: types complexes)

174

Vous aimerez peut-être aussi