Beruflich Dokumente
Kultur Dokumente
Nicolas M. Thiery
http://Nicolas.Thiery.name/Enseignement/Info111
Inspire de cours de
Frederic Verni`ere, Laurent Simon, Florent Hivert, ...
29 novembre 2013
Partie I. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Partie II.
Elements de programmation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Partie III. Structures de controle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Partie IV. Fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Partie V. Tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Partie VI. Modularite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Partie VII. Fichiers, ux, exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Partie VIII. Introduction `a la complexite dalgorithmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
1 / 209
Premi`ere partie I
Introduction
A. Cest quoi linformatique en fait ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
B.
`
A propos de ce cours . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
C. Une br`eve histoire de linfomatique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
D. Debouches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
E. Ordinateurs et traitement automatique des informations . . . . . . . . . . 21
2 / 209
Pourquoi enseigner linformatique ?
Evidence : tous les jeunes savent utiliser un ordinateur
Vraiment ? les-enfants-ne-savent-pas-se-servir-dun-ordinateur
La technologie ?
Qui sait programmer ? Congurer un reseau ?
La science ?
Ma petite experience
6`eme : 3`eme :
Fac : apprendre la science a bouleverse ma programmation
2013 : apr`es 30 ans et 300k lignes de code, japprends toujours ...
6 / 209
La science informatique ?
Science du calcul et de linformation
Notion fondamentale : etude des syst`emes en evolution
Etat avant
Etape de calcul
Etat apr`es
Mod`eles de calcul
7 / 209
Grands probl`emes
Calculabilite
Que peut, ou ne peut pas faire, un ordinateur ?
Independemment du langage
Independemment du materiel
Tous les langages sont equivalents
Complexite
Combien de ressources faut-il pour resoudre un probl`eme ?
Independemment du langage
Independemment du materiel
8 / 209
Grands probl`emes de linformatique
Matriser les syst`emes extremement complexes
Internet avec des milliards dordinateur
Programmes avec des millions de lignes
Services gerant des millions de clients
Passage `a lechelle
Abstraction
Exemple : Reseau : Couches OSI
Probl`eme
Apprendre des outils con cus pour les programmes de 100000 lignes en
travaillant sur des programmes de 10 lignes ...
9 / 209
Concepts des langages de programmation
Java, C++, Python, Ada, Pascal, Perl, ...
Un nouveau langage par semaine depuis 50 ans !
Heureusement les concepts sont presque toujours les memes :
Programmation imperative
Programmation objet
Programmation fonctionnelle
Programmation logique
Evaluation
Partiel (dans laxe des TD)
Projet en n de semestre
Examen nal (vision densemble)
14 / 209
C. Une br`eve histoire de linfomatique
La prehistoire : de 3000 AC `a 1900
Babyloniens (3000 AC) : methodes systematiques de calcul et de
resolution dequations
Abaques, machines pour predire le mouvement des astres (80 AC)
Formalisation du calcul : Al Khawarizmi (IX`eme)
XVII`eme
1948 : EDSAC,
1948 : Invention du transistor (Baarden, Brattain et Shockley 47)
16 / 209
Les annees 50
Test de Turing en 50
Compilateurs (FORTRAN en 57)
LISP en 58
Circuits integres en 59
Les annees 60
Syst`emes dexploitation
Basic en 64
Automates Langages formels - Correction de programmes
Knuth : The Art of Computer Programming
Micro-processeurs
17 / 209
Les annees 70
Base de Donnees Relationnelles
Unix et C (Thompson et Richie)
Pascal et Ada
Architecture RISC (IBM), Cray 1 en 76
Premiers reseaux
Les annees 80
Micro-ordinateur personnel (Apple MacIntosh en 84)
NFSNet en 87 : Ancetre dInternet
Premiers virus en 88
Formalisation du Logiciel Libre
18 / 209
Les annees 90
Linux
C++, Java, Perl, Python, ...
Explosion dInternet
Un ordinateur dans chaque foyer ou presque
Les annees 2000-
Ordinateurs partout, tout le temps
Parallelisation massive
...
Pour les details
http://dept-info.labri.u-bordeaux.fr/~dicky/HisInfo.html
19 / 209
Les metiers de linformatique
Developpeur (programmeur, analyste, ingenieur)
Formateur (apprendre aux autres)
Testeur
Administrateur syst`eme, reseau, base de donnees
Technicien de maintenance
Chef de projet
Directeur des ressources informatiques
Directeur des syst`emes dinformation
Consultant, audit
Chercheurs / Inventeurs
Dirigeant de start-up (jeune pousse)
20 / 209
Les entreprises qui recrutent
Constructeurs (developpement materiel, syst`eme dexploitation)
HP `a Grenoble, Apple `a Paris, etc.
Operateurs Telecom (FT, Free, SFR, . . . )
Editeurs de logiciels (Dassault Catia, ILOG discovery, Jeux
Infogramme, Google, . . . )
SSII (installation syst`eme, materiel, logiciel, developpement,
adaptation, maintenance de logiciels `a la demande des clients) IBM,
Capgemini, Atos Origin, Accenture, Logica, Orange Business Serv. . .
Grands comptes (grandes societes reparties sur plusieurs sites, ayant
des besoins informatiques importants ; services informatiques propres
+ SSII prestataires de service) (constructeurs automobiles, Caisse des
depots, Hopitaux, . . . )
PMI/PME (utilisation de linformatique pour gestion, bureautique,
. . . )
Logiciel libre : 30000 professionnels en France
21 / 209
Ordinateur
Exemples
Calculatrice (programmable)
Ordinateur personnel (PC, Macintosh, . . . )
Station de travail (Sun, DEC, HP, . . . )
Super-ordinateur (Cray, IBM-SP, . . . )
Clusters dordinateurs
Mais aussi
Puce (programme xe)
Tablettes
Telephones portables
Appareils photos
...box et autres routeurs wi
Televiseurs, ...
22 / 209
Caracteristiques principales dun ordinateur
Absolument stupide
Il obeit strictement aux ordres recus
Est-ce quil fait ce que lon veut ?
Tr`es tr`es rapide
2GHz : 2 milliards doperations par seconde
Tr`es tr`es bonne memoire
Bible : M0 (million de caract`eres)
Memoire : Go (milliards de caract`eres)
Disque : To (1000 milliards de caract`eres)
23 / 209
`
A quoi sert un ordinateur ?
Stocker des informations
Agenda, musique, photos, ...
Traiter automatiquement des informations
Entree dinformation venant du clavier, souris, capteurs, memoire,
autre ordinateur, ...
Traitement des informations en executant un programme,
Sortie du resultat vers lecran, memoire, autre ordinateur, ...
Analogie : le cuisinier
Entree : les ingredients venant du frigo, ...
Programme : la recette
Sortie : le plat prepare vers le consommateur
24 / 209
Exemple de programme
Ingredients
250g de chocolat, 125g de beurre, 6 ufs, 50 g de sucre, cafe
Etapes
Faire fondre le chocolat avec 2 cuill`eres deau
Ajouter le beurre, laisser refroidir puis ajouter les jaunes
Ajouter le sucre et comme parfum un peu de cafe
Battre les blancs jusqu`a former une neige uniforme
Ajouter au melange.
25 / 209
Comment se faire comprendre ?
Quel niveau dabstraction ?
Trop detaille
Lever le bras de 10 cm, tendre la main vers la gauche, prendre la
casserole rouge, ...
Recette longue
Mauvaise Lisibilite
Elements de programmation
A. Le cycle de vie dun programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
B. Premiers programmes en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
C. Memoire, variables, types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
D. Lecture,
Ecriture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
E. Types de bases et expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
28 / 209
A. Le cycle de vie dun programme
Ce que je veux :
Calculer la puissance 4
e
dun nombre
Ce que lordinateur sait faire (code assembleur) :
...
400a55: 8b 55 e4 mov -0x1c(%rbp),%edx
400a58: 8b 45 e4 mov -0x1c(%rbp),%eax
400a5b: 0f af c2 imul %edx,%eax
400a5e: 89 45 e8 mov %eax,-0x18(%rbp)
400a61: 8b 45 e8 mov -0x18(%rbp),%eax
400a64: 0f af 45 e8 imul -0x18(%rbp),%eax
400a68: 89 45 ec mov %eax,-0x14(%rbp)
...
Cela ne va pas se faire tout seul ...
29 / 209
Digression : assembleur et premier mod`ele dexecution
Exercice : executer ce fragment dassembleur
400a55: 8b 55 e4 mov -0x1c(%rbp),%edx
400a58: 8b 45 e4 mov -0x1c(%rbp),%eax
400a5b: 0f af c2 imul %edx,%eax
400a5e: 89 45 e8 mov %eax,-0x18(%rbp)
400a61: 8b 45 e8 mov -0x18(%rbp),%eax
400a64: 0f af 45 e8 imul -0x18(%rbp),%eax
400a68: 89 45 ec mov %eax,-0x14(%rbp)
Indications
%eax, %edx : deux registres (cases memoire du processeur)
-0x14(%rbp), ..., -0x1c(%rbp) : autres cases memoire
Initialiser le contenu de la case %-0x1c(%rbp) `a 3
mov a, b : copier le contenu de la case a dans la case b
imul a, b : multiplier le contenu de a par celui de b et mettre le
resultat dans b
30 / 209
Cycle de vie dun programme
Methodologie
1.
Enonce du probl`eme
2. Formalisation (quel est le probl`eme precisement)
3. Recherche dun algorithme (comment resoudre le probl`eme ?)
4. Programmation (implantation)
5. Compilation
6. Execution
7. Mise au point (test, debogage, optimisation)
31 / 209
Cycle de vie dun programme
Probl`eme
Calculer la puissance 4
e
dun nombre
Formalisation
Specication des entrees et des sorties.
Scenario dutilisation : lutilisateur rentre au clavier un nombre entier x ;
lordinateur ache en retour la valeur de x
4
`a lecran.
Recherche dun algorithme
Comment on resout le probl`eme ?
Quel traitement appliquer `a lentree pour obtenir la sortie desiree ?
On note que x
4
= x x x x = (x
2
)
2
Algorithme :
calculer x x
prendre le resultat et faire de meme
32 / 209
Cycle de vie dun programme :
Ecriture dun programme
#include <iostream>
using namespace std;
int main() {
int x, xCarre, xPuissanceQuatre;
cout << "Entrez un entier: ";
cin >> x;
xCarre = x * x;
xPuissanceQuatre = xCarre * xCarre;
cout << "La puissance quatri`eme de " << x
<< " est " << xPuissanceQuatre << endl;
return 0;
}
33 / 209
Cycle de vie dun programme
Compiler le programme
Transformer le programme en code assembleur
Lancer le programme
Autant de fois que lon veut !
Tester que le programme fonctionne
Cas particuliers ! ! !
Ameliorer le programme
Correction derreurs
Optimisation du programme (rapidite, consommation memoire)
Optimisation de lalgorithme
Amelioration du programme (lisibilite, generalisation)
34 / 209
La notion dAlgorithme
Denition
Description formelle dun procede de traitement qui permet, `a partir
dun ensemble dinformations initiales, dobtenir des informations
deduites
Succession nie et non ambigue doperations clairement posees.
Doit donc toujours se terminer !
35 / 209
La notion de Programme
Denition
Suite dinstructions (ordres) donnees `a la machine
Ces instructions sont donnes en utilisant une syntaxe tr`es precise :
Cette syntaxe (et la semantique associee) est decrite par le langage
de programmation
Le programme implante un algorithme
Le programme est concu autant pour etre lu par un autre humain
(dont soi-meme dans un mois) que pour etre execute par lordinateur
36 / 209
Langages de programmation
Langage machine
Binaire directement comprehensible par la machine
Langage dassemblage (ou assembleur)
Tr`es facilement traduisible pour etre compris par la machine
Langage de programmation
Doit etre compile ou interprete pour etre compris par la machine
37 / 209
Les langages de programmation compiles
Chane de production
Utilisateur =
Programme
source
= Compilateur =
Programme
objet
= Machine
Exemples
Pascal, C, C++, ADA, FORTRAN, Java, . . .
Demo
38 / 209
Les langages de programmation interpretes
Chane de production
Utilisateur =
Instruction
source
= Interpreteur =
Instruction
machine
= Machine
Exemples
Basic, LISP, Perl, Python, . . .
Demo
39 / 209
B. Premiers programmes en C++
Le langage C++
1958 : ALGOL : ALGOrithmic Language
1970 : Langage C (Dennis Ritchie)
Programmation objet
Evaluer lexpression (ou les expressions)
Ecrire le resultat sur le ux de sortie (ecran)
64 / 209
La saisie (ou lecture)
Syntaxe
Lecture dune variable :
cin >> variable ;
Lecture de plusieurs variables :
cin >> variable1 >> variable2 ;
Semantique
Lit une valeur du type approprie sur le clavier
Aecte cette valeur `a la variable
65 / 209
La saisie (ou lecture) (2)
Notes
Les caract`eres tapes sur le clavier sont codes (ASCII) puis places dans
la memoire tampon (buer) du clavier
Cette memoire tampon fonctionne comme une le dattente (premier
arrive, premier servi)
La memoire tampon nest envoyee au programme quapr`es lappui de
la touche Entree
Clavier =
Memoire
tampon
= Programme
66 / 209
La saisie (ou lecture) (3)
Notes
Lorsque la memoire tampon est vide, linstruction
cin >> variable ; attend quune donnee arrive dans cette memoire
tampon.
Le programme est bloque et attend une action de lutilisateur.
Notes
Lorsque la memoire tampon contient une donnee, linstruction
cin >> variable ; prend la premi`ere, la supprime du tampon, la
traduit en valeur C++ et place cette valeur dans la variable.
67 / 209
Lecture dune variable de type int ou float
Notes
Les blancs places en tete sont ignores ; le retour `a la ligne et les
tabulations sont consideres comme des blancs.
Erreur `a lexecution si on trouve un caract`ere ne correspondant pas `a
la syntaxe des constantes de type int ou float.
Sinon, on lit tant que le caract`ere correspond `a la syntaxe des
constantes de type int ou float.
Erreur `a lexecution si valeur de la constante non compatible pour
laectation avec le type de la variable.
68 / 209
E. Types de bases et expressions
69 / 209
Les entiers (types int, long)
representes sur un mot machine ;
sur une machine `a n bits on peut representer 2
n
entiers, soit les
entiers compris entre 2
n1
et +2
n1
1.
Les bornes sont donnees par -MAXINT-1 et MAXINT.
Notes
Dierence entier machine / entier mathematique !
Voir Exemples/int.cpp, Exemples/long.cpp
70 / 209
Les operations sur les entiers
Notes
loppose (operation unaire, notee -) ;
laddition (operation binaire, notee +) ;
la soustraction (operation binaire, notee -) ;
la multiplication (operation binaire, notee *) ;
la division enti`ere (operation binaire, notee /) ;
le reste de la division enti`ere (operation binaire, notee %) ;
Attention la multiplication nest pas implicite, le symbole * doit toujours
etre indique explicitement entre les deux operandes.
71 / 209
Les operations sur les entiers (2)
Exemples :
operation resultat
17 + 5 22
17 - 5 12
17 * 5 85
17 / 5 3
17 % 5 2
72 / 209
Les reels (types float, double)
La representation des reels varie suivant les langages de programmation,
les machines et les normes utilisees.
Les operations possibles sur les reels sont :
Notes
loppose (operation unaire, notee -) ;
laddition (operation binaire, notee +) ;
la soustraction (operation binaire, notee -) ;
la multiplication (operation binaire, notee *) ;
la division (operation binaire, notee /) ;
73 / 209
Les operations sur les reels
Exemples :
operation resultat notation scientique
13.6 + 6.9 20.5 2.05E+01
13.6 - 6.9 6.7 6.7E+00
13.6 * 6.9 93.84 9.384E+01
13.6 / 6.9 1.9710145 1.9710145E+00
Voir Exemples/float.cpp
74 / 209
Les caract`eres (type char)
Permettent de stocker un seul caract`ere :
Un chire 0, ..., 9
Deux possibilites :
levaluation compl`ete : evaluer tous les operandes des expressions
booleennes
levaluation paresseuse : stopper levaluation d`es que lon peut :
Ecriture : cout << expression ;
Aectation : variable = expression
Les instructions sont executees de mani`ere sequentielle (les unes apr`es les
autres), dans lordre du programme.
Les expressions sont constituees de constantes et variables, connectees par
des operations.
87 / 209
Le probl`eme
On a souvent besoin de rompre la sequence dexecution :
Dans certain cas particulier, on veut sauter certaines instructions :
Instructions conditionnelles
Dans dautres cas, on a besoin de repeter certaines instructions :
Instructions iteratives
88 / 209
A. Instructions conditionnelles
En fonction dun choix ou dune condition, on va executer ou non un bloc
dinstructions.
Denition
Une condition est une expression booleenne
(i.e. dont le resultat est de type booleen).
Denition
Un bloc dinstructions est une suite dinstructions `a executer
successivement. Il est decrit par la syntaxe suivante :
{
instruction 1;
instruction 2;
...
instruction n;
}
89 / 209
Instruction conditionnelle simple (mot cle if)
Syntaxe
if ( condition ) {
bloc d instructions
}
Semantique
La condition est evaluee
Si sa valeur est true, le bloc dinstructions est execute
Exemples
if ( x >= 0 ) {
cout << "x est positif" << endl;
}
if ( x >= 0 ) cout << "x est positif" << endl;
90 / 209
Instruction conditionnelle avec alternative (mot cle else)
Syntaxe
if (condition) {
bloc d instructions 1
} else {
bloc d instructions 2
}
Semantique
La condition est evaluee
Si sa valeur est true, le bloc dinstructions 1 est execute
Si sa valeur est false, le bloc dinstructions 2 est execute
91 / 209
Exemples dinstruction alternative
Exemple
if ( x >= 0 ) {
cout << "x est positif" << endl;
} else {
cout << "x est negatif" << endl;
}
92 / 209
Exemples dinstruction alternative (2)
Exemple (Calcul du maximum et du minimum de x et y)
int x, y, maximum, minimum;
...
if ( x > y ) {
maximum = x;
minimum = y
} else {
maximum = y;
minimum = x;
}
93 / 209
Erreurs classiques avec les conditionnelles
Exemple
bool estPositif;
...
if ( x >= 0 ) {
estPositif = true
} else {
estPositif = false
}
Utiliser une expression booleenne `a la place !
bool estPositif;
...
estPositif = x >= 0;
94 / 209
Erreurs classiques avec les conditionnelles (2)
Exercice
Que fait :
if ( x = 1 ) {
cout << "x vaut 1" << endl;
}
Attention !
Ne pas confondre = (aectation) et == (egalite) !
95 / 209
Erreurs classiques avec les conditionnelles (3)
Exercice
Que fait :
if ( x == 1 ); {
cout << "x vaut 1" << endl;
}
La meme chose que :
if ( x == 1 );
cout << "x vaut 1" << endl;
Ne tiens pas compte du if et ache toujours x vaut 1 .
Attention !
le point-virgule est un separateur dinstruction !
if (...) {...} else {...} forme une seule instruction
Jamais de point-virgule avant un bloc dinstructions !
96 / 209
Tests imbriques
Il est bien s ur possible dimbriquer des instructions if then else.
Note : un else se rapporte au dernier if rencontre.
Example
Que se passe-t-il lorsque x = 5 et y = 4 dans lexemple suivant :
if (x >= y ) {
if ( x == y ) {
cout << x << " = " << y << endl;
}
else {
cout << x << " < " << y << endl;
}
}
Attention !
En C++, la structuration est determinee pas les accolades
La mauvaise indentation induit en erreur le lecteur !
97 / 209
Tests imbriques, version correcte
Example
Que se passe-t-il lorsque x = 5 et y = 4 dans lexemple suivant :
if (x >= y ) {
if ( x == y ) {
cout << x << " = " << y << endl;
}
} else {
cout << x << " < " << y << endl;
}
98 / 209
Lindentation
Rappel
Un programme sadresse `a un lecteur
La lisibilite est un objectif essentiel
Notes
Lindentation consiste `a espacer les lignes de code par rapport au
bord gauche de la fenetre de saisie de texte
Lespacement doit etre proportionnel au niveau dimbrication des
instructions du programme
Quatre espaces par niveau dimbrication est un bon compromis
La plupart des editeurs de texte orent des facilites pour realiser une
bonne indentation. Apprenez les.
99 / 209
B. Instructions iteratives
Rappel
La force dun ordinateur est de savoir faire des taches repetitives tr`es
rapidement et sans sennuyer.
Exemples
On veut acher tous les nombres entre 1 et 1000.
Dans un jeu sur ordinateur, `a la n dune partie, on veut demander
voulez vous rejouer ? et si oui recommencer une nouvelle partie.
Tous les 1/24`eme de seconde on veut acher une image dun lm
(sil en reste)
100 / 209
B. Instructions iteratives
Exemple (Calcul de la factorielle)
On veut calculer 7! = 1 2 7 :
int resultat = 1;
resultat = resultat * 2;
resultat = resultat * 3;
resultat = resultat * 4;
resultat = resultat * 5;
resultat = resultat * 6;
resultat = resultat * 7;
cout << "Factorielle 7 vaut " << resultat << endl;
Probl`emes
Ce code sent mauvais (repetitions) !
Et si on veut calculer 10! ou 100! ?
101 / 209
Les instructions iteratives
Denition
Les instructions iteratives permette de repeter un certain nombre de fois
lexecution dune bloc dinstructions sous certaines conditions.
De fa con imagee, on appelle boucle cette methode permettant de repeter
lexecution dun groupe dinstructions.
Instructions iteratives
Boucles Tant que (while)
Boucles Faire ... tant que (do ... while)
Boucles Pour (for)
102 / 209
La boucle tant que (while)
Syntaxe
while (condition) {
bloc d instructions
}
Semantique
Tant que la condition est vraie, on rep`ete le bloc dinstructions :
La condition est evaluee
Si sa valeur est true, le bloc dinstructions est execute
On recommence
103 / 209
La boucle tant que (while) : exemples
Exemple
int n, resultat;
cin >> n;
resultat = 1;
while (n > 0) {
resultat = resultat * n;
n = n - 1;
}
cout << resultat << endl;
Execution pour n = 3 puis pour n = 0
104 / 209
La boucle tant que (while) : exemples
Exemple (Compter de 1 `a 10)
int n = 1;
while ( n <= 10 ) {
cout << n << endl;
n = n + 1;
}
105 / 209
Compteur / accumulateur
Techniques de Boucle :
comptage, utilisation dune variable compteur
accumulation, utilisation dune variable accumulateur
Notes
Laccumulation sert `a appliquer la meme operation (somme,
produit, . . .) `a plusieurs elements.
On utilise une variable appelee accumulateur pour stocker les
resultats intermediaires.
106 / 209
Cas particulier : condition toujours fausse
Si la valeur de la condition est fausse d`es le depart alors le bloc
dinstructions ne sera jamais execute !
Exemple
int n = 1;
while ( n < 0 ) {
cout << n << endl;
n = n + 1;
}
107 / 209
Cas particulier : condition toujours vraie
Si la valeur de la condition est toujours vraie, alors le bloc
dinstructions sera execute indeniment ! (boucle innie)
Exemple (Que fait ce programme ?)
int n = 1;
while ( true ) {
cout << n << endl;
n = n + 1;
}
Exemple (Erreur typique : oublier lincrementation !)
int n = 1;
while ( n <= 10 ) {
cout << n << endl;
}
108 / 209
Une source derreur classique en n de boucle
Exemple
Que vaut n `a la n du programme suivant ?
int n = 1;
while ( n <= 10 ) {
cout << n << endl;
n = n + 1;
}
cout << n << endl;
Rappel
On sort de la boucle quand la condition est fausse !
Le compteur est donc un cran trop loin !
109 / 209
La boucle faire ... tant que (do ... while)
Syntaxe
do {
bloc d instructions
} while ( condition );
Semantique
On execute le bloc dinstructions
On evalue la condition
Si sa valeur est true, on recommence
Remarque
La boucle est executee au moins une fois !
110 / 209
La boucle faire ... tant que (do ... while) : exemples
Exemple
int n, resultat;
cin >> n;
resultat = 1;
do {
resultat = resultat * n;
n = n - 1;
} while (n > 0);
cout << resultat << endl;
Execution pour n = 3 puis pour n = 0
111 / 209
La boucle faire ... tant que (do ... while) : exemples
Exemple
char reponse;
do {
...
cout << "Voulez-vous rejouer (o/n)?" << endl;
cin >> reponse
} while ( reponse == o );
112 / 209
La boucle pour (for)
Syntaxe
for ( initialisation ; condition ; incrementation ) {
bloc d instructions
}
Semantique
1. On execute linstruction dinitialisation
2. On evalue la condition
3. Si sa valeur est true, on execute le bloc dinstruction
4. On execute linstruction dincrementation
5. On recommence en (2)
113 / 209
La boucle pour (for) : exemple
Exemple
int n;
for ( n = 1 ; n <= 10 ; n = n + 1 ) {
cout << n;
}
Variante compacte :
for ( int n = 1 ; n <= 10 ; n++ ) {
cout << n;
}
La variable n est locale `a la boucle (on y reviendra)
n++ est un raccourci pour n = n + 1
114 / 209
La boucle pour (for) : exemples
Exemple
int n, resultat;
cin >> n;
resultat = 1;
for ( int k = 1; k <= n; k++ ) {
resultat = resultat * k;
}
cout << resultat << endl;
Execution pour n = 3 puis pour n = 0.
115 / 209
Quatri`eme partie IV
Fonctions
A. Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
B. Fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
116 / 209
Resume des episodes precedents . . .
Pour le moment nous avons vu les instructions suivantes :
Lecture : cin >> variable ;
Ecriture : cout << expression ;
Aectation : variable = expression
Instruction conditionnelle : if
Instructions iteratives : while, do ... while, for
Remarque
Tout ce qui est calculable par un ordinateur peut etre programme
uniquement avec ces instructions
Pourquoi aller plus loin ?
Passage `a lechelle !
117 / 209
Motivation : lexemple du livre de cuisine
Recette de la tarte aux pommes
Ingredients : 250 g de farine, 125 g de beurre, 1 uf, 2 cl deau une
pincee de sel, 100 g de sucre en poudre, 5 belles pommes
Mettre la farine dans un recipient puis faire un puits
Versez dans le puits 2 cl deau
Mettre le beurre
Mettre le sucre et le sel
Petrir de facon `a former une boule
Etaler la pate dans un moule
Peler les pommes, les couper en quartier et les disposer sur la pate
Faire cuire 30 minutes
118 / 209
Motivation : lexemple du livre de cuisine (2)
Recette de la tarte aux poires
Ingredients : 250 g de farine, 125 g de beurre, 1 uf, 2 cl deau une
pincee de sel, 100 g de sucre en poudre, 5 belles poires
Mettre la farine dans un recipient puis faire un puits
Versez dans le puits 2 cl deau
Mettre le beurre
Mettre le sucre et le sel
Petrir de facon `a former une boule
Etaler la pate dans un moule
Peler les poires, les couper en quartier et les disposer sur la pate
Faire cuire 30 minutes
119 / 209
Motivation : lexemple du livre de cuisine (3)
Recette de la tarte tatin
Ingredients : 250 g de farine, 125 g de beurre, 1 uf, 2 cl deau une
pincee de sel, 200g de sucre en poudre, 5 belles pommes
Mettre la farine dans un recipient puis faire un puits
Versez dans le puits 2 cl deau
Mettre le beurre
Mettre le sucre et le sel
Petrir de facon `a former une boule
Verser le sucre dans une casserole
Rajouter un peu deau pour lhumecter
Le faire carameliser `a feu vif, sans remuer
Verser au fond du plat `a tarte
Peler les pommes, les couper en quartier
Faire revenir les pommes dans une poele avec du beurre
Disposer les pommes dans le plat, et etaler la pate au dessus
Faire cuire 45 minutes et retourner dans une assiette
120 / 209
Quest-ce qui ne va pas ?
Duplication
Longueurs
En cas derreur ou damelioration, il faut corriger plusieurs endroits
Manque dexpressivite
Dicile `a lire
Dicile `a memoriser
Essayons dameliorer cela
121 / 209
Recettes de base
Recette de la pate brisee
Ingredients : 250 g de farine, 125 g de beurre, 1 uf, 2 cl deau une
pincee de sel
Mettre la farine dans un recipient puis faire un puits
Versez dans le puits 2 cl deau Mettre le beurre
Mettre le sucre et et une pincee de sel
Puis petrir de facon a former une boule
Recette du caramel
Ingredients : 100 g de sucre
Verser le sucre dans une casserole
Rajouter un peu deau pour lhumecter
Le faire carameliser `a feu vif, sans remuer
122 / 209
Recettes de tartes
Tarte aux fruits (pommes, poires, ...)
Ingredients : 500g de fruits et les ingredients pour une pate brisee
Preparer une pate brisee
Etaler la pate dans un moule
Peler les fruits, les couper en quartier et les disposer sur la pate
Faire cuire 30 minutes
Tarte tatin
Ingredients : 5 belles pommes, pate brisee, caramel
Preparer une pate brisee
Preparer un caramel et le verser au fond du plat `a tarte
Peler les pommes, les couper en quartier
Faire revenir les pommes dans une poele avec du beurre
Disposer les pommes dans le plat, et etaler la pate au dessus
Faire cuire 45 minutes et retourner dans une assiette
123 / 209
Les fonctions : objectif
Modularite
Decomposer un programme en programmes plus simples
Implantation plus facile
Validation (tests)
Reutilisation
Flexibilite
(remplacement dun sous-programme par un autre)
Non duplication
Partager (factoriser) du code
Code plus cours
Maintenance plus facile
Niveau dabstraction
Programmes plus concis et expressifs 124 / 209
Appel de fonctions usuelles
#include <math.h>
#include <iostream>
using namespace std;
int main() {
cout << "3^2 = " << pow(3.0, 2.0) << endl;
cout << "2^3 = " << pow(2.0, 3.0) << endl;
cout << "e^1 = " << exp(1.0) << endl;
cout << "cos(pi) = " << cos(3.1415) << endl;
return 0;
}
Ce programme ache :
3^2 = 9
2^3 = 8
e^1 = 2.71828
cos(pi) = -1
125 / 209
Appel de fonctions usuelles
On remarque
La presence de #include <math.h>
Cest pour utiliser la biblioth`eque de fonctions mathematiques.
On y reviendra ...
Lordre des arguments est important
Le type des arguments est important
On sait ce que calcule cos(x)
On ne sait pas comment il le fait
On na pas besoin de le savoir
126 / 209
Premiers exemples : la fonction max
#include <iostream>
using namespace std;
float max(float a, float b) {
if ( a >= b ) {
return a;
} else {
return b;
}
}
int main() {
cout << max(1.0, 3.0) << endl;
cout << max(5.0, 2.0) << endl;
cout << max(2.0, 2.0) << endl;
return 0;
}
127 / 209
Premiers exemples : la fonction factorielle
#include <iostream>
using namespace std;
int main() {
int n, resultat;
cin >> n;
resultat = 1;
for ( int k = 1; k <= n; k++ ) {
resultat = resultat * k;
}
cout << resultat << endl;
return 0;
}
128 / 209
Premiers exemples : la fonction factorielle
#include <iostream>
using namespace std;
int factorielle(int n) {
int resultat = 1;
for ( int k = 1; k <= n; k++ ) {
resultat = resultat * k;
}
return resultat;
}
int main() {
int n;
cin >> n;
cout << n << "! = " << factorielle(n) << endl;
return 0;
}
129 / 209
Syntaxe dune fonction
Syntaxe
type nom(type1 parametre1, type2 parametre2, ...) {
... declarations de variables ...
... instructions ...
return expression;
}
parametre1, parametre2, ... sont les param`etres formels
Le type des param`etres formels est xe
Les variables sont appelees variables locales
`
A la n, la fonction renvoie la valeur de expression qui doit etre du
type annonce
Il peut y avoir plusieurs return
130 / 209
La fonction main
Exemple
#include <iostream>
using namespace std;
int main() {
cout << "Bonjour!" << endl;
return 0;
}
Le programme principal est une fonction comme les autres !
Ce programme renvoie une valeur enti`ere. Par convention :
Ecriture : cout << expression ;
Aectation : variable = expression
Instruction conditionnelle : if
Instructions iteratives : while, do ... while, for
Fonctions
Pourquoi aller plus loin ?
Passage `a lechelle !
Manipuler de grosses quantites de donnees
146 / 209
A. Motivation
Exemple (Fil conducteur)
Implantation dun annuaire
147 / 209
B. Les tableaux
`
A retenir
Un tableau est une valeur composite formee de plusieurs valeurs du
meme type
En gros : une suite contigue de cases en memoire
Une valeur (ou element) dun tableau t est designee par sa position i
dans le tableau. On la note typiquement t[i ].
En C++, cette position est un entier entre 0 et 1, o` u est le
nombre delements du tableau
Exemple
Voici un tableaux dentiers :
1 4 1 5 9 2 6 5 3 5
Avec cet exemple, t[0] vaut 1, t[1] vaut 4, t[2] vaut 1, ...
Noter que lordre et les repetitions sont importantes !
148 / 209
Les tableaux en C++
Exemple
vector<int> t;
t = vector<int>(10);
t[0] = 1;
t[1] = 4;
t[2] = 1;
t[3] = 5;
t[4] = 9;
t[5] = 2;
t[6] = 6;
t[7] = 5;
t[8] = 3;
t[9] = 5;
cout << t[5] + t[9] << endl;
149 / 209
C. Tableaux et allocation memoire
Declaration dun tableau dentiers
vector<int> t;
Pour un tableau de ottants, on utiliserait vector<float>, etc.
Pour aller plus loin : vector est un template
Allocation dun tableau de 10 entiers
t = vector<int>(10);
t contient maintenant une reference vers ces cases
Initialisation du tableau
t[0] = 1;
t[1] = 4;
150 / 209
Tableaux et allocation memoire
`
A retenir
Une valeur de type tableau ne contient pas directement les cases du
tableau, mais la localisation en memoire de celles-ci (reference).
Une variable de type tableau se construit en trois etapes :
1. Declaration
2. Allocation
Sans elle : faute de segmentation (au mieux !)
3. Initialisation
Sans elle : meme probl`eme quavec les variables usuelles
Raccourci
Declaration, allocation et initialisation en un coup :
vector<int> t = { 1, 4, 1, 5, 9, 2, 6, 5, 3, 5 };
Introduit par la norme C++ de 2011 !
151 / 209
D. Operations
Syntaxe
Si t est un tableau, on peut utiliser t[i] comme nimporte quelle
variable :
x = t[2] + 3*t[5]; // Acc`es en lecture
t[4] = 2 + 3*x; // Acc`es en ecriture
Attention !
En C++ les indices ne sont pas veries !
Le comportement de t[i] nest pas specie en cas de debordement
Source no 1 des trous de securite ! ! !
Acc`es avec verications possibles avec : t.at(i) au lieu de t[i]
Quelques autres operations
t.size(); // Taille du tableau
t.push_back(3); // Ajout dun element `a la fin 152 / 209
Aectation de tableaux
vector<int> t = { 1, 4, 1, 5, 9, 2, 6, 5, 3, 5 };
cout << "t[0]: " << t[0] << endl;
vector<int> t2;
t2 = t; // Affectation
t2[0] = 0;
cout << "t[0]: " << t[0] << ", t2[0]: " << t2[0] << endl;
`
A retenir
En C++, lors dune aectation, un vector est copie !
On dit que vector a une semantique de copie
Dierent de Java, Python, ou des array en C!
Pour aller plus loin
Les vector sont passes par valeur aux fonctions
Pour preserver les performances, vector suit le patron de conception
de copie-en-ecriture : la copie na lieu que quand elle est necessaire
153 / 209
Tableaux, collections et vecteurs en C++
La biblioth`eque standard C++ fournit de nombreuses autres
structures de donnees pour representer des collections :
array, list, queue, stack, set, multiset, ...
Chacune a ses specicites en terme de semantique, doperations
disponibles et de performances
On se contentera dans ce cours de vector
On en verra plus en S2 !
Les vector de C++ ne sont pas des vecteurs au sens mathematique :
pas doperation daddition, ...
Les chanes de caract`eres (string) se comportent en gros comme
des tableaux de caract`eres
154 / 209
Tableaux `a deux dimensions
Remarque
On represente un tableau `a deux dimensions par un tableau de
tableaux : vector<vector<int> >
t
i ,j
: t[i][j]
Attention !
1. Declaration du tableau
2. Allocation du tableau
3. Allocation de chaque ligne
4. Initialization
Exemple (Implantation de Tic-Tac-Toe)
155 / 209
Sixi`eme partie VI
Modularite
A. Lire un programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
B. Debogage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
C. Compilation separee . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
156 / 209
Resume des episodes precedents . . .
Pour le moment nous avons vu les instructions suivantes :
Lecture : cin >> variable ;
Ecriture : cout << expression ;
Aectation : variable = expression
Instruction conditionnelle : if
Instructions iteratives : while, do ... while, for
Fonctions
Tableaux
Pourquoi aller plus loin ?
Passage `a lechelle !
Maintenance de gros programmes
157 / 209
A. Lire un programme
Dans lordre du chier ?
Quelles sont les briques de bases (bottom-up)
Parcourir les fonctions disponibles et leur documentation.
Qui appelle qui ? (top-down)
Chercher la fonction main
Quelles fonctions appelle-telle ?
Quelles fonctions appellent ces fonctions ?
Ne rentrer dans les details que si cest necessaire
Exemple
x = cos(theta);
On supposes, a priori, que la fonction cos est correcte !
158 / 209
Debogage : les types derreurs
Erreurs de syntaxe
Detectees par le compilateur
Erreurs `a lexecution
Erreurs semantiques
Le programme sexecute normalement
mais le resultat est incorrect
Le programme ne fait pas ce que le programmeur souhaitait.
Le programme fait ce que le programmeur lui a demande !
159 / 209
Debogage
Erreurs de syntaxe
Bien lire les messages derreurs
Le compilateur pointe vers l`a ou il ne comprends pas
Pas forcement l`a o` u est lerreur
Erreurs `a lexecution
Analyser letat du programme juste avant lerreur.
En Python, Java, ... : regarder la pile dappel.
Utilisation du debogeur !
160 / 209
Debogage des erreurs semantiques
Un travail de detective !
Peut etre tr`es frustrant, surtout sous stress
Peut etre tr`es une belle source de satisfaction
Gerer ses emotions !
Diculte
Isoler une erreur glissee dans :
Un programme de millions de lignes
De grosses donnees
Des milliards dinstructions executees
Exemple
Exemples/debogage.cpp
Utilisation du debogueur !
161 / 209
Debogage : reduire le probl`eme par dichotomie
1. Faire une experience pour determiner dans quelle moitie du
programme est lerreur.
2. Caracteriser le boggue : Lorsque jappelle telle fonction avec tels
param`etres, la reponse est incorrecte
En faire un test !
3. Trouver le plus petit exemple incorrect
En faire un test !
4. Executer pas `a pas la fonction sur cet exemple
5. Trouver lerreur
6. Corriger lerreur
7. Verier les tests (non regression)
8. Rajouter des tests ?
`
A deux ou trois arguments (et plus ?)
Remarque
Cet exemple nest pas satisfaisant (duplication)
Correctif : les templates pour ecrire du code generique
Ce sera pour un autre cours !
167 / 209
Compilation separee
Un programme peut etre compose de plusieurs chiers source
Contenu :
Equivalent `a copier-coller le contenu de max.h `a lemplacement du
#include "max.h"
Gere par le preprocesseur (cpp)
170 / 209
Inclusion de chiers dentete standard
Syntaxe
#include <iostream>
Semantique
Charge la declaration de toutes les fonctions denies dans la
biblioth`eque standard iostream de C++.
Le chier iostream est recherche dans les repertoires standards du
syst`eme.
Sous linux : /usr/include, ...
171 / 209
Declaration de fonctions
Syntaxe
Semantique
Le programme denit quelque part une fonction max avec cette
signature : type des param`etres et type du resultat
Cette denition nest pas forcement dans le meme chier
Si cette denition nexiste pas ou nest pas unique, une erreur est
declenchee par le compilateur
Lerreur est declenchee au moment o` u lon combine les dierents
chiers (edition de liens)
Application typique
Deux fonctions qui sappellent reciproquement
172 / 209
Resume : implantation dune biblioth`eque en C++
Ecriture : cout << expression ;
Aectation : variable = expression
Instruction conditionnelle : if
Instructions iteratives : while, do ... while, for
Fonctions
Tableaux et valeurs composites
Programmation modulaire
Pourquoi aller plus loin ?
Passage `a lechelle !
Donnees persistentes
179 / 209
B. Introduction
2 ;
7. Probl`eme du sac-`a-dos : etant donne un ensemble dobjets de hauteur
et de poids variables, et un sac `a dos de hauteur donnee, charger au
maximum le sac-`a-dos ?
206 / 209
D. Calculabilite
Des notes dun excellent expose de David Harel :
Computers are not omnipotent
Denition
Un probl`eme est calculable sil existe un algorithme pour le resoudre
Theor`eme (Th`ese de Chuch-T uring)
La calculabilite dun probl`eme est une notion robuste qui ne depends par
du langage de programmation, de larchitecture, ...
Formalisation de plusieurs mod`eles de calculs, dont les machines
de T uring
Demonstration de lequivalence de ces mod`eles
Ces mod`eles concident avec la notion intuitive
Video : une machine de T uring en lego
207 / 209
Calculabilite et solvabilite
Remarque
Un probl`eme peut avoir une solution mais ne pas etre calculable
(on ne sait pas construire une solution)
Exemple (Probl`eme de larret)
P : un programme (par exemple ecrit en C++)
D : des donnees
Question : est-ce que le programme P sarrete si on le lance sur les
donnees D ?
Il est impossible decrire un programme HALT(P,D) qui predit si la reponse
est oui ou non.
208 / 209
Calculabilite pratique
Un probl`eme peut avoir une solution algorithmique inutilisable en pratique
parce quil eectue un nombre trop grand doperations.
Exemple (Jeu dechec)
`
A chaque etape, il existe un nombre ni de coups possibles.
Donc il est possible dexplorer la suite du jeu pour chaque coup.
Mais il faut examiner jusqu`a 10
19
coups pour decider de chaque
deplacement.
Dicile ! mais programmes au niveau champion du monde
Exemple (Jeu de Go)
Damier : 19x19, r`egles beaucoup plus simples
Explosion beaucoup plus rapide : 10
600
coups !
Programmes au niveau amateur
Voir aussi : p. 25 de Computers are not Omnipotent
209 / 209
Conclusion : quavons nous vu ce semestre ?
Les bases de la programmation
instructions de controle de ot (conditionnelles, iteratives)
types de donnees
fonctions, modules
entrees-sorties
Un peu de methodologie de developpement
Documentation, tests
Programmation incrementale
Une esquisse de quelques outils
Algorithmique, structures de donnees, complexite, ...
Ce nest que le debut de laventure !