courspourimpression informatique

55
MPI, Info 111 : Introduction ` a l’informatique Nicolas M. Thi´ ery http://Nicolas.Thiery.name/Enseignement/Info111 Inspir´ e de cours de Fr´ ed´ eric Verni` ere, Laurent Simon, Florent Hivert, ... 29 novembre 2013 Partie I. Introduction ................................................................................................. 1 Partie II. ´ El´ ements de programmation ................................................................................ 27 Partie III. Structures de contrˆole ..................................................................................... 85 Partie IV. Fonctions ............................................................................................... 115 Partie V. Tableaux ................................................................................................. 144 Partie VI. Modularit´ e .............................................................................................. 155 Partie VII. Fichiers, flux, exceptions ................................................................................. 176 Partie VIII. Introduction ` a la complexit´ e d’algorithmes ............................................................... 193

Upload: yatma-niang

Post on 26-Dec-2015

17 views

Category:

Documents


2 download

TRANSCRIPT

MPI, Info 111 : Introduction a l’informatique

Nicolas M. Thiery

http://Nicolas.Thiery.name/Enseignement/Info111

Inspire de cours deFrederic Verniere, 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, flux, exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176

Partie VIII. Introduction a la complexite d’algorithmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193

1 / 209

Premiere partie I

Introduction

A. C’est quoi l’informatique en fait ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

B. A propos de ce cours . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

C. Une breve histoire de l’infomatique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

D. Debouches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

E. Ordinateurs et traitement automatique des informations . . . . . . . . . . 21

2 / 209

Pourquoi enseigner l’informatique ?

Evidence : l’ordinateur est partout !

I Combien d’ordinateur dans la salle ?

I Combien d’ordinateur possedez vous ?

I Le mot « assiste par ordinateur » est en voie de disparition

I Usage constant des ordinateurs, pour le travail comme le reste

Evidence : tous les jeunes connaissent deja l’informatique

Vraiment ?

3 / 209

A. C’est quoi l’informatique en fait ?

Une petite analogie

I Mr Einstein, vous qui etes un excellent physicien,vous devez savoir changer la roue de ma voiture, non ?

I Mr Alonso, vous qui etes un excellent conducteur de F1,vous devez savoir reparer le carburateur de ma voiture, non ?

Conducteur 6= Garagiste 6= Physicien

Et pourtant, loin d’etre Einstein ou Alonso, ...

I Mr Thiery, vous qui etes professeur en informatique,vous devez savoir reparer mon W.....s, non ?

4 / 209

C’est quoi l’informatique en fait ?

Suite de la petite analogie ...

L’usage La technologie La science

Conduite Reparation, Conception Physique

Consommation Cuisine Chimie, Biologie

Utilisation Programmation, ... Informatique

Qu’est-ce qu’on apprend a l’ecole ?

I Principalement la science

I Et il y a des raisons profondes pour cela.

I Et il y a des pressions pour que ce ne soit pas le cas

Quelle ecole pour la societe de l’information ?

Une conference de Francois ElieA lire ou ecouter ... et mediter ...

5 / 209

Tous les jeunes connaissent deja l’informatique ?

L’usage ?

I Evidence : tous les jeunes savent utiliser un ordinateur

I Vraiment ? les-enfants-ne-savent-pas-se-servir-dun-ordinateur

La technologie ?

I Qui sait programmer ? Configurer un reseau ?

La science ?

Ma petite experience

I 6eme : 3eme :

I Fac : apprendre la science a bouleverse ma programmation

I 2013 : apres 30 ans et 300k lignes de code, j’apprends toujours ...6 / 209

La science informatique ?

I Science du calcul et de l’informationI Notion fondamentale : etude des systemes en evolution

I Etat avantI Etape de calculI Etat apres

I Modeles de calcul

7 / 209

Grands problemes

Calculabilite

I Que peut, ou ne peut pas faire, un ordinateur ?

I Independemment du langage

I Independemment du materiel

I Tous les langages sont equivalents

Complexite

I Combien de ressources faut-il pour resoudre un probleme ?

I Independemment du langage

I Independemment du materiel

8 / 209

Grands problemes de l’informatique

Maıtriser les systemes extremement complexes

I Internet avec des milliards d’ordinateur

I Programmes avec des millions de lignes

I Services gerant des millions de clients

I Passage a l’echelle

AbstractionExemple : Reseau : Couches OSI

ProblemeApprendre des outils concus pour les programmes de 100000 lignes entravaillant sur des programmes de 10 lignes ...

9 / 209

Concepts des langages de programmation

I Java, C++, Python, Ada, Pascal, Perl, ...

I Un nouveau langage par semaine depuis 50 ans !I Heureusement les concepts sont presque toujours les memes :

I Programmation imperativeI Programmation objetI Programmation fonctionnelleI Programmation logique

I Algorithmique, Structures de donnees

10 / 209

Autres grand themes de l’informatique

I Reseaux

I Bases de donnees

I Langages formels, automates

I Mathematiques discretes : graphes, combinatoire

I Surete du logiciel :Specification, Test, Preuve

I Surete et securite des donnees :Codage, cryptographie

11 / 209

B. A propos de ce cours

Ce que l’on va voir

I Les briques de bases

I Les regles de compositions

I Les constructions usuelles

I Les problemes deja resolus

I Les erreurs les plus courantes

Pour quoi faire ?

I Pour beneficier de l’experience de plus de 50 ans de programmation

I Pour arriver a l’intuition de ce qui est possible ... ou pas

I Pour arriver a l’intuition de comment resoudre un nouveau probleme

12 / 209

Programme

Introduction

I Pourquoi ?

I A propos de ce cours

I Historique

I Debouches

I Qu’est-ce qu’un ordinateur

Algorithmique et programmation structuree

I Concepts de la programmation structuree

I Algorithmique

I Programmation C++ (simple)Python ?

I Environnement : Code Block

I Passer a l’echelle ?

13 / 209

Organisation du cours

1h30 amphi, 2h TD, 2h TP

Du TD ? ? ? ?

I Apprendre la science informatique, en utilisant un ordinateur, pourprogrammer ...

I C’est comme apprendre la physique, tout en conduisant une voiture ...

I C’est pas facile ...

Evaluation

I Partiel (dans l’axe des TD)

I Projet en fin de semestre

I Examen final (vision d’ensemble)

14 / 209

C. Une breve histoire de l’infomatique

La prehistoire : de 3000 AC a 1900

I Babyloniens (3000 AC) : methodes systematiques de calcul et deresolution d’equations

I Abaques, machines pour predire le mouvement des astres (80 AC)

I Formalisation du calcul : Al Khawarizmi (IXeme)I XVIIeme

I Pascal : machine a additionnerI Leibniz : systeme binaire pour le calcul

I XVIIIemeI Jacquard : metier a tisserI Babbage : machine differentielle

I XIXemeI Boole : calcul binaire et calcul logiqueI Peirce – Hilbert : 3 Questions : correction formelle – completude -

decidabilite d’un systeme formel

15 / 209

De 1900 a 1940

I Godel : Tout systeme formel suffisamment puissant est soitincoherent soit incomplet

I Turing : Probleme de l’arret indecidable

Les annees 40

I Travaux en cryptographie (decodage : Machine Enigma, Colossus)I Parallelement, en Angleterre, en Allemagne et aux USA, construction

des premiers ordinateursI 1944 : Calculateur electro-mecanique Mark 1 (Aiken, 44)I 1946 : ENIAC Calculs balistiques (Atanasoff, Mauchly Eckert)I 1944 : EDVAC, Mauchly Eckert et Von NeumannI 1948 : EDSAC,

I 1948 : Invention du transistor (Baarden, Brattain et Shockley 47)

16 / 209

Les annees 50

I Test de Turing en 50

I Compilateurs (FORTRAN en 57)

I LISP en 58

I Circuits integres en 59

Les annees 60

I Systemes d’exploitation

I Basic en 64

I Automates – Langages formels - Correction de programmes

I Knuth : The Art of Computer Programming

I Micro-processeurs

17 / 209

Les annees 70

I Base de Donnees Relationnelles

I Unix et C (Thompson et Richie)

I Pascal et Ada

I Architecture RISC (IBM), Cray 1 en 76

I Premiers reseaux

Les annees 80

I Micro-ordinateur personnel (Apple – MacIntosh en 84)

I NFSNet en 87 : Ancetre d’Internet

I Premiers virus en 88

I Formalisation du Logiciel Libre

18 / 209

Les annees 90

I Linux

I C++, Java, Perl, Python, ...

I Explosion d’Internet

I Un ordinateur dans « chaque foyer » ou presque

Les annees 2000-

I Ordinateurs partout, tout le temps

I Parallelisation massive

I ...

Pour les detailshttp://dept-info.labri.u-bordeaux.fr/~dicky/HisInfo.html

19 / 209

Les metiers de l’informatique

I Developpeur (programmeur, analyste, ingenieur)

I Formateur (apprendre aux autres)

I Testeur

I Administrateur systeme, reseau, base de donnees

I Technicien de maintenance

I Chef de projet

I Directeur des ressources informatiques

I Directeur des systemes d’information

I Consultant, audit

I Chercheurs / Inventeurs

I Dirigeant de start-up (jeune pousse)

20 / 209

Les entreprises qui recrutent

I Constructeurs (developpement materiel, systeme d’exploitation)

I HP a Grenoble, Apple a Paris, etc.

I Operateurs Telecom (FT, Free, SFR, . . . )

I Editeurs de logiciels (Dassault Catia, ILOG discovery, JeuxInfogramme, Google, . . . )

I SSII (installation systeme, materiel, logiciel, developpement,adaptation, maintenance de logiciels a la demande des clients) IBM,Capgemini, Atos Origin, Accenture, Logica, Orange Business Serv. . .

I Grands comptes (grandes societes reparties sur plusieurs sites, ayantdes besoins informatiques importants ; services informatiques propres+ SSII prestataires de service) (constructeurs automobiles, Caisse desdepots, Hopitaux, . . . )

I PMI/PME (utilisation de l’informatique pour gestion, bureautique,. . . )

I Logiciel libre : 30000 professionnels en France

21 / 209

Ordinateur

Exemples

I Calculatrice (programmable)

I Ordinateur personnel (PC, Macintosh, . . . )

I Station de travail (Sun, DEC, HP, . . . )

I Super-ordinateur (Cray, IBM-SP, . . . )

I Clusters d’ordinateurs

Mais aussi

I Puce (programme fixe)

I Tablettes

I Telephones portables

I Appareils photos

I ...box et autres routeurs wifi

I Televiseurs, ...22 / 209

Caracteristiques principales d’un ordinateur

Absolument stupide

I Il obeit strictement aux ordres recus

I Est-ce qu’il fait ce que l’on veut ?

Tres tres rapide

I 2GHz : 2 milliards d’operations par seconde

Tres tres bonne memoire

I Bible : M0 (million de caracteres)

I Memoire : Go (milliards de caracteres)

I Disque : To (1000 milliards de caracteres)

23 / 209

A quoi sert un ordinateur ?

Stocker des informationsAgenda, musique, photos, ...

Traiter automatiquement des informations

I Entree d’information venant du clavier, souris, capteurs, memoire,autre ordinateur, ...

I Traitement des informations en executant un programme,

I Sortie du resultat vers l’ecran, memoire, autre ordinateur, ...

Analogie : le cuisinier

I Entree : les ingredients venant du frigo, ...

I Programme : la recette

I 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

I Faire fondre le chocolat avec 2 cuilleres d’eau

I Ajouter le beurre, laisser refroidir puis ajouter les jaunes

I Ajouter le sucre et comme parfum un peu de cafe

I Battre les blancs jusqu’a former une neige uniforme

I Ajouter au melange.

25 / 209

Comment se faire comprendre ?

Quel niveau d’abstraction ?

I Trop detaille« Lever le bras de 10 cm, tendre la main vers la gauche, prendre lacasserole rouge, ... »

I Recette longueMauvaise Lisibilite

I Recette dependant du contexteMauvaise Portabilite

I Trop abstrait

I Non informatif : « Preparer une mousse au chocolat »I Ambigu : c’est combien une cuillere ?

26 / 209

Automatisation du traitement

I Tout processeur (cœur des differents systemes informatiques) executedes programmes.

I Un programme est compose d’une succession d’instructions quipeuvent se decomposer en operations elementaires par compilation

I La compilation transforme le programme ecrit dans un langage riche(lisible par vous) en un langage simple compose d’operationselementaires (lisible par l’ordinateur)

I Les operations elementaires sont realisees par des fonctions logiquesqui sont codees sous forme de 0 et de 1 en memoire puis . . .

I Les fonctions logiques sont realisees par des circuits electroniques(addition, test d’egalite)

I Les circuits electroniques sont composes de fils / couches de siliciumtraverses par un courant discontinu.

27 / 209

Deuxieme partie II

Elements de programmation

A. Le cycle de vie d’un 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 d’un programme

Ce que je veux :

« Calculer la puissance 4e d’un nombre »

Ce que l’ordinateur 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 modele d’execution

Exercice : executer ce fragment d’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)

Indications

I %eax, %edx : deux registres (cases memoire du processeur)

I -0x14(%rbp), ..., -0x1c(%rbp) : autres cases memoire

I Initialiser le contenu de la case %-0x1c(%rbp) a 3

I mov a, b : copier le contenu de la case a dans la case b

I imul a, b : multiplier le contenu de a par celui de b et mettre leresultat dans b

30 / 209

Cycle de vie d’un programme

Methodologie

1. Enonce du probleme

2. Formalisation (quel est le probleme precisement)

3. Recherche d’un algorithme (comment resoudre le probleme ?)

4. Programmation (implantation)

5. Compilation

6. Execution

7. Mise au point (test, debogage, optimisation)

31 / 209

Cycle de vie d’un programme

Probleme« Calculer la puissance 4e d’un nombre »

FormalisationSpecification des entrees et des sorties.Scenario d’utilisation : « l’utilisateur rentre au clavier un nombre entier x ;l’ordinateur affiche en retour la valeur de x4 a l’ecran. »

Recherche d’un algorithme

Comment on resout le probleme ?Quel traitement appliquer a l’entree pour obtenir la sortie desiree ?On note que x4 = x ∗ x ∗ x ∗ x = (x2)2

Algorithme :

I calculer x ∗ x

I prendre le resultat et faire de meme

32 / 209

Cycle de vie d’un programme : Ecriture d’un 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 quatrieme de " << x

<< " est " << xPuissanceQuatre << endl;

return 0;

}

33 / 209

Cycle de vie d’un programme

Compiler le programme

I Transformer le programme en code assembleur

Lancer le programme

I Autant de fois que l’on veut !

Tester que le programme fonctionne

I Cas particuliers ! ! !

Ameliorer le programme

I Correction d’erreurs

I Optimisation du programme (rapidite, consommation memoire)

I Optimisation de l’algorithme

I Amelioration du programme (lisibilite, generalisation)34 / 209

La notion d’Algorithme

Definition

I Description formelle d’un procede de traitement qui permet, a partird’un ensemble d’informations initiales, d’obtenir des informationsdeduites

I Succession finie et non ambigue d’operations clairement posees.

I Doit donc toujours se terminer !

35 / 209

La notion de Programme

Definition

I Suite d’instructions (ordres) donnees a la machine

I Ces instructions sont donnes en utilisant une syntaxe tres precise :

I Cette syntaxe (et la semantique associee) est decrite par le langagede programmation

I Le programme implante un algorithme

I Le programme est concu autant pour etre lu par un autre humain(dont soi-meme dans un mois) que pour etre execute par l’ordinateur

36 / 209

Langages de programmation

Langage machine

Binaire directement comprehensible par la machine

Langage d’assemblage (ou assembleur)

Tres 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

Chaıne de production

Utilisateur =⇒ Programmesource

=⇒ Compilateur =⇒ Programmeobjet

=⇒ Machine

Exemples

Pascal, C, C++, ADA, FORTRAN, Java, . . .

Demo

38 / 209

Les langages de programmation interpretes

Chaıne de production

Utilisateur =⇒ Instructionsource

=⇒ Interpreteur =⇒ Instructionmachine

=⇒ Machine

Exemples

Basic, LISP, Perl, Python, . . .

Demo

39 / 209

B. Premiers programmes en C++

Le langage C++

I 1958 : ALGOL : ALGOrithmic Language

I 1970 : Langage C (Dennis Ritchie)I Langage generaliste simple et elegantI Independant du systeme, mais proche de luiI Rapidite par un controle fin de l’executionI Toujours tres utilise

I 1983- : Langage C++ (Bjarn Stroustrup) : extension de CI Bibliotheque standard (entrees, sorties)I Programmation objetI Programmation generique (templates)I 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 quatrieme de " << x

<< " est " << xPuissanceQuatre << endl;

return 0;

} 42 / 209

La structure d’un programme C++

Syntaxe

Un programme C++ est compose de plusieurs parties :

I Un entete de programme

I Une fonction principale main composee de :I Un entete de fonction : declarations des variablesI Le corps de la fonction : une suite d’instructions

43 / 209

La structure d’un programme C++

L’entete du programme

#include <iostream>

using namespace std;

I Un programme utilise souvent des composants deja existants

I L’entete indique lesquels

I Sans rentrer dans les details, l’entete precise ici que l’on va utiliser iciles utilitaires d’entree sorties (iostream) fournie par la bibliothequestandard (std) de C++

I L’entete peut aussi declarer des constantes, des types, ...

44 / 209

La structure d’un programme C++

La fonction « main »

int main() {

int x, xCarre, xPuissanceQuatre;

...

return 0;

}

L’entete de la fonction permet de declarer toutes les variables utiliseesdans la partie instructions.

45 / 209

La structure d’un programme C++

La fonction « main » : instructionsAussi appele le corps du programme.

cout << "Entrez un entier: ";

cin >> x;

xCarre = x * x;

xPuissanceQuatre = xCarre * xCarre;

cout << "La puissance quatrieme de " << x

<< " est " << xPuissanceQuatre << endl;

Syntaxe

I Une suite d’instructions separees par des points-virgules « ; »I suivi par une accolade fermante « } ».

46 / 209

C. Memoire, variables, types

La memoire

I Une suite contigue de milliards de zeros et de uns.

I Pour 1Go, a raison de 1 chiffre par mm, cela ferait 8590 km, soit plusque Paris-Pekin !

I Le processeur y accede par adresse

47 / 209

La notion de Variable

I Objectif : stocker des informations en memoire centrale durantl’execution d’un programme ;

I Analogie : utiliser un recipient pour stocker des ingredients en cuisine

I « Va mettre cela dans le bol en position 374479 sur l’etagere »On veut eviter d’avoir a manipuler directement les adresses !

DefinitionUne variable est un espace de stockage nomme ou le programme peutmemoriser une donneeLe nom de la variable est choisi par le programmeur

48 / 209

La notion de variable (2)

NotesUne variable possede quatre proprietes :

I un nom (ou identificateur)

I une adresse

I un type

I une valeur

La valeur peut changer en cours d’execution du programme(d’ou le nom de variable)

49 / 209

Regles de formation des identificateurs

Les noms des variables (ainsi que les noms des programmes, constantes,types, procedures et fonctions) sont appeles des identificateurs.

Syntaxe (regles de formation des identificateurs)

I suite de lettres (minuscules ’a’..’z’ ou majuscules ’A’..’Z’), dechiffres (’0’..’9’) et de caracteres de soulignement (’_’)

I premier caractere doit etre une lettre

I longueur bornee

50 / 209

Exemples et contres exemples d’identificateurs (2)

Exemples :

I c14_T0 est un identificateur ;

I 14c_T0 n’est pas un identificateur ;

I x*y n’est pas un identificateur.

51 / 209

Formation des identificateurs (3)

Notes

I Donnez des noms significatifs aux variables

I Dans le cas de plusieurs mots, par convention dans le cadre de cecours on mettra le premier mot en minuscule et les suivants avec unemajuscule : maVariable

I Autre convention possible : ma_variable

I Mauvais noms : truc, toto, temp, nombre ;

I Bons noms courts : i,j,k,x,y,z,t.

I Bons noms longs : nbCases, notes, moyenneNotes, estNegatif.

52 / 209

Notion de type

Les variables peuvent contenir toutes sortes de donnees differentes :

I nombres entiers, reels, booleens, ...

I textes

I releves de notes, images, musiques, ...

Definition (Notion de type de donnee)

I Une variable ne peut contenir qu’une seule sorte de donnees

I On appelle cette sorte le type de la variable

I On dit que C++ est un langage type statiquement :

53 / 209

Les types de base

Les differents types de base en C++ sont :

I Les entiers (mots cles int, long int) ;Exemples : 1, 42, -32765

I les reels (mots cles float ou double) ;Exemples : 10.43, 1.0324432e22

I les caracteres (mot cle char) ;Exemples : ’a’, ’b’, ’ ’, ’]’

I les chaınes de caracteres (mot cle string).Exemples : ”bonjour”, ”Alice aime Bob”

I les booleens (mot cle bool).Exemples : true, false

Les entiers, les caracteres 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 l’on declare la variable.

Syntaxe (Declaration des variables)

I introduite par un nom de type

I 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

I Apres sa definition (declaration + allocation d’une case memoire),une variable possede une valeur qui correspond a l’etat de la memoireau moment de sa definition

I Certains langages garantissent que les variables sont initialisees a zero

I Pas C++ !

56 / 209

L’affectation

Syntaxe

identificateur = expression ;

Exemple

x = 3 + 5 ;

Semantique

I Calcul (ou evaluation) de la valeur de l’expression

I Rangement de cette valeur dans la case memoire associee a cettevariable.La variable et l’expression doivent etre de meme type !

57 / 209

Exemple d’affectations

operation instruction valeur de la variable

affecter la valeur 1 a la variable x x = 1 x : 1

affecter la valeur 3 a la variable y y = 3 y : 3

Notes

I Affectation x = y : copie de la valeur

I 6= transferer un ingredient d’un recipient a l’autre

58 / 209

Affectation et egalite : deux concepts differents

L’affectation x = 5Une instruction modifiant l’etat de la memoire.

Le test d’egalite 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)

NotesOn peut modifier la valeur des variables tout au long du programme.

Exemples :

operation instruction valeur

affecter la valeur x + 1 a la variable x x = x + 1 x : 2

affecter la valeur y + x a la variable y y = y + x y : 5

60 / 209

Exemple d’affectations

#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

I Le langage C++ permet de manipuler des constantes de chaque typede base.

I La valeur d’une constante est donnee au debut d’un programme et nepeut etre changee par la suite.

Syntaxe

I Declaration introduite par le mot cle const

I const type nomDeConstante = valeur ;

Exemple

const int nombreDAnnuites = 3;

const int nombreDeMois = 12 * nombreDAnnuites;

62 / 209

D. Lecture, Ecriture

63 / 209

L’affichage (ou ecriture)

Syntaxe

I Affichage d’une valeur :cout << expression ;

I Affichage d’une valeur avec saut de ligne :cout << expression << endl ;

I Affichage de plusieurs valeurs :cout << expr1 << expr2 << expr3 ;

Semantique

I Evaluer l’expression (ou les expressions)

I Ecrire le resultat sur le flux de sortie (ecran)

64 / 209

La saisie (ou lecture)

Syntaxe

I Lecture d’une variable :cin >> variable ;

I Lecture de plusieurs variables :cin >> variable1 >> variable2 ;

Semantique

I Lit une valeur du type approprie sur le clavier

I Affecte cette valeur a la variable

65 / 209

La saisie (ou lecture) (2)

Notes

I Les caracteres tapes sur le clavier sont codes (ASCII) puis places dansla memoire tampon (buffer) du clavier

I Cette memoire tampon fonctionne comme une file d’attente (premierarrive, premier servi)

I La memoire tampon n’est envoyee au programme qu’apres l’appui dela touche « Entree »

Clavier =⇒ Memoiretampon

=⇒ Programme

66 / 209

La saisie (ou lecture) (3)

Notes

I Lorsque la memoire tampon est vide, l’instructioncin >> variable ; attend qu’une donnee arrive dans cette memoiretampon.

I Le programme est bloque et attend une action de l’utilisateur.

Notes

I Lorsque la memoire tampon contient une donnee, l’instructioncin >> variable ; prend la premiere, la supprime du tampon, latraduit en valeur C++ et place cette valeur dans la variable.

67 / 209

Lecture d’une variable de type int ou float

Notes

I Les blancs places en tete sont ignores ; le retour a la ligne et lestabulations sont consideres comme des blancs.

I Erreur a l’execution si on trouve un caractere ne correspondant pas ala syntaxe des constantes de type int ou float.

I Sinon, on lit tant que le caractere correspond a la syntaxe desconstantes de type int ou float.

I Erreur a l’execution si valeur de la constante non compatible pourl’affectation avec le type de la variable.

68 / 209

E. Types de bases et expressions

69 / 209

Les entiers (types int, long)

I representes sur un mot machine ;

I sur une machine a n bits on peut representer 2n entiers, soit lesentiers compris entre −2n−1 et +2n−1 − 1.

I Les bornes sont donnees par -MAXINT-1 et MAXINT.

NotesDifference entier machine / entier mathematique !

Voir Exemples/int.cpp, Exemples/long.cpp

70 / 209

Les operations sur les entiers

Notes

I l’oppose (operation unaire, notee -) ;

I l’addition (operation binaire, notee +) ;

I la soustraction (operation binaire, notee -) ;

I la multiplication (operation binaire, notee *) ;

I la division entiere (operation binaire, notee /) ;

I le reste de la division entiere (operation binaire, notee %) ;

Attention la multiplication n’est pas implicite, le symbole * doit toujoursetre indique explicitement entre les deux operandes.

71 / 209

Les operations sur les entiers (2)

Exemples :

operation resultat

17 + 5 2217 - 5 1217 * 5 8517 / 5 317 % 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

I l’oppose (operation unaire, notee -) ;

I l’addition (operation binaire, notee +) ;

I la soustraction (operation binaire, notee -) ;

I la multiplication (operation binaire, notee *) ;

I la division (operation binaire, notee /) ;

73 / 209

Les operations sur les reels

Exemples :

operation resultat notation scientifique

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 caracteres (type char)

I Permettent de stocker un seul caractere :I Une lettre de l’alphabet (sans accent) : ’a’, ..., ’z’, ’A’, ..., ’Z’I Un chiffre ’0’, ..., ’9’I Un caracteres du clavier (’@’, ’+’, ’/’, ’ ’)I Quelques caracteres speciaux

I Notes entre apostrophes (exemple : ’A’) pour distinguer le caractere’A’ de la variable A

I La table ASCII associe un numero unique entre 0 et 127 a chaquecaractere, ce qui permet d’introduire un ordre

I Et les lettres accentuees ? Les caracteres chinois ? ...

Voir Exemples/char.cpp

75 / 209

Les chaınes de caracteres (type string)

I Permettent de stocker une suite de caracteres : un mot, une phrase,...

I 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

NotesLes variables de type booleen ne peuvent prendre que deux valeurs :

I vrai (mot cle true) ;

I faux (mot cle false).

Les operations possibles sur les booleens sont :

I la negation (operation unaire, mot cle not) ;

I la conjonction (operation binaire, mot cle and) ;

I la disjonction (operation binaire, mot cle or).

I ...

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 descas d’une ou plusieurs comparaisons.

symbole C++ symbole mathematique

< <<= ≤== =!= 6=>= ≥> >

79 / 209

Expressions booleennes : encadrements

Exemple

Les encadrements ne peuvent pas etre ecrits directement en C++Ils doivent etre realises a l’aide de deux comparaisons connectees parl’operateur and.L’encadrement mathematique

0 ≤ x ≤ 15

se traduit en C++ par l’expression 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 )I

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

Deux possibilites :

I l’evaluation complete : evaluer tous les operandes des expressionsbooleennes

I l’evaluation paresseuse : stopper l’evaluation des que l’on peut :I Pour une conjonction a and b on peut s’arreter si a est fauxI Pour une disjonction a or b on peut s’arreter si a est vrai

81 / 209

Les types ordinaux

Notes

I successeur (operateur ++) ;

I predecesseur (operateur -).

82 / 209

Les expressions

Une expression peut etre :

I une valeur constanteExemples : 2, 56.7, ’u’ ou true

I une variable

I toute combinaison d’operations valides mettant en œuvre desconstantes et/ou des variables

83 / 209

Ordre de priorite

ExerciceQuelle est la valeur des expressions suivantes :

I 6 / 3 * 2

I 6 + 3 * 2

I 3 + 4 <= 2 * 8

I not 1 < 2 and 1 == 2

NotesLes expressions sont evaluees de gauche a droite suivant l’ordre de prioritedecroissante suivant :

Unaire Binaire

not

* / % and

+ - + - or<, <=, =, !=, >= >

84 / 209

Le parenthesage

NotesLes parentheses servent a modifier l’ordre de priorite.

Exemples :

operations valeurs

5 + 4 * 2 13

(5 + 4) * 2 18

85 / 209

Troisieme partie III

Structures de controle

A. Instructions conditionnelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

B. Instructions iteratives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

86 / 209

Resume des episodes precedents. . .

NotesUn programme imperatif est compose d’instructions dont le but est deproduire un effet.Pour le moment nous avons vu trois instructions :

I Lecture : cin >> variable ;

I Ecriture : cout << expression ;

I Affectation : variable = expression

Les instructions sont executees de maniere sequentielle (les unes apres lesautres), dans l’ordre du programme.Les expressions sont constituees de constantes et variables, connectees pardes operations.

87 / 209

Le probleme

On a souvent besoin de rompre la sequence d’execution :

I Dans certain cas particulier, on veut sauter certaines instructions :Instructions conditionnelles

I Dans d’autres cas, on a besoin de repeter certaines instructions :Instructions iteratives

88 / 209

A. Instructions conditionnellesEn fonction d’un choix ou d’une condition, on va executer ou non un blocd’instructions.

DefinitionUne condition est une expression booleenne(i.e. dont le resultat est de type booleen).

DefinitionUn bloc d’instructions est une suite d’instructions a executersuccessivement. 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

I La condition est evaluee

I Si sa valeur est true, le bloc d’instructions 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

I La condition est evaluee

I Si sa valeur est true, le bloc d’instructions 1 est execute

I Si sa valeur est false, le bloc d’instructions 2 est execute

91 / 209

Exemples d’instruction alternative

Exemple

if ( x >= 0 ) {

cout << "x est positif" << endl;

} else {

cout << "x est negatif" << endl;

}

92 / 209

Exemples d’instruction 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)

ExerciceQue fait :

if ( x = 1 ) {

cout << "x vaut 1" << endl;

}

Attention !Ne pas confondre « = » (affectation) et « == » (egalite) !

95 / 209

Erreurs classiques avec les conditionnelles (3)

ExerciceQue 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 affiche toujours « x vaut 1 ».

Attention !

I le point-virgule est un separateur d’instruction !

I if (...) {...} else {...} forme une seule instruction

I Jamais de point-virgule avant un bloc d’instructions !96 / 209

Tests imbriquesIl est bien sur possible d’imbriquer 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 l’exemple suivant :

if (x >= y ) {

if ( x == y ) {

cout << x << " = " << y << endl;

}

else {

cout << x << " < " << y << endl;

}

}

Attention !

I En C++, la structuration est determinee pas les accolades

I 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 l’exemple suivant :

if (x >= y ) {

if ( x == y ) {

cout << x << " = " << y << endl;

}

} else {

cout << x << " < " << y << endl;

}

98 / 209

L’indentation

Rappel

I Un programme s’adresse a un lecteur

I La lisibilite est un objectif essentiel

Notes

I L’indentation consiste a espacer les lignes de code par rapport aubord gauche de la fenetre de saisie de texte

I L’espacement doit etre proportionnel au niveau d’imbrication desinstructions du programme

I Quatre espaces par niveau d’imbrication est un bon compromis

La plupart des editeurs de texte offrent des facilites pour realiser unebonne indentation. Apprenez les.

99 / 209

B. Instructions iteratives

Rappel

La force d’un ordinateur est de savoir faire des taches repetitives tresrapidement et sans s’ennuyer.

Exemples

I On veut afficher tous les nombres entre 1 et 1000.

I Dans un jeu sur ordinateur, a la fin d’une partie, on veut demander« voulez vous rejouer ? » et si oui recommencer une nouvelle partie.

I Tous les 1/24eme de seconde on veut afficher une image d’un film(s’il 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;

Problemes

I Ce code sent mauvais (repetitions) !

I Et si on veut calculer 10! ou 100! ?

101 / 209

Les instructions iteratives

DefinitionLes instructions iteratives permette de repeter un certain nombre de foisl’execution d’une bloc d’instructions sous certaines conditions.

De facon imagee, on appelle boucle cette methode permettant de repeterl’execution d’un groupe d’instructions.

Instructions iteratives

I Boucles « Tant que » (while)

I Boucles « Faire ... tant que » (do ... while)

I Boucles « Pour » (for)

102 / 209

La boucle tant que (while)

Syntaxe

while (condition) {

bloc d instructions

}

Semantique

Tant que la condition est vraie, on repete le bloc d’instructions :

I La condition est evaluee

I Si sa valeur est true, le bloc d’instructions est execute

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

I comptage, utilisation d’une variable compteur

I accumulation, utilisation d’une variable accumulateur

Notes

I L’accumulation sert a appliquer la meme operation (somme,produit, . . .) a plusieurs elements.

I On utilise une variable appelee accumulateur pour stocker lesresultats intermediaires.

106 / 209

Cas particulier : condition toujours fausse

Si la valeur de la condition est fausse des le depart alors le blocd’instructions ne sera jamais execute !

Exemple

int n = 1;

while ( n < 0 ) {

cout << n << endl;

n = n + 1;

}

107 / 209

Cas particulier : condition toujours vraieSi la valeur de la condition est toujours vraie, alors le blocd’instructions sera execute indefiniment ! (boucle infinie)

Exemple (Que fait ce programme ?)

int n = 1;

while ( true ) {

cout << n << endl;

n = n + 1;

}

Exemple (Erreur typique : oublier l’incrementation !)

int n = 1;

while ( n <= 10 ) {

cout << n << endl;

}108 / 209

Une source d’erreur classique en fin de boucle

Exemple

Que vaut n a la fin 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

I On execute le bloc d’instructions

I On evalue la condition

I 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 l’instruction d’initialisation

2. On evalue la condition

3. Si sa valeur est true, on execute le bloc d’instruction

4. On execute l’instruction d’incrementation

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;

}

I La variable n est locale a la boucle (on y reviendra)

I 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

Quatrieme partie IV

Fonctions

A. Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

B. Fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

116 / 209

Resume des episodes precedents . . .

Pour le moment nous avons vu les instructions suivantes :

I Lecture : cin >> variable ;

I Ecriture : cout << expression ;

I Affectation : variable = expression

I Instruction conditionnelle : if

I Instructions iteratives : while, do ... while, for

Remarque

Tout ce qui est calculable par un ordinateur peut etre programmeuniquement avec ces instructions

Pourquoi aller plus loin ?

Passage a l’echelle !

117 / 209

Motivation : l’exemple du livre de cuisine

Recette de la tarte aux pommes

I Ingredients : 250 g de farine, 125 g de beurre, 1 œuf, 2 cl d’eau unepincee de sel, 100 g de sucre en poudre, 5 belles pommes

I Mettre la farine dans un recipient puis faire un puits

I Versez dans le puits 2 cl d’eau

I Mettre le beurre

I Mettre le sucre et le sel

I Petrir de facon a former une boule

I Etaler la pate dans un moule

I Peler les pommes, les couper en quartier et les disposer sur la pate

I Faire cuire 30 minutes

118 / 209

Motivation : l’exemple du livre de cuisine (2)

Recette de la tarte aux poires

I Ingredients : 250 g de farine, 125 g de beurre, 1 œuf, 2 cl d’eau unepincee de sel, 100 g de sucre en poudre, 5 belles poires

I Mettre la farine dans un recipient puis faire un puits

I Versez dans le puits 2 cl d’eau

I Mettre le beurre

I Mettre le sucre et le sel

I Petrir de facon a former une boule

I Etaler la pate dans un moule

I Peler les poires, les couper en quartier et les disposer sur la pate

I Faire cuire 30 minutes

119 / 209

Motivation : l’exemple du livre de cuisine (3)

Recette de la tarte tatin

I Ingredients : 250 g de farine, 125 g de beurre, 1 œuf, 2 cl d’eau unepincee de sel, 200g de sucre en poudre, 5 belles pommes

I Mettre la farine dans un recipient puis faire un puits

I Versez dans le puits 2 cl d’eau

I Mettre le beurre

I Mettre le sucre et le sel

I Petrir de facon a former une boule

I Verser le sucre dans une casserole

I Rajouter un peu d’eau pour l’humecter

I Le faire carameliser a feu vif, sans remuer

I Verser au fond du plat a tarte

I Peler les pommes, les couper en quartier

I Faire revenir les pommes dans une poele avec du beurre

I Disposer les pommes dans le plat, et etaler la pate au dessus

I Faire cuire 45 minutes et retourner dans une assiette

120 / 209

Qu’est-ce qui ne va pas ?

Duplication

I Longueurs

I En cas d’erreur ou d’amelioration, il faut corriger plusieurs endroits

Manque d’expressivite

I Difficile a lire

I Difficile a memoriser

Essayons d’ameliorer cela

121 / 209

Recettes de base

Recette de la pate brisee

I Ingredients : 250 g de farine, 125 g de beurre, 1 œuf, 2 cl d’eau unepincee de sel

I Mettre la farine dans un recipient puis faire un puits

I Versez dans le puits 2 cl d’eau Mettre le beurre

I Mettre le sucre et et une pincee de sel

I Puis petrir de facon a former une boule

Recette du caramel

I Ingredients : 100 g de sucre

I Verser le sucre dans une casserole

I Rajouter un peu d’eau pour l’humecter

I Le faire carameliser a feu vif, sans remuer

122 / 209

Recettes de tartes

Tarte aux fruits (pommes, poires, ...)

I Ingredients : 500g de fruits et les ingredients pour une pate brisee

I Preparer une pate brisee

I Etaler la pate dans un moule

I Peler les fruits, les couper en quartier et les disposer sur la pate

I Faire cuire 30 minutes

Tarte tatin

I Ingredients : 5 belles pommes, pate brisee, caramel

I Preparer une pate brisee

I Preparer un caramel et le verser au fond du plat a tarte

I Peler les pommes, les couper en quartier

I Faire revenir les pommes dans une poele avec du beurre

I Disposer les pommes dans le plat, et etaler la pate au dessus

I Faire cuire 45 minutes et retourner dans une assiette

123 / 209

Les fonctions : objectif

Modularite

I Decomposer un programme en programmes plus simples

I Implantation plus facile

I Validation (tests)

I Reutilisation

I Flexibilite(remplacement d’un sous-programme par un autre)

Non duplication

I Partager (factoriser) du code

I Code plus cours

I Maintenance plus facile

Niveau d’abstraction

I 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 affiche :

3^2 = 9

2^3 = 8

e^1 = 2.71828

cos(pi) = -1

125 / 209

Appel de fonctions usuelles

On remarque

I La presence de #include <math.h>

C’est pour utiliser la bibliotheque de fonctions mathematiques.On y reviendra ...

I L’ordre des arguments est important

I Le type des arguments est important

I On sait ce que calcule cos(x)

I On ne sait pas comment il le fait

I On n’a 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 d’une fonction

Syntaxe

type nom(type1 parametre1, type2 parametre2, ...) {

... declarations de variables ...

... instructions ...

return expression;

}

I parametre1, parametre2, ... sont les parametres formels

I Le type des parametres formels est fixe

I Les variables sont appelees variables locales

I A la fin, la fonction renvoie la valeur de expression qui doit etre dutype annonce

I Il peut y avoir plusieurs return

130 / 209

La fonction main

Exemple

#include <iostream>

using namespace std;

int main() {

cout << "Bonjour!" << endl;

return 0;

}

I Le programme principal est une fonction comme les autres !I Ce programme renvoie une valeur entiere. Par convention :

I 0 si l’execution du programme s’est deroulee normalementI un entier different de 0 en cas d’erreur

cet entier indique quel genre d’erreur s’est produite

131 / 209

La fonction main : parametres

#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 l’execution :

> 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-t’il lorsque l’on evalue l’expression 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 parametres reels

3. Leurs types doivent correspondre au type des parametres formels(eventuellement une conversion a lieu)

4. De la memoire est allouee sur la pile pour :I Les variables localesI Les parametres formels

5. Les parametres reels sont affectes aux parametres formels (copie)

6. Les instructions sont executees

7. Lorsque « return expression » est rencontre, l’expression estevaluee et donne la valeur de retour de la fonction

8. Les variables et parametres sur la pile sont desallouees

9. Au final, la valeur de l’expression est donnee par la valeur de retour.134 / 209

Appel de fonctions : exercice

Qu’affiche 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 parametres par valeur

Les parametres formels d’une fonction sont des variables comme les autresOn peut les modifierMais. . .

Rappel

Lors d’un appel de fonction ou de procedure, la valeur du parametre reelest copiee dans le parametre formel

En consequence

I Une modification du parametre formel, n’affecte pas le parametre reel

I Si la variable est volumineuse (tableaux, chaıne de caracteres, etc.),cette recopie peut etre couteuse.

On dit que les parametres sont passes par valeurPlus tard on verra le passage de parametres par reference

136 / 209

Exemple

int a, b;

int f(int b) { // parametre 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

I Une variable est visible depuis sa declaration jusqu’a la fin du bloc ouelle est declaree

I Elle peut masquer des variables issues des contextes englobants (cf.exemple suivant)

I Variable locale : definie dans le bloc d’une fonction

I Variable globale : definie ailleurs

I Les parametres formels se comportent comme des variables locales.

Remarque

I Une variable locale a une fonction n’existe que le temps d’executionde la fonction.

I La valeur que cette variable peut avoir lors d’un appel a la fonctionest perdue lors du retour au programme appelant et ne peut etrerecuperee lors d’un appel ulterieur.

138 / 209

Variables locales/globales

I les variables du programme principale (dite globale) restentaccessibles a l’interieur de la fonction.

I On peut modifier la valeur d’une variable globaleCeci est tres fortement deconseillee (effet de bord)

I Une variable locale masque une variable globale du meme nomCeci est tres fortement deconseillee (ambiguıte)

I On interdira ces pratiques dans le cadre de ce cours

139 / 209

Fonction recursive

ExerciceExecuter pas-a-pas l’execution 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

ProceduresOn a parfois besoin de sous-programme qui agissent au lieu de calculer :

I on veut produire un effet (affichage, musique, etc)I on veut modifier (en place) l’etat interne d’une structure de donnee.

On parle d’effet de bord

Exemple

void affiche_rectangle(n) {

for (int k=0; k<n; k++) {

cout << "**********" << endl;

}

}

Remarques

I Cette fonction ne renvoie rien

I On le denote en C++ par le type void

I Dans d’autres langages on distingue fonctions et procedures

141 / 209

Documentation d’une fonction (syntaxe javadoc)

Exemple

/** La fonction factorielle

* @param n un nombre entier positif

* @return n!

**/

int factorielle(int n) {

Une bonne documentation

I Est concise et precise

I Donne les preconditions sur les parametres

I Decrit le resultat (ce que fait la fonction)

Astuce pour etre efficace

I Toujours commencer par ecrire la documentation d’une fonctionDe toutes les facons il faut reflechir a ce qu’elle va faire !

142 / 209

Tests d’une fonction

I Il n’y a pas d’infrastructure standard en C++ pour ecrire des tests

I 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 d’une fonction

Astuces pour etre efficace

I Commencer par ecrire les tests d’une fonctionDe toutes les facons il faut reflechir a ce qu’elle va faire !

I Tester les cas particuliersI Tant que l’on est pas sur que la fonction est correcte :

I Faire des essais supplementairesI Capitaliser ces essais sous forme de tests

I Si l’on trouve un bogue :I Ajouter un test caracterisant le bogue

Remarque

I Les effets de bord sont durs a tester !

144 / 209

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

I Lecture : cin >> variable ;

I Ecriture : cout << expression ;

I Affectation : variable = expression

I Instruction conditionnelle : if

I Instructions iteratives : while, do ... while, for

I Fonctions

Pourquoi aller plus loin ?

Passage a l’echelle !

Manipuler de grosses quantites de donnees

146 / 209

A. Motivation

Exemple (Fil conducteur)

Implantation d’un annuaire

147 / 209

B. Les tableaux

A retenir

I Un tableau est une valeur composite formee de plusieurs valeurs dumeme type

I En gros : une suite contigue de cases en memoire

I Une valeur (ou element) d’un tableau t est designee par sa position idans le tableau. On la note typiquement t[i ].

I En C++, cette position est un entier entre 0 et `− 1, ou ` est lenombre d’elements du tableau

Exemple

I Voici un tableaux d’entiers :

1 4 1 5 9 2 6 5 3 5

I Avec cet exemple, t[0] vaut 1, t[1] vaut 4, t[2] vaut 1, ...

I Noter que l’ordre 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 d’un tableau d’entiers

vector<int> t;

I Pour un tableau de flottants, on utiliserait vector<float>, etc.

I Pour aller plus loin : vector est un template

Allocation d’un tableau de 10 entiers

t = vector<int>(10);

I 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

I Une valeur de type tableau ne contient pas directement les cases dutableau, mais la localisation en memoire de celles-ci (reference).

I Une variable de type tableau se construit en trois etapes :

1. Declaration2. Allocation

Sans elle : faute de segmentation (au mieux !)3. Initialisation

Sans elle : meme probleme qu’avec les variables usuelles

RaccourciDeclaration, 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 n’importe quellevariable :

x = t[2] + 3*t[5]; // Acces en lecture

t[4] = 2 + 3*x; // Acces en ecriture

Attention !

I En C++ les indices ne sont pas verifies !

I Le comportement de t[i] n’est pas specifie en cas de debordement

I Source no 1 des trous de securite ! ! !

I Acces avec verifications possibles avec : t.at(i) au lieu de t[i]

Quelques autres operations

t.size(); // Taille du tableau

t.push_back(3); // Ajout d’un element a la fin 152 / 209

Affectation 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

I En C++, lors d’une affectation, un vector est copie !

I On dit que vector a une semantique de copie

I Different de Java, Python, ou des array en C !

Pour aller plus loin

I Les vector sont passes par valeur aux fonctions

I Pour preserver les performances, vector suit le patron de conceptionde copie-en-ecriture : la copie n’a lieu que quand elle est necessaire

153 / 209

Tableaux, collections et vecteurs en C++

I La bibliotheque standard C++ fournit de nombreuses autresstructures de donnees pour representer des collections :array, list, queue, stack, set, multiset, ...

I Chacune a ses specificites en terme de semantique, d’operationsdisponibles et de performances

I On se contentera dans ce cours de vector

On en verra plus en S2 !

I Les vector de C++ ne sont pas des vecteurs au sens mathematique :pas d’operation d’addition, ...

I Les chaınes de caracteres (string) se comportent en gros commedes tableaux de caracteres

154 / 209

Tableaux a deux dimensions

Remarque

I On represente un tableau a deux dimensions par un tableau detableaux : vector<vector<int> >

I ti ,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

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

I Lecture : cin >> variable ;

I Ecriture : cout << expression ;

I Affectation : variable = expression

I Instruction conditionnelle : if

I Instructions iteratives : while, do ... while, for

I Fonctions

I Tableaux

Pourquoi aller plus loin ?

Passage a l’echelle !

Maintenance de « gros » programmes

157 / 209

A. Lire un programme

Dans l’ordre du fichier ?

Quelles sont les briques de bases (bottom-up)

Parcourir les fonctions disponibles et leur documentation.

Qui appelle qui ? (top-down)

I Chercher la fonction main

I Quelles fonctions appelle-t’elle ?

I Quelles fonctions appellent ces fonctions ?

I Ne rentrer dans les details que si c’est necessaire

Exemple

x = cos(theta);

On supposes, a priori, que la fonction cos est correcte !

158 / 209

Debogage : les types d’erreurs

Erreurs de syntaxe

Detectees par le compilateur

Erreurs a l’execution

Erreurs semantiques

I Le programme s’execute « normalement »mais le resultat est incorrect

I Le programme ne fait pas ce que le programmeur souhaitait.

I Le programme fait ce que le programmeur lui a demande !

159 / 209

Debogage

Erreurs de syntaxe

I Bien lire les messages d’erreurs

I Le compilateur pointe vers la ou il ne comprends pasPas forcement la ou est l’erreur

Erreurs a l’execution

I Analyser l’etat du programme juste avant l’erreur.

I En Python, Java, ... : regarder la pile d’appel.

I Utilisation du debogeur !

160 / 209

Debogage des erreurs semantiques

I Un travail de detective !

I Peut etre tres frustrant, surtout sous stress

I Peut etre tres une belle source de satisfaction

I Gerer ses emotions !

DifficulteIsoler une erreur glissee dans :

I Un programme de millions de lignes

I De grosses donnees

I Des milliards d’instructions executees

Exemple

I Exemples/debogage.cpp

I Utilisation du debogueur !

161 / 209

Debogage : reduire le probleme par dichotomie

1. Faire une experience pour determiner dans quelle « moitie » duprogramme est l’erreur.

2. Caracteriser le boggue : « Lorsque j’appelle telle fonction avec telsparametres, la reponse est incorrecte »En faire un test !

3. Trouver le plus petit exemple incorrectEn faire un test !

4. Executer pas a pas la fonction sur cet exemple

5. Trouver l’erreur

6. Corriger l’erreur

7. Verifier les tests (non regression)

8. Rajouter des tests ?

Etre efficace dans la boucle essai-erreur ! ! !

162 / 209

Un outil essentiel : le debogueur

I Observation du programme en cours de fonctionnementI Execution pas a pas

I En passant a la ligne suivante (next)I En rentrant dans les sous fonctions (step)

I Points d’arrets (conditionnels)

I Analyse de la pile d’execution

I Analyse de l’etat de la memoire

Debogueur gdb et CodeBlocks

I En arriere plan gdb : GNU DeBugger

I CodeBlocks rend l’utilisation du deboggeur facile

I Il n’est disponible que si on a cree un projet !

163 / 209

Debogage : prevention

Developpement incremental

I Toujours etre « proche de quelque chose qui marche »I Gestion de version

Modularite

I Decoupage d’un programme en fonctions

I Decoupage d’un programme en modulesA venir !

I Decoupage d’un programme en espace de nomsA venir !

Specifications et tests

I Definir precisement la semantique des fonctions :qu’est-ce qu’elles doivent faire

I 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

I Le programme definit quelque part une fonction max avec cettesignature : type des parametres et type du resultat

I Cette definition n’est pas forcement dans le meme fichier

I Si cette definition n’existe pas ou n’est pas unique, une erreur estdeclenchee par le compilateur

I L’erreur est declenchee au moment ou l’on combine les differentsfichiers (edition de liens)

Application typique

Deux fonctions qui s’appellent reciproquement

166 / 209

Digression : surcharge de fonctions

I En C++, on peut avoir plusieurs fonctions avec le meme nom et dessignatures differentes

I Idem en Java, mais pas en C ou en Python par exemple

I Il est recommande que toutes les fonctions ayant le meme nom aientla meme semantique

Exemple (la fonction max : Exemples/max-surcharge.cpp)

I Pour les entiers, les reels, les chaınes de caracteres, ...

I A deux ou trois arguments (et plus ?)

Remarque

I Cet exemple n’est pas satisfaisant (duplication)

I Correctif : les templates pour ecrire du code generique

I Ce sera pour un autre cours !

167 / 209

Compilation separee

I Un programme peut etre compose de plusieurs fichiers sourceContenu :

I Des definitions de fonctionsI Des variables globales, ...

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

I Le code binaire des fonctions, ...

I L’editeur de lien combine plusieurs fichiers objet en un fichierexecutable

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 l’edition de lien

I Chaque fonction utilisee doit etre definie une et une seule fois

I La fonction main doit etre definie une et une seule fois

Quelques variantes autour des fichiers objets

I Bibliotheques (.a) :Une archive contenant plusieurs fichiers objets .o

I Bibliotheques dynamiques (.so) :Edition de lien dynamique au lancement du programme

169 / 209

Fichiers d’enteteFichier .h contenant la declaration des fonctions definies dans le fichier.cpp correspondant

Exemple (max.h)

Syntaxe (Utilisation d’un fichier d’entete)

#include "max.h"

Semantique

Utiliser la bibliotheque max

Implantation en C++

I Equivalent a copier-coller le contenu de max.h a l’emplacement du#include "max.h"

I Gere par le preprocesseur (cpp)170 / 209

Inclusion de fichiers d’entete standard

Syntaxe

#include <iostream>

Semantique

I Charge la declaration de toutes les fonctions definies dans labibliotheque standard iostream de C++.

I Le fichier iostream est recherche dans les repertoires standards dusysteme.

I Sous linux : /usr/include, ...

171 / 209

Declaration de fonctions

Syntaxe

Semantique

I Le programme definit quelque part une fonction max avec cettesignature : type des parametres et type du resultat

I Cette definition n’est pas forcement dans le meme fichier

I Si cette definition n’existe pas ou n’est pas unique, une erreur estdeclenchee par le compilateur

I L’erreur est declenchee au moment ou l’on combine les differentsfichiers (edition de liens)

Application typique

Deux fonctions qui s’appellent reciproquement

172 / 209

Resume : implantation d’une bibliotheque en C++

Ecrire un fichier d’entete (max.h)

I La declaration de toutes les fonctions publiques

I Avec leur documentation !

Ecrire un fichier source (max.cpp)

I La definition de toutes les fonctions

I Inclure le fichier .h !

Ecrire un fichier de tests (maxTest.cpp)

I Les fonctions de tests

I Fonction main lancant tous les tests

I Avec CodeBlocks : creer un projet contenant max.h, max.cpp,maxTest.cpp

173 / 209

Resume : utilisation d’une bibliotheque en C++

Inclusion des entetes

#include <iostream> // fichier d’entete standard

#include "max.h" // fichier d’entete perso

Raccourci pour les espaces de nom

using namespace std;

Compilation

I Donner la bibliotheque a charger a l’editeur de lien

I Gere automatiquement par CodeBlocks

174 / 209

Resume : compilation separee avec CodeBlocks

I Creer un projet pour chaque fichier executable (programme)I Y mettre tous les fichiers qui doivent etre compilees ensemble :

I Fichiers sources (.cpp)I Fichiers d’entetes (.h)

175 / 209

Digression : espaces de noms

ProblemeConflit entre bibliotheques definissant des fonctions avec le meme nom !

SolutionIsoler chaque bibliotheque dans un espace de noms

Exemple

La bibliotheque standard C++ utilise l’espace 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

Septieme partie VII

Fichiers, flux, exceptions

A. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178

B. Fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180

C. Digression : traitement des erreurs et exceptions . . . . . . . . . . . . . . . . 189

177 / 209

A. Projets de fin de semestre

Theme

I Traitement d’image

I Compression PNG

En pratique

I Volume horaire : une vingtaine d’heure

I Travail en binome recommande

Calendrier

1. Semaine 10 : TP : lecture / ecriture d’images

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 :

I Lecture : cin >> variable ;

I Ecriture : cout << expression ;

I Affectation : variable = expression

I Instruction conditionnelle : if

I Instructions iteratives : while, do ... while, for

I Fonctions

I Tableaux et valeurs composites

I Programmation modulaire

Pourquoi aller plus loin ?

Passage a l’echelle !

Donnees persistentes

179 / 209

B. Introduction

Etude de cas : un annuaire

Problemes

I Separation programme / donnees

I Persistence des donnees

180 / 209

Qu’est-ce qu’un fichier

DefinitionUn fichier informatique est au sens commun, une collectiond’informations numeriques reunies sous un meme nom, enregistrees sur unsupport de stockage tel qu’un disque dur, un CD-ROM, ou une bandemagnetique, et manipulees comme une unite.

Techniquement

Un fichier est une information numerique constituee d’une sequenced’octets, c’est-a-dire d’une sequence de nombres, permettant des usagesdivers.Comme la memoire, mais en persistent !

181 / 209

Ecriture dans un fichier

#include <fstream>

using namespace std;

int main() {

ofstream fichier("blah");

fichier << "coucou" << endl;

fichier.close();

}

Trois phases :

1. Ouverture du fichier

2. Ecriture

3. Fermeture du fichier

182 / 209

Lecture depuis un fichier

#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 fichier

2. Lecture

3. Fermeture du fichier

183 / 209

Exemple : recherche dans un annuaire

184 / 209

Notion de tampon

Metaphore de la boıte aux lettres

I Aller poster une lettre, cela prend du temps

I Donc on attend souvent d’avoir accumule plusieurs lettres pour lesenvoyer toutes d’un coup

Strategie d’ecriture

I De meme, ecrire un fichier octet par octet, ce n’est pas efficace

I On accumule les informations a ecrire dans une memoire tampon

I Lorsqu’il y en a assez on les ecrit toutes d’un coup(flush : tirer la chasse d’eau)

185 / 209

Notion de tampon : de l’importance de fermer les fichiers

Definition (Memoire Tampon)

Une zone de memoire utilisee pour stocker temporairement des donnees,notamment entre deux processus ou deux pieces d’equipement nefonctionnant pas a la meme vitesse

Attention !Si on ne ferme pas un fichier, les donnees dans le tampon a la fin del’execution du programme sont perdues !

Autre instance du meme phenomene

Perte de donnees si on retire une clef USB trop vite !« vous pouvez maintenant retirer le peripherique en toute securite »

186 / 209

Notion de flux

Remarque

I On a utilise la meme syntaxe pour lire au clavier et pour lire depuisun fichier : xxx >> variable

I Idem pour l’ecriture : xxx << variable

Definition (Flux de donnees)

I Un flux entrant de donnees est un dispositif ou l’on peut lire desdonnees l’une apres l’autre

I Un flux sortant de donnees est un dispositif ou l’on peut ecrire desdonnees l’une apres l’autre

187 / 209

Exemples

Flux entrant de donnees

I cin : entree standard du programmeTypiquement : clavier

I fichiers (ifstream)

I chaınes de caracteres ! (istringstream)

I connexion avec un autre programme ...

Flux sortant de donnees

I cout : sortie standard du programmeAvec tampon

I cerr : sortie d’erreur du programmeSans tampon

I fichiers (ofstream)

I chaınes de caracteres ! (ostringstream)

I connexion avec un autre programme ...188 / 209

Etat d’un fichier

Semantique

Une variable de type fichier peut etre dans un bon etat (« jusqu’ici toutva bien ») ou un mauvais etat :

I Fichier non trouve a l’ouverture, probleme de permissions

I Lecture ou ecriture incorrecte

I Fin du fichier atteinte

I Plus de place disque

Syntaxe

Dans un contexte booleen, un fichier est evalue a Vrai s’il est en bon etat :

if (fichier) ...

Remarque

Si un fichier n’est pas en bon etat, il y a moyen d’en savoir plus

189 / 209

D. Digression : traitement des erreurs et exceptions

Syntaxe

throw e;

Semantique

I Une situation exceptionnelle que je ne sait pas gerer s’est produite

I Je m’arrete immediatement et je previens mon bossc’est-a-dire la fonction appelante

I On dit qu’on leve une exception

I La situation est decrite par ee est un objet quelconque ; par exemple une exception standard

I Si mon boss ne sait pas gerer, il previent son boss

I . . .

I Si personne ne sait gerer, le programme s’arrete

190 / 209

Exemple de lancer d’exception

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 standardI exceptionI invalid_argument, out_of_range, length_errorI 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

I Execute le premier bloc d’instructionsI Si une exception de type type est levee, ce n’est pas grave, je sais

gerer :I L’execution du premier bloc d’instruction s’interromptI Le deuxieme bloc d’instruction est execute

193 / 209

Huitieme partie VIII

Introduction a la complexite d’algorithmes

A. Complexite d’un algorithme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195

B. Ordres de grandeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199

C. Complexite d’un probleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203

D. Calculabilite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206

194 / 209

Quelques problemes

I Quel est le meilleur algorithme pour trouver un nom dans unannuaire ?

I Comment predire le temps que va mettre un programme pours’executer ?

I Comment savoir, entre deux algorithmes, lequel est le plus efficace ?

I Comment savoir si un algorithme est optimal ?

I Comment determiner si un probleme est insoluble en pratique ?

195 / 209

Exemple : recherche naıve dans un tableau

Je recherche le nom « Zorro » dans un annuaire en utilisant la methodesuivante :

1. Je pars du debut de l’annuaire

2. Je compare le nom avec « Zorro »3. Si oui, j’ai termine

4. Sinon, je recommence en 2 avec le nom suivant

Probleme

I Combien est-ce que cela va me prendre de temps ?

I Combien est-ce que cela prendra de temps a un ordinateur

196 / 209

Synthese

On s’est donne :

I un probleme : rechercher un mot dans un dictionnaire

I un algorithme pour le resoudre : recherche exhaustiveI un modele de calcul :

1. Choix de la mesure de la taille d’une instance du probleme :le nombre de mots du dictionnaire

2. Choix des operations elementaires : comparer deux mots

DefinitionDans ce modele, on a cherche le nombre d’operations elementaireseffectuees par l’algorithme pour un probleme de taille n.C’est ce que l’on appelle la complexite de l’algorithme.

A partir de cette information, et en connaissant le temps necessaire pourde petites instances du probleme, on peut predire le temps necessairepour resoudre n’importe quelle instance du probleme.

197 / 209

Variantes

Complexite au pire

Exemple : n operations pour la recherche exhaustive

Complexite en moyenne

Exemple : n2 operations pour la recherche exhaustive

Complexite en memoire

La meme strategie peut s’appliquer a toutes les autres ressourcesEn particulier la complexite en memoire : combien faut-il de memoirepour executer l’algorithme (au pire, en moyenne, . . . )

Exemple

Un algorithme a une complexite en memoire de n2

Que peut-on dire de sa complexite en temps ?

198 / 209

Exercices

Donner des algorithmes et leur complexite au pire et en moyenne pour lesproblemes suivants :

1. Calculer la somme de deux vecteurs de Qn

2. Afficher une image

3. Calculer le plus grand element d’un tableau

4. Rechercher la position d’un 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 log2 n + 50 est meilleur qu’un algorithme en n1000

des que l’on s’interesse a des instances suffisamment grandes

La plupart du temps, il suffit d’avoir un ordre de grandeur du nombred’operations : les constantes sont sans grande importance

DefinitionsSoient f et g deux fonctions de N dans Npar 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 regles 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(n2) + O(n) = O(n2)

4. O(n3)O(n2 log n) = O(n5 log n)

202 / 209

Exercices

Simplifier les ordres de grandeurs suivants :

1. o(17n + 124) + o(n) + 3n

2. o(n2) + 1012o(n)

3. n2o(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 d’un probleme

ProblemeOn a vu dans un exercice precedent un algorithme pour calculer lamoyenne d’un tableau de nombres et on a obtenu sa complexite : O(n)Existe-t’il un meilleur algorithme ?

DefinitionsLa complexite d’un probleme est la complexite du meilleur algorithmepour le resoudre.On dit qu’un algorithme est optimal si sa complexite coıncide avec celledu probleme.

204 / 209

Exercices

1. Les algorithmes vus precedemment sont-ils optimaux ?

2. Demontrer que la recherche d’un element dans un tableau trie detaille n est un probleme de complexite O(log n).

205 / 209

Exercices

Evaluer au mieux la complexite des problemes suivants :

1. Calcul du n-ieme nombre de Fibonacci ;

2. Test de primalite de n ;

3. Calcul du pgcd de deux nombres ;

4. Recherche d’un echec et mat en 4 coups a partir d’une positiondonnee aux echecs.

5. Recherche du plus court chemin entre deux stations de metro a Paris ;

6. Calcul de la n-ieme decimale de√

2 ;

7. Probleme du sac-a-dos : etant donne un ensemble d’objets de hauteuret de poids variables, et un sac a dos de hauteur donnee, charger aumaximum le sac-a-dos ?

206 / 209

D. CalculabiliteDes notes d’un excellent expose de David Harel :

Computers are not omnipotent

DefinitionUn probleme est calculable s’il existe un algorithme pour le resoudre

Theoreme (These de Chuch-Turing)

La calculabilite d’un probleme est une notion robuste qui ne depends pardu langage de programmation, de l’architecture, ...

I Formalisation de plusieurs modeles de calculs, dont les machinesde Turing

I Demonstration de l’equivalence de ces modeles

I Ces modeles coıncident avec la notion intuitive

Video : une machine de Turing en lego

207 / 209

Calculabilite et solvabilite

Remarque

Un probleme peut avoir une solution mais ne pas etre calculable(on ne sait pas construire une solution)

Exemple (Probleme de l’arret)

I P : un programme (par exemple ecrit en C++)

I D : des donnees

I Question : est-ce que le programme P s’arrete si on le lance sur lesdonnees D ?

Il est impossible d’ecrire un programme HALT(P,D) qui predit si la reponseest oui ou non.

208 / 209

Calculabilite pratique

Un probleme peut avoir une solution algorithmique inutilisable en pratiqueparce qu’il effectue un nombre trop grand d’operations.

Exemple (Jeu d’echec)

I A chaque etape, il existe un nombre fini de coups possibles.

I Donc il est possible d’explorer la suite du jeu pour chaque coup.

I Mais il faut examiner jusqu’a 1019 coups pour decider de chaquedeplacement.

I Difficile ! mais programmes au niveau « champion du monde »

Exemple (Jeu de Go)

I Damier : 19x19, regles beaucoup plus simples

I Explosion beaucoup plus rapide : 10600 coups !

I Programmes au niveau « amateur »

Voir aussi : p. 25 de Computers are not Omnipotent

209 / 209

Conclusion : qu’avons nous vu ce semestre ?

Les bases de la programmation

I instructions de controle de flot (conditionnelles, iteratives)

I types de donnees

I fonctions, modules

I entrees-sorties

Un peu de methodologie de developpement

I Documentation, tests

I Programmation incrementale

Une esquisse de quelques outils

I Algorithmique, structures de donnees, complexite, ...

Ce n’est que le debut de l’aventure !