Support MOOC Support MOOC Concepts centraux Concepts centraux Approfondissements Approfondissements Vidéos, Quiz et transparents Programmation I : Cours de programmation (C++) Variables et opérateurs https://www.coursera.org/learn/init-prog-cpp/home/week/1 Jamila Sam + Semaine 1 Laboratoire d’Intelligence Artificielle Faculté I&C c EPFL 2016-17 c EPFL 2016-17 Jamila Sam & Jean-Cédric Chappelier Jamila Sam & Jean-Cédric Chappelier Programmation I – Cours 2 : Variables et opérateurs – 1 / 25 Support MOOC Concepts centraux Les instructions de l’ordinateur Langages de programmation Cycle de développement Structure générale d’un programme C++ Données et traitements Les variables Opérateurs et expressions Entrée-Sorties Approfondissements Programmation I – Cours 2 : Variables et opérateurs – 2 / 25 Support MOOC Concepts centraux Les instructions de l’ordinateur Langages de programmation Concrètement, quelles sont les instructions et les données « adaptées » à l’ordinateur ? Ordinateur ' microprocesseur détermine l’ensemble des instructions élémentaires que l’ordinateur est capable d’exécuter ; Cycle de développement Structure générale d’un programme C++ Données et traitements Les variables Opérateurs et expressions Entrée-Sorties Approfondissements Ordinateur ' microprocesseur mémoire centrale périphériques mémoire centrale détermine l’espace dans lequel des données peuvent être stockées en cours de traitement + C’est donc le microprocesseur qui détermine le « jeu d’instructions » (et le type de données) à utiliser. périphériques On les appelle « Instructions Machine », « Langage Machine », ' « Assembleur » permettent l’échange ou la sauvegarde à long terme des données c EPFL 2016-17 c EPFL 2016-17 Jamila Sam & Jean-Cédric Chappelier Jamila Sam & Jean-Cédric Chappelier Programmation I – Cours 2 : Variables et opérateurs – 3 / 25 Concrètement, quelles sont les instructions et les données « adaptées » à l’ordinateur ? On peut programmer directement le microprocesseur en langage machine... ...mais c’est un peu fastidieux et de plus, chaque processeur utilise ses propres instructions Programmation I – Cours 2 : Variables et opérateurs – 3 / 25 Support MOOC Concepts centraux Langages de programmation Cycle de développement Structure générale d’un programme C++ Données et traitements Les variables Opérateurs et expressions Exemple d’instructions-machine Programme en Assembleur 1: LOAD 10 5 2: CMP 10 0 3: JUMP +3 4: DECR 10 5: JUMP -3 6: END mettre 5 dans la mémoire 10 comparer le contenu de la mémoire 10 à 0 si tel est le cas sauter 3 instructions plus loin décrémenter la mémoire 10 (de 1) sauter 3 instructions en arrière Jamila Sam & Jean-Cédric Chappelier Cycle de développement Structure générale d’un programme C++ Données et traitements Opérateurs et expressions Instructions machine : Code Machine 00000000 00000001 00000010 00000011 00000100 Approfondissements données -3 0 2 3 5 6 10 Code Machine 10000011 00000000 00000010 00000011 00000101 00000110 00001010 Le programme ci-dessus correspond donc physiquement en machine à la séquence : 0000010000001010000001010000000000001010000000000000001100000011 0000000100001010000000111000001100000010 Concepts centraux La notion de langage de programmation (2) 1 N=5 2 IF (N>0) THEN PRINT N; N=N-1; GOTO 2 3 END Programmation I – Cours 2 : Variables et opérateurs – 5 / 25 Support MOOC Concepts centraux Cycle de développement Structure générale d’un programme C++ Structure générale d’un programme C++ Opérateurs et expressions Entrée-Sorties Approfondissements + traduire les séquences d’instructions de haut niveau en instructions-machine directement exécutables par le microprocesseur Données et traitements Les variables Opérateurs et expressions Entrée-Sorties Approfondissements Selon ses caractéristiques, un tel traducteur est appelé compilateur ou interpréteur La notion de langage de programmation (3) Un langage de programmation est donc un moyen formel permettant de décrire des traitements (i.e. des tâches à réaliser) sous la forme de programmes (i.e. de séquences d’instructions et de données de « haut niveau », compréhensibles par le programmeur) pour lesquels un compilateur ou un interpréteur est disponible pour permettre l’exécution effective par un ordinateur. Exemples de langages de programmation : C, python, Lisp, Java... et C++ L’ensemble des instructions de plus haut niveau qu’un compilateur ou un interpréteur est capable de traiter constitue un langage de programmation. c EPFL 2016-17 c EPFL 2016-17 Jamila Sam & Jean-Cédric Chappelier Jamila Sam & Jean-Cédric Chappelier Programmation I – Cours 2 : Variables et opérateurs – 6 / 25 main() { int n; for (n=5; n>0; --n) printf("%d\n", n); } Jamila Sam & Jean-Cédric Chappelier Langages de programmation Les variables C c EPFL 2016-17 Cycle de développement Comment rendre les instructions plus sophistiquées compréhensibles par l’ordinateur ? . . . il faut donc fournir au programmeur la possibilité d’utiliser des instructions de plus haut niveau, plus proches de notre manière de penser et de conceptualiser les problèmes . . . « vieux » BASIC Langages de programmation Données et traitements Cependant, ces instructions-machine sont trop élémentaires pour pouvoir être efficacement utilisées (par les humains) pour l’écriture de programmes... Exemples de langage de programmation de haut niveau : Programmation I – Cours 2 : Variables et opérateurs – 4 / 25 Support MOOC La notion de langage de programmation Les variables Entrée-Sorties Instructions CMP DECR END JUMP LOAD c EPFL 2016-17 Concepts centraux Langages de programmation Entrée-Sorties Approfondissements Support MOOC Programmation I – Cours 2 : Variables et opérateurs – 7 / 25 Support MOOC Concepts centraux Interpréteur/Compilateur Support MOOC Concepts centraux Langages de programmation Langages de programmation Cycle de développement Cycle de développement Structure générale d’un programme C++ Données et traitements Comment rendre les instructions plus sophistiquées compréhensibles par l’ordinateur ? Les variables Opérateurs et expressions Entrée-Sorties Approfondissements Structure générale d’un programme C++ Données et traitements Interpréteur/Compilateur (2) I Le compilateur traduit un programme, écrit dans un langage de haut niveau, en un fichier binaire (exécutable) spécifique à une architecture matérielle (ARM, x86, amd64, ...). Chaque plateforme a son format de fichiers binaires (ELF, COFF, ...) I L’interpréteur exécute un programme, écrit dans un langage de haut niveau, sans étape intermédiaire. Un programme interprété de manière naïve est plus lent qu’un programme compilé, mais indépendant de l’architecture. Les variables + traduire les séquences d’instructions de haut niveau en instructions-machine directement exécutables par le microprocesseur Opérateurs et expressions Entrée-Sorties Approfondissements Selon ses caractéristiques, un tel traducteur est appelé compilateur ou interpréteur. L’ensemble des instructions de plus haut niveau qu’un compilateur ou un interpréteur est capable de traiter constitue un langage de programmation. + C++ est un langage compilé c EPFL 2016-17 c EPFL 2016-17 Jamila Sam & Jean-Cédric Chappelier Jamila Sam & Jean-Cédric Chappelier Programmation I – Cours 2 : Variables et opérateurs – 8 / 25 Support MOOC Concepts centraux Le langage C++ (1) Programmation I – Cours 2 : Variables et opérateurs – 9 / 25 Support MOOC Concepts centraux Langages de programmation Langages de programmation Cycle de développement Cycle de développement Structure générale d’un programme C++ Structure générale d’un programme C++ Données et traitements Données et traitements Les variables Les variables Opérateurs et expressions Opérateurs et expressions Entrée-Sorties Approfondissements Entrée-Sorties Le langage C++ (2) Plus précisément, le langage C++ est un langage orienté-objet compilé fortement typé : C++ = C + typage fort + objets Parmi les avantages de C++, on peut citer : I Extension objet du langage C I Développé initialement par Bjarn Stroustrup (1983-1985) I Un des langages objets les plus utilisés I Normalisé ISO en 1998, 2002 et 2011 I Un langage compilé, ce qui permet la réalisation d’applications efficaces (disponibilité d’excellents compilateurs open-source (GNU)) I Un typage fort, ce qui permet au compilateur d’effectuer de nombreuses vérifications lors de la compilation ⇒ moins de « bugs »... I Un langage disponible sur pratiquement toutes les plate-formes; I Similarité syntaxique et facilité d’interfaçage avec le C Approfondissements Le C date de 1969-1973. c EPFL 2016-17 c EPFL 2016-17 Jamila Sam & Jean-Cédric Chappelier Jamila Sam & Jean-Cédric Chappelier Programmation I – Cours 2 : Variables et opérateurs – 10 / 25 Programmation I – Cours 2 : Variables et opérateurs – 11 / 25 Support MOOC Concepts centraux Le langage C++ (3) Support MOOC Concepts centraux Langages de programmation Langages de programmation Cycle de développement Cycle de développement Structure générale d’un programme C++ Structure générale d’un programme C++ Données et traitements . . . et les inconvénients : Les variables Opérateurs et expressions Opérateurs et expressions Entrée-Sorties I Similarité syntaxique avec le C ! I Pas nécessairement de gestion automatique de la mémoire I Pas de protection de la mémoire I Syntaxe parfois lourde et peu intuitive (“pousse-au-crime”) I Gestion facultative des exceptions I Effets parfois indésirables et peu intuitifs dus à la production automatique de code Programmation I – Cours 2 : Variables et opérateurs – 12 / 25 Cycle de développement Structure générale d’un programme C++ Données et traitements Les variables Opérateurs et expressions Entrée-Sorties Approfondissements hello.cc cout << } Jamila Sam & Jean-Cédric Chappelier Langages de programmation commande : g++ hello.cc -o hello hello main() { c EPFL 2016-17 Cycle de développement (2) fichier exécutable #include <iostream> using namespace std; Jamila Sam & Jean-Cédric Chappelier Concepts centraux fichier source Entrée-Sorties Approfondissements c EPFL 2016-17 Support MOOC compilation Données et traitements Les variables Approfondissements Cycle de développement (1) "Hello World!" << endl; 010100001010101 001010101001110 101111001010001 ... Programmation I – Cours 2 : Variables et opérateurs – 13 / 25 Support MOOC Concepts centraux Structure générale d’un programme C++ Langages de programmation Cycle de développement Programmer c’est : À réfléchir au problème ; concevoir l’algorithme Á traduire cette réflexion en un texte exprimé dans un langage donné (écriture du programme source) Â traduire ce texte sous un format exécutable par un processeur (compilation, c++ ou g++) Structure générale d’un programme C++ Données et traitements Les variables La structure très générale d’un programme C++ est la suivante : #include <des_librairies_utiles> ... Opérateurs et expressions Entrée-Sorties using namespace std; // on y reviendra Approfondissements (déclaration d’objets globaux) Ã exécution du programme déclarations de fonctions utiles [à éviter] [recommandé] En pratique : I erreurs de compilation (mal écrit) I erreurs d’exécution (mal pensé) =⇒ correction(s) int main() //ou int main(int argc, char **argv) { corps du programme principal [si possible assez court] } + d’où le(s) cycle(s) ! c EPFL 2016-17 c EPFL 2016-17 Jamila Sam & Jean-Cédric Chappelier Jamila Sam & Jean-Cédric Chappelier Programmation I – Cours 2 : Variables et opérateurs – 14 / 25 Programmation I – Cours 2 : Variables et opérateurs – 15 / 25 Support MOOC Concepts centraux Langages de programmation Cycle de développement Structure générale d’un programme C++ Données et traitements Les variables Opérateurs et expressions Entrée-Sorties Approfondissements Exemple de programme en C++ Résolution d’une équation du second degré : x 2 + b x + c = 0 #include <iostream> #include <cmath> using namespace std; main() { double b(0.0); double c(0.0); double delta(0.0); Support MOOC Concepts centraux Données et traitements Langages de programmation Cycle de développement Structure générale d’un programme C++ Un programme C++ est donc à la base un ensemble de traitements s’effectuant sur des données. Données et traitements données traitements structures de contrôle Les variables Algorithme Traitements Opérateurs et expressions Entrée-Sorties structures de données Données Variables Approfondissements Expressions & Opérateurs Structures de contrôle Fonctions cin >> b >> c; delta = b*b - 4*c; if (delta < 0.0) { cout << "pas de solutions reelles" << endl; } else if (delta == 0.0) { cout << "une solution unique : " << -b/2.0 << endl; } else { cout << "deux solutions : " << (-b-sqrt(delta))/2.0 << " et " << (-b+sqrt(delta))/2.0 << endl; } Portée Chaînes de caractères Tableaux statiques Tableaux dynamiques Structures Pointeurs Entrées/Sorties } c EPFL 2016-17 c EPFL 2016-17 Jamila Sam & Jean-Cédric Chappelier Jamila Sam & Jean-Cédric Chappelier Programmation I – Cours 2 : Variables et opérateurs – 16 / 25 Support MOOC Concepts centraux Langages de programmation Cycle de développement Structure générale d’un programme C++ Données et traitements Les variables Opérateurs et expressions Entrée-Sorties Approfondissements Variables Programmation I – Cours 2 : Variables et opérateurs – 17 / 25 Support MOOC auto Concepts centraux En C++, une valeur à conserver est stockée dans une variable caractérisée par : I son type I et son identificateur ; (définis lors de la déclaration) La valeur peut être définie une première fois lors de l’initialisation, puis éventuellement modifiée par la suite. Rappels de syntaxe : type nom ; type nom(valeur); (déclaration) (initialisation) nom = expression ; (affectation) Langages de programmation Cycle de développement Structure générale d’un programme C++ Données et traitements Les variables Opérateurs et expressions Entrée-Sorties Approfondissements Types élémentaires : int double char bool En , on peut laisser le compilateur deviner le type d’une variable grace au mot-clé auto. Le type de la variable est déduit du contexte. Il faut donc qu’il y ait un 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 types autant que possibles. N’utilisez auto que dans les cas « techniques », par exemple (qui viendra plus tard dans le cours) : for (auto p = v.begin(); p != v.end(); ++p) Exemples : int val(2) ; const double z(x+2.0*y); c EPFL 2016-17 Jamila Sam & Jean-Cédric Chappelier au lieu de c EPFL 2016-17 constexpr double pi(3.141592653); i = j + 3; Programmation I – Cours 2 : Variables et opérateurs – 18 / 25 Jamila Sam & Jean-Cédric Chappelier for (vector<int>::iterator p = v.begin(); p != v.end(); ++p) Programmation I – Cours 2 : Variables et opérateurs – 19 / 25 Opérateurs Support MOOC Concepts centraux Langages de programmation Cycle de développement Structure générale d’un programme C++ Données et traitements Les variables Opérateurs et expressions Entrée-Sorties Approfondissements Operateurs arithmétiques multiplication * / division % modulo + addition soustraction ++ incrément (1 opérande) -- décrément (1 opérande) && || ∧ ! c EPFL 2016-17 Jamila Sam & Jean-Cédric Chappelier Support MOOC Concepts centraux Operateurs de comparaison == teste l’égalité logique != non égalité < inférieur > supérieur <= inférieur ou égal >= supérieur ou égal Langages de programmation Cycle de développement Structure générale d’un programme C++ Données et traitements En C++ les entrées-sorties se font par le biais de flots (streams) : I Flot = objet dans lequel on peut lire (entrée) ou écrire(sortie) des données I cout est le symbole associé au flot de sortie standard (terminal) I cin est le symbole associé au flot d’entrée standard (clavier) I la lecture dans un flot se fait au moyen de l’opérateur >> I l’écriture dans un flot se fait au moyen de l’opérateur << I Pour utiliser cout et cin, il faut inclure la librairie iostream Les variables Opérateurs et expressions Entrée-Sorties Approfondissements Operateurs logiques "et" logique ou ou exclusif négation (1 opérande) Priorités (par ordre décroissant, tous les opérateurs d’un même groupe sont de priorité égale) : ! ++ --, * / %, + -, < <= > >=, == !=, ∧ &&, || Entrée-Sorties de base Nous reviendrons plus en détails sur les entrées-sorties dans la suite du cours. c EPFL 2016-17 Jamila Sam & Jean-Cédric Chappelier Programmation I – Cours 2 : Variables et opérateurs – 20 / 25 Support MOOC Concepts centraux Entrée-Sorties de base : lecture Langages de programmation Cycle de développement Structure générale d’un programme C++ Données et traitements Les variables Opérateurs et expressions Programmation I – Cours 2 : Variables et opérateurs – 21 / 25 Support MOOC Concepts centraux Entrée-Sorties de base : écriture Langages de programmation Cycle de développement #include<iostream> using namespace std; int main() { int x; double y; Structure générale d’un programme C++ Données et traitements Les variables Opérateurs et expressions Entrée-Sorties Entrée-Sorties Approfondissements Approfondissements // Lecture: cin >> x >> y; return 0; #include<iostream> using namespace std; int main() { // Ecriture: cout << "un entier :" << n << "un double :"; cout << (12.5 + 3.0) << endl; return 0; } } I I c EPFL 2016-17 l’opérateur >> lit des valeurs dans un flot d’entrée et les affecte (dans l’ordre de lecture) aux variables se trouvant sur sa droite. les différentes valeurs à lire seront séparées par un espace ou un retour à la ligne. Jamila Sam & Jean-Cédric Chappelier I l’opérateur << prend un flot de sortie à gauche, un type quelconque à droite. Il réalise l’écriture sur le support associé au flot et retourne le flot. I endl provoque un saut de ligne. c EPFL 2016-17 Jamila Sam & Jean-Cédric Chappelier Programmation I – Cours 2 : Variables et opérateurs – 22 / 25 Programmation I – Cours 2 : Variables et opérateurs – 23 / 25 Support MOOC Concepts centraux Approfondissements Support MOOC Concepts centraux Approfondissements Pour préparer le prochain cours Approfondissements I I transtypage . . . ou comment disserter sur un calcul de moyenne I x++ vs ++x Vidéos et quiz du MOOC semaine 2 : I I I I Le prochain cours : I c EPFL 2016-17 c EPFL 2016-17 Jamila Sam & Jean-Cédric Chappelier Jamila Sam & Jean-Cédric Chappelier Programmation I – Cours 2 : Variables et opérateurs – 24 / 25 Branchements conditionnels [13:46] Conditions [13:14] Erreurs de débutant le type bool [14:34] de 15h15 à 16h (résumé et quelques approfondissements) Programmation I – Cours 2 : Variables et opérateurs – 25 / 25