diff --git a/2nd/06_Programmation/1B_momie.pdf b/2nd/06_Programmation/1B_momie.pdf new file mode 100644 index 0000000..d5ef373 Binary files /dev/null and b/2nd/06_Programmation/1B_momie.pdf differ diff --git a/2nd/06_Programmation/1B_momie.tex b/2nd/06_Programmation/1B_momie.tex new file mode 100644 index 0000000..a32f4fd --- /dev/null +++ b/2nd/06_Programmation/1B_momie.tex @@ -0,0 +1,38 @@ +\documentclass[a4paper,10pt]{article} +\usepackage{myXsim} + +\author{Benjamin Bertrand} +\title{Programmation - Cours} +\date{Février 2022} + +\pagestyle{empty} + +\begin{document} + +\maketitle + +\section{Programme Python} + +\begin{center} + %\includegraphics[scale=0.6]{./fig/pgm_momie} + \begin{minipage}{0.8\linewidth} + \lstinputlisting[language=Python]{./momie.py} + \end{minipage} +\end{center} + +Contenu du programme + +\afaire{Relever les mots clés, les opérateurs, les variables et les fonctions dans le programme.} + +\begin{itemize} + \item Les mots clés (en vert gras) + \vspace{2cm} + \item Les opérateurs (en rose) + \vspace{2cm} + \item Les variables (en noir) + \vspace{2cm} + \item Les fonctions (en vert) + \vspace{2cm} +\end{itemize} + +\end{document} diff --git a/2nd/06_Programmation/1E_tour_d_horizon.ipynb b/2nd/06_Programmation/1E_tour_d_horizon.ipynb new file mode 100644 index 0000000..f3f8914 --- /dev/null +++ b/2nd/06_Programmation/1E_tour_d_horizon.ipynb @@ -0,0 +1 @@ +{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Étape 1: Tour d'horizon\n\n"},{"metadata":{},"cell_type":"markdown","source":"## Decrire un programme\n\nCi-dessous, vous retrouverez des programmes. Vous devez les executer. Puis écrire une phrase par ligne de programme pour décrire ce qu'elle fait."},{"metadata":{},"cell_type":"markdown","source":"### Programme 1"},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"Hello les 2nd\")\na = 2\nprint(a + a)","execution_count":1,"outputs":[{"output_type":"stream","text":"Hello les 2nd\n4\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"Description"},{"metadata":{},"cell_type":"raw","source":""},{"metadata":{},"cell_type":"markdown","source":"### Programme 2"},{"metadata":{"trusted":true},"cell_type":"code","source":"age = int(input(\"Quel age as-tu?\"))\nif age >= 18:\n print(\"Tu es majeur, tu peux passer ton permis\")\nelse:\n print(\"Tu es mineur\")\n \n print(\"Il te reste \", 18 - age, \"ans avant de pouvoir passer le permis\")","execution_count":5,"outputs":[{"output_type":"stream","name":"stdout","text":"Quel age as-tu?1\nTu es mineur\nIl te reste 17 ans avant de pouvoir passer le permis\n"}]},{"metadata":{},"cell_type":"markdown","source":"Description"},{"metadata":{},"cell_type":"raw","source":""},{"metadata":{},"cell_type":"markdown","source":"### Programme 3\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"def f(x):\n resultat = x**2 + 2\n return resultat\n\nprint(f(0))\nprint(f(10))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Description"},{"metadata":{},"cell_type":"raw","source":""},{"metadata":{},"cell_type":"markdown","source":"## Modifier le programme de la momie\n\n\nOuvrez le programme édupython \n\nCi-dessous, vous avez un programme qui code un jeu de hazard. \n\n**Copier puis coller tout le programme dans édupython** puis lancer quelques parties pour comprendre ce que faire ce jeux.\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"# Programme de la momie - tiré du livre les maths ensembles et pour chacun\nfrom random import randint\n\ndef choisir_porte(nombre_portes):\n print(\"Il y a \" + str(nombre_portes) + \" portes devant toi.\")\n porte_choisie = int(input( \"Laquelle ouvres-tu?\"))\n return porte_choisie\n \n \nnombre_portes = 3\npoints_de_vie = 5\nscore = 0\ndegat_momie = 3\n\nwhile points_de_vie > 0:\n print(\"Tu arrives dans un long couloir et tu avances. Jusqu'à ce que...\")\n porte_momie = randint(0, nombre_portes)\n porte_choisie = choisir_porte(nombre_portes)\n if porte_choisie == porte_momie:\n print(\"Une momie attaque!\")\n for i in range(degat_momie):\n print(\"Elle te touche une fois\")\n points_de_vie = points_de_vie - 1\n else:\n print(\"Rien! Tu as survécu à une porte en plus.\")\n score = score + 1\n\nprint(\"T'es mort. Tu n'as plus de points de vie.\")\nprint(\"Le jeu est fini, ton score est de \", score)","execution_count":8,"outputs":[{"output_type":"stream","text":"Tu arrives dans un long couloir et tu avances. Jusqu'à ce que...\nIl y a 3 portes devant toi.\nLaquelle ouvres-tu?2\nUne momie attaque!\nElle te touche une fois\nElle te touche une fois\nElle te touche une fois\nTu arrives dans un long couloir et tu avances. Jusqu'à ce que...\nIl y a 3 portes devant toi.\nLaquelle ouvres-tu?2\nRien! Tu as survécu à une porte en plus.\nTu arrives dans un long couloir et tu avances. Jusqu'à ce que...\nIl y a 3 portes devant toi.\nLaquelle ouvres-tu?2\nRien! Tu as survécu à une porte en plus.\nTu arrives dans un long couloir et tu avances. Jusqu'à ce que...\nIl y a 3 portes devant toi.\nLaquelle ouvres-tu?2\nRien! Tu as survécu à une porte en plus.\nTu arrives dans un long couloir et tu avances. Jusqu'à ce que...\nIl y a 3 portes devant toi.\nLaquelle ouvres-tu?2\nUne momie attaque!\nElle te touche une fois\nElle te touche une fois\nElle te touche une fois\nT'es mort. Tu n'as plus de points de vie.\nLe jeu est fini, ton score est de 3\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"Maintenant que vous avez un peu joué à ce jeu. Vous allez créer des variantes de ce jeu. \n\nVous devez faire dans l'ordre les variantes 1, 2 et 3. Les autres peuvent être fait dans l'ordre que vous souhaitez en fonction de ce qui vous inspire.\n\n\n**Pour chaque variante, vous copirez puis collerez le programme précédent dans un nouveau fichier dans édupython avant de le modifier.**"},{"metadata":{},"cell_type":"markdown","source":"*Variante 1* Modifier le programme pour que chaque ouverture de porte sans momie rapporte 10 points"},{"metadata":{},"cell_type":"markdown","source":"*Variante 2* Modifier le programme pour que l'on commence avec 5 points de vie mais qu'il n'y ait que deux portes à chaque fois."},{"metadata":{},"cell_type":"markdown","source":"*Variante 3* Le programme comporte un gros bug. Il est possible de ne jamais être dévoré par la momie. Proposer une façon de corriger ce bug.\n"},{"metadata":{},"cell_type":"markdown","source":"*Variante 4* On part fixe le nombre de porte à 3. Quelle est la probabilité de tomber sur un momie? Transformer le programme pour la probabilité de tomber sur une momie soit de 3/2."},{"metadata":{},"cell_type":"markdown","source":"---\nLes variantes suivantes peuvent être faites dans l'ordre que vous souhaitez."},{"metadata":{},"cell_type":"markdown","source":"*Variante 5* Modifier le programme pour qu'à chaque fois que l'on tombe sur une momie, on ait une chance sur deux de perdre 1 point de vie et une chance sur 2 de ne perdre 2 points de vie."},{"metadata":{},"cell_type":"markdown","source":"*Variante 6* Ajouter d'autres monstres cachés derière d'autres portes qui enlèvent plus ou moins de points."},{"metadata":{},"cell_type":"markdown","source":"Variante 7 Étonnez nous avec une variante bien à vous!"},{"metadata":{},"cell_type":"markdown","source":"## Bilan\n\nNoter les mots écris en vert dans différents programmes manipulés et décrire l'action de chacun d'eux."},{"metadata":{},"cell_type":"raw","source":"\n"}],"metadata":{"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"}},"nbformat":4,"nbformat_minor":2} diff --git a/2nd/06_Programmation/2B_variables.pdf b/2nd/06_Programmation/2B_variables.pdf new file mode 100644 index 0000000..aed5e57 Binary files /dev/null and b/2nd/06_Programmation/2B_variables.pdf differ diff --git a/2nd/06_Programmation/2B_variables.tex b/2nd/06_Programmation/2B_variables.tex new file mode 100644 index 0000000..685adf1 --- /dev/null +++ b/2nd/06_Programmation/2B_variables.tex @@ -0,0 +1,60 @@ +\documentclass[a4paper,10pt]{article} +\usepackage{myXsim} + +\author{Benjamin Bertrand} +\title{Programmation - Cours} +\date{Février 2022} + +\pagestyle{empty} + +\begin{document} + +\maketitle +\setcounter{section}{1} + +\section{Types de variables} + +Vous devez connaître trois types de variables + +\begin{multicols}{3} + Les entiers + + \begin{lstlisting} +a = 2\end{lstlisting} + + Les flottants + + \begin{lstlisting} +a = 2.2\end{lstlisting} + + Les chaines de caractères + + \begin{lstlisting} +a = "2"\end{lstlisting} +\end{multicols} + +\bigskip + +Le symbole \lstinline[ columns=fixed ]{=} affecte une valeur à une variable. + +\bigskip + +Quand c'est possible, des fonctions python permettent de transformer un type de variable en un autre. + +\begin{itemize} + \item Transformer en entier: \lstinline[columns=fixed]{int(...)} + \item Transformer en flottant \lstinline[columns=fixed]{float(...)} + \item Transformer en chaine de caractères \lstinline[columns=fixed]{str(...)} +\end{itemize} + +\bigskip + +Deux fonctions pour interagir avec l'utilisateur du programme: +\begin{itemize} + \item \lstinline[ columns=fixed ]{print(...)}: affiche à l'écran ce qui lui est transmis dans les parenthèses. + \item \lstinline[columns=fixed]{input(...)}: affiche à l'écran ce qui lui est transmis dans les parenthèses, attend un réponse de l'utilisateur et retourne la réponse sous forme d'une chaine de caractères. +\end{itemize} + + + +\end{document} diff --git a/2nd/06_Programmation/2E_variables.ipynb b/2nd/06_Programmation/2E_variables.ipynb new file mode 100644 index 0000000..5c6e1e4 --- /dev/null +++ b/2nd/06_Programmation/2E_variables.ipynb @@ -0,0 +1 @@ +{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Étape 2: Variables, affectation et type"},{"metadata":{},"cell_type":"markdown","source":"## Interagir avec l'utilisateur: input\n\nPour demander une information à l'utilisateur du programme, on peut utiliser la commande `input`.\n\nDans l'exemple suivant, la réponse de l'utilisateur est stocké dans la variable `reponse` pour être réutilisé à la ligne suivante."},{"metadata":{"trusted":true},"cell_type":"code","source":"reponse = input(\"Dis moi quelque chose: \")\nprint(\"Oh! Quelle chance, tu m'as dis \", reponse)","execution_count":1,"outputs":[{"output_type":"stream","name":"stdout","text":"Dis moi quelque chose: 23 éé\nOh! Quelle chance, tu m'as dis 23 éé\n"}]},{"metadata":{},"cell_type":"markdown","source":"1. Ecrire un programme qui demande le nom du l'utilisateur ou l'utilisatrice puis qui le ou la salue en réutilisant la réponse donnée."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"2. On veut écrire un programme qui demande la ville de naissance puis le nom de famille et qui écrit une phrase du type \"M. ou Mme .... vous êtes né.e à ... \" "},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"3. Un vendeur vend des tomates à 2€ le kg. Ecrire un programme qui demande la quantité de tomates souhaitée (en kg) et qui revoie le prix. *(essayez mais dans l'état actuel de vos connaissances, vous devriez avoir un comportement bizarre.)*"},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Type de variables\n\nLe problème que vous avez obtenu est un problème de types. La quantité, pour vous, est un nombre (entier ou à virgule) tandis que pour l'ordinateur c'est une chaine de caractères.\n\nIl est possible de transformer un type en un autre."},{"metadata":{"trusted":false},"cell_type":"code","source":"entier = 23\nvirgule = 2.3\nchaine = \"23\"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Pour transformer en entier (integer en anglais) on utilise `int()`"},{"metadata":{"trusted":false},"cell_type":"code","source":"int(entier)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"int(virgule)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"int(chaine)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Pour transformer en un nombre à virgule ou flottant (float en anglais) on utilise `float()`.\n\nTester la fonction `float()` sur les variables (comme au dessus)."},{"metadata":{"trusted":false},"cell_type":"code","source":"float(entier)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Pour transformer en une chaine de caractères (string en anglais) on utilise `str()`.\n\nTester la fonction `str()` sur les variables."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"3bis. Reprendre l'exercice du vendeur de tomates et corrigez le pour avoir le bon prix."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"
\n À partir de là vous pouvez continuer à explorer les types de variables ou alors allez à la fin faire les exercices.\n
"},{"metadata":{},"cell_type":"markdown","source":"### Identifier les types de variables\n\nPour nous (humain) les trois variables qui suivent sont itdentiques"},{"metadata":{"trusted":false},"cell_type":"code","source":"a = 1\na","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"b = 1.0\nb","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"c = \"1\"\nc","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Mais pour Python ce sont trois choses très différentes. Le premier est un **entier**, le deuxième est un **flottant** (nombre à virgule) et le dernier est une **chaine de caractères**."},{"metadata":{},"cell_type":"markdown","source":"4. Trier les variables suivantes en fonction de leur type"},{"metadata":{"trusted":false},"cell_type":"code","source":"a = 3\nb = 4.5\nc = \"coucou\"\nd = \"6\"\ne = 8\nf = 5.0\ng = \"09\"\nh = \"0.4\"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"raw","source":"Les entiers:\nLes flottants:\nLes chaines de caractères:"},{"metadata":{},"cell_type":"markdown","source":"## Exercices\n\nDans les éxercices suivants vous devrez coder un programme qui fait ce qu'il est décrit. Vous pouvez les faire dans l'ordre que vous souhaitez."},{"metadata":{"trusted":true},"cell_type":"markdown","source":"## Calculateur de TVA\n\nÉcrire un programme qui\n\n demande le prix HT d'un objet\n calcule le prix TTC avec une TVA de 20%\n affiche le prix TTC"},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Variation d'une grandeur\n\nÉcrire un programme qui\n\n demande la valeur initiale\n demande le taux d'évolution\n affiche la valeur finale"},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Taux d'évolution\n\nÉcrire un programme qui\n\n demande la valeur initiale\n demande la valeur finale\n affiche le taux d'évolution\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.10.2"}},"nbformat":4,"nbformat_minor":2} diff --git a/2nd/06_Programmation/3B_conditions.pdf b/2nd/06_Programmation/3B_conditions.pdf new file mode 100644 index 0000000..59f6f30 Binary files /dev/null and b/2nd/06_Programmation/3B_conditions.pdf differ diff --git a/2nd/06_Programmation/3B_conditions.tex b/2nd/06_Programmation/3B_conditions.tex new file mode 100644 index 0000000..82a42cc --- /dev/null +++ b/2nd/06_Programmation/3B_conditions.tex @@ -0,0 +1,39 @@ +\documentclass[a4paper,10pt]{article} +\usepackage{myXsim} + +\author{Benjamin Bertrand} +\title{Programmation - Cours} +\date{Février 2022} + +\pagestyle{empty} + +\begin{document} + +\maketitle +\setcounter{section}{2} + +\section{Conditions \lstinline{if/elif/else}} + +Quand on veut gérer différent cas de figure, on utilise les mots clés \lstinline{if/elif/else}. + +\begin{center} + \begin{minipage}{0.8\linewidth} + \begin{lstlisting} +age = str(input{Quel age as tu?}) +if age < 2: # si + print("Tu es un bébé") # alors +elif age < 18: #sinon si + print("Tu n'es pas majeur") # alors + print("Tu peux passer le permis") +elif age < 50: #sinon si + print("Tu as moins de la moitier d'un siècle") #alors +else: #sinon + print("Plus d'un demi siècle!") +print("J'ai plus rien à dire")\end{lstlisting} + \end{minipage} +\end{center} + +\paragraph{Remarque:} Il faut faire attention à l'indentation. C'est elle qui détermine où s'arrête le alors. + + +\end{document} diff --git a/2nd/06_Programmation/3E_conditions.ipynb b/2nd/06_Programmation/3E_conditions.ipynb new file mode 100644 index 0000000..80c4779 --- /dev/null +++ b/2nd/06_Programmation/3E_conditions.ipynb @@ -0,0 +1 @@ +{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Conditions\n\nQuand on veut gérer des situations différentes, on utiliser une structure `if`.\n\nTester le programme ci-dessous avec différentes valeurs de `a` et `b`. Que faut-il mettre pour avoir les messages suivant?\n\n- a est plus petit que 10\n- a est égal à b\n- J'ai rien à dire"},{"metadata":{"trusted":true},"cell_type":"code","source":"a = int(input(\"Choisir un nombre (a): \"))\nb = int(input(\"Choisir un autre nombre(b): \"))\n\nif a < 10: # Si\n print(\"a est plus petit que 10\")\nelif a == b: # Sinon si\n print(\"a est égal à b\")\nelse: # Sinon\n print(\"J'ai rien à dire\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Exercices"},{"metadata":{},"cell_type":"markdown","source":"1. Un musée accorde des tarifs réduits aux groupes contenant au minimum 6 personnes de plus de 18 ans. Un informaticien du musée veut écrire un programme Python pour les clients qui achètent des billets en ligne. Ce programme doit demander au client le nombre d’adultes de plus de 18 ans du groupe puis afficher, suivant la réponse du client, l’une des deux phrases suivantes :\n\n - \"Vous avez droit au tarif Groupe !\"\n - \"Vous n’avez pas droit au tarif Groupe !\""},{"metadata":{},"cell_type":"markdown","source":"L’informaticien a commencé à écrire le programme ci-dessous. Complétez-le :"},{"metadata":{"trusted":true},"cell_type":"code","source":"nombre_adulte = int(input(\"Combien ...\"))\n\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"2. À l'achat d'une voiture neuve, l'état applique un malus écologique. C'est une taxe qui dépend de la quantité de CO2 rejeté par le véhicule. Voici quelques montants de cette taxe\n\n| Emission de C02 (g/km) | Montant du malus 2022 |\n|------------------------|-----------------------|\n| Moins de 127 | 0 |\n| De 128 à 151 | 1074 |\n| De 152 à 200 | 18 188 |\n| De 201 à 224 | 36 447 |\n| Plus de 225 | 40 000 |\n\nÉcrire un programme qui demande l'emission du véhicule et qui affiche le montant du malus."},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"3. **Questions flashs et correction automatique**\n\nPréparer une série de 4 questions flashs simples où la réponse est un nombre ou un mot. Écrire un programme qui demande une réponse aux questions flashs et qui dit si oui ou non la réponse est juste."},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Comparaison et logique"},{"metadata":{},"cell_type":"markdown","source":"En anglais, `True` signifie `vrai` et `False` signifie `faux`.\n\nQuelques opérateurs pour faire des comparaison entre nombres"},{"metadata":{"trusted":true},"cell_type":"code","source":"print(2 == 2)\nprint(2 == 3)\nprint(2 != 2)\nprint(10 != 5)\nprint(4 < 5)\nprint(4 <= 4)\nprint(34 > 2)\nprint(34 > 50)\nprint(5 >= 10)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"4.Faire la liste des opérateurs et écrire une phrase pour décrire ce qu'ils signifie."},{"metadata":{},"cell_type":"raw","source":""},{"metadata":{},"cell_type":"markdown","source":"Pour combiner plusieur condition, on peut utiliser les mots clés `not` (pas), `and` (et) et `or` (ou)"},{"metadata":{"trusted":true},"cell_type":"code","source":"print(2 == 2 and 4 == 4)\nprint(2 == 2 and 3 == 4)\nprint(2 == 3 and 3 == 4)\nprint(\"---------------\")\nprint(2 == 2 or 4 == 4)\nprint(2 == 2 or 3 == 4)\nprint(2 == 3 or 3 == 4)\nprint(\"---------------\")\nprint(not 2 == 2)\nprint(not 2 == 2)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Exercices"},{"metadata":{},"cell_type":"markdown","source":"5. Programmer une IA au jeu Qui-est-ce?\n\nVoici 4 visages.\n\n![qui-est-ce.png](attachment:qui-est-ce.png)\n\nEcrire un programme qui demande de choisir un personnage, pose 2 questions et qui arrive à déterminer le personnage choisis.\n","attachments":{"qui-est-ce.png":{"image/png":"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"}}},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"6. Programmer un pierre-feuille-ciseau. \n\nDéroulé du programme:\n\n- L'utilisateur choisit un nombre entre 0 (pierre), 1(feuille), 2(ciseau).\n- L'ordinateur choisit au hasard un nombre en 0 et 2 (vous pourrez utiliser `randint(0, 2)` pour faire cela.\n- L'ordinateur détermine qui a gagné la partie"},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"}},"nbformat":4,"nbformat_minor":2} diff --git a/2nd/06_Programmation/4B_boucle_for.pdf b/2nd/06_Programmation/4B_boucle_for.pdf new file mode 100644 index 0000000..14979c5 Binary files /dev/null and b/2nd/06_Programmation/4B_boucle_for.pdf differ diff --git a/2nd/06_Programmation/4B_boucle_for.tex b/2nd/06_Programmation/4B_boucle_for.tex new file mode 100644 index 0000000..46b0420 --- /dev/null +++ b/2nd/06_Programmation/4B_boucle_for.tex @@ -0,0 +1,54 @@ +\documentclass[a4paper,10pt]{article} +\usepackage{myXsim} + +\author{Benjamin Bertrand} +\title{Programmation - Cours} +\date{Février 2022} + +\pagestyle{empty} + +\begin{document} + +\maketitle +\setcounter{section}{3} + +\section{Boucle \lstinline{for}} + +Quand on veut \textbf{faire} quelque chose un nombre de foi \textbf{connus}, on utilise une boucle \lstinline{for}. + +\begin{multicols}{2} + \begin{minipage}{0.8\linewidth} + \begin{lstlisting} +for i in range(3): + print("Coucou")\end{lstlisting} + Le programme va afficher + \vspace{2cm} + \end{minipage} + + \begin{minipage}{0.8\linewidth} + \begin{lstlisting} +somme = 0 +for i in range(4): + somme = somme + i +print(somme)\end{lstlisting} + Le programme va afficher + \vspace{1cm} + + Tableau des variables + + \begin{center} + \begin{tabular}{c|c} + i & somme \\ + \hline + & \\ + & \\ + & \\ + \end{tabular} + \end{center} + + \end{minipage} +\end{multicols} + +\afaire{Prévoir ce que vont afficher ces deux programmes et compléter le tableau des variables} + +\end{document} diff --git a/2nd/06_Programmation/4E_boucles_for.ipynb b/2nd/06_Programmation/4E_boucles_for.ipynb new file mode 100644 index 0000000..a5de344 --- /dev/null +++ b/2nd/06_Programmation/4E_boucles_for.ipynb @@ -0,0 +1 @@ +{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Étape 4: boucle for\n\nCe TP commence par la partie 1. Ensuite les autres parties peuvent se faire dans l'ordre que vous voulez."},{"metadata":{},"cell_type":"markdown","source":"## 1- Faire la même chose plusieurs fois, une belle punition\n\nBob n'a pas été sage, il a encore essayer de scotcher son voisin de classe sur sa chaise. Son professeur a une idée très originale pour le punir : lui faire recopier 100 fois \"je ne dois pas scotcher mon voisin sur sa chaise\". Alors Bob commence"},{"metadata":{"trusted":false},"cell_type":"code","source":"print(\"je ne dois pas scotcher mon voisin sur sa chaise\")\nprint(\"je ne dois pas scotcher mon voisin sur sa chaise\")\nprint(\"je ne dois pas scotcher mon voisin sur sa chaise\")\nprint(\"je ne dois pas scotcher mon voisin sur sa chaise\")\nprint(\"je ne dois pas scotcher mon voisin sur sa chaise\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Mais il en marre. Alors il se rappelle qu'il peut sans effort utiliser une boucle `for` pour cela."},{"metadata":{"trusted":false},"cell_type":"code","source":"for i in range(10):\n print(\"je ne dois pas scotcher mon voisin sur sa chaise\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"1. Modifier le programme précédent pour qu'il réalise la punition de Bob."},{"metadata":{},"cell_type":"markdown","source":"Bien sûr l'enseignant est fou de rage. Il lui demande de réécrire 100 fois \"Moi Bob, je suis un gros malin et j'utiliser la programmation\" mais cette fois ci entre 2 lignes il doit y avoir une ligne de tirés (\"---------\").\n\n2. Réaliser la punition de Bob"},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Encore raté, l'enseignant ne sait plus comment construire une vraie bonne punition pour ce plaisantin. Mais il a une idée, il va lui demander de numéroter ses lignes de punition. Il veut des phrases du genre \"C'est la phrase numéro 10, il me reste encore 90 lignes à faire\".\n\nBob se rappelle alors qu'il peut utiliser la variable `i` pour compter le nombre de répétition. Il écrire alors"},{"metadata":{"trusted":false},"cell_type":"code","source":"for i in range(4):\n print(\"Je repète \", i, \" fois\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"3. Recopier et modifier le programme de Bob pour réaliser sa punition."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 2- Dessins ASCII\n\nLe but de cette partie est de réaliser des dessins avec des chaines de caractères.\n\nQuand on multiplie une chaine de caractères (par exemple \"#\") par un entier (par exemple 4), python va répéter la chaine de caractères.\n\nQuelques exemples:"},{"metadata":{"trusted":false},"cell_type":"code","source":"print(\"#\"*4)\nprint(\"-\"*10)\nprint(\"_\"*3, \" \"*2, \"-\"*5)","execution_count":1,"outputs":[{"name":"stdout","output_type":"stream","text":"####\n----------\n___ -----\n"}]},{"metadata":{},"cell_type":"markdown","source":"On peut utiliser des boucles pour faire ensuite des motifs"},{"metadata":{"trusted":false},"cell_type":"code","source":"for i in range(5):\n print(\"-\", \"#\"*i)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"1. Réaliser le motif suivant:\n\n\n -\n --\n ---\n ----\n -----\n ------\n -------\n --------\n --------- "},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"2. Réaliser le motif suivant\n\n \n ##\n ####\n ######\n ########"},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"3. Réaliser le motif suivant\n\n ######\n #####\n ####\n ###\n ##\n #"},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"4. Réaliser le motif suivant\n\n\n #\n ##\n ###\n ####\n #####\n ######\n #####\n ####\n ###\n ##\n #"},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"5. Réaliser le motif suivant\n\n # \n ### \n ##### \n ####### "},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 3- Calculer des images à pelle\n\nOn définit la fonction \n$$ f(x) = 2x - 1$$\nOn veut calculer les valeurs de $f(0)$, $f(1)$ jusqu'à $f(10)$. C'est une tache répétitive,on va pouvoir utiliser une boucle `for`"},{"metadata":{"trusted":false},"cell_type":"code","source":"for x in range(11):\n print(\"f(\", x, \")=\", 2*x-1)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"1. Calculer les images pour $x$ allant de 0 à 20 par la fonctin $g(x) = 4x^2 - 5x - 1$ (en python la puissance s'écrit avec `**`)."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"2. Calculer les images pour $x$ allant de -10 à 0 par la fonctin $h(x) = -x^2 + x - 1$ "},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"3. Pour x allant de -100 à 100, quelles sont les valeurs de $x$ qui ont une image positive par la fonction $i(x) = -x^2 + 600$."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 4- Accumulateurs\n\nDans le programme suivant, on veut ajouter tous les nombres de 0 à 100."},{"metadata":{"trusted":false},"cell_type":"code","source":"somme = 0\nfor i in range(101):\n somme = somme + i\nprint(somme)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"1. Adapter le programme pour qu'il fasse la somme des nombres de 50 à 100."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"2. Adapter le programme pour qu'il fasse le produit des tous les nombres de 0 à 100."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"3. On veut ajouter tous les nombres de 0 à 100 qui sont paires. Écrire le programme qui correspond."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"4. Écrire un programme qui fait la somme de tous les multiples de 5 de 0 à 1000."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 5- Plusieurs boucles\n\nOn veut énumérer les points du plan qui ont des coordonnées entières comprises entre -5 et 5. Pour cela il va falloir faire une boucles pour les abscisses (x), une boucle pour les ordonnées (y) et les imbriquer."},{"metadata":{"trusted":false},"cell_type":"code","source":"for x in range(-5, 6):\n for y in range(-5, 6):\n print(\"(\", x, \",\", y,\")\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"1. Lister tous les points à coordonnées entières qui ont une ordonnée égal à 2 (on note $y = 2$)."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"2. Lister tous les points à coordonnées entières qui sont sur $x = -2$."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"3. Lister tous les points à coordonnées entières qui sont sur $x = 2y$."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"4. En informatique, on peut coder une couleur en RGB (rouge, vert, bleu). Ce sont 3 nombres compris entre 0 et 255 mis sous forme de coordonnée.\n\nÉcrire un programme qui liste toutes les couleurs RGB possibles."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.10.2"}},"nbformat":4,"nbformat_minor":2} diff --git a/2nd/06_Programmation/5B_boucle_while.pdf b/2nd/06_Programmation/5B_boucle_while.pdf new file mode 100644 index 0000000..c40d9b5 Binary files /dev/null and b/2nd/06_Programmation/5B_boucle_while.pdf differ diff --git a/2nd/06_Programmation/5B_boucle_while.tex b/2nd/06_Programmation/5B_boucle_while.tex new file mode 100644 index 0000000..99d6f6c --- /dev/null +++ b/2nd/06_Programmation/5B_boucle_while.tex @@ -0,0 +1,52 @@ +\documentclass[a4paper,10pt]{article} +\usepackage{myXsim} + +\author{Benjamin Bertrand} +\title{Programmation - Cours} +\date{Février 2022} + +\pagestyle{empty} + +\begin{document} + +\maketitle +\setcounter{section}{4} + +\section{Boucle \lstinline{while}} + +Quand on veut \textbf{faire} quelque chose \textbf{tant que} quelque chose reste vrai, on utilise une boucle \lstinline{while}. + +\begin{multicols}{3} + \begin{minipage}{0.8\linewidth} + \begin{lstlisting} +n = 0 +u = 1 +print(u) +while n < 5: + n = n + 1 + u = u * 2 + print(u)\end{lstlisting} + \end{minipage} + + \columnbreak + + Tableau des variables + \begin{center} + \begin{tabular}{c|c} + n & u \\ + \hline + & \\ + & \\ + & \\ + \end{tabular} + \end{center} + \columnbreak + + Le programme va afficher + + +\end{multicols} + +\afaire{Prévoir ce que vont afficher ces deux programmes et compléter le tableau des variables} + +\end{document} diff --git a/2nd/06_Programmation/5E_boucles_while.ipynb b/2nd/06_Programmation/5E_boucles_while.ipynb new file mode 100644 index 0000000..c8c326b --- /dev/null +++ b/2nd/06_Programmation/5E_boucles_while.ipynb @@ -0,0 +1 @@ +{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Étape 5: boucle while\n\n`While` signifie `tant que` en anglais. Cette instruction va répéter **tant que** quelque chose est vrai.\n\n1. Exécuter puis décrire le programme suivant"},{"metadata":{"trusted":true},"cell_type":"code","source":"i = 0\n\nwhile i < 10:\n print(\"i vaut\", i, \". C'est plus petit que 10 je continue\")\n i = i + 1\n \nprint(\"i vaut \", i, \". C'est plus grand que 10. Je suis sorti de la boucle\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Description de ce que fait le programme"},{"metadata":{},"cell_type":"raw","source":""},{"metadata":{},"cell_type":"markdown","source":"2. Proposer un variante où l'on répète jusqu'à ce que `i` depasse 20 et où `i` augmente de 2 en 2."},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Dès que l'on veut faire quelque chose **jusqu'à ce que**, on utilisera un boucle `while`. \n\n3. Exécuter le programme et essayer de trouver mon mot de passe."},{"metadata":{"trusted":true},"cell_type":"code","source":"mdp = input(\"Quel est mon mot de passe?\")\nwhile mdp != \"les maths c bon\":\n mdp = input(\"Raté! Tu ne trouveras jamais. Quel est mon mot de passe?\")\nprint(\"Arf bien joué, tu l'as trouvé. J'ai plus qu'à le changer...\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"4. Écrire une programme qui pose la même question tant que la bonne réponse n'est pas trouvée (vous devez inventer la question et la réponse)."},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 1- Jeux de devinette\n\nDans cette section, vous programmerez un jeu où l'utilisateur va chercher deviner un nombre choisi au hasard par l'ordinateur.\n\n1. *Programmation du coeur du jeu*: coder le programme suivant\n\n L'ordinateur choisi un nombre au hasard\n \n L'utilisateur propose une réponse\n Si la réponse est égale au nombre choisi par l'ordinateur\n L'utilisateur est félicité\n Sinon si la réponse est supérieur\n On affiche que sa réponse est trop grande\n Sinon\n on affiche que sa réponse est trop petite"},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"2. *Programmation de la boucle de jeu*: reprendre le programme précédent et faire répéter *jusqu'à ce que* l'utilisateur trouve la bonne réponse."},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"3. Quelques propositions d'améliorations\n\n - À la fin, on le nombre de réponses données par l'utilisateur pour trouver le nombre.\n - Limiter le nombre de réponses que l'utilisateur peut donner."},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 2- Simulation aléatoire\n\nLa boucle `while` peut être utile pour simuler des phénomènes aléatoires et les arreter en fonction d'une condition."},{"metadata":{},"cell_type":"markdown","source":"1. Le jeu est le suivant: on part avec 10 points. À chaque tour, on peut perdre un point, gagner un point, ne rien perdre ni gagner. Le jeu s'arrête quand on a plus de points.\n\nLe programme suivra l'algorithme suivant\n\n Notre score est de 10 points\n Affiche le score\n Tant que notre score est positif\n Au hasard notre score gagne un point, perd un point ou rien ne se passe\n Affiche le score\n "},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"2. Adapter le programme précédent pour qu'il calcule puis affiche le nombre de tours avant que notre score arrive à 0."},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 2- Investissement"},{"metadata":{},"cell_type":"markdown","source":"Une banque nous propose le placement suivant: on place 100€ et chaque année ce placement augmente de 2%. On veut savoir combien d'année il faudra attendre pour que ce placement atteigne 10 000€.\n\nProgrammer l'algorithme suivant pour répondre à cette question\n\n C'est l'année 0\n Le placement est de 100\n Tant que le placement est plus petit que 10000€\n le placement est augmenté de 2%\n l'année est augmentés de 1\n Affiche le nombre d'année"},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"}},"nbformat":4,"nbformat_minor":2} diff --git a/2nd/06_Programmation/6B_fonctions.pdf b/2nd/06_Programmation/6B_fonctions.pdf new file mode 100644 index 0000000..a934953 Binary files /dev/null and b/2nd/06_Programmation/6B_fonctions.pdf differ diff --git a/2nd/06_Programmation/6B_fonctions.tex b/2nd/06_Programmation/6B_fonctions.tex new file mode 100644 index 0000000..4fc7e51 --- /dev/null +++ b/2nd/06_Programmation/6B_fonctions.tex @@ -0,0 +1,62 @@ +\documentclass[a4paper,10pt]{article} +\usepackage{myXsim} + +\author{Benjamin Bertrand} +\title{Programmation - Cours} +\date{Février 2022} + +\pagestyle{empty} + +\begin{document} + +\maketitle +\setcounter{section}{5} + +\section{Fonction - \lstinline{def/return}} + +Une \textbf{fonction} en informatique est un sous programme à qui on va donner des paramètres (entre parenthèses) et qui retournera une valeur. + +\bigskip + +Fonction similaire aux fonctions en maths: +\smallskip + +\begin{minipage}{0.4\linewidth} + \begin{lstlisting} +def f(x): + return x^2 + 2 + +print(f(3)) +print(f(-1))\end{lstlisting} +\end{minipage} +\hfill +\begin{minipage}{0.5\linewidth} + + Le programme va afficher + \vspace{2cm} +\end{minipage} + +Fonctions qui décorent du texte + +\begin{minipage}{0.55\linewidth} + \begin{lstlisting} +def decore(texte): + return "*"*4 + texte + "*"*4 + +def belledeco(texte, decoration): + return decoration*5 + texte + decoration*5 + +print(decore("Coucou c'est moi")) +print(decore("Je suis trop beau!")) + +print(belledeco("Coucou c'est moi", "=")) +print(belledeco("Je suis trop beau!", "a"))\end{lstlisting} +\end{minipage} +\hfill +\begin{minipage}{0.4\linewidth} + + Le programme va afficher + \vspace{3cm} +\end{minipage} + +\end{document} diff --git a/2nd/06_Programmation/6E_fonctions.ipynb b/2nd/06_Programmation/6E_fonctions.ipynb new file mode 100644 index 0000000..d2ad85c --- /dev/null +++ b/2nd/06_Programmation/6E_fonctions.ipynb @@ -0,0 +1,42 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "b4d60a66", + "metadata": {}, + "source": [ + "# Étape 6: fonctions\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1d71067c", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/2nd/06_Programmation/7E_simulation.ipynb b/2nd/06_Programmation/7E_simulation.ipynb new file mode 100644 index 0000000..e985713 --- /dev/null +++ b/2nd/06_Programmation/7E_simulation.ipynb @@ -0,0 +1,259 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0078371d", + "metadata": {}, + "source": [ + "# Simulation\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "208f5bbc", + "metadata": {}, + "source": [ + "## Simulation d'une marche aléatoire\n", + "\n", + "On se pose la question suivante:\n", + "\n", + " Une puce est sur une règle et fait 10 sauts de 1cm à droite ou à gauche aléatoirement. On veut savoir la chance a-t-elle de revenir à son point de départ.\n", + " \n", + "Comme nous n'avons pas de puces sous la main, nous n'avons d'autre choix que de simuler la situation avec un ordinateur." + ] + }, + { + "cell_type": "markdown", + "id": "6f6f1e1f", + "metadata": {}, + "source": [ + "### Algorithme\n", + "\n", + "Avant de se lancer dans la programmation, vous allez écrire l'algorithme pour faire cette simulation. C'est à dire la \"recette\" pour simuler les 10 sauts de la puce.\n", + "\n", + "Pour cela, mettez vous à deux. Tracez un axe gradué. Une personne simule la puce pendant que l'autre va devoir lui dire ce qu'elle doit faire. La personne qui simule doit être la plus bête possible et ne faire que ce que l'autre lui dit de faire.\n", + "\n", + "Une fois que les indications sont assez explicite, vous les écrirez avec une phrase par ligne et en utilisant les mots ou expressions suivantes\n", + "\n", + "- Affecter ... à la variable ...\n", + "- Afficher/dire\n", + "- Si ... Alors ...\n", + "- Pour ... allant de ... à ... faire ...\n", + "- Tant que ... faire ...\n", + "\n", + "Vous aurez écrit votre algorithme." + ] + }, + { + "cell_type": "markdown", + "id": "cdcc41de", + "metadata": {}, + "source": [ + "### Simulation\n", + "\n", + "A vous de traduire votre algorithme en language Python. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "173d77ec", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "0da2a635", + "metadata": {}, + "source": [ + "### Droite ou gauche?\n", + "\n", + "Ici, nous allons voir comment simuler le choix de la puce d'aller à droite ou à gauche.\n", + "\n", + "En python, nous avons la fonction `random()` qui permet d'avoir un nombre aléatoire entre 0 et 1." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "27f496f9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.2629111349482097" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from random import random\n", + "random()" + ] + }, + { + "cell_type": "markdown", + "id": "a59f232c", + "metadata": {}, + "source": [ + "On veut que la puce ait autant de chance de faire un saut à gauche qu'un saut à droite.\n", + "\n", + "1. En utilisant `random()`, écrire un programme qui affiche la direction choisi de façon aléatoire." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4bfbd25a", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "e1fba5c0", + "metadata": {}, + "source": [ + "2. Pour pouvoir réutiliser votre programme facilement, vous allez pouvoir le mettre dans une **fonction**. Pour cela réécrire votre programme à la place des ... dans la cellule en dessous et remplacer les `print` par `return`." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "638becc3", + "metadata": {}, + "outputs": [], + "source": [ + "def droite_ou_gauche():\n", + " ..." + ] + }, + { + "cell_type": "markdown", + "id": "3d2d67c2", + "metadata": {}, + "source": [ + "Vous pouvez maintenant utiliser cette fonction à n'importe quel endroit dans vos programmes." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "a570e33e", + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'droite_ou_gauche' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [3]\u001b[0m, in \u001b[0;36m