Sie sind auf Seite 1von 55

MPI, Info 111 : Introduction `a linformatique

Nicolas M. Thiery
http://Nicolas.Thiery.name/Enseignement/Info111
Inspire de cours de
Frederic Verni`ere, Laurent Simon, Florent Hivert, ...
29 novembre 2013
Partie I. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Partie II.

Elements de programmation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Partie III. Structures de controle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Partie IV. Fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Partie V. Tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Partie VI. Modularite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Partie VII. Fichiers, ux, exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Partie VIII. Introduction `a la complexite dalgorithmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
1 / 209
Premi`ere partie I
Introduction
A. Cest quoi linformatique en fait ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
B.
`
A propos de ce cours . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
C. Une br`eve histoire de linfomatique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
D. Debouches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
E. Ordinateurs et traitement automatique des informations . . . . . . . . . . 21
2 / 209
Pourquoi enseigner linformatique ?

Evidence : lordinateur est partout !


Combien dordinateur dans la salle ?
Combien dordinateur possedez vous ?
Le mot assiste par ordinateur est en voie de disparition
Usage constant des ordinateurs, pour le travail comme le reste

Evidence : tous les jeunes connaissent dej`a linformatique


Vraiment ?
3 / 209
A. Cest quoi linformatique en fait ?
Une petite analogie
Mr Einstein, vous qui etes un excellent physicien,
vous devez savoir changer la roue de ma voiture, non ?
Mr Alonso, vous qui etes un excellent conducteur de F1,
vous devez savoir reparer le carburateur de ma voiture, non ?
Conducteur = Garagiste = Physicien
Et pourtant, loin detre Einstein ou Alonso, ...
Mr Thiery, vous qui etes professeur en informatique,
vous devez savoir reparer mon W.....s, non ?
4 / 209
Cest quoi linformatique en fait ?
Suite de la petite analogie ...
Lusage La technologie La science
Conduite Reparation, Conception Physique
Consommation Cuisine Chimie, Biologie
Utilisation Programmation, ... Informatique
Quest-ce quon apprend `a lecole ?
Principalement la science
Et il y a des raisons profondes pour cela.
Et il y a des pressions pour que ce ne soit pas le cas
Quelle ecole pour la societe de linformation ?
Une conference de Francois

Elie
`
A lire ou ecouter ... et mediter ...
5 / 209
Tous les jeunes connaissent dej`a linformatique ?
Lusage ?


Evidence : tous les jeunes savent utiliser un ordinateur
Vraiment ? les-enfants-ne-savent-pas-se-servir-dun-ordinateur
La technologie ?
Qui sait programmer ? Congurer un reseau ?
La science ?
Ma petite experience
6`eme : 3`eme :
Fac : apprendre la science a bouleverse ma programmation
2013 : apr`es 30 ans et 300k lignes de code, japprends toujours ...
6 / 209
La science informatique ?
Science du calcul et de linformation
Notion fondamentale : etude des syst`emes en evolution

Etat avant

Etape de calcul

Etat apr`es
Mod`eles de calcul
7 / 209
Grands probl`emes
Calculabilite
Que peut, ou ne peut pas faire, un ordinateur ?
Independemment du langage
Independemment du materiel
Tous les langages sont equivalents
Complexite
Combien de ressources faut-il pour resoudre un probl`eme ?
Independemment du langage
Independemment du materiel
8 / 209
Grands probl`emes de linformatique
Matriser les syst`emes extremement complexes
Internet avec des milliards dordinateur
Programmes avec des millions de lignes
Services gerant des millions de clients
Passage `a lechelle
Abstraction
Exemple : Reseau : Couches OSI
Probl`eme
Apprendre des outils con cus pour les programmes de 100000 lignes en
travaillant sur des programmes de 10 lignes ...
9 / 209
Concepts des langages de programmation
Java, C++, Python, Ada, Pascal, Perl, ...
Un nouveau langage par semaine depuis 50 ans !
Heureusement les concepts sont presque toujours les memes :

Programmation imperative

Programmation objet

Programmation fonctionnelle

Programmation logique

Algorithmique, Structures de donnees


10 / 209
Autres grand th`emes de linformatique
Reseaux
Bases de donnees
Langages formels, automates
Mathematiques discr`etes : graphes, combinatoire
Surete du logiciel :
Specication, Test, Preuve
Surete et securite des donnees :
Codage, cryptographie
11 / 209
B.
`
A propos de ce cours
Ce que lon va voir
Les briques de bases
Les r`egles de compositions
Les constructions usuelles
Les probl`emes dej`a resolus
Les erreurs les plus courantes
Pour quoi faire ?
Pour benecier de lexperience de plus de 50 ans de programmation
Pour arriver `a lintuition de ce qui est possible ... ou pas
Pour arriver `a lintuition de comment resoudre un nouveau probl`eme
12 / 209
Programme
Introduction
Pourquoi ?
A propos de ce cours
Historique
Debouches
Quest-ce quun ordinateur
Algorithmique et programmation structuree
Concepts de la programmation structuree
Algorithmique
Programmation C++ (simple)
Python ?
Environnement : Code Block
Passer `a lechelle ?
13 / 209
Organisation du cours
1h30 amphi, 2h TD, 2h TP
Du TD? ? ? ?
Apprendre la science informatique, en utilisant un ordinateur, pour
programmer ...
Cest comme apprendre la physique, tout en conduisant une voiture ...
Cest pas facile ...

Evaluation
Partiel (dans laxe des TD)
Projet en n de semestre
Examen nal (vision densemble)
14 / 209
C. Une br`eve histoire de linfomatique
La prehistoire : de 3000 AC `a 1900
Babyloniens (3000 AC) : methodes systematiques de calcul et de
resolution dequations
Abaques, machines pour predire le mouvement des astres (80 AC)
Formalisation du calcul : Al Khawarizmi (IX`eme)
XVII`eme

Pascal : machine `a additionner

Leibniz : syst`eme binaire pour le calcul


XVIII`eme

Jacquard : metier `a tisser

Babbage : machine dierentielle


XIX`eme

Boole : calcul binaire et calcul logique

Peirce Hilbert : 3 Questions : correction formelle completude -


decidabilite dun syst`eme formel
15 / 209
De 1900 `a 1940
Godel : Tout syst`eme formel susamment puissant est soit
incoherent soit incomplet
Turing : Probl`eme de larret indecidable
Les annees 40
Travaux en cryptographie (decodage : Machine Enigma, Colossus)
Parall`element, en Angleterre, en Allemagne et aux USA, construction
des premiers ordinateurs

1944 : Calculateur electro-mecanique Mark 1 (Aiken, 44)

1946 : ENIAC Calculs balistiques (Atanaso, Mauchly Eckert)

1944 : EDVAC, Mauchly Eckert et Von Neumann

1948 : EDSAC,
1948 : Invention du transistor (Baarden, Brattain et Shockley 47)
16 / 209
Les annees 50
Test de Turing en 50
Compilateurs (FORTRAN en 57)
LISP en 58
Circuits integres en 59
Les annees 60
Syst`emes dexploitation
Basic en 64
Automates Langages formels - Correction de programmes
Knuth : The Art of Computer Programming
Micro-processeurs
17 / 209
Les annees 70
Base de Donnees Relationnelles
Unix et C (Thompson et Richie)
Pascal et Ada
Architecture RISC (IBM), Cray 1 en 76
Premiers reseaux
Les annees 80
Micro-ordinateur personnel (Apple MacIntosh en 84)
NFSNet en 87 : Ancetre dInternet
Premiers virus en 88
Formalisation du Logiciel Libre
18 / 209
Les annees 90
Linux
C++, Java, Perl, Python, ...
Explosion dInternet
Un ordinateur dans chaque foyer ou presque
Les annees 2000-
Ordinateurs partout, tout le temps
Parallelisation massive
...
Pour les details
http://dept-info.labri.u-bordeaux.fr/~dicky/HisInfo.html
19 / 209
Les metiers de linformatique
Developpeur (programmeur, analyste, ingenieur)
Formateur (apprendre aux autres)
Testeur
Administrateur syst`eme, reseau, base de donnees
Technicien de maintenance
Chef de projet
Directeur des ressources informatiques
Directeur des syst`emes dinformation
Consultant, audit
Chercheurs / Inventeurs
Dirigeant de start-up (jeune pousse)
20 / 209
Les entreprises qui recrutent
Constructeurs (developpement materiel, syst`eme dexploitation)
HP `a Grenoble, Apple `a Paris, etc.
Operateurs Telecom (FT, Free, SFR, . . . )


Editeurs de logiciels (Dassault Catia, ILOG discovery, Jeux
Infogramme, Google, . . . )
SSII (installation syst`eme, materiel, logiciel, developpement,
adaptation, maintenance de logiciels `a la demande des clients) IBM,
Capgemini, Atos Origin, Accenture, Logica, Orange Business Serv. . .
Grands comptes (grandes societes reparties sur plusieurs sites, ayant
des besoins informatiques importants ; services informatiques propres
+ SSII prestataires de service) (constructeurs automobiles, Caisse des
depots, Hopitaux, . . . )
PMI/PME (utilisation de linformatique pour gestion, bureautique,
. . . )
Logiciel libre : 30000 professionnels en France
21 / 209
Ordinateur
Exemples
Calculatrice (programmable)
Ordinateur personnel (PC, Macintosh, . . . )
Station de travail (Sun, DEC, HP, . . . )
Super-ordinateur (Cray, IBM-SP, . . . )
Clusters dordinateurs
Mais aussi
Puce (programme xe)
Tablettes
Telephones portables
Appareils photos
...box et autres routeurs wi
Televiseurs, ...
22 / 209
Caracteristiques principales dun ordinateur
Absolument stupide
Il obeit strictement aux ordres recus
Est-ce quil fait ce que lon veut ?
Tr`es tr`es rapide
2GHz : 2 milliards doperations par seconde
Tr`es tr`es bonne memoire
Bible : M0 (million de caract`eres)
Memoire : Go (milliards de caract`eres)
Disque : To (1000 milliards de caract`eres)
23 / 209
`
A quoi sert un ordinateur ?
Stocker des informations
Agenda, musique, photos, ...
Traiter automatiquement des informations
Entree dinformation venant du clavier, souris, capteurs, memoire,
autre ordinateur, ...
Traitement des informations en executant un programme,
Sortie du resultat vers lecran, memoire, autre ordinateur, ...
Analogie : le cuisinier
Entree : les ingredients venant du frigo, ...
Programme : la recette
Sortie : le plat prepare vers le consommateur
24 / 209
Exemple de programme
Ingredients
250g de chocolat, 125g de beurre, 6 ufs, 50 g de sucre, cafe

Etapes
Faire fondre le chocolat avec 2 cuill`eres deau
Ajouter le beurre, laisser refroidir puis ajouter les jaunes
Ajouter le sucre et comme parfum un peu de cafe
Battre les blancs jusqu`a former une neige uniforme
Ajouter au melange.
25 / 209
Comment se faire comprendre ?
Quel niveau dabstraction ?
Trop detaille
Lever le bras de 10 cm, tendre la main vers la gauche, prendre la
casserole rouge, ...

Recette longue
Mauvaise Lisibilite

Recette dependant du contexte


Mauvaise Portabilite
Trop abstrait

Non informatif : Preparer une mousse au chocolat

Ambigu : cest combien une cuill`ere ?


26 / 209
Automatisation du traitement
Tout processeur (cur des dierents syst`emes informatiques) execute
des programmes.
Un programme est compose dune succession dinstructions qui
peuvent se decomposer en operations elementaires par compilation
La compilation transforme le programme ecrit dans un langage riche
(lisible par vous) en un langage simple compose doperations
elementaires (lisible par lordinateur)
Les operations elementaires sont realisees par des fonctions logiques
qui sont codees sous forme de 0 et de 1 en memoire puis . . .
Les fonctions logiques sont realisees par des circuits electroniques
(addition, test degalite)
Les circuits electroniques sont composes de ls / couches de silicium
traverses par un courant discontinu.
27 / 209
Deuxi`eme partie II

Elements de programmation
A. Le cycle de vie dun programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
B. Premiers programmes en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
C. Memoire, variables, types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
D. Lecture,

Ecriture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
E. Types de bases et expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
28 / 209
A. Le cycle de vie dun programme
Ce que je veux :
Calculer la puissance 4
e
dun nombre
Ce que lordinateur sait faire (code assembleur) :
...
400a55: 8b 55 e4 mov -0x1c(%rbp),%edx
400a58: 8b 45 e4 mov -0x1c(%rbp),%eax
400a5b: 0f af c2 imul %edx,%eax
400a5e: 89 45 e8 mov %eax,-0x18(%rbp)
400a61: 8b 45 e8 mov -0x18(%rbp),%eax
400a64: 0f af 45 e8 imul -0x18(%rbp),%eax
400a68: 89 45 ec mov %eax,-0x14(%rbp)
...
Cela ne va pas se faire tout seul ...
29 / 209
Digression : assembleur et premier mod`ele dexecution
Exercice : executer ce fragment dassembleur
400a55: 8b 55 e4 mov -0x1c(%rbp),%edx
400a58: 8b 45 e4 mov -0x1c(%rbp),%eax
400a5b: 0f af c2 imul %edx,%eax
400a5e: 89 45 e8 mov %eax,-0x18(%rbp)
400a61: 8b 45 e8 mov -0x18(%rbp),%eax
400a64: 0f af 45 e8 imul -0x18(%rbp),%eax
400a68: 89 45 ec mov %eax,-0x14(%rbp)
Indications
%eax, %edx : deux registres (cases memoire du processeur)
-0x14(%rbp), ..., -0x1c(%rbp) : autres cases memoire
Initialiser le contenu de la case %-0x1c(%rbp) `a 3
mov a, b : copier le contenu de la case a dans la case b
imul a, b : multiplier le contenu de a par celui de b et mettre le
resultat dans b
30 / 209
Cycle de vie dun programme
Methodologie
1.

Enonce du probl`eme
2. Formalisation (quel est le probl`eme precisement)
3. Recherche dun algorithme (comment resoudre le probl`eme ?)
4. Programmation (implantation)
5. Compilation
6. Execution
7. Mise au point (test, debogage, optimisation)
31 / 209
Cycle de vie dun programme
Probl`eme
Calculer la puissance 4
e
dun nombre
Formalisation
Specication des entrees et des sorties.
Scenario dutilisation : lutilisateur rentre au clavier un nombre entier x ;
lordinateur ache en retour la valeur de x
4
`a lecran.
Recherche dun algorithme
Comment on resout le probl`eme ?
Quel traitement appliquer `a lentree pour obtenir la sortie desiree ?
On note que x
4
= x x x x = (x
2
)
2
Algorithme :
calculer x x
prendre le resultat et faire de meme
32 / 209
Cycle de vie dun programme :

Ecriture dun programme
#include <iostream>
using namespace std;
int main() {
int x, xCarre, xPuissanceQuatre;
cout << "Entrez un entier: ";
cin >> x;
xCarre = x * x;
xPuissanceQuatre = xCarre * xCarre;
cout << "La puissance quatri`eme de " << x
<< " est " << xPuissanceQuatre << endl;
return 0;
}
33 / 209
Cycle de vie dun programme
Compiler le programme
Transformer le programme en code assembleur
Lancer le programme
Autant de fois que lon veut !
Tester que le programme fonctionne
Cas particuliers ! ! !
Ameliorer le programme
Correction derreurs
Optimisation du programme (rapidite, consommation memoire)
Optimisation de lalgorithme
Amelioration du programme (lisibilite, generalisation)
34 / 209
La notion dAlgorithme
Denition
Description formelle dun procede de traitement qui permet, `a partir
dun ensemble dinformations initiales, dobtenir des informations
deduites
Succession nie et non ambigue doperations clairement posees.
Doit donc toujours se terminer !
35 / 209
La notion de Programme
Denition
Suite dinstructions (ordres) donnees `a la machine
Ces instructions sont donnes en utilisant une syntaxe tr`es precise :
Cette syntaxe (et la semantique associee) est decrite par le langage
de programmation
Le programme implante un algorithme
Le programme est concu autant pour etre lu par un autre humain
(dont soi-meme dans un mois) que pour etre execute par lordinateur
36 / 209
Langages de programmation
Langage machine
Binaire directement comprehensible par la machine
Langage dassemblage (ou assembleur)
Tr`es facilement traduisible pour etre compris par la machine
Langage de programmation
Doit etre compile ou interprete pour etre compris par la machine
37 / 209
Les langages de programmation compiles
Chane de production
Utilisateur =
Programme
source
= Compilateur =
Programme
objet
= Machine
Exemples
Pascal, C, C++, ADA, FORTRAN, Java, . . .
Demo
38 / 209
Les langages de programmation interpretes
Chane de production
Utilisateur =
Instruction
source
= Interpreteur =
Instruction
machine
= Machine
Exemples
Basic, LISP, Perl, Python, . . .
Demo
39 / 209
B. Premiers programmes en C++
Le langage C++
1958 : ALGOL : ALGOrithmic Language
1970 : Langage C (Dennis Ritchie)

Langage generaliste simple et elegant

Independant du syst`eme, mais proche de lui

Rapidite par un controle n de lexecution

Toujours tr`es utilise


1983- : Langage C++ (Bjarn Stroustrup) : extension de C

Biblioth`eque standard (entrees, sorties)

Programmation objet

Programmation generique (templates)

Programmation fonctionnelle (un peu)


40 / 209
Un exemple de programme C++
#include <iostream>
using namespace std;
int main() {
cout << "Bonjour!" << endl;
return 0;
}
41 / 209
Un autre exemple de programme C++
#include <iostream>
using namespace std;
int main() {
int x, xCarre, xPuissanceQuatre;
cout << "Entrez un entier: ";
cin >> x;
xCarre = x * x;
xPuissanceQuatre = xCarre * xCarre;
cout << "La puissance quatri`eme de " << x
<< " est " << xPuissanceQuatre << endl;
return 0;
}
42 / 209
La structure dun programme C++
Syntaxe
Un programme C++ est compose de plusieurs parties :
Un entete de programme
Une fonction principale main composee de :

Un entete de fonction : declarations des variables

Le corps de la fonction : une suite dinstructions


43 / 209
La structure dun programme C++
Lentete du programme
#include <iostream>
using namespace std;
Un programme utilise souvent des composants dej`a existants
Lentete indique lesquels
Sans rentrer dans les details, lentete precise ici que lon va utiliser ici
les utilitaires dentree sorties (iostream) fournie par la biblioth`eque
standard (std) de C++
Lentete peut aussi declarer des constantes, des types, ...
44 / 209
La structure dun programme C++
La fonction main
int main() {
int x, xCarre, xPuissanceQuatre;
...
return 0;
}
Lentete de la fonction permet de declarer toutes les variables utilisees
dans la partie instructions.
45 / 209
La structure dun programme C++
La fonction main : instructions
Aussi appele le corps du programme.
cout << "Entrez un entier: ";
cin >> x;
xCarre = x * x;
xPuissanceQuatre = xCarre * xCarre;
cout << "La puissance quatri`eme de " << x
<< " est " << xPuissanceQuatre << endl;
Syntaxe
Une suite dinstructions separees par des points-virgules ;
suivi par une accolade fermante } .
46 / 209
C. Memoire, variables, types
La memoire
Une suite contigue de milliards de zeros et de uns.
Pour 1Go, `a raison de 1 chire par mm, cela ferait 8590 km, soit plus
que Paris-Pekin !
Le processeur y acc`ede par adresse
47 / 209
La notion de Variable
Objectif : stocker des informations en memoire centrale durant
lexecution dun programme ;
Analogie : utiliser un recipient pour stocker des ingredients en cuisine
Va mettre cela dans le bol en position 374479 sur letag`ere
On veut eviter davoir `a manipuler directement les adresses !
Denition
Une variable est un espace de stockage nomme o` u le programme peut
memoriser une donnee
Le nom de la variable est choisi par le programmeur
48 / 209
La notion de variable (2)
Notes
Une variable poss`ede quatre proprietes :
un nom (ou identicateur)
une adresse
un type
une valeur
La valeur peut changer en cours dexecution du programme
(do` u le nom de variable)
49 / 209
R`egles de formation des identicateurs
Les noms des variables (ainsi que les noms des programmes, constantes,
types, procedures et fonctions) sont appeles des identicateurs.
Syntaxe (r`egles de formation des identicateurs)
suite de lettres (minuscules a..z ou majuscules A..Z), de
chires (0..9) et de caract`eres de soulignement (_)
premier caract`ere doit etre une lettre
longueur bornee
50 / 209
Exemples et contres exemples didenticateurs (2)
Exemples :
c14_T0 est un identicateur ;
14c_T0 nest pas un identicateur ;
x*y nest pas un identicateur.
51 / 209
Formation des identicateurs (3)
Notes
Donnez des noms signicatifs aux variables
Dans le cas de plusieurs mots, par convention dans le cadre de ce
cours on mettra le premier mot en minuscule et les suivants avec une
majuscule : maVariable
Autre convention possible : ma_variable
Mauvais noms : truc, toto, temp, nombre ;
Bons noms courts : i,j,k,x,y,z,t.
Bons noms longs : nbCases, notes, moyenneNotes, estNegatif.
52 / 209
Notion de type
Les variables peuvent contenir toutes sortes de donnees dierentes :
nombres entiers, re`els, booleens, ...
textes
releves de notes, images, musiques, ...
Denition (Notion de type de donnee)
Une variable ne peut contenir quune seule sorte de donnees
On appelle cette sorte le type de la variable
On dit que C++ est un langage type statiquement :
53 / 209
Les types de base
Les dierents types de base en C++ sont :
Les entiers (mots cles int, long int) ;
Exemples : 1, 42, -32765
les reels (mots cles float ou double) ;
Exemples : 10.43, 1.0324432e22
les caract`eres (mot cle char) ;
Exemples : a, b, , ]
les chanes de caract`eres (mot cle string).
Exemples : bonjour, Alice aime Bob
les booleens (mot cle bool).
Exemples : true, false
Les entiers, les caract`eres et les booleens forment les types ordinaux.
54 / 209
La declaration des variables
Pour chaque variable, il faut donner au programme son nom et son type.
On dit que lon declare la variable.
Syntaxe (Declaration des variables)
introduite par un nom de type
liste de noms de variables (separees par des virgules)
Exemple
int x, y, monEntier;
float f, g;
bool b;
55 / 209
La manipulation de variables
Apr`es sa denition (declaration + allocation dune case memoire),
une variable poss`ede une valeur qui correspond `a letat de la memoire
au moment de sa denition
Certains langages garantissent que les variables sont initialisees `a zero
Pas C++ !
56 / 209
Laectation
Syntaxe
identificateur = expression ;
Exemple
x = 3 + 5 ;
Semantique
Calcul (ou evaluation) de la valeur de lexpression
Rangement de cette valeur dans la case memoire associee `a cette
variable.
La variable et lexpression doivent etre de meme type !
57 / 209
Exemple daectations
operation instruction valeur de la variable
aecter la valeur 1 `a la variable x x = 1 x : 1
aecter la valeur 3 `a la variable y y = 3 y : 3
Notes
Aectation x = y : copie de la valeur
= transferer un ingredient dun recipient `a lautre
58 / 209
Aectation et egalite : deux concepts dierents
Laectation x = 5
Une instruction modiant letat de la memoire.
Le test degalite x == 5
Une expression qui a une valeur booleenne :
Est-ce que x est egal `a 5 ?
Autrement dit : est-ce que la valeur contenue dans la variable x est 5 ?
59 / 209
La manipulation des variables (2)
Notes
On peut modier la valeur des variables tout au long du programme.
Exemples :
operation instruction valeur
aecter la valeur x + 1 `a la variable x x = x + 1 x : 2
aecter la valeur y + x `a la variable y y = y + x y : 5
60 / 209
Exemple daectations
#include <iostream>;
using namespace std;
int main() {
int a, b, c, d;
cout << a << " " << b << " " << c << " " << d << endl;
a = 1;
cout << a << " " << b << " " << c << " " << d << endl;
b = 3;
cout << a << " " << b << " " << c << " " << d << endl;
a + b;
cout << a << " " << b << " " << c << " " << d << endl;
a - b;
cout << a << " " << b << " " << c << " " << d << endl;
a = a + 2 * b;
cout << a << " " << b << " " << c << " " << d << endl;
c + b;
cout << a << " " << b << " " << c << " " << d << endl;
a * b;
cout << a << " " << b << " " << c << " " << d << endl;
}
61 / 209
Les constantes
Le langage C++ permet de manipuler des constantes de chaque type
de base.
La valeur dune constante est donnee au debut dun programme et ne
peut etre changee par la suite.
Syntaxe
Declaration introduite par le mot cle const
const type nomDeConstante = valeur ;
Exemple
const int nombreDAnnuites = 3;
const int nombreDeMois = 12 * nombreDAnnuites;
62 / 209
D. Lecture,

Ecriture
63 / 209
Lachage (ou ecriture)
Syntaxe
Achage dune valeur :
cout << expression ;
Achage dune valeur avec saut de ligne :
cout << expression << endl ;
Achage de plusieurs valeurs :
cout << expr1 << expr2 << expr3 ;
Semantique


Evaluer lexpression (ou les expressions)


Ecrire le resultat sur le ux de sortie (ecran)
64 / 209
La saisie (ou lecture)
Syntaxe
Lecture dune variable :
cin >> variable ;
Lecture de plusieurs variables :
cin >> variable1 >> variable2 ;
Semantique
Lit une valeur du type approprie sur le clavier
Aecte cette valeur `a la variable
65 / 209
La saisie (ou lecture) (2)
Notes
Les caract`eres tapes sur le clavier sont codes (ASCII) puis places dans
la memoire tampon (buer) du clavier
Cette memoire tampon fonctionne comme une le dattente (premier
arrive, premier servi)
La memoire tampon nest envoyee au programme quapr`es lappui de
la touche Entree
Clavier =
Memoire
tampon
= Programme
66 / 209
La saisie (ou lecture) (3)
Notes
Lorsque la memoire tampon est vide, linstruction
cin >> variable ; attend quune donnee arrive dans cette memoire
tampon.
Le programme est bloque et attend une action de lutilisateur.
Notes
Lorsque la memoire tampon contient une donnee, linstruction
cin >> variable ; prend la premi`ere, la supprime du tampon, la
traduit en valeur C++ et place cette valeur dans la variable.
67 / 209
Lecture dune variable de type int ou float
Notes
Les blancs places en tete sont ignores ; le retour `a la ligne et les
tabulations sont consideres comme des blancs.
Erreur `a lexecution si on trouve un caract`ere ne correspondant pas `a
la syntaxe des constantes de type int ou float.
Sinon, on lit tant que le caract`ere correspond `a la syntaxe des
constantes de type int ou float.
Erreur `a lexecution si valeur de la constante non compatible pour
laectation avec le type de la variable.
68 / 209
E. Types de bases et expressions
69 / 209
Les entiers (types int, long)
representes sur un mot machine ;
sur une machine `a n bits on peut representer 2
n
entiers, soit les
entiers compris entre 2
n1
et +2
n1
1.
Les bornes sont donnees par -MAXINT-1 et MAXINT.
Notes
Dierence entier machine / entier mathematique !
Voir Exemples/int.cpp, Exemples/long.cpp
70 / 209
Les operations sur les entiers
Notes
loppose (operation unaire, notee -) ;
laddition (operation binaire, notee +) ;
la soustraction (operation binaire, notee -) ;
la multiplication (operation binaire, notee *) ;
la division enti`ere (operation binaire, notee /) ;
le reste de la division enti`ere (operation binaire, notee %) ;
Attention la multiplication nest pas implicite, le symbole * doit toujours
etre indique explicitement entre les deux operandes.
71 / 209
Les operations sur les entiers (2)
Exemples :
operation resultat
17 + 5 22
17 - 5 12
17 * 5 85
17 / 5 3
17 % 5 2
72 / 209
Les reels (types float, double)
La representation des reels varie suivant les langages de programmation,
les machines et les normes utilisees.
Les operations possibles sur les reels sont :
Notes
loppose (operation unaire, notee -) ;
laddition (operation binaire, notee +) ;
la soustraction (operation binaire, notee -) ;
la multiplication (operation binaire, notee *) ;
la division (operation binaire, notee /) ;
73 / 209
Les operations sur les reels
Exemples :
operation resultat notation scientique
13.6 + 6.9 20.5 2.05E+01
13.6 - 6.9 6.7 6.7E+00
13.6 * 6.9 93.84 9.384E+01
13.6 / 6.9 1.9710145 1.9710145E+00
Voir Exemples/float.cpp
74 / 209
Les caract`eres (type char)
Permettent de stocker un seul caract`ere :

Une lettre de lalphabet (sans accent) : a, ..., z, A, ..., Z

Un chire 0, ..., 9

Un caract`eres du clavier (@, +, /, )

Quelques caract`eres speciaux


Notes entre apostrophes (exemple : A) pour distinguer le caract`ere
A de la variable A
La table ASCII associe un numero unique entre 0 et 127 `a chaque
caract`ere, ce qui permet dintroduire un ordre
Et les lettres accentuees ? Les caract`eres chinois ? ...
Voir Exemples/char.cpp
75 / 209
Les chanes de caract`eres (type string)
Permettent de stocker une suite de caract`eres : un mot, une phrase,
...
Notees entre guillemets doubles (exemple : "A") ;
Operations
operation exemple resultat
concatenation "bonjour" + "toto" "bonjourtoto"
indexation "bonjour"[3]" j
longueur "bonjour".length()" 7
76 / 209
Les booleens
Notes
Les variables de type booleen ne peuvent prendre que deux valeurs :
vrai (mot cle true) ;
faux (mot cle false).
Les operations possibles sur les booleens sont :
la negation (operation unaire, mot cle not) ;
la conjonction (operation binaire, mot cle and) ;
la disjonction (operation binaire, mot cle or).
...
77 / 209
Les tables de verite
not
false true
true false
and false true
false false false
true false true
or false true
false false true
true true true
De plus le type booleen est ordonne : false < true.
78 / 209
Expressions booleennes : comparaisons
La condition dans une expression booleenne resulte dans la majorite des
cas dune ou plusieurs comparaisons.
symbole C++ symbole mathematique
< <
<=
== =
!= =
>=
> >
79 / 209
Expressions booleennes : encadrements
Exemple
Les encadrements ne peuvent pas etre ecrits directement en C++
Ils doivent etre realises `a laide de deux comparaisons connectees par
loperateur and.
Lencadrement mathematique
0 x 15
se traduit en C++ par lexpression booleenne
(0 <= x) and (x <= 15)
80 / 209

Evaluation paresseuse des expressions booleennes


Exemple
Quelle est la valeur des expressions suivantes :
false and ( 3*x + 1 >= 2 or 1/(1+x) < 42 )

true or ( 3*x + 1 >= 2 or 1/(1+x) < 42 )

Deux possibilites :
levaluation compl`ete : evaluer tous les operandes des expressions
booleennes
levaluation paresseuse : stopper levaluation d`es que lon peut :

Pour une conjonction a and b on peut sarreter si a est faux

Pour une disjonction a or b on peut sarreter si a est vrai


81 / 209
Les types ordinaux
Notes
successeur (operateur ++) ;
predecesseur (operateur -).
82 / 209
Les expressions
Une expression peut etre :
une valeur constante
Exemples : 2, 56.7, u ou true
une variable
toute combinaison doperations valides mettant en uvre des
constantes et/ou des variables
83 / 209
Ordre de priorite
Exercice
Quelle est la valeur des expressions suivantes :
6 / 3 * 2
6 + 3 * 2
3 + 4 <= 2 * 8
not 1 < 2 and 1 == 2
Notes
Les expressions sont evaluees de gauche `a droite suivant lordre de priorite
decroissante suivant :
Unaire Binaire
not
* / % and
+ - + - or
<, <=, =, !=, >= >
84 / 209
Le parenthesage
Notes
Les parenth`eses servent `a modier lordre de priorite.
Exemples :
operations valeurs
5 + 4 * 2 13
(5 + 4) * 2 18
85 / 209
Troisi`eme partie III
Structures de controle
A. Instructions conditionnelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
B. Instructions iteratives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
86 / 209
Resume des episodes precedents. . .
Notes
Un programme imperatif est compose dinstructions dont le but est de
produire un eet.
Pour le moment nous avons vu trois instructions :
Lecture : cin >> variable ;


Ecriture : cout << expression ;
Aectation : variable = expression
Les instructions sont executees de mani`ere sequentielle (les unes apr`es les
autres), dans lordre du programme.
Les expressions sont constituees de constantes et variables, connectees par
des operations.
87 / 209
Le probl`eme
On a souvent besoin de rompre la sequence dexecution :
Dans certain cas particulier, on veut sauter certaines instructions :
Instructions conditionnelles
Dans dautres cas, on a besoin de repeter certaines instructions :
Instructions iteratives
88 / 209
A. Instructions conditionnelles
En fonction dun choix ou dune condition, on va executer ou non un bloc
dinstructions.
Denition
Une condition est une expression booleenne
(i.e. dont le resultat est de type booleen).
Denition
Un bloc dinstructions est une suite dinstructions `a executer
successivement. Il est decrit par la syntaxe suivante :
{
instruction 1;
instruction 2;
...
instruction n;
}
89 / 209
Instruction conditionnelle simple (mot cle if)
Syntaxe
if ( condition ) {
bloc d instructions
}
Semantique
La condition est evaluee
Si sa valeur est true, le bloc dinstructions est execute
Exemples
if ( x >= 0 ) {
cout << "x est positif" << endl;
}
if ( x >= 0 ) cout << "x est positif" << endl;
90 / 209
Instruction conditionnelle avec alternative (mot cle else)
Syntaxe
if (condition) {
bloc d instructions 1
} else {
bloc d instructions 2
}
Semantique
La condition est evaluee
Si sa valeur est true, le bloc dinstructions 1 est execute
Si sa valeur est false, le bloc dinstructions 2 est execute
91 / 209
Exemples dinstruction alternative
Exemple
if ( x >= 0 ) {
cout << "x est positif" << endl;
} else {
cout << "x est negatif" << endl;
}
92 / 209
Exemples dinstruction alternative (2)
Exemple (Calcul du maximum et du minimum de x et y)
int x, y, maximum, minimum;
...
if ( x > y ) {
maximum = x;
minimum = y
} else {
maximum = y;
minimum = x;
}
93 / 209
Erreurs classiques avec les conditionnelles
Exemple
bool estPositif;
...
if ( x >= 0 ) {
estPositif = true
} else {
estPositif = false
}
Utiliser une expression booleenne `a la place !
bool estPositif;
...
estPositif = x >= 0;
94 / 209
Erreurs classiques avec les conditionnelles (2)
Exercice
Que fait :
if ( x = 1 ) {
cout << "x vaut 1" << endl;
}
Attention !
Ne pas confondre = (aectation) et == (egalite) !
95 / 209
Erreurs classiques avec les conditionnelles (3)
Exercice
Que fait :
if ( x == 1 ); {
cout << "x vaut 1" << endl;
}
La meme chose que :
if ( x == 1 );
cout << "x vaut 1" << endl;
Ne tiens pas compte du if et ache toujours x vaut 1 .
Attention !
le point-virgule est un separateur dinstruction !
if (...) {...} else {...} forme une seule instruction
Jamais de point-virgule avant un bloc dinstructions !
96 / 209
Tests imbriques
Il est bien s ur possible dimbriquer des instructions if then else.
Note : un else se rapporte au dernier if rencontre.
Example
Que se passe-t-il lorsque x = 5 et y = 4 dans lexemple suivant :
if (x >= y ) {
if ( x == y ) {
cout << x << " = " << y << endl;
}
else {
cout << x << " < " << y << endl;
}
}
Attention !
En C++, la structuration est determinee pas les accolades
La mauvaise indentation induit en erreur le lecteur !
97 / 209
Tests imbriques, version correcte
Example
Que se passe-t-il lorsque x = 5 et y = 4 dans lexemple suivant :
if (x >= y ) {
if ( x == y ) {
cout << x << " = " << y << endl;
}
} else {
cout << x << " < " << y << endl;
}
98 / 209
Lindentation
Rappel
Un programme sadresse `a un lecteur
La lisibilite est un objectif essentiel
Notes
Lindentation consiste `a espacer les lignes de code par rapport au
bord gauche de la fenetre de saisie de texte
Lespacement doit etre proportionnel au niveau dimbrication des
instructions du programme
Quatre espaces par niveau dimbrication est un bon compromis
La plupart des editeurs de texte orent des facilites pour realiser une
bonne indentation. Apprenez les.
99 / 209
B. Instructions iteratives
Rappel
La force dun ordinateur est de savoir faire des taches repetitives tr`es
rapidement et sans sennuyer.
Exemples
On veut acher tous les nombres entre 1 et 1000.
Dans un jeu sur ordinateur, `a la n dune partie, on veut demander
voulez vous rejouer ? et si oui recommencer une nouvelle partie.
Tous les 1/24`eme de seconde on veut acher une image dun lm
(sil en reste)
100 / 209
B. Instructions iteratives
Exemple (Calcul de la factorielle)
On veut calculer 7! = 1 2 7 :
int resultat = 1;
resultat = resultat * 2;
resultat = resultat * 3;
resultat = resultat * 4;
resultat = resultat * 5;
resultat = resultat * 6;
resultat = resultat * 7;
cout << "Factorielle 7 vaut " << resultat << endl;
Probl`emes
Ce code sent mauvais (repetitions) !
Et si on veut calculer 10! ou 100! ?
101 / 209
Les instructions iteratives
Denition
Les instructions iteratives permette de repeter un certain nombre de fois
lexecution dune bloc dinstructions sous certaines conditions.
De fa con imagee, on appelle boucle cette methode permettant de repeter
lexecution dun groupe dinstructions.
Instructions iteratives
Boucles Tant que (while)
Boucles Faire ... tant que (do ... while)
Boucles Pour (for)
102 / 209
La boucle tant que (while)
Syntaxe
while (condition) {
bloc d instructions
}
Semantique
Tant que la condition est vraie, on rep`ete le bloc dinstructions :
La condition est evaluee
Si sa valeur est true, le bloc dinstructions est execute
On recommence
103 / 209
La boucle tant que (while) : exemples
Exemple
int n, resultat;
cin >> n;
resultat = 1;
while (n > 0) {
resultat = resultat * n;
n = n - 1;
}
cout << resultat << endl;
Execution pour n = 3 puis pour n = 0
104 / 209
La boucle tant que (while) : exemples
Exemple (Compter de 1 `a 10)
int n = 1;
while ( n <= 10 ) {
cout << n << endl;
n = n + 1;
}
105 / 209
Compteur / accumulateur
Techniques de Boucle :
comptage, utilisation dune variable compteur
accumulation, utilisation dune variable accumulateur
Notes
Laccumulation sert `a appliquer la meme operation (somme,
produit, . . .) `a plusieurs elements.
On utilise une variable appelee accumulateur pour stocker les
resultats intermediaires.
106 / 209
Cas particulier : condition toujours fausse
Si la valeur de la condition est fausse d`es le depart alors le bloc
dinstructions ne sera jamais execute !
Exemple
int n = 1;
while ( n < 0 ) {
cout << n << endl;
n = n + 1;
}
107 / 209
Cas particulier : condition toujours vraie
Si la valeur de la condition est toujours vraie, alors le bloc
dinstructions sera execute indeniment ! (boucle innie)
Exemple (Que fait ce programme ?)
int n = 1;
while ( true ) {
cout << n << endl;
n = n + 1;
}
Exemple (Erreur typique : oublier lincrementation !)
int n = 1;
while ( n <= 10 ) {
cout << n << endl;
}
108 / 209
Une source derreur classique en n de boucle
Exemple
Que vaut n `a la n du programme suivant ?
int n = 1;
while ( n <= 10 ) {
cout << n << endl;
n = n + 1;
}
cout << n << endl;
Rappel
On sort de la boucle quand la condition est fausse !
Le compteur est donc un cran trop loin !
109 / 209
La boucle faire ... tant que (do ... while)
Syntaxe
do {
bloc d instructions
} while ( condition );
Semantique
On execute le bloc dinstructions
On evalue la condition
Si sa valeur est true, on recommence
Remarque
La boucle est executee au moins une fois !
110 / 209
La boucle faire ... tant que (do ... while) : exemples
Exemple
int n, resultat;
cin >> n;
resultat = 1;
do {
resultat = resultat * n;
n = n - 1;
} while (n > 0);
cout << resultat << endl;
Execution pour n = 3 puis pour n = 0
111 / 209
La boucle faire ... tant que (do ... while) : exemples
Exemple
char reponse;
do {
...
cout << "Voulez-vous rejouer (o/n)?" << endl;
cin >> reponse
} while ( reponse == o );
112 / 209
La boucle pour (for)
Syntaxe
for ( initialisation ; condition ; incrementation ) {
bloc d instructions
}
Semantique
1. On execute linstruction dinitialisation
2. On evalue la condition
3. Si sa valeur est true, on execute le bloc dinstruction
4. On execute linstruction dincrementation
5. On recommence en (2)
113 / 209
La boucle pour (for) : exemple
Exemple
int n;
for ( n = 1 ; n <= 10 ; n = n + 1 ) {
cout << n;
}
Variante compacte :
for ( int n = 1 ; n <= 10 ; n++ ) {
cout << n;
}
La variable n est locale `a la boucle (on y reviendra)
n++ est un raccourci pour n = n + 1
114 / 209
La boucle pour (for) : exemples
Exemple
int n, resultat;
cin >> n;
resultat = 1;
for ( int k = 1; k <= n; k++ ) {
resultat = resultat * k;
}
cout << resultat << endl;
Execution pour n = 3 puis pour n = 0.
115 / 209
Quatri`eme partie IV
Fonctions
A. Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
B. Fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
116 / 209
Resume des episodes precedents . . .
Pour le moment nous avons vu les instructions suivantes :
Lecture : cin >> variable ;


Ecriture : cout << expression ;
Aectation : variable = expression
Instruction conditionnelle : if
Instructions iteratives : while, do ... while, for
Remarque
Tout ce qui est calculable par un ordinateur peut etre programme
uniquement avec ces instructions
Pourquoi aller plus loin ?
Passage `a lechelle !
117 / 209
Motivation : lexemple du livre de cuisine
Recette de la tarte aux pommes
Ingredients : 250 g de farine, 125 g de beurre, 1 uf, 2 cl deau une
pincee de sel, 100 g de sucre en poudre, 5 belles pommes
Mettre la farine dans un recipient puis faire un puits
Versez dans le puits 2 cl deau
Mettre le beurre
Mettre le sucre et le sel
Petrir de facon `a former une boule


Etaler la pate dans un moule
Peler les pommes, les couper en quartier et les disposer sur la pate
Faire cuire 30 minutes
118 / 209
Motivation : lexemple du livre de cuisine (2)
Recette de la tarte aux poires
Ingredients : 250 g de farine, 125 g de beurre, 1 uf, 2 cl deau une
pincee de sel, 100 g de sucre en poudre, 5 belles poires
Mettre la farine dans un recipient puis faire un puits
Versez dans le puits 2 cl deau
Mettre le beurre
Mettre le sucre et le sel
Petrir de facon `a former une boule


Etaler la pate dans un moule
Peler les poires, les couper en quartier et les disposer sur la pate
Faire cuire 30 minutes
119 / 209
Motivation : lexemple du livre de cuisine (3)
Recette de la tarte tatin
Ingredients : 250 g de farine, 125 g de beurre, 1 uf, 2 cl deau une
pincee de sel, 200g de sucre en poudre, 5 belles pommes
Mettre la farine dans un recipient puis faire un puits
Versez dans le puits 2 cl deau
Mettre le beurre
Mettre le sucre et le sel
Petrir de facon `a former une boule
Verser le sucre dans une casserole
Rajouter un peu deau pour lhumecter
Le faire carameliser `a feu vif, sans remuer
Verser au fond du plat `a tarte
Peler les pommes, les couper en quartier
Faire revenir les pommes dans une poele avec du beurre
Disposer les pommes dans le plat, et etaler la pate au dessus
Faire cuire 45 minutes et retourner dans une assiette
120 / 209
Quest-ce qui ne va pas ?
Duplication
Longueurs
En cas derreur ou damelioration, il faut corriger plusieurs endroits
Manque dexpressivite
Dicile `a lire
Dicile `a memoriser
Essayons dameliorer cela
121 / 209
Recettes de base
Recette de la pate brisee
Ingredients : 250 g de farine, 125 g de beurre, 1 uf, 2 cl deau une
pincee de sel
Mettre la farine dans un recipient puis faire un puits
Versez dans le puits 2 cl deau Mettre le beurre
Mettre le sucre et et une pincee de sel
Puis petrir de facon a former une boule
Recette du caramel
Ingredients : 100 g de sucre
Verser le sucre dans une casserole
Rajouter un peu deau pour lhumecter
Le faire carameliser `a feu vif, sans remuer
122 / 209
Recettes de tartes
Tarte aux fruits (pommes, poires, ...)
Ingredients : 500g de fruits et les ingredients pour une pate brisee
Preparer une pate brisee


Etaler la pate dans un moule
Peler les fruits, les couper en quartier et les disposer sur la pate
Faire cuire 30 minutes
Tarte tatin
Ingredients : 5 belles pommes, pate brisee, caramel
Preparer une pate brisee
Preparer un caramel et le verser au fond du plat `a tarte
Peler les pommes, les couper en quartier
Faire revenir les pommes dans une poele avec du beurre
Disposer les pommes dans le plat, et etaler la pate au dessus
Faire cuire 45 minutes et retourner dans une assiette
123 / 209
Les fonctions : objectif
Modularite
Decomposer un programme en programmes plus simples
Implantation plus facile
Validation (tests)
Reutilisation
Flexibilite
(remplacement dun sous-programme par un autre)
Non duplication
Partager (factoriser) du code
Code plus cours
Maintenance plus facile
Niveau dabstraction
Programmes plus concis et expressifs 124 / 209
Appel de fonctions usuelles
#include <math.h>
#include <iostream>
using namespace std;
int main() {
cout << "3^2 = " << pow(3.0, 2.0) << endl;
cout << "2^3 = " << pow(2.0, 3.0) << endl;
cout << "e^1 = " << exp(1.0) << endl;
cout << "cos(pi) = " << cos(3.1415) << endl;
return 0;
}
Ce programme ache :
3^2 = 9
2^3 = 8
e^1 = 2.71828
cos(pi) = -1
125 / 209
Appel de fonctions usuelles
On remarque
La presence de #include <math.h>
Cest pour utiliser la biblioth`eque de fonctions mathematiques.
On y reviendra ...
Lordre des arguments est important
Le type des arguments est important
On sait ce que calcule cos(x)
On ne sait pas comment il le fait
On na pas besoin de le savoir
126 / 209
Premiers exemples : la fonction max
#include <iostream>
using namespace std;
float max(float a, float b) {
if ( a >= b ) {
return a;
} else {
return b;
}
}
int main() {
cout << max(1.0, 3.0) << endl;
cout << max(5.0, 2.0) << endl;
cout << max(2.0, 2.0) << endl;
return 0;
}
127 / 209
Premiers exemples : la fonction factorielle
#include <iostream>
using namespace std;
int main() {
int n, resultat;
cin >> n;
resultat = 1;
for ( int k = 1; k <= n; k++ ) {
resultat = resultat * k;
}
cout << resultat << endl;
return 0;
}
128 / 209
Premiers exemples : la fonction factorielle
#include <iostream>
using namespace std;
int factorielle(int n) {
int resultat = 1;
for ( int k = 1; k <= n; k++ ) {
resultat = resultat * k;
}
return resultat;
}
int main() {
int n;
cin >> n;
cout << n << "! = " << factorielle(n) << endl;
return 0;
}
129 / 209
Syntaxe dune fonction
Syntaxe
type nom(type1 parametre1, type2 parametre2, ...) {
... declarations de variables ...
... instructions ...
return expression;
}
parametre1, parametre2, ... sont les param`etres formels
Le type des param`etres formels est xe
Les variables sont appelees variables locales

`
A la n, la fonction renvoie la valeur de expression qui doit etre du
type annonce
Il peut y avoir plusieurs return
130 / 209
La fonction main
Exemple
#include <iostream>
using namespace std;
int main() {
cout << "Bonjour!" << endl;
return 0;
}
Le programme principal est une fonction comme les autres !
Ce programme renvoie une valeur enti`ere. Par convention :

0 si lexecution du programme sest deroulee normalement

un entier dierent de 0 en cas derreur


cet entier indique quel genre derreur sest produite
131 / 209
La fonction main : param`etres
#include <iostream>
using namespace std;
int main(int argv, char ** args) {
string nom1, nom2;
nom1 = args[1];
nom2 = args[2];
cout << "Bonjour " << nom1 << "!" << endl;
cout << "Bonjour " << nom2 << "!" << endl;
return 0;
}
`
A lexecution :
> bonjour-nom Jean Paul
Bonjour Jean!
Bonjour Paul!
132 / 209
Appel de fonctions : un exemple
Considerons la fonction suivante :
int factorielle(int n) {
int resultat = 1;
for ( int k = 1; k <= n; k++ ) {
resultat = resultat * k;
}
return resultat;
}
Que se passe-til lorsque lon evalue lexpression suivante :
factorielle(1+2)
133 / 209
Appel de fonctions : formalisation
Syntaxe
nom(expression1, expression2, ...)
Semantique
1. Les expressions sont evaluees
2. Leurs valeurs sont les param`etres re`els
3. Leurs types doivent correspondre au type des param`etres formels
(eventuellement une conversion a lieu)
4. De la memoire est allouee sur la pile pour :

Les variables locales

Les param`etres formels


5. Les param`etres re`els sont aectes aux param`etres formels (copie)
6. Les instructions sont executees
7. Lorsque return expression est rencontre, lexpression est
evaluee et donne la valeur de retour de la fonction
8. Les variables et param`etres sur la pile sont desallouees
9. Au nal, la valeur de lexpression est donnee par la valeur de retour.
134 / 209
Appel de fonctions : exercice
Quache le (fragment de) programme suivant :
int incremente(int n) {
n = n + 1;
return n;
}
int main() {
int a, b;
a = 1;
b = incremente(a);
cout << a << endl;
cout << b << endl;
return 0;
}
135 / 209
Passage des param`etres par valeur
Les param`etres formels dune fonction sont des variables comme les autres
On peut les modier
Mais. . .
Rappel
Lors dun appel de fonction ou de procedure, la valeur du param`etre reel
est copiee dans le param`etre formel
En consequence
Une modication du param`etre formel, naecte pas le param`etre reel
Si la variable est volumineuse (tableaux, chane de caract`eres, etc.),
cette recopie peut etre co uteuse.
On dit que les param`etres sont passes par valeur
Plus tard on verra le passage de param`etres par reference
136 / 209
Exemple
int a, b;
int f(int b) { // param`etre formel (donc local `a f)
int c; // variable locale `a f
return a + b + c;
}
int main() {
int b, c; // variables locales `a main
a + b + c // b et c: locales `a main, a: globale
{
long a, c;
a + b + c // a et c: locales au bloc, b: locale `a main
}
a + b + c; // b et c: locales `a main, a: globale
return f(b);
}
137 / 209
Portee des variables
Contexte lexical
Une variable est visible depuis sa declaration jusqu`a la n du bloc o` u
elle est declaree
Elle peut masquer des variables issues des contextes englobants (cf.
exemple suivant)
Variable locale : denie dans le bloc dune fonction
Variable globale : denie ailleurs
Les param`etres formels se comportent comme des variables locales.
Remarque
Une variable locale `a une fonction nexiste que le temps dexecution
de la fonction.
La valeur que cette variable peut avoir lors dun appel `a la fonction
est perdue lors du retour au programme appelant et ne peut etre
recuperee lors dun appel ulterieur.
138 / 209
Variables locales/globales
les variables du programme principale (dite globale) restent
accessibles `a linterieur de la fonction.
On peut modier la valeur dune variable globale
Ceci est tr`es fortement deconseillee (eet de bord)
Une variable locale masque une variable globale du meme nom
Ceci est tr`es fortement deconseillee (ambigute)
On interdira ces pratiques dans le cadre de ce cours
139 / 209
Fonction recursive
Exercice
Executer pas-`a-pas lexecution du programme suivant
int factorielle(int n) {
if (n == 0) {
return 1;
} else {
return n * factorielle(n-1);
}
}
int main() {
int n;
cin >> n;
cout << n << "! = " << factorielle(n) << endl;
return 0;
}
140 / 209
Procedures
On a parfois besoin de sous-programme qui agissent au lieu de calculer :
on veut produire un eet (achage, musique, etc)
on veut modier (en place) letat interne dune structure de donnee.
On parle deet de bord
Exemple
void affiche_rectangle(n) {
for (int k=0; k<n; k++) {
cout << "**********" << endl;
}
}
Remarques
Cette fonction ne renvoie rien
On le denote en C++ par le type void
Dans dautres langages on distingue fonctions et procedures
141 / 209
Documentation dune fonction (syntaxe javadoc)
Exemple
/** La fonction factorielle
* @param n un nombre entier positif
* @return n!
**/
int factorielle(int n) {
Une bonne documentation
Est concise et precise
Donne les preconditions sur les param`etres
Decrit le resultat (ce que fait la fonction)
Astuce pour etre ecace
Toujours commencer par ecrire la documentation dune fonction
De toutes les facons il faut reechir `a ce quelle va faire !
142 / 209
Tests dune fonction
Il ny a pas dinfrastructure standard en C++ pour ecrire des tests
Dans ce cours, on utilisera une infrastructure minimale
Exemple
void factorielleTest() {
ASSERT( factorielle(0) == 1 );
ASSERT( factorielle(1) == 1 );
ASSERT( factorielle(2) == 2 );
ASSERT( factorielle(3) == 6 );
ASSERT( factorielle(4) == 24 );
}
143 / 209
Tests dune fonction
Astuces pour etre ecace
Commencer par ecrire les tests dune fonction
De toutes les facons il faut reechir `a ce quelle va faire !
Tester les cas particuliers
Tant que lon est pas s ur que la fonction est correcte :

Faire des essais supplementaires

Capitaliser ces essais sous forme de tests


Si lon trouve un bogue :

Ajouter un test caracterisant le bogue


Remarque
Les eets de bord sont durs `a tester !
144 / 209
Cinqui`eme partie V
Tableaux
A. Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
B. Les tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
C. Tableaux et allocation memoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
D. Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
E. Variantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
145 / 209
Resume des episodes precedents . . .
Pour le moment nous avons vu les instructions suivantes :
Lecture : cin >> variable ;


Ecriture : cout << expression ;
Aectation : variable = expression
Instruction conditionnelle : if
Instructions iteratives : while, do ... while, for
Fonctions
Pourquoi aller plus loin ?
Passage `a lechelle !
Manipuler de grosses quantites de donnees
146 / 209
A. Motivation
Exemple (Fil conducteur)
Implantation dun annuaire
147 / 209
B. Les tableaux
`
A retenir
Un tableau est une valeur composite formee de plusieurs valeurs du
meme type
En gros : une suite contigue de cases en memoire
Une valeur (ou element) dun tableau t est designee par sa position i
dans le tableau. On la note typiquement t[i ].
En C++, cette position est un entier entre 0 et 1, o` u est le
nombre delements du tableau
Exemple
Voici un tableaux dentiers :
1 4 1 5 9 2 6 5 3 5
Avec cet exemple, t[0] vaut 1, t[1] vaut 4, t[2] vaut 1, ...
Noter que lordre et les repetitions sont importantes !
148 / 209
Les tableaux en C++
Exemple
vector<int> t;
t = vector<int>(10);
t[0] = 1;
t[1] = 4;
t[2] = 1;
t[3] = 5;
t[4] = 9;
t[5] = 2;
t[6] = 6;
t[7] = 5;
t[8] = 3;
t[9] = 5;
cout << t[5] + t[9] << endl;
149 / 209
C. Tableaux et allocation memoire
Declaration dun tableau dentiers
vector<int> t;
Pour un tableau de ottants, on utiliserait vector<float>, etc.
Pour aller plus loin : vector est un template
Allocation dun tableau de 10 entiers
t = vector<int>(10);
t contient maintenant une reference vers ces cases
Initialisation du tableau
t[0] = 1;
t[1] = 4;
150 / 209
Tableaux et allocation memoire
`
A retenir
Une valeur de type tableau ne contient pas directement les cases du
tableau, mais la localisation en memoire de celles-ci (reference).
Une variable de type tableau se construit en trois etapes :
1. Declaration
2. Allocation
Sans elle : faute de segmentation (au mieux !)
3. Initialisation
Sans elle : meme probl`eme quavec les variables usuelles
Raccourci
Declaration, allocation et initialisation en un coup :
vector<int> t = { 1, 4, 1, 5, 9, 2, 6, 5, 3, 5 };
Introduit par la norme C++ de 2011 !
151 / 209
D. Operations
Syntaxe
Si t est un tableau, on peut utiliser t[i] comme nimporte quelle
variable :
x = t[2] + 3*t[5]; // Acc`es en lecture
t[4] = 2 + 3*x; // Acc`es en ecriture
Attention !
En C++ les indices ne sont pas veries !
Le comportement de t[i] nest pas specie en cas de debordement
Source no 1 des trous de securite ! ! !
Acc`es avec verications possibles avec : t.at(i) au lieu de t[i]
Quelques autres operations
t.size(); // Taille du tableau
t.push_back(3); // Ajout dun element `a la fin 152 / 209
Aectation de tableaux
vector<int> t = { 1, 4, 1, 5, 9, 2, 6, 5, 3, 5 };
cout << "t[0]: " << t[0] << endl;
vector<int> t2;
t2 = t; // Affectation
t2[0] = 0;
cout << "t[0]: " << t[0] << ", t2[0]: " << t2[0] << endl;
`
A retenir
En C++, lors dune aectation, un vector est copie !
On dit que vector a une semantique de copie
Dierent de Java, Python, ou des array en C!
Pour aller plus loin
Les vector sont passes par valeur aux fonctions
Pour preserver les performances, vector suit le patron de conception
de copie-en-ecriture : la copie na lieu que quand elle est necessaire
153 / 209
Tableaux, collections et vecteurs en C++
La biblioth`eque standard C++ fournit de nombreuses autres
structures de donnees pour representer des collections :
array, list, queue, stack, set, multiset, ...
Chacune a ses specicites en terme de semantique, doperations
disponibles et de performances
On se contentera dans ce cours de vector
On en verra plus en S2 !
Les vector de C++ ne sont pas des vecteurs au sens mathematique :
pas doperation daddition, ...
Les chanes de caract`eres (string) se comportent en gros comme
des tableaux de caract`eres
154 / 209
Tableaux `a deux dimensions
Remarque
On represente un tableau `a deux dimensions par un tableau de
tableaux : vector<vector<int> >
t
i ,j
: t[i][j]
Attention !
1. Declaration du tableau
2. Allocation du tableau
3. Allocation de chaque ligne
4. Initialization
Exemple (Implantation de Tic-Tac-Toe)
155 / 209
Sixi`eme partie VI
Modularite
A. Lire un programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
B. Debogage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
C. Compilation separee . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
156 / 209
Resume des episodes precedents . . .
Pour le moment nous avons vu les instructions suivantes :
Lecture : cin >> variable ;


Ecriture : cout << expression ;
Aectation : variable = expression
Instruction conditionnelle : if
Instructions iteratives : while, do ... while, for
Fonctions
Tableaux
Pourquoi aller plus loin ?
Passage `a lechelle !
Maintenance de gros programmes
157 / 209
A. Lire un programme
Dans lordre du chier ?
Quelles sont les briques de bases (bottom-up)
Parcourir les fonctions disponibles et leur documentation.
Qui appelle qui ? (top-down)
Chercher la fonction main
Quelles fonctions appelle-telle ?
Quelles fonctions appellent ces fonctions ?
Ne rentrer dans les details que si cest necessaire
Exemple
x = cos(theta);
On supposes, a priori, que la fonction cos est correcte !
158 / 209
Debogage : les types derreurs
Erreurs de syntaxe
Detectees par le compilateur
Erreurs `a lexecution
Erreurs semantiques
Le programme sexecute normalement
mais le resultat est incorrect
Le programme ne fait pas ce que le programmeur souhaitait.
Le programme fait ce que le programmeur lui a demande !
159 / 209
Debogage
Erreurs de syntaxe
Bien lire les messages derreurs
Le compilateur pointe vers l`a ou il ne comprends pas
Pas forcement l`a o` u est lerreur
Erreurs `a lexecution
Analyser letat du programme juste avant lerreur.
En Python, Java, ... : regarder la pile dappel.
Utilisation du debogeur !
160 / 209
Debogage des erreurs semantiques
Un travail de detective !
Peut etre tr`es frustrant, surtout sous stress
Peut etre tr`es une belle source de satisfaction
Gerer ses emotions !
Diculte
Isoler une erreur glissee dans :
Un programme de millions de lignes
De grosses donnees
Des milliards dinstructions executees
Exemple
Exemples/debogage.cpp
Utilisation du debogueur !
161 / 209
Debogage : reduire le probl`eme par dichotomie
1. Faire une experience pour determiner dans quelle moitie du
programme est lerreur.
2. Caracteriser le boggue : Lorsque jappelle telle fonction avec tels
param`etres, la reponse est incorrecte
En faire un test !
3. Trouver le plus petit exemple incorrect
En faire un test !
4. Executer pas `a pas la fonction sur cet exemple
5. Trouver lerreur
6. Corriger lerreur
7. Verier les tests (non regression)
8. Rajouter des tests ?

Etre ecace dans la boucle essai-erreur ! ! !


162 / 209
Un outil essentiel : le debogueur
Observation du programme en cours de fonctionnement
Execution pas `a pas

En passant `a la ligne suivante (next)

En rentrant dans les sous fonctions (step)


Points darrets (conditionnels)
Analyse de la pile dexecution
Analyse de letat de la memoire
Debogueur gdb et CodeBlocks
En arri`ere plan gdb : GNU DeBugger
CodeBlocks rend lutilisation du deboggeur facile
Il nest disponible que si on a cree un projet !
163 / 209
Debogage : prevention
Developpement incremental
Toujours etre proche de quelque chose qui marche
Gestion de version
Modularite
Decoupage dun programme en fonctions
Decoupage dun programme en modules
`
A venir !
Decoupage dun programme en espace de noms
`
A venir !
Specications et tests
Denir precisement la semantique des fonctions :
quest-ce quelles doivent faire
Tester que la semantique est respectee sur des exemples.
164 / 209
C. Compilation separee
Exemple
Partager une fonction max entre plusieurs programmes
165 / 209
Declaration de fonctions
Syntaxe
Semantique
Le programme denit quelque part une fonction max avec cette
signature : type des param`etres et type du resultat
Cette denition nest pas forcement dans le meme chier
Si cette denition nexiste pas ou nest pas unique, une erreur est
declenchee par le compilateur
Lerreur est declenchee au moment o` u lon combine les dierents
chiers (edition de liens)
Application typique
Deux fonctions qui sappellent reciproquement
166 / 209
Digression : surcharge de fonctions
En C++, on peut avoir plusieurs fonctions avec le meme nom et des
signatures dierentes
Idem en Java, mais pas en C ou en Python par exemple
Il est recommande que toutes les fonctions ayant le meme nom aient
la meme semantique
Exemple (la fonction max : Exemples/max-surcharge.cpp)
Pour les entiers, les reels, les chanes de caract`eres, ...

`
A deux ou trois arguments (et plus ?)
Remarque
Cet exemple nest pas satisfaisant (duplication)
Correctif : les templates pour ecrire du code generique
Ce sera pour un autre cours !
167 / 209
Compilation separee
Un programme peut etre compose de plusieurs chiers source
Contenu :

Des denitions de fonctions

Des variables globales, ...


Chaque chier source est compile en un chier objet (extension : .o)
Contenu :

Le code binaire des fonctions, ...


Lediteur de lien combine plusieurs chiers objet en un chier
executable
Sources
max.cpp :
int max(int x, int y)
float max(float x, float y)
programme.cpp :
int main()
Compilation Fichiers objet
max.o
programme.o

Edition de lien Fichier executable


programme
g++ -c max.cpp
g++ -c programme.cpp g++ programme.o max.o -o programme
168 / 209
Compilation separee (2)
Au moment de ledition de lien
Chaque fonction utilisee doit etre denie une et une seule fois
La fonction main doit etre denie une et une seule fois
Quelques variantes autour des chiers objets
Biblioth`eques (.a) :
Une archive contenant plusieurs chiers objets .o
Biblioth`eques dynamiques (.so) :

Edition de lien dynamique au lancement du programme


169 / 209
Fichiers dentete
Fichier .h contenant la declaration des fonctions denies dans le chier
.cpp correspondant
Exemple (max.h)
Syntaxe (Utilisation dun chier dentete)
#include "max.h"
Semantique
Utiliser la biblioth`eque max
Implantation en C++


Equivalent `a copier-coller le contenu de max.h `a lemplacement du
#include "max.h"
Gere par le preprocesseur (cpp)
170 / 209
Inclusion de chiers dentete standard
Syntaxe
#include <iostream>
Semantique
Charge la declaration de toutes les fonctions denies dans la
biblioth`eque standard iostream de C++.
Le chier iostream est recherche dans les repertoires standards du
syst`eme.
Sous linux : /usr/include, ...
171 / 209
Declaration de fonctions
Syntaxe
Semantique
Le programme denit quelque part une fonction max avec cette
signature : type des param`etres et type du resultat
Cette denition nest pas forcement dans le meme chier
Si cette denition nexiste pas ou nest pas unique, une erreur est
declenchee par le compilateur
Lerreur est declenchee au moment o` u lon combine les dierents
chiers (edition de liens)
Application typique
Deux fonctions qui sappellent reciproquement
172 / 209
Resume : implantation dune biblioth`eque en C++

Ecrire un chier dentete (max.h)


La declaration de toutes les fonctions publiques
Avec leur documentation !

Ecrire un chier source (max.cpp)


La denition de toutes les fonctions
Inclure le chier .h !

Ecrire un chier de tests (maxTest.cpp)


Les fonctions de tests
Fonction main lan cant tous les tests
Avec CodeBlocks : creer un projet contenant max.h, max.cpp,
maxTest.cpp
173 / 209
Resume : utilisation dune biblioth`eque en C++
Inclusion des entetes
#include <iostream> // fichier dent^ete standard
#include "max.h" // fichier dent^ete perso
Raccourci pour les espaces de nom
using namespace std;
Compilation
Donner la biblioth`eque `a charger `a lediteur de lien
Gere automatiquement par CodeBlocks
174 / 209
Resume : compilation separee avec CodeBlocks
Creer un projet pour chaque chier executable (programme)
Y mettre tous les chiers qui doivent etre compilees ensemble :

Fichiers sources (.cpp)

Fichiers dentetes (.h)


175 / 209
Digression : espaces de noms
Probl`eme
Conit entre biblioth`eques denissant des fonctions avec le meme nom!
Solution
Isoler chaque biblioth`eque dans un espace de noms
Exemple
La biblioth`eque standard C++ utilise lespace de nom std :
#include <iostream>
int main() {
std::cout << "Bonjour!" << std::endl;
return 0;
}
Vous verrez plus tard comment creer vos propres espaces de noms
176 / 209
Septi`eme partie VII
Fichiers, ux, exceptions
A. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
B. Fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
C. Digression : traitement des erreurs et exceptions . . . . . . . . . . . . . . . . 189
177 / 209
A. Projets de n de semestre
Th`eme
Traitement dimage
Compression PNG
En pratique
Volume horaire : une vingtaine dheure
Travail en binome recommande
Calendrier
1. Semaine 10 : TP : lecture / ecriture dimages
2. Semaine 11 : Travail personnel + TP
3. Semaine 12 : Travail personnel + TP
4. Semaine 13 : Soutenance projet en TP
178 / 209
Resume des episodes precedents . . .
Pour le moment nous avons vu les instructions suivantes :
Lecture : cin >> variable ;


Ecriture : cout << expression ;
Aectation : variable = expression
Instruction conditionnelle : if
Instructions iteratives : while, do ... while, for
Fonctions
Tableaux et valeurs composites
Programmation modulaire
Pourquoi aller plus loin ?
Passage `a lechelle !
Donnees persistentes
179 / 209
B. Introduction

Etude de cas : un annuaire


Probl`emes
Separation programme / donnees
Persistence des donnees
180 / 209
Quest-ce quun chier
Denition
Un chier informatique est au sens commun, une collection
dinformations numeriques reunies sous un meme nom, enregistrees sur un
support de stockage tel quun disque dur, un CD-ROM, ou une bande
magnetique, et manipulees comme une unite.
Techniquement
Un chier est une information numerique constituee dune sequence
doctets, cest-`a-dire dune sequence de nombres, permettant des usages
divers.
Comme la memoire, mais en persistent !
181 / 209

Ecriture dans un chier


#include <fstream>
using namespace std;
int main() {
ofstream fichier("blah");
fichier << "coucou" << endl;
fichier.close();
}
Trois phases :
1. Ouverture du chier
2.

Ecriture
3. Fermeture du chier
182 / 209
Lecture depuis un chier
#include <fstream>
#include <iostream>
using namespace std;
int main() {
ifstream fichier("bla.txt");
string nom;
int i;
fichier >> nom >> i;
cout << "i: " << i << "nom: " << nom << endl;
}
Trois phases :
1. Ouverture du chier
2. Lecture
3. Fermeture du chier
183 / 209
Exemple : recherche dans un annuaire
184 / 209
Notion de tampon
Metaphore de la bote aux lettres
Aller poster une lettre, cela prend du temps
Donc on attend souvent davoir accumule plusieurs lettres pour les
envoyer toutes dun coup
Strategie decriture
De meme, ecrire un chier octet par octet, ce nest pas ecace
On accumule les informations `a ecrire dans une memoire tampon
Lorsquil y en a assez on les ecrit toutes dun coup
(ush : tirer la chasse deau)
185 / 209
Notion de tampon : de limportance de fermer les chiers
Denition (Memoire Tampon)
Une zone de memoire utilisee pour stocker temporairement des donnees,
notamment entre deux processus ou deux pi`eces dequipement ne
fonctionnant pas `a la meme vitesse
Attention !
Si on ne ferme pas un chier, les donnees dans le tampon `a la n de
lexecution du programme sont perdues !
Autre instance du meme phenom`ene
Perte de donnees si on retire une clef USB trop vite !
vous pouvez maintenant retirer le peripherique en toute securite
186 / 209
Notion de ux
Remarque
On a utilise la meme syntaxe pour lire au clavier et pour lire depuis
un chier : xxx >> variable
Idem pour lecriture : xxx << variable
Denition (Flux de donnees)
Un ux entrant de donnees est un dispositif o` u lon peut lire des
donnees lune apr`es lautre
Un ux sortant de donnees est un dispositif o` u lon peut ecrire des
donnees lune apr`es lautre
187 / 209
Exemples
Flux entrant de donnees
cin : entree standard du programme
Typiquement : clavier
chiers (ifstream)
chanes de caract`eres ! (istringstream)
connexion avec un autre programme ...
Flux sortant de donnees
cout : sortie standard du programme
Avec tampon
cerr : sortie derreur du programme
Sans tampon
chiers (ofstream)
chanes de caract`eres ! (ostringstream)
connexion avec un autre programme ...
188 / 209

Etat dun chier


Semantique
Une variable de type chier peut etre dans un bon etat ( jusquici tout
va bien ) ou un mauvais etat :
Fichier non trouve `a louverture, probl`eme de permissions
Lecture ou ecriture incorrecte
Fin du chier atteinte
Plus de place disque
Syntaxe
Dans un contexte booleen, un chier est evalue `a Vrai sil est en bon etat :
if (fichier) ...
Remarque
Si un chier nest pas en bon etat, il y a moyen den savoir plus
189 / 209
D. Digression : traitement des erreurs et exceptions
Syntaxe
throw e;
Semantique
Une situation exceptionnelle que je ne sait pas gerer sest produite
Je marrete immediatement et je previens mon boss
cest-`a-dire la fonction appelante
On dit quon l`eve une exception
La situation est decrite par e
e est un objet quelconque ; par exemple une exception standard
Si mon boss ne sait pas gerer, il previent son boss
. . .
Si personne ne sait gerer, le programme sarrete
190 / 209
Exemple de lancer dexception
exception.cpp
#include <iostream>
using namespace std;
int factorielle(int n) {
if (n < 0) throw "Argument invalide: n doit ^etre positif";
if (n == 0) return 1;
return n*factorielle(n-1);
}
int main() {
cout << factorielle(-1) << endl;
}
191 / 209
Quelques exceptions standard
exception
invalid_argument, out_of_range, length_error
logic_error, bad_alloc, system_error
exception-standard.cpp
#include <stdexcept>
#include <iostream>
using namespace std;
int factorielle(int n) {
if (n < 0) throw invalid_argument("n doit ^ etre positif");
if (n == 0) return 1;
return n*factorielle(n-1);
}
int main() {
cout << factorielle(-1) << endl;
}
192 / 209
Gestion des exceptions
Syntaxe
try {
bloc d instructions;
} catch (type & e) {
bloc d instructions;
}
Semantique
Execute le premier bloc dinstructions
Si une exception de type type est levee, ce nest pas grave, je sais
gerer :

Lexecution du premier bloc dinstruction sinterrompt

Le deuxi`eme bloc dinstruction est execute


193 / 209
Huiti`eme partie VIII
Introduction `a la complexite dalgorithmes
A. Complexite dun algorithme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
B. Ordres de grandeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
C. Complexite dun probl`eme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
D. Calculabilite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
194 / 209
Quelques probl`emes
Quel est le meilleur algorithme pour trouver un nom dans un
annuaire ?
Comment predire le temps que va mettre un programme pour
sexecuter ?
Comment savoir, entre deux algorithmes, lequel est le plus ecace ?
Comment savoir si un algorithme est optimal ?
Comment determiner si un probl`eme est insoluble en pratique ?
195 / 209
Exemple : recherche nave dans un tableau
Je recherche le nom Zorro dans un annuaire en utilisant la methode
suivante :
1. Je pars du debut de lannuaire
2. Je compare le nom avec Zorro
3. Si oui, jai termine
4. Sinon, je recommence en 2 avec le nom suivant
Probl`eme
Combien est-ce que cela va me prendre de temps ?
Combien est-ce que cela prendra de temps `a un ordinateur
196 / 209
Synth`ese
On sest donne :
un probl`eme : rechercher un mot dans un dictionnaire
un algorithme pour le resoudre : recherche exhaustive
un mod`ele de calcul :
1. Choix de la mesure de la taille dune instance du probl`eme :
le nombre de mots du dictionnaire
2. Choix des operations elementaires : comparer deux mots
Denition
Dans ce mod`ele, on a cherche le nombre doperations elementaires
eectuees par lalgorithme pour un probl`eme de taille n.
Cest ce que lon appelle la complexite de lalgorithme.
`
A partir de cette information, et en connaissant le temps necessaire pour
de petites instances du probl`eme, on peut predire le temps necessaire
pour resoudre nimporte quelle instance du probl`eme.
197 / 209
Variantes
Complexite au pire
Exemple : n operations pour la recherche exhaustive
Complexite en moyenne
Exemple :
n
2
operations pour la recherche exhaustive
Complexite en memoire
La meme strategie peut sappliquer `a toutes les autres ressources
En particulier la complexite en memoire : combien faut-il de memoire
pour executer lalgorithme (au pire, en moyenne, . . . )
Exemple
Un algorithme a une complexite en memoire de n
2
Que peut-on dire de sa complexite en temps ?
198 / 209
Exercices
Donner des algorithmes et leur complexite au pire et en moyenne pour les
probl`emes suivants :
1. Calculer la somme de deux vecteurs de Q
n
2. Acher une image
3. Calculer le plus grand element dun tableau
4. Rechercher la position dun element dans un tableau
5. Rechercher un element dans un tableau trie
6. Inserer un element dans un tableau trie
7. Essayer tous les codes secrets pour une carte bancaire
8. Essayer tous les mots de passe pour un compte en ligne
199 / 209
Quelques courbes de complexite
200 / 209
Ordres de grandeurs
Exemple
Un algorithme en 1000 log
2
n + 50 est meilleur quun algorithme en
n
1000
d`es que lon sinteresse `a des instances susamment grandes
La plupart du temps, il sut davoir un ordre de grandeur du nombre
doperations : les constantes sont sans grande importance
Denitions
Soient f et g deux fonctions de N dans N
par exemple les complexites de deux algorithmes
On note f = O(g) si f est au plus du meme ordre de grandeur que g :
il existe une constante a telle que f (n) ag(n)
On note f = o(g) si, asymptotiquement, f est negligeable devant g :
pour toute constante a > 0 il existe N tel que f (n) ag(n) pour n N
201 / 209
Quelques r`egles de calculs sur les ordres de grandeur
Proposition
1. O(4n + 3) = O(n)
2. O(log n) + O(log n) = O(log n)
3. O(n
2
) + O(n) = O(n
2
)
4. O(n
3
)O(n
2
log n) = O(n
5
log n)
202 / 209
Exercices
Simplier les ordres de grandeurs suivants :
1. o(17n + 124) + o(n) + 3n
2. o(n
2
) + 10
12
o(n)
3. n
2
o(n)o(log n)
4. O(n) + o(n log n)
5. O(n) o(n log n)
6. O(n log n) + o(n log n)
203 / 209
C. Complexite dun probl`eme
Probl`eme
On a vu dans un exercice precedent un algorithme pour calculer la
moyenne dun tableau de nombres et on a obtenu sa complexite : O(n)
Existe-til un meilleur algorithme ?
Denitions
La complexite dun probl`eme est la complexite du meilleur algorithme
pour le resoudre.
On dit quun algorithme est optimal si sa complexite concide avec celle
du probl`eme.
204 / 209
Exercices
1. Les algorithmes vus precedemment sont-ils optimaux ?
2. Demontrer que la recherche dun element dans un tableau trie de
taille n est un probl`eme de complexite O(log n).
205 / 209
Exercices

Evaluer au mieux la complexite des probl`emes suivants :


1. Calcul du n-i`eme nombre de Fibonacci ;
2. Test de primalite de n ;
3. Calcul du pgcd de deux nombres ;
4. Recherche dun echec et mat en 4 coups `a partir dune position
donnee aux echecs.
5. Recherche du plus court chemin entre deux stations de metro `a Paris ;
6. Calcul de la n-i`eme decimale de

2 ;
7. Probl`eme du sac-`a-dos : etant donne un ensemble dobjets de hauteur
et de poids variables, et un sac `a dos de hauteur donnee, charger au
maximum le sac-`a-dos ?
206 / 209
D. Calculabilite
Des notes dun excellent expose de David Harel :
Computers are not omnipotent
Denition
Un probl`eme est calculable sil existe un algorithme pour le resoudre
Theor`eme (Th`ese de Chuch-T uring)
La calculabilite dun probl`eme est une notion robuste qui ne depends par
du langage de programmation, de larchitecture, ...
Formalisation de plusieurs mod`eles de calculs, dont les machines
de T uring
Demonstration de lequivalence de ces mod`eles
Ces mod`eles concident avec la notion intuitive
Video : une machine de T uring en lego
207 / 209
Calculabilite et solvabilite
Remarque
Un probl`eme peut avoir une solution mais ne pas etre calculable
(on ne sait pas construire une solution)
Exemple (Probl`eme de larret)
P : un programme (par exemple ecrit en C++)
D : des donnees
Question : est-ce que le programme P sarrete si on le lance sur les
donnees D ?
Il est impossible decrire un programme HALT(P,D) qui predit si la reponse
est oui ou non.
208 / 209
Calculabilite pratique
Un probl`eme peut avoir une solution algorithmique inutilisable en pratique
parce quil eectue un nombre trop grand doperations.
Exemple (Jeu dechec)

`
A chaque etape, il existe un nombre ni de coups possibles.
Donc il est possible dexplorer la suite du jeu pour chaque coup.
Mais il faut examiner jusqu`a 10
19
coups pour decider de chaque
deplacement.
Dicile ! mais programmes au niveau champion du monde
Exemple (Jeu de Go)
Damier : 19x19, r`egles beaucoup plus simples
Explosion beaucoup plus rapide : 10
600
coups !
Programmes au niveau amateur
Voir aussi : p. 25 de Computers are not Omnipotent
209 / 209
Conclusion : quavons nous vu ce semestre ?
Les bases de la programmation
instructions de controle de ot (conditionnelles, iteratives)
types de donnees
fonctions, modules
entrees-sorties
Un peu de methodologie de developpement
Documentation, tests
Programmation incrementale
Une esquisse de quelques outils
Algorithmique, structures de donnees, complexite, ...
Ce nest que le debut de laventure !

Das könnte Ihnen auch gefallen