# source_cell

id: f736a342ebbd4148bf3b8b7daedf1d64
name: cell-d4e64962efcbc324
cell_type: markdown
checksum: 0d65b1db4ff4d2aefc74ed2c66a51567
notebook_id: 1941ae94e27140c0829be8c86cc6ac1f
source:
  # TP : Jupyter : mode Édition vs mode Commande

  <div class="alert alert-info">

  Objectif pédagogique : Découvrir les deux modes d'interaction avec un
  carnet Jupyter.

  </div> 

  Lorsque l'on travaille sur un carnet Jupyter, on est amené à
  alternativement éditer le contenu d'une cellule (par exemple y écrire
  du texte) et naviguer entre les cellules et les manipuler
  (par exemple supprimer une cellule, ou en insérer une
  nouvelle). Jusqu'ici, vous avez probablement utilisé la souris et les
  menus pour effectuer ces manipulations de cellules.

  Pour travailler plus efficacement, notamment à l'aide de raccourcis clavier,
  les carnets Jupyter offrent deux modes d'éditions:

  - Le mode ***Édition*** qui permet, comme son nom l'indique, d'éditer le
    contenu d'une cellule. C'est celui que vous avez utilisé lorsque
    vous avez cliqué ou double cliqué dans une cellule.

  - Le mode ***Commande*** qui permet de naviguer d'une cellule à
    l'autre et de les manipuler.


id: a7cf952629fb480f994364306b1fc1c8
name: cell-da8f72cb85b2d1de
cell_type: markdown
checksum: c9b9cbd959df806a0c76d72bd69931b6
notebook_id: 1941ae94e27140c0829be8c86cc6ac1f
source:
  <!--
  Vous trouverez tous les raccourcis clavier dans le menu `Aide` ->
  `Raccourcis` clavier. Ils sont aussi rappelés dans les menus
  eux-même.
  !-->

  <div class="alert alert-info">

  **Les raccourcis clavier essentiels :**
      
  En mode commande :
  - Naviguer entre cellules : touches <kbd>↑</kbd> et <kbd>↓</kbd>; 
  - Basculer en mode Édition sur la cellule courante : touche <kbd>Entrée</kbd>
  - Ajouter une cellule Avant : touche <kbd>A</kbd> (comme *above*)
  - Ajouter une cellule Après : touche <kbd>B</kbd> (comme *below*)
  - Couper une cellule : touche <kbd>X</kbd>
  - Copier une cellule : touche <kbd>C</kbd>
  - Coller une cellule : touche <kbd>V</kbd>
  - Annuler : toucher <kbd>Z</kbd>
  - Fusionner avec la cellule du dessous : touches <kbd>Maj</kbd>+<kbd>M</kbd>

  <!--
  - Obtenir la liste des raccourcis claviers : touche <kbd>H</kbd> (comme *help*);
  !-->

  En mode édition :
  - Basculer en mode Commande : touche <kbd>Esc</kbd>
  - Sélectionner au clavier : <kbd>Maj</kbd>-touche de déplacement
  - Couper : <kbd>Ctrl</kbd>-<kbd>x</kbd>
  - Copier : <kbd>Ctrl</kbd>-<kbd>c</kbd>
  - Coller : <kbd>Ctrl</kbd>-<kbd>v</kbd>

  </div>


id: 89b21e901b24457f83234402ade25791
name: cell-1ac7fa2533514788
cell_type: markdown
checksum: 4586f168f62b18c016204ff685941479
notebook_id: 1941ae94e27140c0829be8c86cc6ac1f
source:
  ## Exercice

  Votre défi est d'effectuer l'ensemble de cet exercice, sans toucher
  votre souris!

  1.  Observez la cellule actuellement sélectionnée. Est-elle encadrée
      d'un liseré bleu? Si oui vous êtes en mode Édition. Sinon, vous
      êtes mode Commande. Utilisez les touches <kbd>Entrée</kbd> et
      <kbd>Echap</kbd> pour basculer de l'un à l'autre de ces
      modes. Finissez par <kbd>Echap</kbd> pour être en mode commande.
  2.  Utilisez les flèches <kbd>↑</kbd> et <kbd>↓</kbd> pour vous déplacer rapidement
      d'une cellule à l'autre
  3.  Éditez les cellules ci-dessous en suivant les instructions
      qu'elles contiennent.


id: 52cec306f9bf4b3b8f070347c9f91b89
name: cell-6144a810d1986571
cell_type: markdown
checksum: 5287c2683d7b592a5729b8e5f528cbce
notebook_id: 1941ae94e27140c0829be8c86cc6ac1f
source:
  ## Conclusion

  Utiliser alternativement les deux modes Édition et Commande vous
  permettra de manipuler efficacement les carnets Jupyter au clavier.
  Consultez régulièrement la liste des raccourcis disponibles et
  apprenez en un ou deux à chaque séance!

  <!-- TODO: liens vers les suites naturelles: réordonner cellules, -->
  <!-- jeter sa souris -->

  <!--
  <div class="btn btn-default btn-xs" role="button">

  [<i class="fa fa-home"></i> Revenir à l'accueil du Tutoriel Jupyter](https://jupyter.gitlab.dsi.universite-paris-saclay.fr/tutoriel-jupyter/intro.html)

  </div>

  ## Pour aller plus loin 

  * Découvrez comment différencier et utiliser les cellules de texte (Markdown) et de code executable avec ce [tuto](https://jupyter.gitlab.dsi.universite-paris-saclay.fr/tutoriel-jupyter/tuto-les-types-de-cellules.html)
  * 
  !-->


id: 2e22a5c90eef47cdaacb6d6056648fc8
name: cell-b78562ee2ff6d72c
cell_type: markdown
checksum: 11bc746bb3f36668d563917b04467610
notebook_id: e7282a31574941f68ad6aa503fcd5574
source:
  # TP : valeurs, types et variables

  ## Introduction à Jupyter et premiers calculs

  Lors de ces premières semaines de cours, nous allons travailler dans
  l'application web *Jupyter* qui permet d'exécuter du code `C++`
  interactivement, un peu comme une super calculatrice. Plus tard, nous
  verrons comment créer un programme `C++` indépendant en dehors de
  *Jupyter*.


id: 792969d6fc43456c91e5b7a0275d71f9
name: cell-33660fa4ef5903e4
cell_type: markdown
checksum: 31783578f8bde28209b21d60b4afa8df
notebook_id: e7282a31574941f68ad6aa503fcd5574
source:
  **Exercice 1 : premiers calculs**

  - Cliquez sur la cellule suivante puis exécutez la en appuyant sur les
    touches <kbd>Maj</kbd>+<kbd>Entrée</kbd> :


id: 5965814a06814f2ab510209d3100211f
name: cell-291a3535b726abef
cell_type: markdown
checksum: a641bd5ef111d5f779f4d06209dffffb
notebook_id: e7282a31574941f68ad6aa503fcd5574
source:
  La première ligne donne le résultat du calcul. La deuxième ligne
  indique que ce résultat est de type *entier* (`int`).

  Techniquement parlant, le navigateur web a envoyé le contenu `1+1` de
  la cellule à un *noyau* (kernel en anglais) qui l'a *compilé* et
  *exécuté*, avant de renvoyer le résultat à afficher. Le noyau que nous
  utilisons (`C++17`) permet de travailler en `C++`. Il existe des
  noyaux pour beaucoup d'autres langages de programmation.


id: 60bd5cf8a8f34a44b7fd94f303963e22
name: cell-12b1679926b1768d
cell_type: markdown
checksum: d687d8f5e69fce473a4c069310d311e9
notebook_id: e7282a31574941f68ad6aa503fcd5574
source:
  - Utilisez la cellule suivante pour calculer la surface d'un rectangle
    de largeur 25 et de longueur 37 :


id: 854fbb27b4684d05b5959d39606bea36
name: cell-1b42d53da30ded82
cell_type: markdown
checksum: d8e8920ea94e7d6c8db86d6b29e849fe
notebook_id: e7282a31574941f68ad6aa503fcd5574
source:
  **Exercice 2 : types**

  Vous avez vu en cours qu'il existe plusieurs types de variables
  (`int`, `double`, etc.). Il est très utile de connaître le type des
  valeurs que l'on manipule. Exécutez les cellules suivantes et observez
  les types obtenus :


id: 89ce13fb44cf4db0854b3d487f6741f4
name: cell-7c72028bf998c9e5
cell_type: markdown
checksum: f91a40fc1958f4b6f1e0681d8df77441
notebook_id: e7282a31574941f68ad6aa503fcd5574
source:
  Les lignes suivantes vous présentent des exemples de
  calculs. Exécutez-les en observant bien la valeur du résultat et son
  type.


id: 5a00a0cde84f463daa422b9ef860c1c0
name: cell-cf97d7e3ffc985a0
cell_type: markdown
checksum: b03fd9ec2be270091121833ce867f1cc
notebook_id: e7282a31574941f68ad6aa503fcd5574
source:
  Remarque: dans les deux cellules précédentes, nous avons utilisé un
  **double égal** `==` qui sert à **tester** l'égalité entre deux
  valeurs. Nous reverrons bientôt la signification du **simple égal**
  `=`.


id: 7e861190da9946409e30603866c94a27
name: cell-05caf97c8306b9b4
cell_type: markdown
checksum: af204e753d48317334d009d9df551827
notebook_id: e7282a31574941f68ad6aa503fcd5574
source:
  Note: pour éviter de fausses manœuvres, nous configurons de nombreuses
  cellules, telles celles ci-dessus, pour qu'elles soient non
  modifiables. Pour faire vos propres expérimentations ou pour prendre
  des notes personnelles, vous pouvez à tout moment insérer de nouvelles
  cellules. Insérez maintenant une cellule ci-dessous en utilisant le
  bouton `+` sous les onglets. Dans la barre d'outil de cette feuille,
  sélectionnez `Markdown` à la place de `Code` pour en faire une cellule
  de texte.


id: 29e215db1cae4366b8557a9c9a9bf59b
name: cell-884721498ad284a1
cell_type: markdown
checksum: f111bfd79786faaa5d38dc0f13967c66
notebook_id: e7282a31574941f68ad6aa503fcd5574
source:
  **Exercice 3 :**

  Pour chacune des expressions suivantes, déterminez **de tête** le type
  et la valeur du résultat, et donnez votre réponse à l'endroit indiqué
  sous la forme `type`, `valeur`; puis vérifiez en exécutant les
  cellules.


id: 0dcab13e90974e8298a49a1fbd20c280
name: cell-a8d152d15809265f
cell_type: markdown
checksum: 2c2010fc398715fd883ec87dbcf20298
notebook_id: e7282a31574941f68ad6aa503fcd5574
source:
   ---
   * Type : int, bool, ou double ?
   * Valeur : 7, 9, 11, ou 21 ?

  % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE


id: ebec7acf6c414729a6bf7c84f1d63b5d
name: cell-b866905e681f44cb
cell_type: markdown
checksum: dfe5e7372570d9dea7fd0e5805abc6c1
notebook_id: e7282a31574941f68ad6aa503fcd5574
source:
   ---
   * Type : int, bool, ou double ?
   * Valeur : 12 ou 12.5 ?
   
   % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE


id: 33eec5df00b740a68d1b8672df0396aa
name: cell-899fabbcd7ecd371
cell_type: markdown
checksum: 6c2e63ea6633366117382f5c3f127e60
notebook_id: e7282a31574941f68ad6aa503fcd5574
source:
   ---
   * Type : int, bool, ou double ?
   * Valeur : 6, 7, 6.0000, ou 7.0000?

   % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE


id: 23412b2ba4a347bf82144df7d433b0a3
name: cell-fe0c64ef514d2b0f
cell_type: markdown
checksum: 71eee2fa3fea6fb3788badde6e41dfc0
notebook_id: e7282a31574941f68ad6aa503fcd5574
source:
   ---
   * Type: int, bool, ou double ?
   * Valeur : 5, 4, ou 4.66667 ?
   
   % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE


id: 3871f2d3cdfe4d2c80ccf9795e0a8166
name: cell-b1b2d0d4b7baa06e
cell_type: markdown
checksum: 26ca09cd9707728cdd34ca521aed3382
notebook_id: e7282a31574941f68ad6aa503fcd5574
source:
   ---
   * Type : int, bool, ou double ?
   * Valeur : 3,7,21, true, ou false ?
   
   % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE


id: b19e09794e404fc69a93c9e0c437408a
name: cell-59ff90739ae5b7b2
cell_type: markdown
checksum: ff1acd99636db830d19c4999334bfe63
notebook_id: e7282a31574941f68ad6aa503fcd5574
source:
   ---
   * Type : int, bool, double ?
   * Valeur : 21, 25, true, false ?
   
   % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE


id: ba9f622bd3184f51b6c582be654a7ce3
name: cell-2bf659cbac5d597a
cell_type: markdown
checksum: 334e68aa2b0ee056926c9e5d3f54bf12
notebook_id: e7282a31574941f68ad6aa503fcd5574
source:
   ---
   * Type : int, bool, double ?
   * Valeur : 1, 0, true, false ?
   
   % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE


id: 70e9d6bc91e14ede8de07b96827e2184
name: cell-e5856c338c095691
cell_type: markdown
checksum: 4ca4d1bcbd35f830508935fdcf0b1e2a
notebook_id: e7282a31574941f68ad6aa503fcd5574
source:
  ---
   * Type : int, bool, double ?
   * Valeur : 1, 0, true, false ?
   
   % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE


id: ca58e90be1394e12ad92de45b1012680
name: cell-6e834cd22ecc144b
cell_type: markdown
checksum: b13d62422ced658b42da7508a80bcb1a
notebook_id: e7282a31574941f68ad6aa503fcd5574
source:
  Bravo, vous avez terminé cette première feuille où vous avez exploré
  les expressions, valeurs, types en C++. Dans la feuille suivante, vous
  aborderez les variables.

  Vous pouvez maintenant fermer cette feuille; utilisez pour cela le
  raccourci clavier <kbd>Ctrl</kbd>+<kbd>Maj</kbd>+<kbd>Q</kbd>.


id: 6ff07a4dbae04b1ba658f230951c8794
name: cell-b78562ee2ff6d72c
cell_type: markdown
checksum: e4ed54f9374fe785a849796811edb0f1
notebook_id: 14d70ccc6c7f47a9b403450a798685c3
source:
  # TP : variables et affectations

  Dans la feuille précédente, nous avons effectué des calculs et observé
  les résultats (type, valeur). Pour écrire des programmes, nous aurons
  besoin de **stocker les résultats intermédiaires dans des variables**
  pour en réutiliser les valeurs.

  ## Exercice 1

  - Exécutez la cellule suivante :


id: fb1eea46be7644eda9f5498927af46a9
name: cell-77b23801c7675aeb
cell_type: markdown
checksum: ba6652be5c55c029961aaa50cb81d6b9
notebook_id: 14d70ccc6c7f47a9b403450a798685c3
source:
  Une fois que la variable `a` a été ***déclarée*** (`int a;`) et qu'on
  lui a ***affecté*** une valeur (`a = 3`), on peut afficher ou
  réutiliser cette valeur :


id: 12c8e482793143aca353d6741b84f10e
name: cell-67887572028175dc
cell_type: markdown
checksum: 834f5df4982133662574ade48a23d255
notebook_id: 14d70ccc6c7f47a9b403450a798685c3
source:
  - Que se passe-t-il si l'on exécute à nouveau la dernière cellule? Si
    on exécute alternativement les deux dernières cellules?


id: b3a5a02a3fdd4b5eaf591a88c70e274c
name: cell-11418469192f043e
cell_type: markdown
checksum: bbb11d6c9985a3ebc219d1fc62693525
notebook_id: 14d70ccc6c7f47a9b403450a798685c3
source:
  ## Quelques remarques sur Jupyter

  L'ordre dans lequel vous exécutez les cellules est important, la
  variable contient la **dernière valeur que vous lui avez
  attribuée**. L'ordre d'exécution des cellules est indiqué entre
  crochets dans la marge de gauche.


id: 3f65c4b496b34ba0a8fd07e88d0f5edb
name: cell-11418469192f043f
cell_type: markdown
checksum: 398c703c716b88f225bcae0f95ba5715
notebook_id: 14d70ccc6c7f47a9b403450a798685c3
source:
  Vous aurez noté que certaines cellules finissaient par «;», d'autres
  non.

  ### Exercice 2

  - Exécutez les cellules suivantes et observez le résultat :


id: 812b7ee5345c42e48512166ed6db07a9
name: cell-11418469192f043g
cell_type: markdown
checksum: a241d96474a7be331015009524932b2b
notebook_id: 14d70ccc6c7f47a9b403450a798685c3
source:
  En général, toute *instruction* C++ doit se terminer par un «;». Par
  convention pour C++ dans Jupyter, si la dernière instruction d'une
  cellule est une *expression* (elle a une valeur) et si l'on omets le
  «;», alors cette valeur est affichée, avec son type.


id: 45975a76ee4a4eff81c0103db3a132a1
name: cell-36f8f65940be42e9
cell_type: markdown
checksum: 636d73718d93878465ab2e3c929934c0
notebook_id: 14d70ccc6c7f47a9b403450a798685c3
source:
  ### Exercice 3

  Les cellules suivantes déclarent deux variables `r` et `pi`. Vous
  noterez qu'une valeur est affectée à `pi` dans la foulée, en mettant
  la déclaration et l'affectation sur la même ligne :


id: c53b696ba5b64bc29d7fe31acd00beb9
name: cell-91058b910f815221
cell_type: markdown
checksum: f115e46467180823a68878709f74eec2
notebook_id: 14d70ccc6c7f47a9b403450a798685c3
source:
  - Utilisez ces variables pour calculer l'aire et le périmètre d'un
    disque de rayon `r` pour les différentes valeurs données
    ci-dessous. Pour simplifier, vous pourrez considérer que la variable
    `pi` contient la valeur exacte du nombre bien connu. Utilisez les
    cellules vides pour faire vos calculs. N'oubliez pas d'exécuter
    aussi les cellules qui changent la valeur de `r`.


id: 0529fb5628a749ffb4f1ce1f6a48d1fd
name: cell-e9b1884cc2aaecf1
cell_type: markdown
checksum: 1c6277a8e8dbdba9d76e456c07867f51
notebook_id: 14d70ccc6c7f47a9b403450a798685c3
source:
  Dans les cellules vides ci-dessous, écrivez un programme qui *échange
  les valeurs* des deux variables, comme dans le TD 1. Votre programme
  pourra déclarer de nouvelles variables et utiliser des affectations,
  mais sans écrire les nombres à la main bien sûr, ce serait tricher.

  **Indication :**
  - Une cellule peut contenir plusieurs instructions (comme ci-dessus)
    séparées par des points-virgules `;`.


id: b04c4bde1c7544e6be8a92241a89e7ac
name: cell-34adf2e9f2f58483
cell_type: markdown
checksum: 9b3bcf2875083ea0f70fdc4144ce23c5
notebook_id: 14d70ccc6c7f47a9b403450a798685c3
source:
  ## Affectations et types

  Tout à l'heure, nous avons exploré différents types de valeurs et nous
  venons de voir comment déclarer une variable pouvant contenir un
  certain type. Mais que se passe-t-il lorsque l'on affecte une valeur
  du mauvais type à une variable?


id: e15747ea93f74afc816681436a551038
name: cell-a5106c0a703afcee
cell_type: markdown
checksum: 4923e17a17c544bb30b2686935688687
notebook_id: 14d70ccc6c7f47a9b403450a798685c3
source:
  Vous remarquez que, lorsque les types sont suffisament proches, les
  valeurs sont converties automatiquement au moment de
  l'affectation. Dans les autres cas, l'affectation déclenche une
  erreur.


id: fa1b1dc6e3284b57bdc42453e0cff2e9
name: cell-4edc9c17698dd130
cell_type: markdown
checksum: c89964f3bf3795f7bec68d75ee4e7ee4
notebook_id: 14d70ccc6c7f47a9b403450a798685c3
source:
  ### Exercice 6

  Pour chaque expression ci-dessous, déclarez une variable **du bon
  type** et affectez-lui le résultat, puis affichez le contenu de la
  variable pour le vérifier.

  **Exemple :**


id: 8358f2511f4a47fa9a4b02a4265cf9e9
name: cell-6e834cd22ecc144b
cell_type: markdown
checksum: d95f6ef892f20fd0c87e84b80cc08b41
notebook_id: 14d70ccc6c7f47a9b403450a798685c3
source:
  Avec cette feuille, nous avons fini notre première exploration des
  données en C++ : calculer des valeurs avec des expressions, comprendre
  les types de ces valeurs et leur influence, stocker les résultats dans
  des variables. Dans la feuille suivante, vous aborderez les conditions
  et les fonctions.

  Vous pouvez maintenant fermer cette feuille; utilisez pour cela le
  raccourci clavier <kbd>Ctrl</kbd>+<kbd>Maj</kbd>+<kbd>Q</kbd>.


id: da667e1715cc410ebaf0fba955695d25
name: cell-1b21180343eef5af
cell_type: markdown
checksum: e6e41c38440a173ee00db100d85a72f9
notebook_id: 0152a5d5ab9540b59c26da91864d9606
source:
  - Écrivez un code similaire tel qu'une nouvelle variable `d` prenne la valeur minimale entre `b` et `a`.


id: cb8267c0dedc481e9c48937b474e4296
name: cell-53017ddafd267e8e
cell_type: markdown
checksum: 8a6d7659717cb606c80feb290609ff92
notebook_id: 0152a5d5ab9540b59c26da91864d9606
source:
  - Exécutez les cellules suivantes.  

    Vous remarquerez que l'on a réutilisé le même code mais en lui
    donnant un **nom** et en précisant le type de ses **entrées** et
    **sorties**. C'est ce qu'on appelle une **fonction** (nous
    reviendrons sur cette notion en cours). Ici la fonction `max`
    renvoie en sortie un type `int` (ce qui est précisé par le premier
    mot) et prend deux variables `int` en entrée (ce qui est précisé
    dans la parenthèse).


id: 4476108ae58e46fd8a75efb3c5400ccc
name: cell-da4b804e4c504f3b
cell_type: code
checksum: f683b7167cfaa4759c70b6a542e36ce6
notebook_id: 0152a5d5ab9540b59c26da91864d9606
source:
  int max(int a, int b) {
      if ( a < b ) {
          return b; 
      } else {
          return a;
      }
  }


id: 89a29b6ec02e4b20a738dfd91d09fdf1
name: cell-c3c70549ea20c619
cell_type: markdown
checksum: 8d6476a23a7ecf4710f0ab2ac3819305
notebook_id: 0152a5d5ab9540b59c26da91864d9606
source:
  **Exercice**

  Dans cet exercice, vous allez **utiliser** la fonction `max` pour calculer le maximum de deux nombres, trois nombres et quatre nombres.


id: 8610fe3a180a48f9878af236d1da4661
name: cell-5c05a59c77ec8231
cell_type: markdown
checksum: cfe5c3be2111e03b307f0aae6692bc30
notebook_id: 0152a5d5ab9540b59c26da91864d9606
source:
  * Calculez le max de n1, n2 et n3.<br>
    **Indication:** utilisez plusieurs fois la fonction comme dans le dernier exemple de l'exercice précédent.


id: 18eb494a19694939b88bb85d5e82741d
name: cell-825c2c774b85287f
cell_type: markdown
checksum: 57bda93ba3bd248f22ab98a5f82227bb
notebook_id: 0152a5d5ab9540b59c26da91864d9606
source:
  * Changez les valeurs de n1, n2, n3 et n4 ci-dessus, re-exécutez les cellules et vérifiez les résultats.


id: 037f615d6cfe40a7b736acf0a5192805
name: cell-88fe335b6a80af8e
cell_type: markdown
checksum: 2566e705667554c1e9f89519ce77b424
notebook_id: 0152a5d5ab9540b59c26da91864d9606
source:
  **Attention: une fonction -- une cellule**

  L'interpréteur C++ que nous utilisons (```Cling``` dans ```Jupyter```)
  est à l'heure actuelle plus restrictif que nécessaire: lorsque l'on
  souhaite définir une fonction, il est impératif que la définition de
  cette fonction apparaisse seule dans sa cellule. En particulier on ne
  peux pas définir deux fonctions dans une même cellule, ni faire
  précéder ou suivre la définition d'une fonction par des instructions.


id: 5b60f5441b024023b6f1bfd69ffa90e8
name: cell-88fe335b6a80af8d
cell_type: markdown
checksum: 3adc59e11b8ffce0a0fb70ad8f4efb9f
notebook_id: 0152a5d5ab9540b59c26da91864d9606
source:
  **Exercice**

  Complétez la fonction `min` ci-dessous.
  Si vous en avez besoin, vous pouvez consulter l'exemple de la fonction `max` plus haut et l'adapter.


id: a264af39fde34d5788b004f7866cb434
name: cell-d05c19054e863b1c
cell_type: code
checksum: bcb442dd7cde9e2401cd8851e0324952
notebook_id: 0152a5d5ab9540b59c26da91864d9606
source:
  int min(int a, int b) {
      // REMPLACER CETTE LIGNE ET LA SUIVANTE PAR VOTRE RÉPONSE
      throw std::runtime_error("À faire");
  }


id: 8d4fef3d5a0740709619eccaaf3d04aa
name: cell-71cd2f16555fbd37
cell_type: markdown
checksum: 2ce7160fbd67860c203d9d76eca42dcf
notebook_id: 0152a5d5ab9540b59c26da91864d9606
source:
  La cellule suivante contient des tests automatisés; nous reviendrons dessus plus en détails par la suite; pour le moment, vous pouvez juste exécuter la cellule et vérifier qu'il n'y a pas de message d'erreur.


id: 2b21ccc6ddee4d23ad6b73636dd00a28
name: cell-095f41446daefada
cell_type: code
checksum: 8c4e8fa4bb0ced29d22feb2bc157b0ff
notebook_id: 0152a5d5ab9540b59c26da91864d9606
source:
  double abs(double a) {
      // REMPLACER CETTE LIGNE ET LA SUIVANTE PAR VOTRE RÉPONSE
      throw std::runtime_error("À faire");
  }


id: d5943dc369de435599334eb45d574fa9
name: cell-403dc8b8bb8d58c4
cell_type: markdown
checksum: 1b4e6166617973cda3a56fc8bba442e6
notebook_id: 0152a5d5ab9540b59c26da91864d9606
source:
  **Exercice**

  Complétez la fonction ci-dessous qui calcule et renvoie le périmètre d'un cercle. Vous remarquez que la constante `pi` n'est pas passée en paramètre car c'est une variable de calcul interne à la fonction (une variable *locale*), et non une entrée de cette fonction.


id: 2dd23d8db40a43b9bd2e04e8c7dfaadf
name: cell-292a7f3566822daf
cell_type: code
checksum: 24be09dd71b0453371f6ebd8df39a0e7
notebook_id: 0152a5d5ab9540b59c26da91864d9606
source:
  double perimetre(double r) {
      double pi = 3.1415;
      // REMPLACER CETTE LIGNE ET LA SUIVANTE PAR VOTRE RÉPONSE
      throw std::runtime_error("À faire");
  }


id: b10fc5e6b8534d7ca28525474e280967
name: cell-95680906d451aa5b
cell_type: markdown
checksum: 2af9a2d92f24a28ba727b4fcce175d9d
notebook_id: 0152a5d5ab9540b59c26da91864d9606
source:
  **Exercice**

  Sur le même modèle, écrivez une fonction `aire` qui renvoie l'aire d'un cercle dont on donne le rayon. Testez-la.


id: 134a74afa26241769b68d78edfec6e53
name: cell-72500357fd98d2d3
cell_type: markdown
checksum: 896f14f77bb2f271c8cbc285dd42c630
notebook_id: 0152a5d5ab9540b59c26da91864d9606
source:
  Bravo, vous avez fini l'exercice «Jupyter: affectations, conditionnelles, fonctions» du TP.

  Retournez sur l'énoncé du TP pour consulter la suite des instructions.


id: 35e0ed3b89c642c7b0b0b498daad278a
name: cell-1b21180343eef5af
cell_type: markdown
checksum: 23e6b697bab1e68fe14f70fb2b382003
notebook_id: d8994e90c9434810aecb4ee4c861142a
source:
  Consultez l'énoncé de TD et et implantez en `C++` les algorithmes de
  l'exercice 3, autant que possible sans consulter vos notes de TD.
  Pensez à faire des tests pour vérifier vos réponses. Vous aurez besoin
  d'ajouter de nouvelles cellules (bouton <kbd>+</kbd> dans la barre
  d'outil de la feuille).


id: dee8fa89cc7f4fb7b816b4ce872d7d69
name: 10
cell_type: markdown
checksum: 3646ea08d143a76ae9ab457e4dca2a32
notebook_id: 6680c57cc4914a01989d3c6286520dbd
source:
  ::::{admonition} Exercice 1 : affectations

  Voici un fragment de programme `Échange`. On suppose que les variables
  entières `n1` et `n2` ont été préalablement déclarées et initialisées:

      n1 = n2;
      n2 = n1;

  1.  En première lecture, que fait ce fragment de programme?

      % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  2.  Exécutez le fragment de programme pas à pas avec comme valeurs
      initiales `5` et `7` pour les variables `n1` et `n2`
      respectivement. Obtient-on à la fin les valeurs attendues dans ces
      variables ?

      % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  3.  Modifiez le programme pour qu'il réponde à ce qui est
      attendu. Seules des déclarations de variables et des affectations
      sont nécessaires pour cela.

      % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  ::::


id: 61f5beb6ad7642999ffad13bf3751f27
name: 30
cell_type: markdown
checksum: 8d908402d296f5bbdca6839ac9c533f7
notebook_id: 6680c57cc4914a01989d3c6286520dbd
source:
  ::::{admonition} Exercice 2 : conditionnelles

  En relisant votre cours après l'amphi, vous avez appris les opérations
  sur les entiers ainsi que les opérations booléennes.  Cela vous sera
  utile dans cet exercice. On suppose que l'on a déjà déclaré et
  initialisé une variable `n` de type entier. On veut diviser $n$ par
  $2$ s'il est pair et lui enlever $1$ s'il est impair. Écrivez les
  quelques lignes d'instructions correspondantes.

  % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  ::::


id: ffd4bb7fd6124e29b3c4e9e36eb01421
name: 50
cell_type: markdown
checksum: e751bbbc92e4e72670429fdf78bd2db2
notebook_id: 6680c57cc4914a01989d3c6286520dbd
source:
  ::::{admonition} Exercice 3 : conditionnelles, fonctions

  Dans cet exercice (et les suivants), vous préciserez le nom, l'entrée
  et la sortie de vos programmes comme dans l'exemple suivant :

      // Programme produit
      // Entrée: deux entiers a et b de type int
      // Sortie: le produit de a et b stocké dans une variable p
      int p;
      p = a*b;

  Si vous vous sentez à l'aise, ou lorsque cela est demandé, mettez
  votre programme sous la forme d'une fonction :

      int produit(int a, int b) {
          return a*b;
      }

  Lors de la fin d'un semestre dans une Université X, les enseignants
  sont amenés à calculer la moyenne générale des notes de physique et de
  mathématiques selon une règle précise : la meilleure note des trois
  épreuves de mathématiques est comptée coefficient 3, et la meilleure
  note des deux épreuves de physique est comptée coefficient 2; les
  autres notes ne comptent pas.

  Un enseignant est chargé de concevoir un algorithme prenant en entrée
  les trois notes de mathématiques et les deux notes de physique, et
  donnant la moyenne générale suivant la règle énoncée ci-dessus.

  1.  Spécifiez et écrivez un algorithme `max2` qui, étant donnés deux
      nombres réels `a` et `b` (qu'on suppose déjà déclarés et
      initialisés), calcule le plus grand des deux et met le résultat
      dans une variable `m`.

      % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  2.  Transformez cet algorithme en une fonction nommée `max2` pour
      pouvoir par la suite calculer le maximum de deux nombres avec un
      appel à la fonction, par exemple `max2(7,5)`.

      % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  3.  De même, étant donnés trois nombres réels, donnez un algorithme
      calculant le plus grand des trois (dans une variable `m`). On
      pourra utiliser la fonction `max2(a,b)`.

      % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  4.  $\clubsuit$ Transformer cet algorithme en fonction.

      % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  5.  Spécifiez et donnez un algorithme qui prend en entrée trois
      notes de mathématiques, puis deux notes de physique, et calcule la
      moyenne selon la règle spécifiée.

      % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  6.  $\clubsuit$ Transformez cet algorithme en fonction.

      % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  ::::


id: 065f2624c1b44b43832de2f129b575fa
name: 70
cell_type: markdown
checksum: a1dde20aae2304dcd4886ac8cc7af7cd
notebook_id: 6680c57cc4914a01989d3c6286520dbd
source:
  ::::{admonition} Exercice 4 : rendu de monnaie

  On considère une machine qui distribue des sucreries. Le problème
  consiste à écrire le programme qu'elle exécute pour rendre la monnaie
  sur une somme, à l'aide de pièces de 50 centimes, 20 centimes, 10
  centimes et 5 centimes d'euro, de façon à minimiser le nombre de
  pièces rendues sachant que l'on connaît le prix et la somme donnée par
  le client. On suppose que les sommes sont données en centimes d'euro,
  qu'il n'y a pas de risque de pénurie de pièces de monnaie, et que les
  prix sont un multiple de 5 centimes.  Par exemple si le prix à payer
  est de 110 centimes et que le client a donné 200 centimes, il faut lui
  rendre 1 pièce de 50 centimes et 2 pièces de 20 centimes.

  1.  Quelles sont les entrées / sorties du problème ?

          // Entrées : la somme due (prix) et la somme donnée (somme),
          //     des entiers divisibles par 5
  	    // Sorties : le nombre de pièces de 50, 20, 10 et 5 centimes
  		//     à rendre (npieces50, npieces20, npieces10, npieces5).


  2.  Écrivez un programme pour résoudre le problème. On pourra supposer
      que les variables `prix` et `somme` contiennent respectivement le
      prix et la somme donnée par le client. À la fin du programme, la
      variable `npieces50` devra contenir le nombre de pièces de
      cinquante centimes à rendre, et de même pour les variables
      `npieces20`, `npieces10` et `npieces5`.
      
      Note : avec ce que vous avez appris, vous ne pouvez pas encore
      écrire une fonction pour ce problème (pourquoi?).

      % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE


  3.  $\clubsuit$ Comment gérer un nombre limité de pièces en réserve
      dans la caisse de la machine?

  ::::


id: 3fd784ec921446eb8cdc30523d4d5a9b
name: 80
cell_type: markdown
checksum: 26a341fc1567103da0dee7eff55ae08f
notebook_id: 6680c57cc4914a01989d3c6286520dbd
source:
  ::::{admonition} Exercice 5 : $\clubsuit$ pierre-feuille-ciseaux

  Héloïse et Gabriel veulent jouer à pierre-feuille-ciseaux, mais, têtes
  en l'air, ils ne se souviennent jamais de qui bat quoi.

  1.  On numérote les joueurs par $1$ et $2$, et on représente un choix
      par un entier: $1$ pour une pierre, $2$ pour une feuille, et $3$
      pour les ciseaux. On suppose que les variables `choix1` et
      `choix2` ont été déclarées et initialisées respectivement avec les
      choix du joueur $1$ et $2$.  Écrivez un programme dont la sortie,
      stockée dans une variable `gagnant` contienne le numéro du joueur
      gagnant (ou zéro si égalité).

      % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  2.  Transformez votre programme sous forme d'une fonction.

  	% REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  3.  Même chose en représentant un choix par un caractère (type
      `char`): 'p' pour pierre, 'f' pour feuille, 'c' pour ciseaux.

  	% REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  4.  $\clubsuit$ Même chose en utilisant un type `enum`.

  	% REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  ::::


id: d40b3a5717a1465fa3ac97319b4e5f28
name: cell-65f24a4fe8c153b9
cell_type: markdown
checksum: 56ec0a4cabda6c0696ea19160d6d7e34
notebook_id: 14a5eec6a1404edc92a2220a9e8c73e0
source:
  # Semaine 2: Premiers éléments de programmation impérative

  La semaine dernière, Laby nous a amené à la découverte de premiers
  éléments de la programmation impérative: programmes, fonctions,
  instructions conditionnelles et itératives. Cette semaine, nous allons
  commencer à formaliser ces éléments, en y ajoutant expressions et
  variables.


id: b26db0a04da1405e80e5eca025ea811e
name: cell-bf0808a9dcb0b572
cell_type: markdown
checksum: 16d262add0837e4334ab87b904b85f8f
notebook_id: 14a5eec6a1404edc92a2220a9e8c73e0
source:
  ### Exercice 0 : Notes de cours

  1.  Consultez les notes de cours de la semaine 1 sur le site web.
  2.  Que signifie *syntaxe*? Et *sémantique*? Vérifiez dans les notes
      de cours.
  3.  Quelle est la syntaxe et la sémantique de l'affectation de
      variables? Vérifiez dans les notes de cours de la semaine 2 (voir
      le site web ou ci-dessus).

  <!--
  ### Exercice: Téléchargement du sujet de TP

  1.  Ouvrez un terminal (vous pouvez consulter l'exercice 2 du TP 1).

  3.  Exécutez la commande `info-111` et observez le résultat.

  4.  Vous venez de lire la documentation de la commande `info-111`.
      Téléchargez le sujet de TP «Semaine2» en suivant les instructions
      données à ce sujet par cette documentation.
      Remarque: Si vous n'avez pas fait le TP1, vous aurez besoin d'activer
      votre compte gitlab (voir TP1).

  6.  Consultez la liste des fichiers de votre nouveau répertoire
      `~/ProgImperative/Semaine2/` à l'aide de la commande `ls` (cf. l'UE
      Introduction à l'Informatique pour ceux qui la suivent):

  	    ls ~/ProgImperative/Semaine2/

  5.  Observez ce qui est affiché; notez que `info-111` a fait appel à la
      commande `git clone ...`.
  !-->


id: e5e2e6b17b804f1a8efa2e722f184152
name: cell-bf0808a9dcb0b574
cell_type: markdown
checksum: e97d0f3d2c198c10d8f8aa4313e2f707
notebook_id: 14a5eec6a1404edc92a2220a9e8c73e0
source:
  ### Exercice 1 : Jupyter

  Chaque semaine, nous commencerons par une petite feuille pour vous
  familiariser progressivement à l'utilisation de Jupyter. Aujourd'hui,
  ce sera:

  - [00: Jupyter: mode édition versus mode commande](00-jupyter-mode-edition-vs-commande.md)


id: c878784bc6864d86be34eb658ba68f1f
name: cell-bf0808a9dcb0b573
cell_type: markdown
checksum: 1974cd8f2b5e472f6c0416829c9031d3
notebook_id: 14a5eec6a1404edc92a2220a9e8c73e0
source:
  ### Exercice 2 : Jupyter, valeurs, types, types, variables, conditionnelles, fonctions

  Travaillez successivement sur les feuilles suivantes :

  - [01: Expressions, valeurs et types](01-valeurs-types.md);
  - [02: Variables](02-variables.md);
  - [03: Conditions et fonctions](03-conditions-fonctions.md);


id: f8d7021d975f4efa9cbef975df3cdf45
name: cell-bf0808a9dcb0b575
cell_type: markdown
checksum: d82b17ec12b05990bfd4e9bd1aff611e
notebook_id: 14a5eec6a1404edc92a2220a9e8c73e0
source:
  ### Exercice 3 : Dépôt de votre travail

  1.  Utilisez le tableau de bord pour déposer votre travail sur GitLab
      (consultez au besoin la page
  	[Case départ](https://nicolas.thiery.name/Enseignement/Info111/ComputerLab/index.html)
      du site web).

  3.  N'oubliez pas de déposer à nouveau votre travail en fin de séance,
      afin que tout soit bien sauvegardé.


id: e9c86dac0a024c13a027c49d14df0a4d
name: cell-bf0808a9dcb0b576
cell_type: markdown
checksum: e5203c02432c8ea4b5dc0d24105bc30d
notebook_id: 14a5eec6a1404edc92a2220a9e8c73e0
source:
  ### Exercice 4 : Service JupyterHub@Paris-Saclay

  :::{hint} Rappel
  L'université a déployé un service `JupyterHub` (expérimental)
  vous permettant de travailler en dehors des séances avec simplement
  une connexion internet et un navigateur web (firefox, chrome, safari,
  ...).
  :::
  :::{attention}
  Cet exercice n'est à faire que si vous n'avez pas encore utilisé ce
  service ou si vous avez rencontré des difficultés. Demandez de l'aide au besoin à votre enseignant.
  :::

  1.  Suivez les instructions de la page
  	[Case départ](https://nicolas.thiery.name/Enseignement/Info111/ComputerLab/index.html)
  	du site web
      pour vous connecter au service JupyterHub;
  2.  Téléchargez-y vos TP 1 et 2 et consultez les;

  <!--
  2.  Fermez votre serveur avec `Control Panel -> Stop My Server`, puis
      fermez la page.
  !-->


id: c045842e24db4fa3bac765b2b5a6b51e
name: cell-bf0808a9dcb0b577
cell_type: markdown
checksum: 3e6182e1ad41cd0c966bafd7c7405f45
notebook_id: 14a5eec6a1404edc92a2220a9e8c73e0
source:
  ### Exercice 5 : Retour sur le TD

  Travaillez successivement sur les deux feuilles suivantes :

  1.  [04-td-exercice3.md](04-td-exercice3.md).
  2.  [05-td-exercice4.md](05-td-exercice4.md).


id: 1ef71d971dc347e2a316c2d6bbdb917f
name: cell-bf0808a9dcb0b578
cell_type: markdown
checksum: 9e02be34bb97f5a80a6ad0f6e9729ec5
notebook_id: 14a5eec6a1404edc92a2220a9e8c73e0
source:
  ### Exercice 6 : **Pour la semaine prochaine**

  1.  Vous vérifierez que vous pouvez vous connecter au service
      JupyterHub depuis chez vous et que vous pouvez y exécuter vos
      feuilles Jupyter (voir exercice « Service JupyterHub » ci dessus).

  2.  Terminez les fiches Jupyter de ce TP, soit en salle informatique
      de l'université, soit depuis chez vous en utilisant le service
      JupyterHub.


id: 1298b9d5c7424a3bba8758bf265860ad
name: cell-bf0808a9dcb0b57a
cell_type: markdown
checksum: 76412fe4e07321dadd3cc05830f425fc
notebook_id: 14a5eec6a1404edc92a2220a9e8c73e0
source:
  :::{note}

  Vous pouvez aborder les exercices ♣ suivants dans l'ordre que vous
  souhaitez.

  Pour les réaliser, vous créerez au fur et à mesure de nouvelles
  feuilles de travail (notebook). Pour cela : utilisez le menu `Fichier
  -> Nouveau -> Notebook` et sélectionnez le noyau `Python 3` ou `C++
  17`. Vous noterez dans le titre de l'onglet que votre feuille
  s'appelle `Untitled.ipynb`; utilisez un clic droit sur le titre de
  l'onglet et choisissez `Renommer` dans le menu pour donner un nom
  informatif à la feuille.
  </div>

  :::


id: ed484270defe4e669488cda961732dc8
name: cell-bf0808a9dcb0b57c
cell_type: markdown
checksum: 0e5590c0564fa84b30aec895de9bf212
notebook_id: 14a5eec6a1404edc92a2220a9e8c73e0
source:
  :::{tip} Astuce

  Pour que le dépôt sur GitLab tienne compte de vos nouveaux fichiers,
  vous devez au préalable les déclarer au système de gestion de version
  sous-jacent `git`. Par exemple, pour déclarer un nouveau fichier
  `mon_fichier.md` que vous avez créé dans votre répertoire `Semaine2`,
  vous ouvrirez un terminal et ferez :

      cd ~/ProgImperative/Semaine2
      git add mon_fichier.md

  Il sera alors inclus dans tous les dépôts ultérieurs.

  :::


id: 32191622916a4976b9286a87d163a55f
name: cell-bf0808a9dcb0b57b
cell_type: markdown
checksum: d2ac8dc671e598607d2d1c2dff7cc736
notebook_id: 14a5eec6a1404edc92a2220a9e8c73e0
source:
  ### Exercice ♣ : Euler forever!

  Vous trouverez sur le site du projet Euler <https://projecteuler.net>
  une série de problèmes mathématiques qui nécessitent chacun une
  combinaison de réflexion sur feuille et de programmation (voir
  <http://submoon.freeshell.org/fr/sphinx/euler.html> pour avoir les
  énoncés en français).

  Essayez de résoudre les problèmes 1, 2, 5 et tous ceux qui vous
  plairont!


id: 3960e59086b544e087e9d2aa775df001
name: cell-bf0808a9dcb0b579
cell_type: markdown
checksum: ea53bc2ad33d30f8800bbf95e6f35dd1
notebook_id: 14a5eec6a1404edc92a2220a9e8c73e0
source:
  ### Exercice ♣ : Python

  Dans le cours «Introduction à la programmation», vous (re)découvrirez
  le langage de programmation Python. Pour prendre un peu d'avance,
  refaites le TP en utilisant cette fois `Python`.

  Vous pouvez consulter la feuille [Résumé de la syntaxe de base
  Python](fiche-resume-python.md).

  <!--
  Vous trouverez un cours complet sur `Python` à cette adresse:

  <http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-en-python>

  Il est intéressant de le lire et de comparer avec ce que vous apprenez
  en C++ ce semestre.
  !-->


