courspourimpression informatique
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 !