Objectifs Présentation du cours Notes et examens Présentation de C++ Rappels de programmation c EPFL 2002–2012 Jamila Sam ÉCOLE POLYTECHNIQUE FÉDÉRALE DE LAUSANNE Informatique II : Cours de programmation (C++) INTRODUCTION Jamila Sam Haroud Laboratoire d’Intelligence Artificielle Faculté I&C Informatique II –Cours 1 : – Introduction – – 1 / 65
66
Embed
Informatique II : [5pt] Cours de programmation (C++ ...icsam/infosv/slides/cours01-full.pdf · Qu’est-ce que la programmation orientée-objet? ... Le semestre sera clôturé par
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E
Présentation générale du cours
Public : Cours obligatoire pour les étudiants de 2e semestrede la section des Sciences de la Vie.Connaissances supposées acquises : bases de laprogrammation en C
Langue : Français
Moyens :Concepts théoriques introduits lors de coursmagistraux ex-cathedra (Mardi 1015–1200)
mis en pratique, de manière guidée, lors deséances d’exercices sur machines (Vendredi1415–1600)
ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E
Support de cours
◮ Transparents mis à disposition via le site Webparfois enrichis de notes techniques (mini-références)détaillant certains concepts évoqués pendant le cours, enparticulier les éléments du langage C++également parfois des références complémentaires(bibliographiques et/où hyperliens Internet)
◮ Énoncé des exercicesdisponibles sur le site Web en fin de semaine.
◮ Corrigé des exercicesdisponibles sur le site Web en fin de semaine suivante.
◮ Les cours Informatique I et II comptent chacun pour la moitiédu semestre. Le calcul de la note se fait sur les notesnon-arrondies de chaque semestre. L’arrondi de la note finalese fait au demi-point le plus proche.
ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E
Le langage C++ (3)
. . . et les inconvénients :
◮ Similarité syntaxique avec le C !◮ Pas de gestion automatique de la mémoire◮ Pas de protection de la mémoire◮ Syntaxe parfois lourde et peu intuitive (“pousse-au-crime”)◮ Gestion facultative des exceptions◮ Effets parfois indésirables et peu intuitifs dus à la production
ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E
Avantages de la POO
◮ Façon naturelle de modéliser les données et traitementsintervenant dans un programme
◮ Modularité : le programme est composé d’un ensembled’entités (types d’objets) aux rôles bien déterminés
◮ Réutisabilité : chaque type d’objets peut être réutilisé, sasémantique peut être étendue par le biais de l’héritage
◮ Polymorphisme : un même code peut s’appliquer à destypes d’objets différents
◮ Abstraction : la représentation des données est découpléede leur utilisation. De plus des règles précises d’utilisationdes données peuvent être imposées.
◮ d’énormes librairies déjà écrites (Java, C#)
☞ Efficacité dans la conception des programmes, concision ducodage, meilleures fiabilité et maintenabilité des programmes
ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E
Données et traitementsComme en C, un programme C++ est donc à la base unensemble de traitements s’effectuant sur des données .
Algorithme structures de donnéesTraitements Données
VariablesExpressions & OpérateursStructures de contrôleFonctions Portée
Chaînes de caractèresTableaux statiquesTableaux dynamiquesStructuresPointeurs
Entrées/Sorties
L’aspect orienté-objet de C++ permet d’intégrer données ettraitements dans une structure unique, les objets , qui serontdéfinis par le biais de classes . Avant de développer cet aspect,commençons par quelques rappels/mise à jour sur les conceptsdu tableau ci-dessus.
ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E
Variables
Pour être utilisée dans un programme C++, une donnée doit êtrestockée quelque part en mémoire. C’est un objet informatique quipourra être manipulé par le programme.
Ces données peuvent être :◮ temporaire/transitoires, et anonymes (nous y reviendrons) ;◮ identifiées/nommées pour être réutilisées : la zone mémoire
utilisée est alors décrite au niveau du langage deprogrammation par une variable .
ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E
Déclaration de variablesEn C++, une variable doit être déclarée avant d’être utilisée.
Comme en C, la syntaxe de la déclaration d’une variable est :
type identificateur ;
où type est l’identificateur de type de la variable déclarée etidentificateur est une chaîne de caractères permettant deréférer la variable créée et donc de l’utiliser dans un programme.
Exemples : int val;double delta;
Un identificateur de variable peut être n’importe quelle séquencecomposée de lettres, de chiffres ou du caractère ’_’ etcommençant par une lettre ou par ’_’. Il ne doit pas correspondreà un mot réservé du langage (if, else, while, ...)
Conseil : Pour vos variables, utilisez des noms aussi explicitesque possible .
Une donnée temporaire n’a qu’un type et une valeur, mais pas de nom.Informatique II –Cours 1 : – Introduction – – 29 / 65
ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E
Initialisation
En même temps qu’elle est déclarée, une variable peut êtreinitialisée , c’est-à-dire qu’on lui donne une première valeur avantmême toute utilisation.
Note : il est possible d’utiliser une variable non initialisée. Ceci doitau maximum être évité ! Initialisez toujours vos variables... ...celavous évitera bien des soucis par la suite.
La syntaxe de la déclaration/initialisation d’une variable est :
type identificateur ( valeur_d’initialisation ) ;
où valeur_d’initialisation est n’importe quelle constante(i.e. valeur littérale) ou expression du type indiqué.
ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E
auto
En , on peut laisser le compilateur deviner le type d’unevariable grace au mot-clé auto .
Le type de la variable est déduit du contexte. Il faut donc qu’il y aitun contexte, c’est-à-dire une initialisation.
Par exemple :auto val(2);auto j(2 * i+5);auto x(7.2835);
Conseil : N’abuser pas de cette possibilité et explicitez vos typesautant que possibles.N’utilisez auto que dans les cas « techniques », par exemple (quiviendra plus tard dans le cours) :for ( auto p = v.begin(); p != v.end(); ++p)
ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E
Données modifiables/non modifiables
Par défaut les variables sont modifiables.
Comme en C, si on ne veut pas qu’une variable soit modifiable : ladéfinir comme constante par l’indication du mot réservé constlors de la déclaration :
int const couple(2);double const g(9.81);
Une fois déclarée, une constante ne pourra donc plus êtremodifiée par le programme (toute tentative de modificationproduira un message d’erreur lors de la compilation).
ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E
Expressions constantes
En C++11, il existe aussi le mot clé constexpr .
Il est d’utilisation plus générale (voir futur cours sur les fonctions),mais est aussi plus contraignant que const : la valeur initiale doitpouvoir être calculée à la compilation.
☞ Les deux (const et constexpr ) sont donc très différents !
◮ const indique au compilateur qu’une donnée ne changera pasde valeur au travers de ce nom ; mais
1. le compilateur peut très bien ne pas connaître la valeur enquestion au moment de la compilation ; et
2. cette valeur pourrait changer par ailleurs.
◮ constexpr indique au compilateur qu’une donnée nechangera pas du tout de valeur et qu’il doit pouvoir en calculerla valeur au moment de la compilation (i.e. cette valeur ne dépendpas de ce qu’il va se passer plus tard dans le programme).
Conseil : Si ces deux conditions sont vérifiées, on préfèrerautiliser constexpr .
ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E
Priorité entre Opérateurs
Il est largement préférable de parenthèser ses expressions (neserait-ce que pour la lisibilité !).Par exemple écrire (a * b) % c plutôt que a * b % c
En l’absence de parenthèsage, l’ordre de priorité des opérateurssera :
* ou / ou %puis + ou -
Tous ces opérateurs sont associatifs à gauche : a+b+c =(a+b)+cEn cas d’ambiguité entre opérateurs du même ordre de prioritéc’est la règle d’associativité qui s’applique
Exemples : a * b % c = (a * b) % ca % b * c = (a % b) * ca + b * c % d = a + ((b * c) % d)
ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E
Évaluation « paresseuse »
Les opérateurs logiques && et || effectuent une évaluation« paresseuse » (« lazy evaluation ») de leur arguments :
l’évaluation des arguments se fait de la gauche vers la droite et seuls lesarguments strictement nécessaires à la détermination de la valeurlogique sont évalués.
Ainsi, dans X1 && X2 && ... && Xn , les arguments Xi nesont évalués que jusqu’au 1er argument faux (s’il existe, auquelcas l’expression est fausse, sinon l’expression est vraie);
Exemple : dans (x != 0.0) && (3.0/x > 12.0) le secondterme ne sera effectivement évalué uniquement si x est non nul.La division par x ne sera donc jamais erronée.Et dans X1 || X2 || ... || Xn, les arguments ne sont évaluésque jusqu’au 1er argument vrai (s’il existe, auquel cas l’expressionest vraie, sinon l’expression est fausse).
Exemple : dans (x == 0.0) || (3.0/x < 12.0) le secondterme ne sera effectivement évalué uniquement si x est non nul.
ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E
Expressions logiques
Une expression logique est une expression de type booléen, dontles valeurs possibles sont donc true et false .
Cependant, en C++, n’importe quelle expression de n’importequel type peut être considérée comme une expression logique.Ceci est fait via la convention suivante :Si l’évaluation de l’expression conditionnelle est une valeur nulle,alors la condition sera dite fausse , sinon elle sera dite vraie .
Conseil : évitez d’utiliser cette possibilité du langage et préférezécrire explicitement vos expressions logiques.Par exemple, écrivez if (x != 0) plutôt que if (x) .
◮ l’opérateur << prend un flot de sortie à gauche, un typequelconque à droite. Il réalise l’écriture sur le support associéau flot et retourne le flot.
ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E
Branchement conditionnel
La syntaxe générale d’un branchement conditionnel est :
if (condition)Instructions 1
else Instructions 2
La condition, qui s’exprime au moyen d’une expression , est toutd’abord évaluée puis, si le résultat de l’évaluation est vrai alors laséquence d’instructions 1 est exécutée, sinon la séquenced’instructions 2 est exécutée.
Le else est optionnel
Instructions 1 et Instructions 2 sont soit uneinstruction élémentaire , soit un bloc d’instructions .Note : Il est conseillé de toujours utiliser la syntaxe par bloc.
ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E
Choix multiplesOn peut écrire de façon plus synthétique l’enchaînement deplusieurs conditions dans le cas où l’on teste différentes valeurs(entières) d’une expressionif (i == 1)
ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E
BouclesLa syntaxe générale d’une boucle avec condition de continuationa priori (on veut tester la condition avant d’exécuter lesinstructions) est :while (condition)
Instructions
Tant que la condition de continuation est vérifiée, les instructionssont exécutées. a posteriori (on veut exécuter les instructions au
moins une fois avant de tester la condition) est :do
Instructionswhile (condition);
Les instructions sont exécutées jusqu’à ce que la condition decontinuation soit fausse (et au moins une fois au départ,indépendemment de la valeur de la condition).
Même remarque ici que pour if :Instructions est soit une instruction élémentaire (suivie deson ; ), soit un bloc d’instructions .Il est plutôt conseillé de toujours utiliser la syntaxe par bloc.Informatique II –Cours 1 : – Introduction – – 56 / 65
ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E
L’itération for « classique »
Les itérations permettent l’application itérative d’un traitement,contrôlée par une initialisation , une condition de continuation ,et une opération de mise à jour de certaines variables.Syntaxe :for (initialisation; condition; mise_a_jour)
Instructions
Même remarque ici que pour if et while :Instructions est soit une instruction élémentaire (suivie deson ; ), soit un bloc d’instructions .Il est plutôt conseillé de toujours utiliser la syntaxe par bloc.
Note : Une boucle for (sans continue !) est équivalente à laboucle while suivante :
ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E
L’itération for : Exercice
Remarque : si plusieurs instructions d’initialisation ou de mise àjour sont nécessaires, elles sont séparées par des virgules . Ellessont exécutées de la gauche vers la droite .
Qu’affiche l’instruction suivante ?
for ( int i( 0), s( 0); i < 5; s += i, ++i) {cout << i << ", " << s << endl ;
ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E
Les itérations for de C++11
En , il y a DEUX sortes d’itérations :◮ les itérations « classiques » (telles que nous venons de les
voir), très générales ;◮ les nouvelles itérations, spéciquement pour parcourir des
ensembles de valeurs.
Les deux utilisent le mot clé for , mais se distinguent par leursyntaxe :
for ( initialisation ; condition ; mise_à_jour )
for ( déclaration : ensemble )
Voici un exemple d’itération sur un ensemble (nous y reviendronslors des rappels sur les tableaux):for ( int i : { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }){
ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E
Sauts : break et continue
C++ fournit deux instructions prédéfinies, break et continue ,permettant de contrôler de façon plus fine le déroulement d’uneboucle.
◮ Si l’instruction break est exécutée au sein du bloc intérieurde la boucle, l’exécution de la boucle est interrompue(quelque soit l’état de la condition de contrôle);
◮ Si l’instruction continue est exécutée au sein du blocintérieur de la boucle, l’exécution du bloc est interrompue et lacondition de continuation est évaluée pour déterminer sil’exécution de la boucle doit être poursuivie.
Conseil : En toute rigueur on n’aurait pas besoin de cesinstructions, et tout bon programmeur évite de les utiliser.
Pour la petite histoire, un bug lié à une mauvaise utilisation de break; aconduit à l’effondrement du réseau téléphonique longue distance d’AT&T,le 15 janvier 1990. Plus de 16’000 usagers ont perdu l’usage de leur télé-phone pendant près de 9 heures. 70’000’000 d’appels ont été perdus.
ÉC OL E POL Y T EC H N I Q U EFÉ DÉRA LE D E L A U SAN N E
Ce que j’ai appris aujourd’hui
◮ que toutes les informations utiles se trouvent sur la page webdu cours;
◮ que les concepts fondamentaux de la POO permettent deproduire des programmes plus élégants, concis, fiables etmaintenables;
◮ que la POO n’est pas spécifique à C++ mais que ce langagemet en oeuvre la plupart de ses concepts fondamentaux;
◮ que ce cours va aussi me permettre d’aborder des thèmesliés à l’algorithmique;
◮ et . . . qu’il faut bien se replonger dans le B.A-BA pourcommencer :
◮ variables et expressions, structures de contrôles (if , while ,for , break , continue ) et entrées-sorties de base.
☞ je peux dès maintenant écrire des programmes nonorientés-objet simples, en faisant attention à bien adhérerdésormais à l’« esprit » C++ (plutôt que C).