diff --git a/README.md b/README.md new file mode 100644 index 0000000..8636e5a --- /dev/null +++ b/README.md @@ -0,0 +1,77 @@ + +Python au lycée - tome 1 +======================== + +Python est le langage idéal pour apprendre la programmation. +C'est un langage puissant qui vous permettra de plonger dans le monde des algorithmes. + +Ce livre vous guide pas à pas à travers des activités mathématiques et informatiques originales adaptées au lycée. Il se complète par des ressources en ligne : des vidéos et des fiches en couleurs. +Vous avez tout en main pour réussir ! + + +Vidéos +====== + +Les vidéos sont visibles depuis la chaîne *Youtube* [Python au lycée](https://www.youtube.com/channel/UC6PiFyqBiUjiJ7Q3DRSW2Wg "www.youtube.com/PythonAuLycée"). + +Livre +===== + +Le livre est en vente sur Amazon.fr à prix coûtant. [Commander le livre sur Amazon.fr]( https://www.amazon.fr/dp/1091267510). + +Vous pouvez aussi le télécharger sur ce site : [Livre 'Python au lycée - tome 1' (3 Mo)](livre-python1.pdf). + +Activités +========= + +* Premiers pas [Activités](premiers_pas/premiers_pas.pdf) +* Tortue (Scratch avec Python) [Activités](tortue/tortue.pdf) +* Si ... alors ... [Activités](sialors/sialors.pdf) +* Fonctions [Activités](fonctions/fonctions.pdf) +* Arithmétique -- Boucle tant que -- I [Activités](tantque/tantque-1.pdf) +* Chaînes de caractères -- Analyse d’un texte [Activités](chaines/chaines.pdf) +* Listes I [Activités](listes/listes-1.pdf) +* Statistique -- Visualisation de données [Activités](statistique/statistique.pdf) +* Fichiers [Activités](fichiers/fichiers.pdf) +* Arithmétique -- Boucle tant que -- II [Activités](tantque/tantque-2.pdf) +* Binaire I [Activités](binaire/binaire-1.pdf) +* Listes II [Activités](listes/listes-2.pdf) +* Binaire II [Activités](binaire/binaire-2.pdf) +* Probabilités -- Paradoxe de Parrondo [Activités](proba/proba.pdf) +* Chercher et remplacer [Activités](chercher/chercher.pdf) +* Calculatrice polonaise -- Piles [Activités](piles/piles.pdf) +* Visualiseur de texte -- Markdown [Activités](markdown/texte_markdown.pdf) +* L-système [Activités](lsysteme/lsysteme.pdf) +* Images dynamiques [Activités](images/images.pdf) +* Jeu de la vie [Activités](vie/vie.pdf) +* Graphes et combinatoire de Ramsey [Activités](ramsey/ramsey.pdf) +* Bitcoin [Activités](bitcoin/bitcoin.pdf) +* Constructions aléatoires [Activités](aleatoire/aleatoire.pdf) + + +Guides +====== + +* Guide de survie Python [Guide](guide/guide-python.pdf) +* Principales fonctions [Guide](guide/guide-fonctions.pdf) +* Notes et références [Guide](guide/guide-biblio.pdf) + +Codes +===== + +Vous trouverez les fichiers sources en naviguant dans les répertoires de GitHub. + +La totalité des codes est regroupée ici : [Code Python](code/code.pdf) + +Auteur +====== + +Arnaud Bodin + +Remerciements à : Stéphanie Bodin, Michel Bodin, François Recher, Éric Wegrzynowski, Philippe Marquet, Kroum Tzanev. + +![Logo Python Exo7](cover/logo-python.png "logo Python Exo7") + +Ce livre est diffusé sous la licence *Creative Commons -- BY-NC-SA -- 4.0 FR*. + + diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..3397c9a --- /dev/null +++ b/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-architect \ No newline at end of file diff --git a/aleatoire/aleatoire.pdf b/aleatoire/aleatoire.pdf index 18cf915..7388f4f 100644 Binary files a/aleatoire/aleatoire.pdf and b/aleatoire/aleatoire.pdf differ diff --git a/aleatoire/aleatoire.tex b/aleatoire/aleatoire.tex index 2e5df64..2bdc518 100644 --- a/aleatoire/aleatoire.tex +++ b/aleatoire/aleatoire.tex @@ -11,14 +11,19 @@ \begin{center} \begin{minipage}{0.4\textwidth} -\includegraphics[scale=0.3]{ecran-alea-bloc00} +\includegraphics[scale=\myscale,scale=0.3]{ecran-alea-bloc00} \end{minipage} \begin{minipage}{0.3\textwidth} -\includegraphics[scale=0.25]{ecran-alea-arbre00} +\includegraphics[scale=\myscale,scale=0.25]{ecran-alea-arbre00} \end{minipage} \end{center} +\insertvideo{-AgiGtmzvI0}{Constructions aléatoires} + +\insertvideo{DJWA7bFiimA}{Mouvement avec tkinter} + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -37,7 +42,7 @@ Le lancer aléatoire de centaines de blocs sur une grande grille produit de jolies formes géométriques ressemblant à des algues. \begin{center} -\includegraphics[scale=0.3]{ecran-alea-bloc0} +\includegraphics[scale=\myscale,scale=0.3]{ecran-alea-bloc0} \end{center} \end{cours} @@ -55,10 +60,10 @@ On modélise l'espace de travail par un tableau de $n$ lignes et $p$ colonnes. Au départ le tableau ne contient que des $0$ ; ensuite la présence d'un bloc est représentée par $1$. -Voici comment initialiser le tableau :\\ -\centerline{\ci{tableau = [[0 for j in range(p)] for i in range(n)]}} -On modifie le tableau par des instructions du type :\\ -\centerline{\ci{tableau[i][j] = 1}} +Voici comment initialiser le tableau : +\mycenterline{\ci{tableau = [[0 for j in range(p)] for i in range(n)]}} +On modifie le tableau par des instructions du type : +\mycenterline{\ci{tableau[i][j] = 1}} Voici un exemple de tableau (à gauche) pour représenter la situation graphique de droite (le bloc en haut à droite est en train de tomber). @@ -153,7 +158,7 @@ \textbf{Affichage statique.} Programme l'affichage graphique des blocs à partir d'un tableau. \begin{center} -\includegraphics[scale=0.3]{ecran-alea-bloc1} +\includegraphics[scale=\myscale,scale=0.3]{ecran-alea-bloc1} \end{center} \medskip @@ -171,7 +176,7 @@ \medskip \begin{center} -\includegraphics[scale=0.3]{ecran-alea-bloc2} +\includegraphics[scale=\myscale,scale=0.3]{ecran-alea-bloc2} \end{center} \emph{Indications.} @@ -194,7 +199,7 @@ Voici une construction un peu différente, beaucoup plus longue à calculer, mais qui dessine aussi de jolies figures appelées \og{}arbres browniens\fg{}. \begin{center} -\includegraphics[scale=0.3]{ecran-alea-arbre1} +\includegraphics[scale=\myscale,scale=0.28]{ecran-alea-arbre1} \end{center} @@ -206,7 +211,7 @@ \item Dès que ce bloc touche un autre bloc par un côté, il s'y colle et ne bouge plus. - \item Si ce bloc sort de la grille, il se désintègre. + \item Si le bloc sort de la grille, il se désintègre. \item Une fois le bloc collé ou désintégré, on relance alors un nouveau bloc depuis un point aléatoire de la grille. \end{itemize} @@ -263,8 +268,9 @@ Programme l'affichage graphique à l'aide de \ci{tkinter}. Tu peux ajouter un bouton qui lance $10$ blocs d'un coup. \begin{center} -\includegraphics[scale=0.3]{ecran-alea-arbre2} +\includegraphics[scale=\myscale,scale=0.24]{ecran-alea-arbre2} \end{center} + \end{activite} @@ -280,7 +286,7 @@ Voici un programme qui fait se déplacer un petit carré et le faisant rebondir sur les bords de la fenêtre. \begin{center} -\includegraphics[scale=0.5]{ecran-alea-cours-mouv} +\includegraphics[scale=\myscale,scale=0.5]{ecran-alea-cours-mouv} \end{center} Voici les points principaux : @@ -289,8 +295,9 @@ \item Cet objet est (un petit peu) déplacé par la fonction \ci{deplacer()} qui décale le rectangle de \ci{(dx,dy)}. - \item Le point clé est que cette fonction sera exécutée une nouvelle fois après un court laps de temps. La commande :\\ - \centerline{\ci{canvas.after(50,deplacer)}} + \item Le point clé est que cette fonction sera exécutée une nouvelle fois après un court laps de temps. La commande : + \mycenterline{\ci{canvas.after(50,deplacer)}} + demande une nouvelle exécution de la fonction \ci{deplacer()} après un court délai (ici $50$ millisecondes). \item La répétition de petits déplacements simule le mouvement. @@ -303,7 +310,7 @@ Hauteur = 200 root = Tk() -canvas = Canvas(root, width=Largeur, height=Hauteur, background="white") +canvas = Canvas(root,width=Largeur,height=Hauteur,background="white") canvas.pack(fill="both", expand=True) # Les coordonnées et la vitesse @@ -338,10 +345,11 @@ return # Boutons -bouton_couleur = Button(root,text="Déplacer", width=20, command=action_deplacer) -bouton_couleur.pack(pady=10) +bouton_deplacer=Button(root,text="Déplacer",width=20, + command=action_deplacer) +bouton_deplacer.pack(pady=10) -bouton_quitter = Button(root,text="Quitter", width=20, command=root.quit) +bouton_quitter = Button(root,text="Quitter",width=20,command=root.quit) bouton_quitter.pack(side=BOTTOM, pady=10) root.mainloop() diff --git a/aleatoire/fig-alea-arbre1.tikz b/aleatoire/fig-alea-arbre1.tikz index cbd0a60..fd62a5c 100644 --- a/aleatoire/fig-alea-arbre1.tikz +++ b/aleatoire/fig-alea-arbre1.tikz @@ -11,7 +11,7 @@ \end{scope} -\begin{scope}[xshift=9cm] +\begin{scope}[xshift=10cm] \fill[green!70!black] (3,3) rectangle ++(1,1); \fill[green!70!black] (5,4) rectangle ++(1,1); @@ -29,11 +29,11 @@ \draw[thick] (0,0) grid ++(7,7); -\node[text width=5cm,text centered] at (3.5,-1.2) {\bf Un bloc et ses 8 mouvements possibles}; +\node[text width=4.5cm,text centered] at (3.5,-1.2) {\bf Un bloc et ses 8 mouvements possibles}; \end{scope} -\begin{scope}[xshift=18cm] +\begin{scope}[xshift=20cm] \fill[green!70!black] (3,3) rectangle ++(1,1); @@ -47,11 +47,11 @@ \draw[thick] (0,0) grid ++(7,7); -\node[text width=5cm,text centered] at (3.5,-1.2) {\bf Le mouvement al\'eatoire du bloc}; +\node[text width=4.5cm,text centered] at (3.5,-1.2) {\bf Le mouvement al\'eatoire du bloc}; \end{scope} -\begin{scope}[xshift=3cm,yshift=-10cm] +\begin{scope}[xshift=4cm,yshift=-10cm] \fill[green!70!black] (3,3) rectangle ++(1,1); @@ -72,7 +72,7 @@ \end{scope} -\begin{scope}[xshift=14cm,yshift=-10cm] +\begin{scope}[xshift=16cm,yshift=-10cm] \fill[green!70!black] (3,3) rectangle ++(1,1); \fill[green!70!black] (3,2) rectangle ++(1,1); diff --git a/aleatoire/fig-alea-bloc0.tikz b/aleatoire/fig-alea-bloc0.tikz index b8dd1e6..2bae121 100644 --- a/aleatoire/fig-alea-bloc0.tikz +++ b/aleatoire/fig-alea-bloc0.tikz @@ -16,7 +16,7 @@ \node[scale=0.7,above] at (5.5,4) {$5$}; -\begin{scope}[xshift=7cm] +\begin{scope}[xshift=9cm] \fill[green!70!black] (1,0) rectangle ++(1,1); \fill[green!70!black] (4,0) rectangle ++(1,1); @@ -33,7 +33,7 @@ \node[scale=0.7,above] at (5.5,4) {$5$}; \end{scope} -\begin{scope}[xshift=14cm] +\begin{scope}[xshift=18cm] \fill[green!70!black] (1,0) rectangle ++(1,1); \fill[green!70!black] (4,0) rectangle ++(1,1); @@ -73,7 +73,7 @@ \end{scope} -\begin{scope}[xshift=7cm,yshift=-7cm] +\begin{scope}[xshift=9cm,yshift=-7cm] \fill[green!70!black] (1,0) rectangle ++(1,1); \fill[green!70!black] (4,0) rectangle ++(1,1); @@ -94,7 +94,7 @@ \end{scope} -\begin{scope}[xshift=14cm,yshift=-7cm] +\begin{scope}[xshift=18cm,yshift=-7cm] \fill[green!70!black] (1,0) rectangle ++(1,1); \fill[green!70!black] (4,0) rectangle ++(1,1); diff --git a/aleatoire/tkinter_mouvement.py b/aleatoire/tkinter_mouvement.py index 416849c..9981429 100644 --- a/aleatoire/tkinter_mouvement.py +++ b/aleatoire/tkinter_mouvement.py @@ -44,8 +44,8 @@ def action_deplacer(): return # Boutons -bouton_couleur = Button(root,text="Déplacer", width=20, command=action_deplacer) -bouton_couleur.pack(pady=10) +bouton_deplacer = Button(root,text="Déplacer", width=20, command=action_deplacer) +bouton_deplacer.pack(pady=10) bouton_quitter = Button(root,text="Quitter", width=20, command=root.quit) bouton_quitter.pack(side=BOTTOM, pady=10) diff --git a/binaire/binaire-1.pdf b/binaire/binaire-1.pdf index 0ffdb2a..1ce0971 100644 Binary files a/binaire/binaire-1.pdf and b/binaire/binaire-1.pdf differ diff --git a/binaire/binaire-1.tex b/binaire/binaire-1.tex index 57255ac..4b750ff 100644 --- a/binaire/binaire-1.tex +++ b/binaire/binaire-1.tex @@ -18,6 +18,14 @@ \index{binaire} \index{ecriture@écriture!binaire} + +\insertvideo{EhxiXresX7Y}{Binaire - partie 1 - écriture décimale} + +\insertvideo{_NrAp2C16j4}{Binaire - partie 2 - de l'écriture binaire vers l'entier} + +\insertvideo{D9ZSxpCvE7A}{Binaire - partie 3 - de l'entier vers l'écriture binaire} + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -56,7 +64,7 @@ $$ On calcule donc l'entier correspondant aux chiffres $[d_{p-1},d_{p-2}, \ldots,d_2,d_1,d_0]$ par la formule : -$$n = {\color{blue}d_{p-1}} \times 10^{p-1} + {\color{blue}d_{p-2}} \times 10^{p-2} + \cdots + {\color{blue}d_i} 10^{i} + \cdots + {\color{blue}d_2} \times 10^2 + {\color{blue}d_1} \times 10^1 + {\color{blue}d_0} \times 10^0$$ +$$n = {\color{blue}d_{p-1}} \times 10^{p-1} + {\color{blue}d_{p-2}} \times 10^{p-2} + \cdots + {\color{blue}d_i} \times 10^{i} + \cdots + {\color{blue}d_2} \times 10^2 + {\color{blue}d_1} \times 10^1 + {\color{blue}d_0} \times 10^0$$ \end{cours} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -141,7 +149,7 @@ $$ On calcule donc l'entier correspondant aux \emph{bits} $[b_{p-1},b_{p-2}, \ldots,b_2,b_1,b_0]$ comme une somme de termes $b_i \times 2^i$, par la formule : -$$n = {\color{red}b_{p-1}} \times 2^{p-1} + {\color{red}b_{p-2}} \times 2^{p-2} + \cdots + {\color{red}b_i} 2^i + \cdots + {\color{red}b_2} \times 2^2 + {\color{red}b_1} \times 2^1 + {\color{red}b_0} \times 2^0$$ +$$n = {\color{red}b_{p-1}} \times 2^{p-1} + {\color{red}b_{p-2}} \times 2^{p-2} + \cdots + {\color{red}b_i} \times 2^i + \cdots + {\color{red}b_2} \times 2^2 + {\color{red}b_1} \times 2^1 + {\color{red}b_0} \times 2^0$$ \item \textbf{\Python{} et le binaire.} \Python{} accepte que l'on écrive directement les entiers en écriture binaire, il suffit d'utiliser le préfixe \og{}\ci{0b}\fg{}. Exemples : @@ -343,7 +351,7 @@ Nous avons donc besoin : \begin{itemize} \item de $n\%2$ : le reste de la division euclidienne de $n$ par $2$ (appelé aussi $n$ modulo $2$) ; le reste vaut soit $0$ soit $1$. - \item de $n//2$ : le \defi{quotient} de cette division. + \item de $n//2$ : le quotient de cette division. \end{itemize} Note que le reste $n\%2$ vaut soit $0$ (quand $n$ est pair) soit $1$ (quand $n$ est impair). diff --git a/binaire/binaire-2.pdf b/binaire/binaire-2.pdf index 0e6f47f..6926143 100644 Binary files a/binaire/binaire-2.pdf and b/binaire/binaire-2.pdf differ diff --git a/binaire/binaire-2.tex b/binaire/binaire-2.tex index 7ecc9cf..c54a8fb 100644 --- a/binaire/binaire-2.tex +++ b/binaire/binaire-2.tex @@ -208,8 +208,8 @@ Les lois de Morgan affirment que pour des booléens (vrai/faux) ou des \emph{bits} (1/0), on a toujours les égalités : $$\text{NON}( b_1 \text{ OU } b_2 ) = - \text{NON}( b_1 ) \text{ ET } \text{NON}(b_2), - \qquad \quad + \text{NON}( b_1 ) \text{ ET } \text{NON}(b_2) + \qquad \text{NON}( b_1 \text{ ET } b_2 ) = \text{NON}( b_1 ) \text{ OU } \text{NON}(b_2).$$ diff --git a/binaire/pres-binaire.pdf b/binaire/pres-binaire.pdf new file mode 100644 index 0000000..c511e6c Binary files /dev/null and b/binaire/pres-binaire.pdf differ diff --git a/binaire/pres-binaire.tex b/binaire/pres-binaire.tex new file mode 100644 index 0000000..b443516 --- /dev/null +++ b/binaire/pres-binaire.tex @@ -0,0 +1,415 @@ +\documentclass[11pt,class=report,crop=false]{standalone} +\usepackage[screen]{../python} + +\pagestyle{empty} + +\begin{document} + +% Commande spécifique +\newcommand{\badletter}[1]{\underline{\textcolor{red}{#1}}} + + + +%==================================================================== +\chapitre{Binaire} +%==================================================================== + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\section*{\'Ecriture décimale} + +L'écriture habituelle des entiers se fait dans le système décimal (en base $10$). Par exemple, $70\,685$ c'est +${\color{blue}7} \times 10\,000 ++{\color{blue}0} \times 1\,000 ++{\color{blue}6} \times 100 ++{\color{blue}8} \times 10 ++{\color{blue}5} \times 1$ : +$$ +\begin{array}{|c|c|c|c|c|} + \hline + {\color{blue}7} & {\color{blue}0} & {\color{blue}6} & {\color{blue}8} & {\color{blue}5} \\ + \hline\hline + 10000 & 1000 & 100 & 10 & 1 \\\hline + 10^4 & 10^3 & 10^2 & 10^1 & 10^0 \\ + \hline +\end{array} +$$ + + +\bigskip + +Puissances de $10$ : on note $10^k$ pour $10 \times 10 \times \cdots \times 10$ (avec $k$ facteurs). + +\bigskip + +$$ +\begin{array}{|c|c|c|c|c|c|c|c|} + \hline + {\color{blue}d_{p-1}} & {\color{blue}d_{p-2}}& {\color{blue}\cdots} & {\color{blue}d_i}& {\color{blue}\cdots} & {\color{blue}d_2} & {\color{blue}d_1} & {\color{blue}d_0} \\ + \hline\hline + 10^{p-1} & 10^{p-2} & \cdots & 10^i &\cdots & 10^2 & 10^1 & 10^0 \\ + \hline +\end{array} +$$ + +On calcule donc l'entier correspondant aux chiffres $[d_{p-1},d_{p-2}, \ldots,d_2,d_1,d_0]$ par la formule : +$$n = {\color{blue}d_{p-1}} \times 10^{p-1} + {\color{blue}d_{p-2}} \times 10^{p-2} + \cdots + {\color{blue}d_i} 10^{i} + \cdots + {\color{blue}d_2} \times 10^2 + {\color{blue}d_1} \times 10^1 + {\color{blue}d_0} \times 10^0$$ + +\newpage + +\section*{\'Ecriture décimale} + + \begin{fonction}[\ci{decimale_vers_entier()}] + Usage : \ci{decimale_vers_entier(liste_decimale)} \\ + Entrée : une liste de chiffres entre $0$ et $9$ \\ + Sortie : l'entier dont l'écriture décimale est la liste + + \medskip + Exemple : si l'entrée est \ci{[1,2,3,4]}, la sortie est \ci{1234}. + \end{fonction} + + \emph{Indications.} Faire la somme d'éléments du type + $$d_i \times 10^{i} \quad \text{ pour } 0 \le i < p$$ + où $p$ est la longueur de la liste et $d_i$ est le chiffre en position $i$ \emph{en comptant à partir de la fin}. + + \newpage + +\section*{\'Ecriture décimale (bis)} + +Comment associer à l'entier $1234$ la liste de ses chiffres $[1,2,3,4]$ ? + + On aura besoin de la division euclidienne par $10$ : + \begin{itemize} + \item on calcule par \ci{n \% 10} le \defi{reste}, on l'appelle aussi \defi{$n$ modulo $10$} + \item on calcule par \ci{n // 10} le \defi{quotient} de cette division. + \end{itemize} + +\myfigure{1}{ +\tikzinput{fig-binaire-1} +} + +\bigskip + + Les commandes \Python{} sont simplement \ci{n \% 10} et \ci{n // 10}. + + Exemple : \ci{1234 \% 10} vaut \ci{4} ; \ci{1234 // 10} vaut \ci{123}. + + + \newpage + +\section*{\'Ecriture décimale (bis)} + + +\bigskip + + \begin{itemize} + \item Le chiffre des unités de $n$ s'obtient comme le reste modulo $10$ : c'est $n\%10$. Exemple $1234 \% 10 = 4$. + +\bigskip + \item Le chiffre des dizaines s'obtient à partir du quotient de la division de $n$ par $10$, puis en prenant le chiffre des unités de ce nombre : c'est donc $(n // 10) \% 10$. + Exemple : $1234 // 10 = 123$, puis on a $123 \% 10 = 3$ ; le chiffre des dizaines de $1234$ est bien $3$. + +\bigskip + \item Pour le chiffre de centaines, on calcule le quotient de la division de $n$ par $100$, puis on prend le chiffre des unités. Exemple $1234 // 100 = 12$ ; $2$ est le chiffre des unités de $12$ et c'est le chiffre des centaines de $1234$. + +\bigskip + \item Pour le chiffre des milliers on calcule le quotient de la division par $1000$ puis on prend le chiffre des unités\ldots + \end{itemize} + + + \newpage + +\section*{\'Ecriture décimale (bis)} + +Objectifs : décomposer un entier en la liste de ses chiffres (en base $10$). + + + \begin{algorithme} + Entrée : un entier $n>0$ + + Sortie : la liste de ses chiffres + + \begin{itemize} + \item Partir d'une liste vide. + + \item Tant que $n$ n'est pas nul : + + \begin{itemize} + \item ajouter $n \% 10$ au début de la liste, + \item faire $n \leftarrow n//10$. + \end{itemize} + + \item Le résultat est la liste. + \end{itemize} + + \end{algorithme} + +Programme l'algorithme en une fonction \ci{entier_vers_decimale()}. + + + \begin{fonction}[\ci{entier_vers_decimale()}] + Usage : \ci{entier_vers_decimale(n)} \\ + Entrée : un entier positif \\ + Sortie : la liste de ses chiffres + + \medskip + + Exemple : si l'entrée est \ci{1234}, la sortie est \ci{[1,2,3,4]}. + \end{fonction} + + + + + + + + \newpage + + +\section*{Binaire} + + \textbf{Puissances de 2.} + On note $2^k$ pour $2 \times 2 \times \cdots \times 2$ (avec $k$ facteurs). Par exemple, $2^3 = 2 \times 2 \times 2 = 8$. +$$ +\begin{array}{|c|c|c|c|c|c|c|c|} + \hline + 2^7 & 2^6 & 2^5 & 2^4 & 2^3 & 2^2 & 2^1 & 2^0 \\ + \hline + 128 & 64 & 32 & 16 & 8 & 4 & 2 & 1 \\ + \hline +\end{array} +$$ + +\bigskip + +\textbf{\'Ecriture binaire : un exemple.} + + Tout entier admet une écriture binaire, c'est-à-dire une écriture où les seuls chiffres sont des $0$ ou des $1$. En binaire, les chiffres sont appelés des \defi{bits}.\index{bits@\emph{bits}} + Par exemple, $1.0.1.1.0.0.1$ (prononce les chiffres un par un) est l'écriture binaire de l'entier $89$. Comment faire ce calcul ? C'est comme pour la base $10$, mais en utilisant les puissances de $2$ ! +$$ +\begin{array}{|c|c|c|c|c|c|c|} + \hline + {\color{red}1} & {\color{red}0} & {\color{red}1} & {\color{red}1} & {\color{red}0} & {\color{red}0} & {\color{red}1} \\ + \hline\hline + 64 & 32 & 16 & 8 & 4 & 2 & 1 \\\hline + 2^6 & 2^5 & 2^4 & 2^3 & 2^2 & 2^1 & 2^0 \\ + \hline +\end{array} +$$ + + + Donc l'écriture {\color{red}1}.{\color{red}0}.{\color{red}1}.{\color{red}1}.{\color{red}0}.{\color{red}0}.{\color{red}1} représente l'entier : + $${\color{red}1} \times 64 + {\color{red}0} \times 32 + {\color{red}1} \times 16 + {\color{red}1} \times 8 + {\color{red}0} \times 4 + {\color{red}0} \times 2 + {\color{red}1} \times 1 = 64 + 16 + 8 + 1 = 89.$$ + +\newpage + + \section*{Binaire} + + \textbf{\Python{} et le binaire.} \Python{} accepte que l'on écrive directement les entiers en écriture binaire, il suffit d'utiliser le préfixe \og{}\ci{0b}\fg{}. + Exemples : + \begin{itemize} + \item avec \ci{x = 0b11010}, alors \ci{print(x)} affiche \ci{26}, + \item avec \ci{y = 0b11111}, alors \ci{print(y)} affiche \ci{31}, + \item et \ci{print(x+y)} affiche \ci{57}. + \end{itemize} + + +\bigskip + + Calcule les entiers dont l'écriture binaire est donnée ci-dessous. Tu peux le faire à la main ou t'aider de \Python. Par exemple $1.0.0.1.1$ vaut $2^4+2^1+2^0 = 19$ ce que confirme la commande \ci{0b10011} qui renvoie $19$. + + \begin{itemize} + \item $1.1$, $1.0.1$, $1.0.0.1$, $1.1.1.1$ + \item $1.0.0.0.0$, $1.0.1.0.1$, $1.1.1.1.1$ + \item $1.0.1.1.0.0$, $1.0.0.0.1.1$ + \item $1.1.1.0.0.1.0.1$ + \end{itemize} + + +\newpage + + \section*{Binaire} + + + \textbf{\'Ecriture binaire : formule.} + + + $$ +\begin{array}{|c|c|c|c|c|c|c|c|} + \hline + {\color{red}b_{p-1}} & {\color{red}b_{p-2}}& {\color{red}\cdots} & {\color{red}b_i}& {\color{red}\cdots} & {\color{red}b_2} & {\color{red}b_1} & {\color{red}b_0} \\ + \hline\hline + 2^{p-1} & 2^{p-2} & \cdots & 2^i &\cdots & 2^2 & 2^1 & 2^0 \\ + \hline +\end{array} +$$ + +On calcule donc l'entier correspondant aux \emph{bits} $[b_{p-1},b_{p-2}, \ldots,b_2,b_1,b_0]$ comme une somme de termes $b_i \times 2^i$, par la formule : +$$n = {\color{red}b_{p-1}} \times 2^{p-1} + {\color{red}b_{p-2}} \times 2^{p-2} + \cdots + {\color{red}b_i} 2^i + \cdots + {\color{red}b_2} \times 2^2 + {\color{red}b_1} \times 2^1 + {\color{red}b_0} \times 2^0$$ + + + + \newpage + + +\section*{Binaire} + +Objectifs : à partir de l'écriture binaire, retrouver l'entier (en écriture décimale usuelle). + + \'Ecris une fonction \ci{binaire_vers_entier(liste_binaire)} qui à partir d'une liste représentant l'écriture binaire calcule l'entier correspondant. + + \begin{fonction}[\ci{binaire_vers_entier()}] + Usage : \ci{binaire_vers_entier(liste_binaire)} \\ + Entrée : une liste de \emph{bits} $0$ et $1$ \\ + Sortie : l'entier dont l'écriture binaire est la liste + + \medskip + Exemples : + \begin{itemize} + \item entrée \ci{[1,1,0]}, sortie \ci{6} + \item entrée \ci{[1,1,0,1,1,1]}, sortie \ci{55} + \item entrée \ci{[1,1,0,1,0,0,1,1,0,1,1,1]}, sortie \ci{3383} + \end{itemize} + \end{fonction} + + + + +\newpage + + \section*{Binaire avec Python} + +\Python{} calcule très bien l'écriture binaire d'un entier grâce à la fonction \ci{bin()}. +\index{bin@\ci{bin}} + + \begin{fonctionpython}[\ci{python : bin()}] + Usage : \ci{bin(n)}\\ + Entrée : un entier \\ + Sortie : l'écriture binaire de $n$ sous la forme d'une chaîne de caractères commençant par \ci{'0b'} + + \medskip + + Exemple : + \begin{itemize} + \item \ci{bin(37)} renvoie \ci{'0b100101'} + \item \ci{bin(139)} renvoie \ci{'0b10001011'} + \end{itemize} + \end{fonctionpython} + + +\newpage + + \section*{Calcul de l'écriture binaire} + +Pour calculer l'écriture binaire d'un entier $n$, c'est la même méthode que pour calculer l'écriture décimale mais en remplaçant les divisions par $10$ par des divisions par $2$. + +Nous avons donc besoin : + \begin{itemize} + \item de $n\%2$ : le reste de la division euclidienne de $n$ par $2$ (appelé aussi $n$ modulo $2$) ; le reste vaut soit $0$ soit $1$. + \item de $n//2$ : le quotient de cette division. + \end{itemize} + + Note que le reste $n\%2$ vaut soit $0$ (quand $n$ est pair) soit $1$ (quand $n$ est impair). + + \bigskip + + Voici la méthode générale pour calculer l'écriture binaire d'un entier : +\begin{itemize} + \item On part de l'entier dont on veut l'écriture binaire. + + \item On effectue une suite de divisions euclidiennes par 2 : + \begin{itemize} + \item à chaque division, on obtient un reste qui vaut 0 ou 1 ; + \item on obtient un quotient que l'on divise de nouveau par 2\ldots{} On s'arrête quand ce quotient est nul. + \end{itemize} + + \item On lit l'écriture binaire comme la suite des restes, mais en partant du dernier reste. +\end{itemize} + + +\newpage + \section*{Calcul de l'écriture binaire} + +\begin{exemple} +Calcul de l'écriture binaire de 14. + +\begin{itemize} + \item On divise 14 par 2, le quotient est 7, le reste est 0. + \item On divise 7 (le quotient précédent) par 2 : le nouveau quotient est 3, le nouveau reste est 1. + \item On divise 3 par 2 : quotient 1, reste 1. + \item On divise 1 par 2 : quotient 0, reste 1. + \item C'est terminé (le dernier quotient est nul). + \item Les restes successifs sont 0, 1, 1, 1. On lit l'écriture binaire à l'envers c'est 1.1.1.0. +\end{itemize} + +Les divisions se font de gauche à droite, mais on lit les restes de droite à gauche. + +\myfigure{1}{ +\tikzinput{fig-binaire-2} +} +\end{exemple} + + +\newpage + \section*{Calcul de l'écriture binaire} + +\begin{exemple} +Écriture binaire de 50. + +\myfigure{1}{ +\tikzinput{fig-binaire-3} +} + +Les restes successifs sont 0, 1, 0, 0, 1, 1, donc l'écriture binaire de 50 est 1.1.0.0.1.0. +\end{exemple} + +Calcule à la main l'écriture binaire des entiers suivants. Vérifie tes résultats à l'aide de la fonction \ci{bin()} de \Python. + + \begin{itemize} + \item $13$, $18$, $29$, $31$, + \item $44$, $48$, $63$, $64$, + \item $100$, $135$, $239$, $1023$. + \end{itemize} + + +\newpage + \section*{Calcul de l'écriture binaire} + + + Programme l'algorithme suivant en une fonction \ci{entier_vers_binaire()}. + + \begin{algorithme} + Entrée : un entier $n>0$ + + Sortie : son écriture binaire sous la forme d'une liste + + \begin{itemize} + \item Partir d'une liste vide. + + \item Tant que $n$ n'est pas nul : + + \begin{itemize} + \item ajouter $n \% 2$ au début de la liste, + \item faire $n \leftarrow n//2$. + \end{itemize} + + \item Le résultat est la liste. + \end{itemize} + + \end{algorithme} + + \begin{fonction}[\ci{entier_vers_binaire()}] + Usage : \ci{entier_vers_binaire(n)} \\ + Entrée : un entier positif \\ + Sortie : son écriture binaire sous forme d'une liste + + \medskip + Exemple : si l'entrée est \ci{204}, la sortie est \ci{[1,1,0,0,1,1,0,0]}. + \end{fonction} + + + + +\end{document} diff --git a/bitcoin/bitcoin.pdf b/bitcoin/bitcoin.pdf index 94e58cc..96e9e07 100644 Binary files a/bitcoin/bitcoin.pdf and b/bitcoin/bitcoin.pdf differ diff --git a/bitcoin/bitcoin.tex b/bitcoin/bitcoin.tex index 4f93e2f..199f819 100644 --- a/bitcoin/bitcoin.tex +++ b/bitcoin/bitcoin.tex @@ -12,6 +12,17 @@ \index{bitcoin@\emph{bitcoin}} + +\insertvideo{lcVC2fqByEo}{Bitcoin - partie 1 - principe général} + +\insertvideo{6yZAHoPGGbw}{Bitcoin - partie 2 - fonction de hachage} + +\insertvideo{FPh9huqhJJg}{Bitcoin - partie 3 - preuve de travail} + +\insertvideo{XfVpekxADyM}{Bitcoin - partie 4 - tes bitcoins} + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Activité 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -69,7 +80,8 @@ \item Au lieu de chercher une solution exacte à notre problème $x^2 = y \pmod{p}$, qui est équivalent à $x^2-y \pmod{p} = 0$. On cherche une solution approchée, c'est-à-dire qui vérifie : $$x^2 - y \pmod{p} \ \le m.$$ Par exemple si $m=5$, alors on peut avoir (modulo $p$) : $x^2 - y = 0$, $x^2 - y = 1$, - $x^2-y = 2$,\ldots, $x^2-y=5$. + $x^2-y = 2$,\ldots{} ou $x^2-y=5$. + Maintenant il y a bien plus de solutions possibles. Programme une fonction \ci{racine_approchee(y,marge)} qui trouve une solution approchée à notre problème $x^2 = y \pmod{p}$. @@ -85,8 +97,8 @@ 10651 \quad 100109 \quad 1300573 \quad -15486869 \quad -179426321 \quad +15486869$$ +$$179426321 \quad 2276856017 \quad 32416187567$$ \end{activite} @@ -102,7 +114,7 @@ \index{module!time@\ci{time}} \index{time@\ci{time}} -Le module \ci{time} permet de chronométrer le temps d'exécution mais aussi de savoir la date et l'heure (voir aussi le module \ci{timeit} expliqué dans la fiche \og{}Arithmétique -- Tant que\fg{}). +Le module \ci{time} permet de chronométrer le temps d'exécution mais aussi de savoir la date et l'heure (voir aussi le module \ci{timeit} expliqué dans la fiche \og{}Arithmétique -- Tant que -- I\fg{}). Voici un petit script pour mesurer le temps de calcul d'une instruction. \begin{lstlisting} @@ -154,7 +166,7 @@ \bigskip Pour éviter que quelqu'un ne vienne truquer le livre de compte, après chaque transaction on ajoute dans le livre une certification construite à partir d'une preuve de travail. -Voici ce que l'on écrit dans le livre +Voici ce que l'on écrit dans le livre : \begin{enumerate} \item On commence par une preuve de travail quelconque. Pour nous ce sera \ci{[0,0,0,0,0,0]}. @@ -199,12 +211,14 @@ \item On aura besoin de transformer une phrase en une liste de nombres. De plus, on va découper nos listes en blocs de taille $N$ (avec $N=6$), on rajoute donc des zéros en début de liste afin qu'elle soit de longueur un multiple de $N$. - Écris une fonction \ci{phrase_vers_liste(phrase)} qui convertit une chaîne de caractères en liste d'entiers entre $0$ et $99$ et si besoin rajoute des zéros devant afin que la liste ait la bonne taille. + Écris une fonction \ci{phrase_vers_liste(phrase)} qui convertit une chaîne de caractères en une liste d'entiers entre $0$ et $99$ et si besoin rajoute des zéros devant afin que la liste ait la bonne taille. - La formule à utiliser pour convertir un caractère en un entier strictement inférieur à $100$ est :\\ - \centerline{\ci{ord(c) \% 100}} - Par exemple : si \ci{phrase = "Vive moi !"} alors la fonction renvoie :\\ -\centerline{\ci{[0, 0, 86, 5, 18, 1, 32, 9, 11, 5, 32, 33]}} + La formule à utiliser pour convertir un caractère en un entier strictement inférieur à $100$ est : + \mycenterline{\ci{ord(c) \% 100}} + + Par exemple : si \ci{phrase = "Vive moi !"} alors la fonction renvoie : +\mycenterline{\ci{[0, 0, 86, 5, 18, 1, 32, 9, 11, 5, 32, 33]}} + Le caractère \ci{"i"} à pour code ASCII/unicode $105$ donc, modulo $100$, le nombre est $5$. Note que la fonction ajoute deux $0$ en début de liste afin d'avoir une longueur qui est un multiple de $N=6$. \end{enumerate} @@ -226,10 +240,11 @@ Dans cette activité, notre message est une liste d'entiers (entre $0$ et $99$) de longueur un multiple quelconque de $N=6$, nous le transformons en une liste de longueur $N=6$ : son empreinte (ou \emph{hash}). Voici des exemples de ce que va faire notre fonction de hachage : \begin{itemize} - \item la liste \ci{[1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]} a pour empreinte :\\ - \centerline{\ci{[10, 0, 58, 28, 0, 90]}} - \item la liste \ci{[1, 1, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]} a pour empreinte :\\ - \centerline{\ci{[25, 14, 29, 1, 19, 6]}} + \item la liste \ci{[1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]} a pour empreinte : + \mycenterline{\ci{[10, 0, 58, 28, 0, 90]}} + + \item la liste \ci{[1, 1, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]} a pour empreinte : + \mycenterline{\ci{[25, 14, 29, 1, 19, 6]}} \end{itemize} L'idée est de mélanger les nombres par bloc de $N=6$ entiers, puis de combiner ce bloc au suivant et de recommencer, jusqu'à obtenir un seul bloc. @@ -292,13 +307,13 @@ \end{itemize} -Voici le schéma d'une situation avec trois blocs : dans un premier temps il y a trois blocs (A,B,C) ; dans un second temps il ne reste plus que deux bloc (B' et C) ; à la fin il ne reste qu'un bloc (C'') : c'est l'empreinte ! +Voici le schéma d'une situation avec trois blocs : dans un premier temps il y a trois blocs (A,B,C) ; dans un second temps il ne reste plus que deux blocs (B' et C) ; à la fin il ne reste qu'un bloc (C'') : c'est l'empreinte ! \myfigure{0.5}{ \tikzinput{fig-bitcoin-2} } - Exemple avec la liste $[0,1,2,3,4,5,1,1,1,1,1,1,1,10,10,10,10,10,10]$. + Exemple avec la liste $[0,1,2,3,4,5,1,1,1,1,1,1,10,10,10,10,10,10]$. \begin{itemize} \item Le premier bloc est $[0,1,2,3,4,5]$, son mélange à $10$ tours est $[98, 95, 86, 55, 66, 75]$. @@ -328,23 +343,30 @@ On va construire un problème compliqué à résoudre, pour lequel, si quelqu'un nous donne la solution, alors il est facile de vérifier qu'elle convient. +\medskip + \textbf{Problème à résoudre.} On nous donne une liste, il s'agit de trouver un bloc tel que, lorsque qu'on le rajoute à la liste, cela produit un hachage commençant par des zéros. -Plus précisément étant donné une liste \ci{liste} et un objectif maximal \ci{Max}, il s'agit de trouver un bloc \ci{preuve} qui, concaténé à la liste puis haché, est plus petit que la liste \ci{Max}, c'est-à-dire : \\ -\centerline{\ci{hachage(liste + preuve)} \ plus petit que \ \ci{Max}} +Plus précisément étant donné une liste \ci{liste} et un objectif maximal \ci{Max}, il s'agit de trouver un bloc \ci{preuve} qui, concaténé à la liste puis haché, est plus petit que la liste \ci{Max}, c'est-à-dire : +\mycenterline{\ci{hachage(liste + preuve)} \ plus petit que \ \ci{Max}} La liste est de longueur quelconque (un multiple de $N=6$), la preuve est un bloc de longueur $N$, l'objectif est de trouver une liste commençant par des $0$ (voir l'activité 2). +\medskip + Par exemple : soit la \ci{liste = [0,1,2,3,4,5]} et \ci{Max = [0,0,7]}. Quel bloc \ci{preuve} puis-je concaténer à \ci{liste} pour résoudre mon problème ? \begin{itemize} - \item \ci{preuve = [12, 3, 24, 72, 47, 77]} convient car concaténé à notre liste cela donne \ci{[0,1,2,3,4,5,12, 3, 24, 72, 47, 77]} et le hachage de toute cette liste vaut - \ci{[0, 0, 5, 47, 44, 71]} qui commence par \ci{[0,0,5]} plus petit que l'objectif. + \item \ci{preuve = [12,3,24,72,47,77]} convient car concaténé à notre liste cela donne \ci{[0,1,2,3,4,5,12,3,24,72,47,77]} et le hachage de toute cette liste vaut + \ci{[0,0,5,47,44,71]} qui commence par \ci{[0,0,5]} plus petit que l'objectif. - \item \ci{preuve = [0, 0, 2, 0, 61, 2]} convient aussi car après concaténation on a - \ci{[0,1,2,3,4,5,0, 0, 2, 0, 61, 2]} dont le hachage donne \ci{[0, 0, 3, 12, 58, 92]}. + \item \ci{preuve = [0,0,2,0,61,2]} convient aussi car après concaténation on a + \ci{[0,1,2,3,4,5,0,0,2,0,61,2]} dont le hachage donne \ci{[0,0,3,12,58,92]}. - \item \ci{[97, 49, 93, 87, 89, 47]} ne convient pas, car après concaténation puis hachage on obtient \ci{[0, 0, 8, 28, 6, 60]} qui est plus grand que l'objectif voulu. + \item \ci{[97,49,93,87,89,47]} ne convient pas, car après concaténation puis hachage on obtient + \ci{[0,0,8,28,6,60]} qui est plus grand que l'objectif voulu. \end{itemize} +\bigskip + \begin{enumerate} \item \textbf{Vérification (facile).} @@ -401,14 +423,14 @@ \item Une \emph{transaction} est une chaîne de caractères comprenant un nom et la somme à ajouter (ou à retrancher) à son compte. Par exemple \ci{"Abel +25"} ou \ci{"Barbara -45"}. - Programme une fonction \ci{ajout_transaction(transaction)} qui ajoute la chaine de caractère \ci{transaction} à la liste \ci{Livre}. + Programme une fonction \ci{ajout_transaction(transaction)} qui ajoute la chaîne de caractères \ci{transaction} à la liste \ci{Livre}. Par exemple après l'initialisation \ci{ajout_transaction("Camille +100")}, - \ci{Livre} vaut \ci{[ [0, 0, 0, 0, 0, 0], "Camille +100" ]}. + \ci{Livre} vaut \ci{[ [0,0,0,0,0,0], "Camille +100" ]}. Attention, pour pouvoir modifier \ci{Livre} il faut commencer la fonction par : \ci{global Livre}. \end{enumerate} - \item Dès qu'une transaction est ajoutée, il faut calculer et ajouter au livre de comptes une preuve de travail. Programme une fonction \ci{minage()}, sans paramètre, qui ajoute une preuve de travail au livre. + \item Dès qu'une transaction est ajoutée, il faut calculer et ajouter au livre de compte une preuve de travail. Programme une fonction \ci{minage()}, sans paramètre, qui ajoute une preuve de travail au livre. Voici comment faire : \begin{itemize} @@ -418,10 +440,12 @@ \item On calcule une preuve de travail de cette liste. \item On ajoute cette preuve au livre de compte. \end{itemize} - Par exemple si le livre se termine par :\\ - \centerline{\ci{[3, 1, 4, 1, 5, 9], "Abel +35"}} - alors après calcul de la preuve de travail le livre se termine par exemple par :\\ - \centerline{\ci{[3, 1, 4, 1, 5, 9], "Abel +35", [32, 17, 37, 73, 52, 90]}} + Par exemple si le livre se termine par : + \mycenterline{\ci{[3,1,4,1,5,9], "Abel +35"}} + + alors après calcul de la preuve de travail le livre se termine par exemple par : + \mycenterline{\ci{[3,1,4,1,5,9], "Abel +35", [32,17,37,73,52,90]}} + On rappelle que la preuve de travail n'est pas unique et qu'en plus elle dépend de l'objectif \ci{Max}. diff --git a/bitcoin/fig-bitcoin-1.tikz b/bitcoin/fig-bitcoin-1.tikz index 2d39fa9..e69d27d 100644 --- a/bitcoin/fig-bitcoin-1.tikz +++ b/bitcoin/fig-bitcoin-1.tikz @@ -32,10 +32,10 @@ % Multiplications \foreach \i/\p in {0/7,2/13,4/19}{ - \draw[<-,>=latex,ultra thick,red] (\i+0.35,7.75) -- ++(0,1) node[midway,right,scale=0.6,black]{$\times \p + 1$}; + \draw[<-,>=latex,ultra thick,red] (\i+0.35,7.75) -- ++(0,1) node[midway,right,scale=0.45,black]{$\times \p + 1$}; }; \foreach \i/\p in {1/11,3/17,5/23}{ - \draw[<-,>=latex,ultra thick,red] (\i+0.35,7.75) -- ++(0,1) node[pos=0.7,right,scale=0.6,black]{$\times \p + 1$}; + \draw[<-,>=latex,ultra thick,red] (\i+0.35,7.75) -- ++(0,1) node[pos=0.7,right,scale=0.45,black]{$\times \p + 1$}; }; % Additions diff --git a/bitcoin/fig-bitcoin-3.tikz b/bitcoin/fig-bitcoin-3.tikz index 10090cb..cfbd0cc 100644 --- a/bitcoin/fig-bitcoin-3.tikz +++ b/bitcoin/fig-bitcoin-3.tikz @@ -2,7 +2,7 @@ \draw[ultra thick] (0,0) rectangle ++(6,2); -\node[blue] at (3,1) {\bf preuve initiale}; +\node[blue,scale=0.9] at (3,1) {\bf preuve initiale}; \begin{scope}[xshift=9cm] \draw[ultra thick] (0,0) rectangle ++(6,2); diff --git a/bitcoin/fig-bitcoin-4.tikz b/bitcoin/fig-bitcoin-4.tikz index 8cac821..5093400 100644 --- a/bitcoin/fig-bitcoin-4.tikz +++ b/bitcoin/fig-bitcoin-4.tikz @@ -2,7 +2,7 @@ \draw[ultra thick] (0,0) rectangle ++(6,2); -\node[blue] at (3,1) {\bf preuve initiale}; +\node[blue,scale=0.9] at (3,1) {\bf preuve initiale}; \begin{scope}[xshift=9cm] \draw[ultra thick] (0,0) rectangle ++(6,2); diff --git a/bitcoin/pres-bitcoin.pdf b/bitcoin/pres-bitcoin.pdf new file mode 100644 index 0000000..6bc0b7b Binary files /dev/null and b/bitcoin/pres-bitcoin.pdf differ diff --git a/bitcoin/pres-bitcoin.tex b/bitcoin/pres-bitcoin.tex new file mode 100644 index 0000000..018ca6b --- /dev/null +++ b/bitcoin/pres-bitcoin.tex @@ -0,0 +1,388 @@ +\documentclass[12pt,class=report,crop=false]{standalone} +\usepackage[screen]{../python} + + +\pagestyle{empty} + +\begin{document} + + +%==================================================================== +\chapitre{Bitcoin} +%==================================================================== + +\section*{Bitcoin} + +\begin{itemize} + \item La monnaie \emph{bitcoin} est une monnaie dématérialisée. + + \item Les transactions sont enregistrées dans un grand livre de compte appelé \emph{blockchain}. + + + \item Imaginons un groupe d'amis qui souhaitent partager les dépenses du groupe de façon la plus simple possible. + + \item Au départ tout le monde dispose de 1000 \emph{bitcoins} et on note au fur et à mesure les dépenses et les recettes de chacun. + + \item On note sur le livre de compte la liste des dépenses/recettes, par exemple : +\begin{itemize} + \item \og{}Amir a dépensé 100 \emph{bitcoins}\fg{} + \item \og{}Barbara a reçu 45 \emph{bitcoins}\fg{} + \item etc. +\end{itemize} + + \item Il suffit de parcourir tout le livre pour savoir combien chacun a reçu ou dépensé depuis le début. +\end{itemize} + +\newpage + +\section*{Blockchain} + +Pour éviter que quelqu'un ne vienne truquer le livre de compte, après chaque transaction on ajoute dans le livre une certification construite à partir d'une preuve de travail. +\begin{enumerate} + \item On commence par une preuve de travail quelconque. Pour nous ce sera + \ci{[0,0,0,0,0,0]}. + \item On écrit la première transaction (par exemple \ci{"Amir -100"}). + \item On calcule et on écrit dans le livre une preuve de travail, qui va servir de certificat. C'est une liste + (par exemple \ci{[56,42,10,98,2,34]}) obtenue après beaucoup de calculs prenant en compte la transaction précédente et la précédente preuve de travail. + \item À chaque nouvelle transaction (par exemple \ci{"Barbara +45"}), quelqu'un calcule une preuve de travail pour la dernière transaction associée à la précédente preuve. On écrit la transaction, puis la preuve de travail. +\end{enumerate} + +\myfigure{0.5}{ +\tikzinput{fig-bitcoin-4} +} + +\newpage + + +\section*{Preuve de travail} + + + +\begin{itemize} + \item Une preuve de travail est la résolution d'un problème difficile, mais où il est facile de vérifier que la solution obtenue est correcte. + + \item Comme les sudokus par exemple : il suffit de dix secondes pour vérifier qu'une grille est remplie correctement, par contre il a fallu plus de dix minutes pour le résoudre. +\end{itemize} + +\myfigure{0.5}{ +\tikzinput{fig-bitcoin-4} +} + +\newpage + +\section*{Fonction de hachage} + + +\begin{itemize} + \item À partir d'un long message nous calculons une courte empreinte. + \item Il est difficile de trouver deux messages différents ayant la même empreinte. + \item Ici notre message est une liste d'entiers (entre $0$ et $99$) de longueur un multiple quelconque de $N=6$. + \item Son empreinte (ou \emph{hash}) sera une liste de longueur $N=6$. + + \item Exemple : \ci{[1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]} a pour empreinte :\\ + \centerline{\ci{[10, 0, 58, 28, 0, 90]}} + \item Exemple : \ci{[1, 1, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]} a pour empreinte :\\ + \centerline{\ci{[25, 14, 29, 1, 19, 6]}} +\end{itemize} + + L'idée est de mélanger les nombres par bloc de $N=6$ entiers, puis de combiner ce bloc au suivant et de recommencer, jusqu'à obtenir un seul bloc. + +\newpage + +\section*{Un tour} + + Pour un bloc $[b_0,b_1,b_2,b_3,b_4,b_5]$ de taille $N=6$, \emph{faire un tour} consiste à faire les opérations suivantes : + \begin{enumerate} + \item On additionne certains entiers : + $$[b_0',b_1',b_2',b_3',b_4',b_5'] = [b_0,b_1+b_0,b_2,b_3+b_2,b_4,b_5+b_4]$$ + + \item On multiplie ces entiers par des nombres premiers (dans l'ordre $7,11,13,17,19,23$) et on rajoute $1$ : + $$[b_0'',b_1'',b_2'',b_3'',b_4'',b_5''] = [7 \times b_0'+1,11\times b_1'+1,13\times b_2'+1,17 \times b_3'+1,19 \times b_4'+1,23 \times b_5'+1]$$ + + \item On effectue une permutation circulaire (le dernier passe devant) : + $$[b_0''',b_1''',b_2''',b_3''',b_4''',b_5'''] = [b_5'',b_0'',b_1'',b_2'',b_3'',b_4'']$$ + + \item On réduit chaque entier modulo $100$ afin d'obtenir des entiers entre $0$ et $99$. + \end{enumerate} + + +\myfigure{0.7}{ +\tikzinput{fig-bitcoin-1} +} + + +\newpage +\begin{minipage}{0.6\textwidth} + Partant du bloc $[0, 1, 2, 3, 4, 5]$, on a donc successivement : + \begin{enumerate} + \item additions : $[0, 1, 2, 5, 4, 9]$ + + \item multiplications : $[7\times 0 + 1, 11\times 1+1, 13\times 2+1, 17 \times 5+1,19 \times 4+1, 23 \times 9+1] = [1,12,27,86,77,208]$ + + \item permutation : $[208,1,12,27,86,77]$ + + \item réduction modulo $100$ : $[8,1,12,27,86,77]$ + \end{enumerate} + + Vérifie que le bloc $[1, 1, 2, 3, 4, 5]$ est transformé en $[8, 8, 23, 27, 86, 77]$. +\end{minipage}\quad +\begin{minipage}{0.3\textwidth} + \myfigure{0.7}{ +\tikzinput{fig-bitcoin-1} +} +\end{minipage} + + +\newpage + + +\section*{Dix tours} + + Pour bien mélanger chaque bloc, itère dix fois les opérations précédentes. + Après $10$ tours : + \begin{itemize} + \item le bloc $[0, 1, 2, 3, 4, 5]$ devient $[98, 95, 86, 55, 66, 75]$, + \item le bloc $[1, 1, 2, 3, 4, 5]$ devient $[18, 74, 4, 42, 77, 42]$. + \end{itemize} + Deux blocs proches sont transformés en deux blocs très différents ! + +\newpage + +\section*{Hachage d'une liste} + + Partant d'une liste de longueur un multiple de $N=6$, on la découpe en blocs de longueur $6$ et on calcule l'empreinte de cette liste selon l'algorithme suivant : + \begin{itemize} + \item On extrait le premier bloc de la liste, on effectue $10$ tours de mélange. + \item On ajoute terme à terme (et modulo $100$), le résultat de ce mélange au second bloc. + \item On recommence en partant du nouveau second bloc. + \item Lorsqu'il ne reste plus qu'un bloc, on effectue $10$ tours de mélange, le résultat est l'empreinte de la liste. + \end{itemize} + + +Voici le schéma d'une situation avec trois blocs : dans un premier temps il y a trois blocs (A,B,C) ; dans un second temps il ne reste plus que deux bloc (B' et C) ; à la fin il ne reste qu'un bloc (C'') : c'est l'empreinte ! +\myfigure{0.5}{ +\tikzinput{fig-bitcoin-2} +} + +\newpage + + Exemple avec la liste $[0,1,2,3,4,5,1,1,1,1,1,1,10,10,10,10,10,10]$. + \begin{itemize} + \item Le premier bloc est $[0,1,2,3,4,5]$, son mélange à $10$ tours est + $[98, 95, 86, 55, 66, 75]$. + \item On ajoute ce mélange au second bloc $[1,1,1,1,1,1]$. + \item La liste restante est maintenant $[99,96,87,56,67,76,10,10,10,10,10,10]$. + \item On recommence. Le nouveau premier bloc est $[99,96,87,56,67,76]$, son mélange à $10$ tours vaut $[60, 82, 12, 94, 6, 80]$, on l'ajoute au dernier bloc $[10,10,10,10,10,10$] pour obtenir (modulo $100$) $[70,92,22,4,16,90]$. + \item On effectue un dernier mélange à $10$ tours pour obtenir l'empreinte : $[77, 91, 5, 91, 89, 99]$. + \end{itemize} + + +\myfigure{0.4}{ +\tikzinput{fig-bitcoin-2} +} + +\newpage + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Activité 4 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\section*{Preuve de travail - Minage} + + +On va construire un problème compliqué à résoudre, pour lequel, si quelqu'un nous donne la solution, alors il est facile de vérifier qu'elle convient. + +\bigskip + +\textbf{Problème à résoudre.} On nous donne une liste, il s'agit de trouver un bloc tel que, lorsque qu'on le rajoute à la liste, cela produit un hachage commençant par des zéros. +Plus précisément étant donné une liste \ci{liste} et un objectif maximal \ci{Max}, il s'agit de trouver un bloc \ci{preuve} qui, concaténé à la liste puis haché, est plus petit que la liste \ci{Max}, c'est-à-dire : \\ +\centerline{\ci{hachage(liste + preuve)} \ plus petit que \ \ci{Max}} + + +La liste est de longueur quelconque (un multiple de $N=6$), la preuve est un bloc de longueur $N$, l'objectif est de trouver une liste commençant par des $0$. + +\newpage + +\textbf{Exemple.} + +Soit la \ci{liste = [0,1,2,3,4,5]} et \ci{Max = [0,0,7]}. Quel bloc \ci{preuve} puis-je concaténer à \ci{liste} pour résoudre mon problème ? + +\bigskip + +\begin{itemize} + \item + \begin{itemize} + \item \ci{preuve = [12, 3, 24, 72, 47, 77]} convient + \item car concaténé à notre liste cela donne \ci{[0,1,2,3,4,5,12, 3, 24, 72, 47, 77]} + \item et le hachage de toute cette liste vaut + \ci{[0, 0, 5, 47, 44, 71]} + \item qui commence par \ci{[0,0,5]} plus petit que l'objectif. + \end{itemize} + +\bigskip + + \item + \begin{itemize} + \item + \ci{preuve = [0, 0, 2, 0, 61, 2]} convient aussi + \item car après concaténation on a + \ci{[0,1,2,3,4,5,0, 0, 2, 0, 61, 2]} + \item dont le hachage donne \ci{[0, 0, 3, 12, 58, 92]}. + \end{itemize} + + \bigskip + + \item \ci{[97, 49, 93, 87, 89, 47]} ne convient pas, car après concaténation puis hachage on obtient \ci{[0, 0, 8, 28, 6, 60]} qui est plus grand que l'objectif voulu. +\end{itemize} + + +\newpage + +Variable globale \ci{Max = [0,0,7]} + + \bigskip + +\textbf{Vérification (facile).} + + Programme une fonction \ci{verification_preuve_de_travail(liste,preuve)} qui renvoie vrai si la solution \ci{preuve} proposée convient pour \ci{liste}. + + \bigskip + +\textbf{Recherche de solution (difficile).} + + Programme une fonction \ci{preuve_de_travail(liste)} qui cherche un bloc \ci{preuve} solution à notre problème pour la liste donnée. + + \bigskip + + \emph{Indications.} + + \begin{itemize} + \item La méthode la plus simple est de prendre un bloc \ci{preuve} de nombres au hasard et de recommencer jusqu'à trouver une solution. + + \item Tu peux aussi tester systématiquement tous les blocs en commençant avec \ci{[0,0,0,0,0,0]}, puis \ci{[0,0,0,0,0,1]}\ldots{} et t'arrêter au premier qui convient. + + \item Tu ajustes la difficulté du problème en changeant l'objectif : facile avec \ci{Max = [0,0,50]}, moyen avec \ci{Max = [0,0,5]}, difficile avec \ci{Max = [0,0,0]}, trop difficile avec \ci{Max = [0,0,0,0]}. + + \item Comme il existe plusieurs solutions, tu n'obtiens pas nécessairement la même solution à chaque recherche. + + \end{itemize} + +\newpage + + \textbf{Temps de calcul.} + + \begin{itemize} + \item Compare le temps de calcul d'une simple vérification par rapport au temps de recherche d'une solution. + + \item Choisis l'objectif \ci{Max} de sorte que la recherche d'une preuve de travail nécessite environ entre 30 et 60 secondes de calculs. + + \item Pour le \emph{bitcoin}, ceux qui calculent des preuves de travail sont appelés les \emph{mineurs}. + + \item Le premier qui trouve une preuve gagne une récompense. + + \item La difficulté du problème est ajustée de sorte +que le temps de calcul mis par le gagnant (parmi l'ensemble de tous les mineurs) pour trouver une solution, soit d'environ $10$ minutes. + + \end{itemize} + +\newpage + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Activité 4 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\section*{Tes \emph{bitcoins}} + +\myfigure{0.5}{ +\tikzinput{fig-bitcoin-3} +} + +\newpage + +\textbf{Initialisation et ajout d'une transaction.} + + \begin{enumerate} + \item Variable globale \ci{Livre} initialisée à \ci{Livre = [ [0,0,0,0,0,0] ]} . + + \item Une \emph{transaction} est une chaîne de caractères comprenant un nom et la somme à ajouter (ou à retrancher) à son compte. Par exemple \ci{"Abel +25"} ou \ci{"Barbara -45"}. + + Programme une fonction \ci{ajout_transaction(transaction)} qui ajoute la chaîne de caractère \ci{transaction} à la liste \ci{Livre}. + + +Par exemple après l'initialisation +\ci{ajout_transaction("Camille +100")}, + \ci{Livre} vaut \ci{[ [0, 0, 0, 0, 0, 0], "Camille +100" ]}. + + + Attention, pour pouvoir modifier \ci{Livre} il faut commencer la fonction par : \ci{global Livre}. + + \newpage + + \textbf{Phrase vers liste d'entiers.} + + Écris une fonction \ci{phrase_vers_liste(phrase)} qui convertit une chaîne de caractères en liste d'entiers entre $0$ et $99$ et si besoin rajoute des zéros devant afin que la liste ait une longueur un multiple de $N=6$. + + \bigskip + + La formule à utiliser pour convertir un caractère en un entier strictement inférieur à $100$ est :\\ + \centerline{\ci{ord(c) \% 100}} + + \bigskip + + Exemple : \\ + \centerline{\ci{phrase = "Vive moi !"}} + + la fonction renvoie :\\ +\centerline{\ci{[0, 0, 86, 5, 18, 1, 32, 9, 11, 5, 32, 33]}} + + + +\newpage + + \textbf{Calcul et ajout d'une preuve de travail.} + +Dès qu'une transaction est ajoutée, il faut calculer et ajouter au livre de compte une preuve de travail. Programme une fonction \ci{minage()}, sans paramètre, qui ajoute une preuve de travail au livre. + +Voici comment faire : + \begin{itemize} + \item On prend la dernière transaction \ci{transaction}, on la transforme en une liste d'entiers par la fonction \ci{phrase_vers_liste()}. + \item On prend la preuve de travail \ci{prec_preuve} située juste avant cette transaction. + \item On forme la liste \ci{liste} composée d'abord des éléments de \ci{prec_preuve}, puis des éléments de la liste d'entiers obtenue en convertissant la chaîne \ci{transaction}. + \item On calcule une preuve de travail de cette liste. + \item On ajoute cette preuve au livre de compte. + \end{itemize} + Par exemple si le livre se termine par :\\ + \centerline{\ci{[3, 1, 4, 1, 5, 9], "Abel +35"}} + alors après calcul de la preuve de travail le livre se termine par exemple par :\\ + \centerline{\ci{[3, 1, 4, 1, 5, 9], "Abel +35", [32, 17, 37, 73, 52, 90]}} + On rappelle que la preuve de travail n'est pas unique et qu'en plus elle dépend + de l'objectif \ci{Max}. + + \newpage + + \textbf{Vérification du livre de compte.} + +Une seule personne à la fois ajoute une preuve de travail. Par contre tout le monde a la possibilité de vérifier que la preuve proposée est correcte (et devrait le faire). + + + Écris une fonction \ci{verification_livre()}, sans paramètre, qui vérifie que la dernière preuve ajoutée au \ci{Livre} est valide. + + + \bigskip + + +\textbf{Exemple.} + +Écris un livre de compte qui correspond aux données suivantes : + \begin{itemize} + \item On prend \ci{Max = [0,0,5]} et au départ \ci{Livre = [ [0,0,0,0,0,0] ]}. + \item \ci{"Alfred -100"} (Alfred doit 100 \emph{bitcoins}). + \item Barnabé en reçoit 150. + \item Chloé gagne 35 \emph{bitcoins}. + \end{itemize} + +\end{enumerate} + + + +\end{document} diff --git a/chaines/chaines.pdf b/chaines/chaines.pdf index 7e11b8b..3a37c05 100644 Binary files a/chaines/chaines.pdf and b/chaines/chaines.pdf differ diff --git a/chaines/chaines.tex b/chaines/chaines.tex index 1a58c24..d31c803 100644 --- a/chaines/chaines.tex +++ b/chaines/chaines.tex @@ -16,6 +16,11 @@ \objectifs{Tu vas faire quelques activités amusantes en manipulant les chaînes de caractères.} +\insertvideo{t2DSnx0R_NI}{Chaîne de caractères - partie 1} + +\insertvideo{4XN1lN-9jtM}{Chaîne de caractères - partie 2} + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -120,12 +125,14 @@ \item Rassemble tout ton travail des trois premières questions dans une fonction \ci{met_au_pluriel()}. La fonction n'affiche rien, mais renvoie le mot au pluriel. + \medskip + \begin{fonction}[\ci{met_au_pluriel()}] Usage : \ci{met_au_pluriel(mot)} \\ Entrée : un mot (une chaîne de caractères) \\ Sortie : le pluriel du mot - \medskip + \bigskip Exemples : \begin{itemize} @@ -137,12 +144,14 @@ \item Écris une fonction \ci{affiche_conjugaison()} qui conjugue un verbe du premier groupe au présent. + \medskip + \begin{fonction}[\ci{affiche_conjugaison()}] Usage : \ci{affiche_conjugaison(verbe)} \\ Entrée : un verbe du premier groupe (une chaîne de caractères se terminant par \ci{"er"}) \\ Sortie : pas de résultat mais l'affichage de la conjugaison du verbe au présent - \medskip + \bigskip Exemple : \begin{itemize} @@ -161,6 +170,10 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\bigskip +\bigskip + + \begin{cours}[Un peu plus sur les chaînes] \sauteligne @@ -174,19 +187,29 @@ \end{minipage} \end{center} - \item On peut tester si un caractère appartient à une certaine liste de caractères. Par exemple : \\ - \centerline{\codeinline{if carac in ["a", "A", "b", "B", "c", "C"]:}} + \item On peut tester si un caractère appartient à une certaine liste de caractères. Par exemple : + + \smallskip + + \mycenterline{\codeinline{if carac in ["a", "A", "b", "B", "c", "C"]:}} + \index{in@\ci{in}} permet d’exécuter des instructions si le caractère \ci{carac} est l'une des lettres a, A, b, B, c, C. - Pour éviter certaines lettres, on utiliserait : \\ - \centerline{\codeinline{if carac not in ["X", "Y", "Z"]:}} + Pour éviter certaines lettres, on utiliserait : + + \smallskip + + \mycenterline{\codeinline{if carac not in ["X", "Y", "Z"]:}} + \index{not in@\ci{not in}} + \end{enumerate} \end{cours} + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Activité 2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -195,15 +218,20 @@ \objectifs{Objectifs : manipuler des mots de façon amusante.} + + %\medskip + \begin{enumerate} \item \textbf{Distance entre deux mots.} La distance\index{distance} de Hamming entre deux mots de même longueur est le nombre d'endroits où les lettres sont différentes. -Par exemple : \\ -\centerline{\mot{ +Par exemple : + +\mycenterline{\mot{ \badletter{J}A\badletter{P}ON}\qquad \mot{\badletter{S}A\badletter{V}ON} } + La première lettre de \mot{JAPON} est différente de la première lettre de \mot{SAVON}, les troisièmes aussi sont différentes. La distance de Hamming entre \mot{JAPON} et \mot{SAVON} vaut donc $2$. Écris une fonction \ci{distance_hamming()} qui calcule la distance de Hamming entre deux mots de même longueur. @@ -218,7 +246,9 @@ Exemple : \ci{distance_hamming("LAPIN","SATIN")} renvoie $2$ \end{fonction} - + + %\medskip + \item \textbf{Latin-cochon.} On transforme un mot commençant par une consonne selon la recette suivante : @@ -239,7 +269,9 @@ Exemple : \ci{latin_cochon("BONJOUR")} renvoie \ci{"ONJOURBUM"} \end{fonction} - + + %\medskip + \item \textbf{Verlan.} Écris une fonction \ci{verlan()} qui renvoie un mot à l'envers : \mot{SALUT} devient \mot{TULAS}. @@ -256,6 +288,7 @@ Exemple : \ci{verlan("TOCARD")} renvoie \ci{"DRACOT"} \end{fonction} + %\medskip \item \textbf{Palindrome.} @@ -267,14 +300,14 @@ Sortie : \og{}vrai\fg{} si le mot est un palindrome, \og{}faux\fg{} sinon. \medskip - - Exemple : \ci{est_un_palindrome("KAYAK")} renvoie \ci{True} - \end{fonction} -\end{enumerate} -\end{activite} + Exemple : \ci{est_un_palindrome("KAYAK")} renvoie \ci{True} + \end{fonction} +\end{enumerate} + +\end{activite} @@ -335,32 +368,31 @@ \item Un crime a été commis dans le château d'Adéno. -Tu as récupéré deux brins d'ADN, provenant de deux positions éloignées de l'ADN du coupable. Il y a quatre suspects, dont tu as sequencé l'ADN. +Tu as récupéré deux brins d'ADN, provenant de deux positions éloignées de l'ADN du coupable. Il y a quatre suspects, dont tu as séquencé l'ADN. Sauras-tu trouver qui est le coupable ? Premier code du coupable : \mot{CATA} Second code du coupable : \mot{ATGC} -{\small +{\footnotesize ADN du colonel Moutarde : - \mot{CCTGGAGGGTGGCCCCACCGGCCGAGACAGCGAGCATATGCAGGAAGCGGCAGGAATAAGGAAAAGCAGC} - +\mot{CCTGGAGGGTGGCCCCACCGGCCGAGACAGCGAGCATATGCAGGAAGCGGCAGGAATAAGGAAAAGCAGC} ADN de Mlle Rose : - \mot{CTCCTGATGCTCCTCGCTTGGTGGTTTGAGTGGACCTCCCAGGCCAGTGCCGGGCCCCTCATAGGAGAGG} +\mot{CTCCTGATGCTCCTCGCTTGGTGGTTTGAGTGGACCTCCCAGGCCAGTGCCGGGCCCCTCATAGGAGAGG} ADN de Mme Pervenche : - \mot{AAGCTCGGGAGGTGGCCAGGCGGCAGGAAGGCGCACCCCCCCAGTACTCCGCGCGCCGGGACAGAATGCC} - +\mot{AAGCTCGGGAGGTGGCCAGGCGGCAGGAAGGCGCACCCCCCCAGTACTCCGCGCGCCGGGACAGAATGCC} ADN de M. Leblanc : \mot{CTGCAGGAACTTCTTCTGGAAGTACTTCTCCTCCTGCAAATAAAACCTCACCCATGAATGCTCACGCAAG} + } \end{enumerate} \end{activite} @@ -376,7 +408,7 @@ Un caractère est stocké par l'ordinateur sous la forme d'un entier. Pour le codage ASCII/unicode, la lettre majuscule \og{}A\fg{} est codé par $65$, la lettre minuscule \og{}h\fg{} est codée par $104$, le symbole \og{}\#\fg{} par $35$. -Voici la table des premiers caractères. Les numéros $0$ à $32$ ne sont pas des caractères imprimables. Cependant le numéro $32$ est le caractère espace \lstinline!" "!. +Voici la table des premiers caractères. Les numéros $0$ à $32$ ne sont pas des caractères imprimables. Cependant le numéro $32$ est le caractère espace \lstinline[showstringspaces=true]!" "!. \index{ascii} \index{unicode} @@ -433,9 +465,8 @@ \begin{enumerate} - \item Décode à la main le message chiffré sous les codes suivants : \\ - -\centerline{80-121-116-104-111-110 \quad 101-115-116 \quad 115-121-109-112-64} + \item Décode à la main le message chiffré sous les codes suivants : +\mycenterline{80-121-116-104-111-110 \quad 101-115-116 \quad 115-121-109-112-64} % [\symbol{80}\symbol{121}\symbol{116}\symbol{104}\symbol{111}\symbol{110} % \symbol{101}\symbol{115}\symbol{116} @@ -502,16 +533,16 @@ \objectifs{Objectifs : déterminer la langue d'un texte à partir de l'analyse des fréquences des lettres.} \begin{enumerate} - \item Écris une fonction \ci{occurences_lettre()} qui compte le nombre de fois où la lettre donnée apparaît dans une phrase (en majuscules et sans accents). + \item Écris une fonction \ci{occurrences_lettre()} qui compte le nombre de fois où la lettre donnée apparaît dans une phrase (en majuscules et sans accents). - \begin{fonction}[\ci{occurences_lettre()}] - Usage : \ci{occurences_lettre(lettre,phrase)}\\ + \begin{fonction}[\ci{occurrences_lettre()}] + Usage : \ci{occurrences_lettre(lettre,phrase)}\\ Entrée : une lettre et une phrase en majuscules (une chaîne de caractères)\\ Sortie : le nombre d'occurrences de la lettre (un entier) \medskip - Exemple : \ci{occurences_lettre("E","ESPRIT ES TU LA")} renvoie \ci{2} + Exemple : \ci{occurrences_lettre("E","ESPRIT ES TU LA")} renvoie \ci{2} \end{fonction} \item Écris une fonction \ci{nombre_lettres()} qui compte le nombre total de lettres qui apparaissent dans une phrase (en majuscules et sans accents). Ne pas compter les espaces, ni la ponctuation. diff --git a/chaines/chaines_5.py b/chaines/chaines_5.py index 714e0ee..7d3db10 100644 --- a/chaines/chaines_5.py +++ b/chaines/chaines_5.py @@ -35,7 +35,7 @@ def nombre_E(phrase): ## Question 1 ## -def occurences_lettre(lettre,phrase): +def occurrences_lettre(lettre,phrase): """ Compte le nombre d'occurrences d'une lettre donnée dans phrase Entrée : une lettre et une phrase en majuscule Sortie : le nombre de lettres """ @@ -50,7 +50,7 @@ def occurences_lettre(lettre,phrase): # Test phrase = "ESPRIT ES TU LA" -print("La phrase",phrase,"contient",occurences_lettre("S",phrase),"fois la lettre S") +print("La phrase",phrase,"contient",occurrences_lettre("S",phrase),"fois la lettre S") @@ -84,7 +84,7 @@ def pourcentage_lettre(lettre,phrase): Entrée : une lettre et une phrase en majuscule Sortie : le pourcentage d'apparition de la lettre """ - nb_lettres = occurences_lettre(lettre,phrase) + nb_lettres = occurrences_lettre(lettre,phrase) nb_total = nombre_lettres(phrase) pourcentage = nb_lettres/nb_total*100 diff --git a/chaines/pres-chaine.pdf b/chaines/pres-chaine.pdf new file mode 100644 index 0000000..227aba8 Binary files /dev/null and b/chaines/pres-chaine.pdf differ diff --git a/chaines/pres-chaine.tex b/chaines/pres-chaine.tex new file mode 100644 index 0000000..5c40ac5 --- /dev/null +++ b/chaines/pres-chaine.tex @@ -0,0 +1,213 @@ +\documentclass[12pt,class=report,crop=false]{standalone} +\usepackage[screen]{../python} + +\pagestyle{empty} + +\begin{document} + +%==================================================================== +\chapitre{Chaînes de caractères -- Analyse d'un texte} +%==================================================================== + +\section*{Caractère et chaîne} + + +\begin{itemize} + \item Un \defi{caractère}\index{caractere@caractère} est un symbole unique, par exemple une lettre minuscule \codeinline{"a"}, une lettre majuscule \codeinline{"B"}, un symbole spécial \codeinline{"\&"}, un symbole représentant un chiffre \codeinline{"7"}, une espace \codeinline{" "} que l'on notera aussi \lstinline[showstringspaces=true]!" "!. + + \bigskip + + \item +Pour désigner un caractère, il faut le mettre entre guillemets simples \codeinline{'z'} ou entre guillemets doubles \codeinline{"z"}. + + \bigskip + + \item Une \defi{chaîne de caractères}\index{chaine@chaîne} est une suite de caractères, comme un mot \codeinline{"Bonjour"}, une phrase \codeinline{'Il fait beau.'}, un mot de passe \codeinline{"N[w5ms\}e!"}. + + \bigskip + + \item Le type d'un caractère ou d'une chaîne est \codeinline{str}\index{str@\ci{str}} (pour \emph{string}). + + +\end{itemize} + + + +\newpage + +\section*{Opérations sur les chaînes} + + +\begin{itemize} + \item La \defi{concaténation}\index{concatenation@concaténation}, c'est-à-dire la mise bout à bout de deux chaînes, s'effectue à l'aide de l'opérateur \codeinline{+}. Par exemple \ci{"para"+"pluie"} donne la chaîne \ci{"parapluie"}. + + \bigskip + + \item La chaîne vide \ci{""} est utile lorsque l'on veut initialiser une chaîne avant d'y ajouter d'autres caractères. + + \bigskip + + \item La \defi{longueur} d'une chaîne est le nombre de caractères qu'elle contient. Elle s'obtient par la fonction \ci{len()}\index{len@\ci{len}}. + Par exemple \lstinline[showstringspaces=true]!len("Hello World")! renvoie $11$ (l'espace compte comme un caractère). +\end{itemize} + +\newpage + +\section*{Opérations sur les chaînes} + +Si \ci{mot} est une chaîne alors on peut récupérer chaque caractère par \ci{mot[i]}. Par exemple si + \ci{mot = "avion"} alors : + \begin{itemize} + \item \ci{mot[0]} est le caractère \ci{"a"}, + \item \ci{mot[1]} est le caractère \ci{"v"}, + \item \ci{mot[2]} est le caractère \ci{"i"}, + \item \ci{mot[3]} est le caractère \ci{"o"}, + \item \ci{mot[4]} est le caractère \ci{"n"}. + \end{itemize} + +\bigskip + +\begin{center} +\begin{tabular}{|c||c|c|c|c|c|} +\hline +Lettre & a & v & i & o & n \\ \hline +Rang & 0 & 1 & 2 & 3 & 4 \\ \hline +\end{tabular} +\end{center} + + +\bigskip + +Si \ci{mot} est une chaîne, les caractères s'obtiennent par \ci{mot[i]} pour \ci{i} variant de \ci{0} à \ci{len(mot)-1}. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +\newpage + +\section*{Sous-chaînes} + + +On peut extraire plusieurs caractères d'une chaîne à l'aide de la syntaxe \ci{mot[i:j]} qui renvoie une chaîne formée des caractères numéro $i$ à $j-1$ (attention le caractère numéro $j$ n'est pas inclus !). + + \bigskip + +Par exemple si \ci{mot = "vendredi"} alors : +\begin{itemize} + \item \ci{mot[0:4]} renvoie la sous-chaîne \ci{"vend"} formée des caractères de rang $0$, $1$, $2$ et $3$ (mais pas $4$), + + \bigskip + + \item \ci{mot[3:6]} renvoie \ci{"dre"} correspondant aux rangs $3$, $4$ et $5$. +\end{itemize} + + \bigskip + +\begin{center} +\begin{tabular}{|c||c|c|c|c|c|c|c|c|} +\hline +Lettre & v & e & n & d & r & e & d & i \\ \hline +Rang & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7\\ \hline +\end{tabular} +\end{center} + + \bigskip + +Autre exemple : \ci{mot[1:len(mot)-1]} renvoie le mot privé de sa première et dernière lettre. + + +\newpage + + +\section*{Un peu plus sur les chaînes} + + +\begin{itemize} + \item Une boucle \ci{for ... in ...} permet de parcourir une chaîne, caractère par caractère :\index{boucle!pour}\index{for@\ci{for}} + \begin{center} + \begin{minipage}{0.4\textwidth} + \ci{for carac in mot:}\\ + \indentation \ci{print(carac)} + \end{minipage} + \end{center} + + \bigskip + + \item On peut tester si un caractère appartient à une certaine liste de caractères. Par exemple : \\ + \centerline{\codeinline{if carac in ["a", "A", "b", "B", "c", "C"]:}} +\index{in@\ci{in}} + + permet d’exécuter des instructions si le caractère \ci{carac} est l'une des lettres a, A, b, B, c, C. + + \bigskip + + \item + Pour éviter certaines lettres, on utiliserait : \\ + \centerline{\codeinline{if carac not in ["X", "Y", "Z"]:}} + \index{not in@\ci{not in}} + + \end{itemize} + +\newpage + +\section*{Codage des caractères} + +\index{codage des caracteres@codage des caractères} + +Un caractère est stocké par l'ordinateur sous la forme d'un entier. +Pour le codage ASCII/unicode, la lettre majuscule \og{}A\fg{} est codé par $65$, la lettre minuscule \og{}h\fg{} est codée par $104$, le symbole \og{}\#\fg{} par $35$. + +Voici la table des premiers caractères. Les numéros $0$ à $32$ ne sont pas des caractères imprimables. Cependant le numéro $32$ est le caractère espace \lstinline!" "!. + +\index{ascii} +\index{unicode} + +\myfigure{0.8}{ +\small + \tikzinput{chaines-unicode} +} + + +\newpage + +\section*{Codage des caractères} + +La fonction \ci{chr()}\index{chr@\ci{chr}} est une fonction \Python{} qui renvoie le caractère associé à un code. + + \begin{fonctionpython}[\ci{python : chr()}] + Usage : \ci{chr(code)}\\ + Entrée : un code (un entier)\\ + Sortie : un caractère + + \medskip + + Exemple : + \begin{itemize} + \item \ci{chr(65)} renvoie \ci{"A"} + \item \ci{chr(123)} renvoie \ci{"\{"} + \end{itemize} + \end{fonctionpython} + +\bigskip + + +La fonction \ci{ord()}\index{ord@\ci{ord}} est une fonction \Python{} correspondant à l'opération inverse : elle renvoie le code associé à un caractère. + + \begin{fonctionpython}[\ci{python : ord()}] + Usage : \ci{ord(carac)}\\ + Entrée : un caractère (une chaîne de longueur $1$)\\ + Sortie : un entier + + \medskip + + Exemple : + \begin{itemize} + \item \ci{ord("A")} renvoie \ci{65} + \item \ci{ord("*")} renvoie \ci{42} + \end{itemize} + \end{fonctionpython} + + +\end{document} diff --git a/chercher/chercher.pdf b/chercher/chercher.pdf index c9e87fb..976d566 100644 Binary files a/chercher/chercher.pdf and b/chercher/chercher.pdf differ diff --git a/chercher/chercher.tex b/chercher/chercher.tex index 61d577a..81e8e13 100644 --- a/chercher/chercher.tex +++ b/chercher/chercher.tex @@ -10,10 +10,14 @@ \objectifs{Chercher et remplacer sont deux tâches très fréquentes. Savoir les utiliser et comprendre comment elles fonctionnent te permettra d'être plus efficace.} - \index{chercher} \index{remplacer} +\insertvideo{pfu9IJR0vZY}{Chercher et remplacer - partie 1} + +\insertvideo{GL446gvcN-U}{Chercher et remplacer - partie 2} + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Activité 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -27,9 +31,10 @@ \index{in@\ci{in}} - La façon la plus simple de savoir si une sous-chaîne est présente dans une chaîne de caractères est d'utiliser l'opérateur \og{}\ci{in}\fg{}. Par exemple, l'expression :\\ - \centerline{\ci{"PAS" in "ETRE OU NE PAS ETRE"}} - vaut \og{}vrai\fg{} car la sous-chaine \mot{PAS} est bien présente dans la phrase + La façon la plus simple de savoir si une sous-chaîne est présente dans une chaîne de caractères est d'utiliser l'opérateur \og{}\ci{in}\fg{}. Par exemple, l'expression : + \mycenterline{\ci{"PAS" in "ETRE OU NE PAS ETRE"}} + + vaut \og{}vrai\fg{} car la sous-chaîne \mot{PAS} est bien présente dans la phrase \mot{ETRE OU NE PAS ETRE}. Déduis-en une fonction \ci{chercher_in(chaine,sous_chaine)} qui renvoie \og{}vrai\fg{} ou \og{}faux\fg{}, selon que la sous-chaîne est (ou non) présente dans la chaîne. @@ -71,8 +76,8 @@ \objectifs{Objectifs : remplacer des portions de texte par d'autres.} \begin{enumerate} - \item La méthode \ci{replace()} s'utilise sous la forme :\\ - \centerline{\ci{chaine.replace(sous_chaine,nouv_sous_chaine)}} + \item La méthode \ci{replace()} s'utilise sous la forme : + \mycenterline{\ci{chaine.replace(sous_chaine,nouv_sous_chaine)}} \index {replace@\ci{replace}} @@ -81,8 +86,9 @@ Transforme la phrase \mot{ETRE OU NE PAS ETRE} en \mot{ETRE OU NE PLUS ETRE}, puis en \mot{AVOIR OU NE PLUS AVOIR}. - \item Écris ta propre fonction \ci{remplacer()} que tu appelleras sous la forme suivante :\\ - \centerline{\ci{remplacer(chaine,sous_chaine,nouv_sous_chaine)}} + \item Écris ta propre fonction \ci{remplacer()} que tu appelleras sous la forme suivante : + \mycenterline{\ci{remplacer(chaine,sous_chaine,nouv_sous_chaine)}} + et qui remplace seulement la première occurrence de \ci{sous_chaine} trouvée. Par exemple \ci{remplacer("ABBA","B","XY")} renvoie \ci{"AXYBA"}. @@ -122,7 +128,7 @@ \bigskip -Nous utiliserons les expressions rationnelles à travers la commande :\\ \centerline{\ci{python_regex_chercher(chaine,exp)}} +Nous utiliserons les expressions rationnelles à travers la commande : \mycenterline{\ci{python_regex_chercher(chaine,exp)}} \index{module!re@\ci{re}} @@ -140,7 +146,8 @@ Programme-la et teste-la. Elle renvoie : (1) la sous-chaîne trouvée, (2) la position de début et (3) la position de fin. \begin{fonctionpython}[\ci{python : re.search() - python_regex_chercher()}] - Usage : \ci{search(exp,chaine)} ou \ci{python_regex_chercher(chaine,exp)}\\ + Usage : \ci{search(exp,chaine)} \\ + \hspace*{9ex} ou \ci{python_regex_chercher(chaine,exp)}\\ Entrée : une chaîne de caractères \ci{chaine} et une expression rationnelle \ci{exp} \\ Sortie : le résultat de la recherche (la sous-chaîne trouvée, sa position de début, celle de fin) @@ -148,7 +155,7 @@ Exemple avec \ci{chaine = "ETRE OU NE PAS ETRE"} \begin{itemize} - \item avec \ci{exp = "P.S"}, alors \ci{python_regex_chercher(chaine,exp)} renvoie + \item avec \ci{exp = "P.S"}, alors \ci{python_regex_chercher(chaine, exp)} renvoie \ci{('PAS', 11, 14)}. \item avec \ci{exp = "E..E"}, la fonction renvoie \ci{('ETRE', 0, 4)}. @@ -204,33 +211,33 @@ Appliquer la transformation \rzero\run{} $\rightarrow$ \run\rzero{} à la phrase \run\rzero\run\run\rzero. -On lit la phrase de gauche à droite, on trouve le premier motif \rzero\run{} à partir de la seconde lettre, on le remplace par \run\rzero{} :\\ -\centerline{\run(\rzero\run)\run\rzero{} \quad $\longmapsto$ \quad \run(\run\rzero)\run\rzero} +On lit la phrase de gauche à droite, on trouve le premier motif \rzero\run{} à partir de la seconde lettre, on le remplace par \run\rzero{} : +\mycenterline{\run(\rzero\run)\run\rzero{} \quad $\longmapsto$ \quad \run(\run\rzero)\run\rzero} -On peut recommencer à partir du début de la phrase obtenue, avec toujours la même transformation \rzero\run{} $\rightarrow$ \run\rzero{} :\\ -\centerline{\run\run(\rzero\run)\rzero{} \quad $\longmapsto$ \quad \run\run(\run\rzero)\rzero} +On peut recommencer à partir du début de la phrase obtenue, avec toujours la même transformation \rzero\run{} $\rightarrow$ \run\rzero{} : +\mycenterline{\run\run(\rzero\run)\rzero{} \quad $\longmapsto$ \quad \run\run(\run\rzero)\rzero} Le motif \rzero\run{} n'apparaît plus dans la phrase \run\run\run\rzero\rzero{} donc la transformation \rzero\run{} $\rightarrow$ \run\rzero{} laisse maintenant cette phrase inchangée. -Résumons : voici l'effet de la transformation itérée \rzero\run{} $\rightarrow$ \run\rzero{} à la phrase \run\rzero\run\run\rzero{} :\\ -\centerline{\run\rzero\run\run\rzero{} \quad $\longmapsto$ \quad \run\run\rzero\run\rzero{} \quad $\longmapsto$ \quad \run\run\run\rzero\rzero} +Résumons : voici l'effet de la transformation itérée \rzero\run{} $\rightarrow$ \run\rzero{} à la phrase \run\rzero\run\run\rzero{} : +\mycenterline{\run\rzero\run\run\rzero{} \quad $\longmapsto$ \quad \run\run\rzero\run\rzero{} \quad $\longmapsto$ \quad \run\run\run\rzero\rzero} \end{exemple} \begin{exemple} Appliquer la transformation \rzero\rzero\run{} $\rightarrow$ \run\run\rzero\rzero{} à la phrase \rzero\rzero\run\run. -Une première fois :\\ -\centerline{(\rzero\rzero\run)\run{} \quad $\longmapsto$ \quad (\run\run\rzero\rzero)\run} -Une seconde fois :\\ -\centerline{\run\run(\rzero\rzero\run) \quad $\longmapsto$ \quad \run\run(\run\run\rzero\rzero)} +Une première fois : +\mycenterline{(\rzero\rzero\run)\run{} \quad $\longmapsto$ \quad (\run\run\rzero\rzero)\run} +Une seconde fois : +\mycenterline{\run\run(\rzero\rzero\run) \quad $\longmapsto$ \quad \run\run(\run\run\rzero\rzero)} Et ensuite la transformation ne modifie plus la phrase. \end{exemple} \begin{exemple} -Voyons un dernier exemple avec la transformation \rzero\run{} $\rightarrow$ \run\run\rzero\rzero{} pour la phrase de départ \rzero\rzero\rzero\run{}: \\ -\centerline{ +Voyons un dernier exemple avec la transformation \rzero\run{} $\rightarrow$ \run\run\rzero\rzero{} pour la phrase de départ \rzero\rzero\rzero\run{}: +\mycenterline{ \rzero\rzero\rzero\run{} \quad $\longmapsto$ \quad \rzero\rzero\run\run\rzero\rzero{} \quad $\longmapsto$ \quad \rzero\run\run\rzero\rzero\run\rzero\rzero{} \quad $\longmapsto$ \quad @@ -267,16 +274,20 @@ Programme une fonction \ci{iterations(phrase,motif,nouv_motif)} qui, à partir d'une phrase, itère la transformation. Une fois que la phrase est stabilisée, la fonction renvoie le nombre d'itérations effectuées ainsi que la phrase obtenue. Si le nombre d'itérations n'a pas l'air de s'arrêter (par exemple quand il dépasse $1000$) alors renvoie \ci{None}. - Exemple. Pour la transformation \rzero\rzero\run\run{} $\rightarrow$ \run\run\rzero\rzero{} et la phrase \rzero\rzero\rzero\rzero\run\run\rzero\run\run, les phrases obtenues sont : \\ - \\ -\centerline{ -\rzero\rzero\rzero\rzero\run\run\rzero\run\run{} $\underset{\mathbf{1}}{\longmapsto}$ + Exemple. Pour la transformation \rzero\rzero\run\run{} $\rightarrow$ \run\run\rzero\rzero{} et la phrase \rzero\rzero\rzero\rzero\run\run\rzero\run\run, les phrases obtenues sont : + +{\small +\mycenterline{ +\ \rzero\rzero\rzero\rzero\run\run\rzero\run\run{} $\underset{\mathbf{1}}{\longmapsto}$ \rzero\rzero\run\run\rzero\rzero\rzero\run\run{} $\underset{\mathbf{2}}{\longmapsto}$ \run\run\rzero\rzero\rzero\rzero\rzero\run\run{} $\underset{\mathbf{3}}{\longmapsto}$ \run\run\rzero\rzero\rzero\run\run\rzero\rzero{} $\underset{\mathbf{4}}{\longmapsto}$ \run\run\rzero\run\run\rzero\rzero\rzero\rzero{} $\longmapsto$ idem -}\\ +} +} + +\medskip Pour cet exemple l'appel à la fonction \ci{iterations()} renvoie alors $4$ (le nombre de transformations avant stabilisation) et \ci{"110110000"} (la phrase stabilisée). @@ -291,8 +302,8 @@ \end{itemize} Exemple : pour la transformation \rzero\run{} $\rightarrow$ \run\rzero\rzero, parmi toutes les phrases de longueur $p=4$, le maximum d'itérations possibles est $7$. Un tel exemple de phrase est \rzero\run\run\run, qui va se stabiliser (après 7 itérations donc) en \run\run\run\rzero\rzero\rzero\rzero\rzero\rzero\rzero\rzero. -Ainsi la commande \ci{iteration_maximale(4,"01","100")} renvoie : \\ -\centerline{7, '0111', '11100000000'} +Ainsi la commande \ci{iteration_maximale(4,"01","100")} renvoie : +\mycenterline{\ci{7, '0111', '11100000000'}} \emph{Indication.} Pour générer toutes les phrases de longueur $p$ formées de \rzero{} et \run{}, tu peux consulter la fiche \og{}Binaire II\fg{} (activité 3). diff --git a/chercher/chercher_1.py b/chercher/chercher_1.py index 3fd8c6a..3be6a95 100644 --- a/chercher/chercher_1.py +++ b/chercher/chercher_1.py @@ -37,9 +37,24 @@ def chercher_find(chaine,sous_chaine): position = chercher_find(chaine,"XYZ") print(position) - ## Question 3 ## +def chercher_index(chaine,sous_chaine): + position = chaine.index(sous_chaine) + return position + +# Test +print("--- Avec index() ---") + +position = chercher_index(chaine,sous_chaine) +print(position) + +# position = chercher_index(chaine,"XYZ") +# print(position) + + +## Question 4 ## + def chercher(chaine,sous_chaine): long_chaine = len(chaine) diff --git a/chercher/pres-chercher.pdf b/chercher/pres-chercher.pdf new file mode 100644 index 0000000..d24ecfe Binary files /dev/null and b/chercher/pres-chercher.pdf differ diff --git a/chercher/pres-chercher.tex b/chercher/pres-chercher.tex new file mode 100644 index 0000000..e9938e6 --- /dev/null +++ b/chercher/pres-chercher.tex @@ -0,0 +1,89 @@ +\documentclass[12pt,class=report,crop=false]{standalone} +\usepackage[screen]{../python} + +\pagestyle{empty} + +\begin{document} + + +%==================================================================== +\chapitre{Chercher et remplacer} +%==================================================================== + +\newcommand{\rzero}{{\color{red}\textbf{0}}} +\newcommand{\run}{{\color{blue}\textbf{1}}} + + +On considère une \og{}phrase\fg{} composée de seulement deux lettres possibles +\rzero{} et \run. Dans cette phrase nous allons chercher un motif (une sous-chaîne) et le remplacer par un autre. + +\begin{exemple} +Appliquer la transformation \rzero\run{} $\rightarrow$ \run\rzero{} +à la phrase \run\rzero\run\run\rzero. + +On lit la phrase de gauche à droite, on trouve le premier motif \rzero\run{} à partir de la seconde lettre, on le remplace par \run\rzero{} :\\ +\centerline{\run(\rzero\run)\run\rzero{} \quad $\longmapsto$ \quad \run(\run\rzero)\run\rzero} + +On peut recommencer à partir du début de la phrase obtenue, avec toujours la même transformation \rzero\run{} $\rightarrow$ \run\rzero{} :\\ +\centerline{\run\run(\rzero\run)\rzero{} \quad $\longmapsto$ \quad \run\run(\run\rzero)\rzero} + +Le motif \rzero\run{} n'apparaît plus dans la phrase \run\run\run\rzero\rzero{} donc +la transformation \rzero\run{} $\rightarrow$ \run\rzero{} laisse maintenant cette phrase inchangée. + +Résumons : voici l'effet de la transformation itérée \rzero\run{} $\rightarrow$ \run\rzero{} à la phrase \run\rzero\run\run\rzero{} :\\ +\centerline{\run\rzero\run\run\rzero{} \quad $\longmapsto$ \quad \run\run\rzero\run\rzero{} \quad $\longmapsto$ \quad \run\run\run\rzero\rzero} +\end{exemple} + + +\newpage + +\begin{exemple} +Appliquer la transformation \rzero\rzero\run{} $\rightarrow$ \run\run\rzero\rzero{} +à la phrase \rzero\rzero\run\run. + +Une première fois :\\ +\centerline{(\rzero\rzero\run)\run{} \quad $\longmapsto$ \quad (\run\run\rzero\rzero)\run} +Une seconde fois :\\ +\centerline{\run\run(\rzero\rzero\run) \quad $\longmapsto$ \quad \run\run(\run\run\rzero\rzero)} +Et ensuite la transformation ne modifie plus la phrase. +\end{exemple} + + +\newpage + +\begin{exemple} +Voyons un dernier exemple avec la transformation \rzero\run{} $\rightarrow$ \run\run\rzero\rzero{} pour la phrase de départ \rzero\rzero\rzero\run{}: \\ +\centerline{ +\rzero\rzero\rzero\run{} \quad $\longmapsto$ \quad +\rzero\rzero\run\run\rzero\rzero{} \quad $\longmapsto$ \quad +\rzero\run\run\rzero\rzero\run\rzero\rzero{} \quad $\longmapsto$ \quad +\run\run\rzero\rzero\run\rzero\rzero\run\rzero\rzero{} \quad $\longmapsto$ \quad $\cdots$} + +On peut itérer la transformation, pour obtenir des phrases de plus en plus longues. +\end{exemple} + + +\newpage + +On considère ici uniquement des transformations du type \rzero$^a$\run$^b$ $\rightarrow$ \run$^c$\rzero$^d$, c'est-à-dire un motif avec d'abord des \rzero{} puis des \run{} est remplacé par un motif avec d'abord des \run{} puis des \rzero. + +\bigskip +\bigskip + +\textbf{Catégories de transformations.} + + \begin{itemize} + \item \textbf{Transformation linéaire.} + Vérifie expérimentalement que la transformation \rzero\rzero\run\run{} $\rightarrow$ \run\run\rzero{} est \emph{linéaire}, c'est-à-dire que pour toutes les phrases de longueur $p$, il y aura au plus de l'ordre de $p$ itérations au maximum. Par exemple pour $p=10$, quel est le nombre maximum d'itérations ? + + \item \textbf{Transformation quadratique.} + Vérifie expérimentalement que la transformation \rzero\run{} $\rightarrow$ \run\rzero{} est \emph{quadratique}, c'est-à-dire que pour toutes les phrases de longueur $p$, il y aura au plus de l'ordre de $p^2$ itérations au maximum. Par exemple pour $p=10$, quel est le nombre maximum d'itérations ? + + \item \textbf{Transformation exponentielle.} + Vérifie expérimentalement que la transformation \rzero\run{} $\rightarrow$ \run\run\rzero{} est \emph{exponentielle}, c'est-à-dire que pour toutes les phrases de longueur $p$, il y aura un nombre fini d'itérations, mais que ce nombre peut être très grand (beaucoup plus grand que $p^2$) avant stabilisation. Par exemple pour $p=10$, quel est le nombre maximum d'itérations ? + + \item \textbf{Transformation sans fin.} + Vérifie expérimentalement que pour la transformation \rzero\run{} $\rightarrow$ \run\run\rzero\rzero{}, il existe des phrases qui ne vont jamais se stabiliser. + \end{itemize} + +\end{document} diff --git a/code/code.pdf b/code/code.pdf index 8828fb8..ffc1a0f 100644 Binary files a/code/code.pdf and b/code/code.pdf differ diff --git a/code/code.tex b/code/code.tex index a6cd5fa..1550668 100644 --- a/code/code.tex +++ b/code/code.tex @@ -196,15 +196,15 @@ \subsection*{Activité 1} \subsection*{Activité 2} -\insertcode{../listes/listes_I_1.py}{Activité 2 \hfill \texttt{listes\_I\_2.py}} +\insertcode{../listes/listes_I_2.py}{Activité 2 \hfill \texttt{listes\_I\_2.py}} \subsection*{Activité 3} -\insertcode{../listes/listes_I_1.py}{Activité 3 \hfill \texttt{listes\_I\_3.py}} +\insertcode{../listes/listes_I_3.py}{Activité 3 \hfill \texttt{listes\_I\_3.py}} \subsection*{Activité 4} -\insertcode{../listes/listes_I_1.py}{Activité 4 \hfill \texttt{listes\_I\_4.py}} +\insertcode{../listes/listes_I_4.py}{Activité 4 \hfill \texttt{listes\_I\_4.py}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -236,19 +236,19 @@ \section{Fichiers} \subsection*{Activité 1} -\insertcode{../fichiers/fichiers_1.py}{Activité 1 \hfill \texttt{fichier\_1.py}} +\insertcode{../fichiers/fichiers_1.py}{Activité 1 \hfill \texttt{fichiers\_1.py}} \subsection*{Activité 2} -\insertcode{../fichiers/fichiers_2.py}{Activité 2 \hfill \texttt{fichier\_2.py}} +\insertcode{../fichiers/fichiers_2.py}{Activité 2 \hfill \texttt{fichiers\_2.py}} \subsection*{Activité 3} -\insertcode{../fichiers/fichiers_3.py}{Activité 3 \hfill \texttt{fichier\_3.py}} +\insertcode{../fichiers/fichiers_3.py}{Activité 3 \hfill \texttt{fichiers\_3.py}} \subsection*{Activité 4} -\insertcode{../fichiers/fichiers_4.py}{Activité 4 \hfill \texttt{fichier\_4.py}} +\insertcode{../fichiers/fichiers_4.py}{Activité 4 \hfill \texttt{fichiers\_4.py}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/cover/AlteDin1451Mittelschrift.ttf b/cover/AlteDin1451Mittelschrift.ttf new file mode 100644 index 0000000..aef931a Binary files /dev/null and b/cover/AlteDin1451Mittelschrift.ttf differ diff --git a/cover/exo7_logo_couleurs.pdf b/cover/exo7_logo_couleurs.pdf new file mode 100644 index 0000000..0df2d4a Binary files /dev/null and b/cover/exo7_logo_couleurs.pdf differ diff --git a/cover/exo7_logo_couleurs.tex b/cover/exo7_logo_couleurs.tex new file mode 100644 index 0000000..793c1b9 --- /dev/null +++ b/cover/exo7_logo_couleurs.tex @@ -0,0 +1,15 @@ +\documentclass[tikz,border=7pt]{standalone} +\usetikzlibrary{svg.path} + +\definecolor{myred}{rgb}{0.93,0.26,0} +\definecolor{myorange}{rgb}{0.97,0.58,0} +\definecolor{myyellow}{rgb}{1,0.86,0} + +\begin{document} + \begin{tikzpicture}[yscale=-1,x=1pt,y=1pt] + \fill[color=myorange] svg{M30 70l40 0 0 40-40 0z}; + \fill[color=myred] svg{M30 70l0-30-30 0 0 30z}; + \fill[color=myyellow] svg{M70 70l-40-30 30-40 40 30-30 40z}; + \fill[color=black] svg{M49.49 35.64l4.61 0c.55 0 .84-.13 .85-.83 0-.65-.23-.83-.85-.82l-4.61 0 0-3.26 .86 0c1.37 0 2.76 .06 4.12 .06 .62 0 1.02 0 1.02-.84l0-.15c0-.56-.12-.84-.84-.84l-6.91 0c-.63 0-.84 .19-.84 .84l0 10.46c0 .63 .19 .84 .84 .84l7.18 0c.67 0 .84-.23 .84-.84l0-.25c0-.84-.4-.84-.99-.84-.91 0-1.81 .04-2.72 .04-.44 0-2.25 .02-2.56 .03zM61.87 36.93l2.55-3.12c.18-.21 .18-.28 .18-.37 0-.38-.35-.38-.62-.39l-.76 0c-.31 0-.53 0-.77 .27-.09 .09-1.23 1.62-1.53 2.02l-1.51-1.9c-.3-.37-.49-.38-.9-.39l-.77 0c-.23 0-.61 0-.61 .39 0 .12 .05 .19 .17 .33l2.65 3.16-2.77 3.43c-.11 .12-.17 .21-.18 .36 0 .38 .38 .38 .63 .38l.76 0c.59 0 .62-.06 1-.63l1.51-2.25 1.79 2.53c.25 .35 .46 .35 .83 .35l.78 0c.24 0 .61 0 .61-.38 0-.14-.07-.21-.19-.37zM74.47 37.15c0-2.88-1.4-4.39-4.27-4.4-2.94 0-4.29 1.56-4.29 4.4 0 2.86 1.51 4.15 4.27 4.14 2.76 0 4.28-1.26 4.29-4.14zm-4.27 2.77c-1.9 0-1.9-1.58-1.9-2.99 0-1.35 0-2.92 1.88-2.91 1.9 0 1.9 1.55 1.9 2.91 0 1.39 0 2.99-1.88 2.99zM81.48 30.79c-3.94 4.34-3.94 8.76-3.93 9.66 0 .56 .12 .84 .84 .84l.81 0c.28 0 .84 0 .84-.68 .05-4.36 1.58-7.54 3.69-10.19 .14-.18 .14-.32 .14-.64 0-.38 0-.86-.74-.87-.6-.02-4.13-.02-4.99-.02l-1.11 0c-.84 0-1.19 0-1.19 .84l0 .23c0 .28 0 .61 .37 .77 .12 .07 .7 .07 1.07 .07 .4 0 .83-.02 1.23-.01z}; + \end{tikzpicture} +\end{document} diff --git a/cover/exo7_logo_white.pdf b/cover/exo7_logo_white.pdf new file mode 100644 index 0000000..b29c30b Binary files /dev/null and b/cover/exo7_logo_white.pdf differ diff --git a/cover/exo7_logo_white.tex b/cover/exo7_logo_white.tex new file mode 100644 index 0000000..57f64c6 --- /dev/null +++ b/cover/exo7_logo_white.tex @@ -0,0 +1,10 @@ +\documentclass[tikz,border=7pt]{standalone} +\usetikzlibrary{svg.path} + +\begin{document} + \begin{tikzpicture}[yscale=-1,x=1pt,y=1pt,white] + \fill svg{M30 70l40 0 0 40-40 0z}; + \fill svg{M30 70l0-30-30 0 0 30z}; + \fill svg{M70 70l-40-30 30-40 40 30-30 40zM49.49 35.64l4.61 0c.55 0 .84-.13 .85-.83 0-.65-.23-.83-.85-.82l-4.61 0 0-3.26 .86 0c1.37 0 2.76 .06 4.12 .06 .62 0 1.02 0 1.02-.84l0-.15c0-.56-.12-.84-.84-.84l-6.91 0c-.63 0-.84 .19-.84 .84l0 10.46c0 .63 .19 .84 .84 .84l7.18 0c.67 0 .84-.23 .84-.84l0-.25c0-.84-.4-.84-.99-.84-.91 0-1.81 .04-2.72 .04-.44 0-2.25 .02-2.56 .03zM61.87 36.93l2.55-3.12c.18-.21 .18-.28 .18-.37 0-.38-.35-.38-.62-.39l-.76 0c-.31 0-.53 0-.77 .27-.09 .09-1.23 1.62-1.53 2.02l-1.51-1.9c-.3-.37-.49-.38-.9-.39l-.77 0c-.23 0-.61 0-.61 .39 0 .12 .05 .19 .17 .33l2.65 3.16-2.77 3.43c-.11 .12-.17 .21-.18 .36 0 .38 .38 .38 .63 .38l.76 0c.59 0 .62-.06 1-.63l1.51-2.25 1.79 2.53c.25 .35 .46 .35 .83 .35l.78 0c.24 0 .61 0 .61-.38 0-.14-.07-.21-.19-.37zM74.47 37.15c0-2.88-1.4-4.39-4.27-4.4-2.94 0-4.29 1.56-4.29 4.4 0 2.86 1.51 4.15 4.27 4.14 2.76 0 4.28-1.26 4.29-4.14zm-4.27 2.77c-1.9 0-1.9-1.58-1.9-2.99 0-1.35 0-2.92 1.88-2.91 1.9 0 1.9 1.55 1.9 2.91 0 1.39 0 2.99-1.88 2.99zM81.48 30.79c-3.94 4.34-3.94 8.76-3.93 9.66 0 .56 .12 .84 .84 .84l.81 0c.28 0 .84 0 .84-.68 .05-4.36 1.58-7.54 3.69-10.19 .14-.18 .14-.32 .14-.64 0-.38 0-.86-.74-.87-.6-.02-4.13-.02-4.99-.02l-1.11 0c-.84 0-1.19 0-1.19 .84l0 .23c0 .28 0 .61 .37 .77 .12 .07 .7 .07 1.07 .07 .4 0 .83-.02 1.23-.01z}; + \end{tikzpicture} +\end{document} diff --git a/cover/logo-python.png b/cover/logo-python.png new file mode 100644 index 0000000..c300bc6 Binary files /dev/null and b/cover/logo-python.png differ diff --git a/cover/python-logo.pdf b/cover/python-logo.pdf new file mode 100644 index 0000000..168ea58 Binary files /dev/null and b/cover/python-logo.pdf differ diff --git a/cover/python-logo.svg b/cover/python-logo.svg new file mode 100644 index 0000000..ef8e8dc --- /dev/null +++ b/cover/python-logo.svg @@ -0,0 +1,112 @@ + + + +image/svg+xmlPYTHON +AU +LYCÉE + \ No newline at end of file diff --git a/cover/python-logo.tex b/cover/python-logo.tex new file mode 100644 index 0000000..a568ce5 --- /dev/null +++ b/cover/python-logo.tex @@ -0,0 +1,71 @@ +% +% A compiler avec xelatex ! +% xelatex -output-driver="xdvipdfmx" python_cover3.tex +\documentclass[a4paper]{article} + +\usepackage{tikz} +% ===================================================== +% The font +% ===================================================== +\usepackage{fontspec} +\newfontfamily\titlefont{AlteDin1451Mittelschrift.ttf} +\newfontfamily\roboto{Roboto} +\setmainfont{Roboto} +%\newfontfamily\authorfont{Times New Roman} +%\newfontfamily\authorfont{Roboto} +\newfontfamily\authorfont{AlteDin1451Mittelschrift.ttf} + +% ===================================================== +% The colors +% ===================================================== +% Couleur épreuve +\definecolor{coulfond}{HTML}{CCCCCC} +\definecolor{coulup}{HTML}{D01A55} +\definecolor{couldown}{HTML}{C1D208} +\definecolor{coulreste}{HTML}{666666} + +% Colors by function +\colorlet{background}{coulfond} + +\colorlet{author}{black} + +\colorlet{pythonlogoup}{coulup} +\colorlet{pythonlogodown}{couldown} +\colorlet{titlepython}{white} +\colorlet{titleau}{coulreste} +\colorlet{titlelycee}{white} + +\colorlet{subtitlealgo}{coulreste} + +\colorlet{spinepython}{coulup} +\colorlet{spineau}{couldown} +\colorlet{spinelycee}{coulup} +\colorlet{spinealgo}{white} + +\pagestyle{empty} + + +\begin{document} +\begin{tikzpicture}[scale=0.8] + +\usetikzlibrary{calc} +\usetikzlibrary{svg.path} +%\tikzset{ +% frame/.style 2 args={inner sep=0, outer sep=0, minimum width=#1, minimum height=#2, node contents=} +%} + % --------------------------------------------------- + % Python logo and title + % --------------------------------------------------- + \begin{scope} + \fill [shift={(-7cm,0)},pythonlogoup]svg{M 133.72 -122.51 v 52.97 c 0 41.07 -34.81 75.63 -74.52 75.63 h -119.15 c -32.64 0 -59.64 27.93 -59.64 60.61 v 113.59 c 0 32.32 28.11 51.34 59.64 60.61 c 37.76 11.1 73.96 13.12 119.15 0 c 30.03 -8.69 59.64 -26.19 59.64 -60.61 v -45.46 h -119.14 v -15.15 h 119.14 h 59.64 c 34.67 0 47.59 -24.18 59.64 -60.48 c 12.45 -37.37 11.93 -73.3 0 -121.23 c -8.57 -34.51 -24.93 -60.47 -59.64 -60.48 h -44.76 z m -67.01 287.64 c 12.37 0 22.38 10.13 22.38 22.66 c 0 12.57 -10.02 22.8 -22.38 22.8 c -12.32 0 -22.38 -10.23 -22.38 -22.8 c 0 -12.53 10.06 -22.66 22.38 -22.66 z}; + \fill [shift={(-7cm,0)},pythonlogodown]svg{M -2.94 -250 c -20.39 .1 -39.87 1.83 -57 4.87 c -50.48 8.92 -59.64 27.58 -59.65 62.01 v 45.46 h 119.29 v 15.15 h -119.29 h -44.76 c -34.67 0 -65.02 20.84 -74.52 60.48 c -10.95 45.44 -11.44 73.79 0 121.23 c 8.48 35.31 28.73 60.47 63.4 60.48 h 41.01 v -54.51 c 0 -39.37 34.06 -74.1 74.51 -74.1 h 119.15 c 33.17 0 59.64 -27.31 59.64 -60.61 v -113.58 c 0 -32.32 -27.27 -56.61 -59.64 -62.01 c -20.49 -3.41 -41.75 -4.96 -62.14 -4.87 z m -64.51 36.57 c 12.32 0 22.38 10.23 22.38 22.8 c 0 12.53 -10.06 22.66 -22.38 22.66 c -12.37 0 -22.38 -10.13 -22.39 -22.66 c 0 -12.57 10.02 -22.8 22.39 -22.8 z}; + % --------------------------------------------------- + \path[every node/.style={scale=7*0.8, font=\titlefont, outer sep=0, inner sep=0}] + (-7cm,0) +(21mm,21mm) node[titlepython]{PYTHON} + (-7cm,0) +(-21mm,-21mm) node + {\textcolor{titleau}{AU}\textcolor{titlelycee}{LYCÉE}}; + + \end{scope} + + \end{tikzpicture} + \end{document} \ No newline at end of file diff --git a/cover/python-logo.tikz b/cover/python-logo.tikz new file mode 100644 index 0000000..abe8743 --- /dev/null +++ b/cover/python-logo.tikz @@ -0,0 +1,72 @@ +% +% A compiler avec xelatex ! +% xelatex -output-driver="xdvipdfmx" python_cover3.tex +\documentclass{article} + +\usetikzlibrary{calc} +% ===================================================== +% For the Python logo (that was in SVG) +% ===================================================== +\usetikzlibrary{svg.path} + +% ===================================================== +% The font +% ===================================================== +\usepackage{fontspec} +\newfontfamily\titlefont{AlteDin1451Mittelschrift.ttf} +\newfontfamily\roboto{Roboto} +\setmainfont{Roboto} +%\newfontfamily\authorfont{Times New Roman} +%\newfontfamily\authorfont{Roboto} +\newfontfamily\authorfont{AlteDin1451Mittelschrift.ttf} + +% ===================================================== +% The colors +% ===================================================== +% Couleur épreuve +\definecolor{coulfond}{HTML}{CCCCCC} +\definecolor{coulup}{HTML}{D01A55} +\definecolor{couldown}{HTML}{C1D208} +\definecolor{coulreste}{HTML}{666666} + +% Colors by function +\colorlet{background}{coulfond} + +\colorlet{author}{black} + +\colorlet{pythonlogoup}{coulup} +\colorlet{pythonlogodown}{couldown} +\colorlet{titlepython}{white} +\colorlet{titleau}{coulreste} +\colorlet{titlelycee}{white} + +\colorlet{subtitlealgo}{coulreste} + +\colorlet{spinepython}{coulup} +\colorlet{spineau}{couldown} +\colorlet{spinelycee}{coulup} +\colorlet{spinealgo}{white} + + +\tikzset{ + frame/.style 2 args={inner sep=0, outer sep=0, minimum width=#1, minimum height=#2, node contents=} +} + +\begin{document} + \begin{tikzpicture} + % --------------------------------------------------- + % Python logo and title + % --------------------------------------------------- + \begin{scope}[transform canvas ={yshift=21mm}] + \fill[shift={(Front.center)},pythonlogoup]svg{M 133.72 -122.51 v 52.97 c 0 41.07 -34.81 75.63 -74.52 75.63 h -119.15 c -32.64 0 -59.64 27.93 -59.64 60.61 v 113.59 c 0 32.32 28.11 51.34 59.64 60.61 c 37.76 11.1 73.96 13.12 119.15 0 c 30.03 -8.69 59.64 -26.19 59.64 -60.61 v -45.46 h -119.14 v -15.15 h 119.14 h 59.64 c 34.67 0 47.59 -24.18 59.64 -60.48 c 12.45 -37.37 11.93 -73.3 0 -121.23 c -8.57 -34.51 -24.93 -60.47 -59.64 -60.48 h -44.76 z m -67.01 287.64 c 12.37 0 22.38 10.13 22.38 22.66 c 0 12.57 -10.02 22.8 -22.38 22.8 c -12.32 0 -22.38 -10.23 -22.38 -22.8 c 0 -12.53 10.06 -22.66 22.38 -22.66 z}; + \fill[shift={(Front.center)},pythonlogodown]svg{M -2.94 -250 c -20.39 .1 -39.87 1.83 -57 4.87 c -50.48 8.92 -59.64 27.58 -59.65 62.01 v 45.46 h 119.29 v 15.15 h -119.29 h -44.76 c -34.67 0 -65.02 20.84 -74.52 60.48 c -10.95 45.44 -11.44 73.79 0 121.23 c 8.48 35.31 28.73 60.47 63.4 60.48 h 41.01 v -54.51 c 0 -39.37 34.06 -74.1 74.51 -74.1 h 119.15 c 33.17 0 59.64 -27.31 59.64 -60.61 v -113.58 c 0 -32.32 -27.27 -56.61 -59.64 -62.01 c -20.49 -3.41 -41.75 -4.96 -62.14 -4.87 z m -64.51 36.57 c 12.32 0 22.38 10.23 22.38 22.8 c 0 12.53 -10.06 22.66 -22.38 22.66 c -12.37 0 -22.38 -10.13 -22.39 -22.66 c 0 -12.57 10.02 -22.8 22.39 -22.8 z}; + % --------------------------------------------------- + \path[every node/.style={scale=7, font=\titlefont, outer sep=0, inner sep=0}] + (Front.center) +(21mm,21mm) node[titlepython]{PYTHON} + (Front.center) +(-21mm,-21mm) node + {\textcolor{titleau}{AU}\textcolor{titlelycee}{LYCÉE}}; + + \end{scope} + + \end{tikzpicture} + \end{document} \ No newline at end of file diff --git a/cover/python-logo_backup.svg b/cover/python-logo_backup.svg new file mode 100644 index 0000000..ef8e8dc --- /dev/null +++ b/cover/python-logo_backup.svg @@ -0,0 +1,112 @@ + + + +image/svg+xmlPYTHON +AU +LYCÉE + \ No newline at end of file diff --git a/cover/python_cover.pdf b/cover/python_cover.pdf new file mode 100644 index 0000000..abfa234 Binary files /dev/null and b/cover/python_cover.pdf differ diff --git a/cover/python_cover.tex b/cover/python_cover.tex new file mode 100644 index 0000000..c4bf083 --- /dev/null +++ b/cover/python_cover.tex @@ -0,0 +1,175 @@ +% +% A compiler avec xelatex ! +% xelatex -output-driver="xdvipdfmx -V3" python_cover.tex +% +\documentclass[tikz,border=0mm]{standalone} +\usetikzlibrary{calc} +% ===================================================== +% For the Python logo (that was in SVG) +% ===================================================== +\usetikzlibrary{svg.path} +% ===================================================== +% For the Hilbert curve +% ===================================================== +\usetikzlibrary{shadings,lindenmayersystems} +\pgfdeclarelindenmayersystem{Hilbert curve}{ + \rule{L -> +RF-LFL-FR+} + \rule{R -> -LF+RFR+FL-}} +% ===================================================== +% The font +% ===================================================== +\usepackage{fontspec} +\newfontfamily\titlefont{AlteDin1451Mittelschrift.ttf} +\newfontfamily\roboto{Roboto} +\setmainfont{Roboto} +%\newfontfamily\authorfont{Times New Roman} +%\newfontfamily\authorfont{Roboto} +\newfontfamily\authorfont{AlteDin1451Mittelschrift.ttf} + +% ===================================================== +% The colors +% ===================================================== +\definecolor{scratchgreen}{rgb}{.43000793,.78393555,.27934265} +\definecolor{scratchviolet}{rgb}{.50601196,.10708618,.55937195} + +\definecolor{goldleaf}{HTML}{D1B280} +% 16 Day & Night +\definecolor{darknavy}{HTML}{011A27} +\definecolor{blueberry}{HTML}{073852} +\definecolor{tangerine}{HTML}{F0810F} +\definecolor{daffodil}{HTML}{E7DF44} + +% Colors by function +\colorlet{background}{tangerine} +\tikzset{ + hilbert/.style = {bottom color=black, top color=white, draw=black, opacity=.14}, + spine/.style = {fill, opacity=.1} +} + +\colorlet{author}{black} + +\colorlet{pythonlogoup}{darknavy} +\colorlet{pythonlogodown}{blueberry} +\colorlet{titlepython}{white} +\colorlet{titleau}{daffodil} +\colorlet{titlelycee}{white} + +\colorlet{subtitlealgo}{blueberry} + +\colorlet{spinepython}{white} +\colorlet{spineau}{daffodil} +\colorlet{spinelycee}{white} +\colorlet{spinealgo}{blueberry} + + +%======================================================= +% The cover size +%======================================================= +% Calculate the splin +\def\numPages{262} +\newlength{\thickCream}\setlength{\thickCream}{0.0025 in} +\newlength{\thickWhite}\setlength{\thickWhite}{0.002252 in} +\newlength{\SpineW}\setlength{\SpineW}{\numPages\thickWhite} % 236*0.0025 = 0.59 (cream), 262*0.002252 = 0.590024 (white) +% The standard bleed +\newlength{\Bleed}\setlength{\Bleed}{.125 in} +% Set the page size +\newlength{\PageW}\setlength{\PageW}{8.5 in} +\newlength{\PageH}\setlength{\PageH}{11 in} +% Calculate the total dimensions +\newlength{\TrimW}\setlength{\TrimW}{\dimexpr 2\PageW + \SpineW \relax} +\newlength{\TrimH}\setlength{\TrimH}{\PageH} +\newlength{\CropW}\setlength{\CropW}{\dimexpr \TrimW + 2\Bleed \relax} +\newlength{\CropH}\setlength{\CropH}{\dimexpr \TrimH + 2\Bleed \relax} +\newlength{\LineW}\setlength{\LineW}{2\Bleed} +%======================================================= +% Some PDF specials +%======================================================= +\special{pdf: docinfo << +/Author (Exo7) +/Title (Python au Lycée - Algorithmes et programmation) +/Keywords (Python, Lycée) +/Subject (manuel de programmation en Python) +>>} +\edef\pwpt{\the\numexpr \dimexpr0.996264009963\CropW\relax/65536 \relax} %paper width in PS points +\edef\phpt{\the\numexpr \dimexpr0.996264009963\CropH\relax/65536 \relax} %paper height in PS points +\expandafter\special\expandafter{pdf: put @thispage << + /MediaBox [0 0 \pwpt\space\phpt] + /BleedBox [0 0 \pwpt\space\phpt] + /CropBox [0 0 \pwpt\space\phpt] + /TrimBox [0 0 \pwpt\space\phpt]>>} +%======================================================= +% for test +%======================================================= +\usepackage{blindtext} +\newif\ifshowborders\showbordersfalse % to display the security zone (Bleed) +% \showborderstrue + +\tikzset{ + frame/.style 2 args={inner sep=0, outer sep=0, minimum width=#1, minimum height=#2, node contents=} +} + +\begin{document}% + \begin{tikzpicture} + % Clip + \clip (-.5*\CropW,-\Bleed) rectangle +(\CropW,\CropH); + % Set nodes for anchors : Cover, Back, Front and Spine + \path + (0,-\Bleed) node[name=Cover,above,fill=background,frame={\CropW}{\CropH}] + (-\SpineW/2,0) node[name=Back,above left,frame={\PageW}{\PageH}] + (\SpineW/2,0) node[name=Front,above right,frame={\PageW}{\PageH}] + (0,0) node[name=Spine,above,spine,frame={\SpineW}{\PageH}]; + % --------------------------------------------------- + % Background + % --------------------------------------------------- + \def\steps{5} + \shadedraw[shift={(Cover.south west)}, hilbert] + [l-system={Hilbert curve, axiom=L, order=5, step={\CropW/31+.01pt}, angle=90}] + lindenmayer system; + % --------------------------------------------------- + % Auteur + % --------------------------------------------------- + \path (Front.north) +(0,-21mm) node[author,scale=3,font=\authorfont]{Arnaud Bodin}; + % --------------------------------------------------- + % Python logo and title + % --------------------------------------------------- + \begin{scope}[transform canvas ={yshift=21mm}] + \fill[shift={(Front.center)},pythonlogoup]svg{M 133.72 -122.51 v 52.97 c 0 41.07 -34.81 75.63 -74.52 75.63 h -119.15 c -32.64 0 -59.64 27.93 -59.64 60.61 v 113.59 c 0 32.32 28.11 51.34 59.64 60.61 c 37.76 11.1 73.96 13.12 119.15 0 c 30.03 -8.69 59.64 -26.19 59.64 -60.61 v -45.46 h -119.14 v -15.15 h 119.14 h 59.64 c 34.67 0 47.59 -24.18 59.64 -60.48 c 12.45 -37.37 11.93 -73.3 0 -121.23 c -8.57 -34.51 -24.93 -60.47 -59.64 -60.48 h -44.76 z m -67.01 287.64 c 12.37 0 22.38 10.13 22.38 22.66 c 0 12.57 -10.02 22.8 -22.38 22.8 c -12.32 0 -22.38 -10.23 -22.38 -22.8 c 0 -12.53 10.06 -22.66 22.38 -22.66 z}; + \fill[shift={(Front.center)},pythonlogodown]svg{M -2.94 -250 c -20.39 .1 -39.87 1.83 -57 4.87 c -50.48 8.92 -59.64 27.58 -59.65 62.01 v 45.46 h 119.29 v 15.15 h -119.29 h -44.76 c -34.67 0 -65.02 20.84 -74.52 60.48 c -10.95 45.44 -11.44 73.79 0 121.23 c 8.48 35.31 28.73 60.47 63.4 60.48 h 41.01 v -54.51 c 0 -39.37 34.06 -74.1 74.51 -74.1 h 119.15 c 33.17 0 59.64 -27.31 59.64 -60.61 v -113.58 c 0 -32.32 -27.27 -56.61 -59.64 -62.01 c -20.49 -3.41 -41.75 -4.96 -62.14 -4.87 z m -64.51 36.57 c 12.32 0 22.38 10.23 22.38 22.8 c 0 12.53 -10.06 22.66 -22.38 22.66 c -12.37 0 -22.38 -10.13 -22.39 -22.66 c 0 -12.57 10.02 -22.8 22.39 -22.8 z}; + % --------------------------------------------------- + \path[every node/.style={scale=7, font=\titlefont, outer sep=0, inner sep=0}] + (Front.center) +(21mm,21mm) node[titlepython]{PYTHON} + (Front.center) +(-21mm,-21mm) node + {\textcolor{titleau}{AU}\textcolor{titlelycee}{LYCÉE}}; + \path (Cover.east) +(0,-105mm) node[left,scale=2,text width=.35\PageW,align=left,fill=white,text=subtitlealgo,inner sep=.7em]{Algorithmes et programmation}; + \end{scope} + % --------------------------------------------------- + % Spine + % --------------------------------------------------- + \begin{scope}[transform canvas ={yshift=21mm}] + \node[rotate=-90,scale=2.1] (tranche) at (Spine.center) + {\textcolor{spinepython}{PYTHON}\textcolor{spineau}{~AU~}\textcolor{spinelycee}{LYCÉE}\textcolor{spinealgo}{~\textemdash~Algorithmes et programmation}}; + \end{scope} + % --------------------------------------------------- + % Logos Exo7 + % --------------------------------------------------- + \path (Spine.south) +(0,14mm) node{\includegraphics[width=11mm]{exo7_logo_white}}; + \path (Front.south) +(0,14mm) node{\includegraphics[width=21mm]{exo7_logo_white}}; + % --------------------------------------------------- + % Back + % --------------------------------------------------- + \path (Back.center) node[scale=2,text width=7cm,fill=white,fill opacity=.5,text opacity=.77]{\blindtext}; + % --------------------------------------------------- + \ifshowborders + % --- security zone + \begin{scope}[line width=\LineW,red,opacity=.35] + \draw (-.5*\TrimW,0) rectangle +(\TrimW,\TrimH); + \draw (-.5*\SpineW-\Bleed/3,0) rectangle +(\SpineW+2\Bleed/3,\TrimH); + \end{scope} + % --- guides + \begin{scope}[dashed] + \draw (-.5*\TrimW,0) rectangle +(\TrimW,\TrimH); + \draw (-.5*\SpineW,0) rectangle +(\SpineW,\TrimH); + \end{scope} + \fi + \end{tikzpicture}% +\end{document} diff --git a/cover/python_cover2.pdf b/cover/python_cover2.pdf new file mode 100644 index 0000000..d9e7440 Binary files /dev/null and b/cover/python_cover2.pdf differ diff --git a/cover/python_cover2.tex b/cover/python_cover2.tex new file mode 100644 index 0000000..24cde4b --- /dev/null +++ b/cover/python_cover2.tex @@ -0,0 +1,203 @@ +% +% A compiler avec xelatex ! +% xelatex -output-driver="xdvipdfmx -V3" python_cover.tex +%% xelatex -output-driver="xdvipdfmx" python_cover.tex +\documentclass[tikz,border=0mm]{standalone} +\usetikzlibrary{calc} +% ===================================================== +% For the Python logo (that was in SVG) +% ===================================================== +\usetikzlibrary{svg.path} +% ===================================================== +% For the Hilbert curve +% ===================================================== +\usetikzlibrary{shadings,lindenmayersystems} +\pgfdeclarelindenmayersystem{Hilbert curve}{ + \rule{L -> +RF-LFL-FR+} + \rule{R -> -LF+RFR+FL-}} +% ===================================================== +% The font +% ===================================================== +\usepackage{fontspec} +\newfontfamily\titlefont{AlteDin1451Mittelschrift.ttf} +\newfontfamily\roboto{Roboto} +\setmainfont{Roboto} +%\newfontfamily\authorfont{Times New Roman} +\newfontfamily\authorfont{Roboto} +%\newfontfamily\authorfont{AlteDin1451Mittelschrift.ttf} + +% ===================================================== +% The colors +% ===================================================== +\definecolor{scratchgreen}{rgb}{.43000793,.78393555,.27934265} +\definecolor{scratchviolet}{rgb}{.50601196,.10708618,.55937195} + +\definecolor{goldleaf}{HTML}{D1B280} +% 16 Day & Night +\definecolor{darknavy}{HTML}{011A27} +\definecolor{blueberry}{HTML}{073852} +\definecolor{tangerine}{HTML}{F0810F} + +\definecolor{daffodil}{HTML}{E7DF44} + +\definecolor{hazelnut}{HTML}{B99A77} +\definecolor{ginger}{HTML}{AF1C1C} +\definecolor{sky}{HTML}{2F2F28} + +% Colors by function +\colorlet{background}{hazelnut} + +\tikzset{ + hilbert/.style = {bottom color=black, top color=white, draw=black, opacity=.14}, + spine/.style = {fill, opacity=.1} +} + +\colorlet{author}{black} + +\colorlet{pythonlogoup}{darknavy} +\colorlet{pythonlogodown}{blueberry} +\colorlet{titlepython}{ginger} +\colorlet{titleau}{sky} +\colorlet{titlelycee}{ginger} + +\colorlet{subtitlealgo}{blueberry} + +\colorlet{spinepython}{white} +\colorlet{spineau}{sky} +\colorlet{spinelycee}{white} +\colorlet{spinealgo}{ginger} + +\definecolor{coul1}{HTML}{FFFFFF} +\definecolor{coul2}{HTML}{AAAAAA} +\colorlet{serpent}{coul1} +\colorlet{oeilserpent}{coul2} + +%======================================================= +% The cover size +%======================================================= +% Calculate the splin +\def\numPages{262} +\newlength{\thickCream}\setlength{\thickCream}{0.0025 in} +\newlength{\thickWhite}\setlength{\thickWhite}{0.002252 in} +\newlength{\SpineW}\setlength{\SpineW}{\numPages\thickWhite} % 236*0.0025 = 0.59 (cream), 262*0.002252 = 0.590024 (white) +% The standard bleed +\newlength{\Bleed}\setlength{\Bleed}{.125 in} +% Set the page size +\newlength{\PageW}\setlength{\PageW}{8.5 in} +\newlength{\PageH}\setlength{\PageH}{11 in} +% Calculate the total dimensions +\newlength{\TrimW}\setlength{\TrimW}{\dimexpr 2\PageW + \SpineW \relax} +\newlength{\TrimH}\setlength{\TrimH}{\PageH} +\newlength{\CropW}\setlength{\CropW}{\dimexpr \TrimW + 2\Bleed \relax} +\newlength{\CropH}\setlength{\CropH}{\dimexpr \TrimH + 2\Bleed \relax} +\newlength{\LineW}\setlength{\LineW}{2\Bleed} +%======================================================= +% Some PDF specials +%======================================================= +\special{pdf: docinfo << +/Author (Exo7) +/Title (Python au Lycée - Algorithmes et programmation) +/Keywords (Python, Lycée) +/Subject (manuel de programmation en Python) +>>} +\edef\pwpt{\the\numexpr \dimexpr0.996264009963\CropW\relax/65536 \relax} %paper width in PS points +\edef\phpt{\the\numexpr \dimexpr0.996264009963\CropH\relax/65536 \relax} %paper height in PS points +\expandafter\special\expandafter{pdf: put @thispage << + /MediaBox [0 0 \pwpt\space\phpt] + /BleedBox [0 0 \pwpt\space\phpt] + /CropBox [0 0 \pwpt\space\phpt] + /TrimBox [0 0 \pwpt\space\phpt]>>} +%======================================================= +% for test +%======================================================= +\usepackage{blindtext} +\newif\ifshowborders\showbordersfalse % to display the security zone (Bleed) +\showborderstrue + +\tikzset{ + frame/.style 2 args={inner sep=0, outer sep=0, minimum width=#1, minimum height=#2, node contents=} +} + +\begin{document}% + \begin{tikzpicture} + % Clip + \clip (-.5*\CropW,-\Bleed) rectangle +(\CropW,\CropH); + % Set nodes for anchors : Cover, Back, Front and Spine + \path + (0,-\Bleed) node[name=Cover,above,fill=background,frame={\CropW}{\CropH}] + (-\SpineW/2,0) node[name=Back,above left,frame={\PageW}{\PageH}] + (\SpineW/2,0) node[name=Front,above right,frame={\PageW}{\PageH}] + (0,0) node[name=Spine,above,spine,frame={\SpineW}{\PageH}]; + % --------------------------------------------------- + % Background + % --------------------------------------------------- + \def\steps{5} + \shadedraw[shift={(Cover.south west)},hilbert] + [l-system={Hilbert curve, axiom=L, order=5, step={\CropW/31+.01pt}, angle=90}] + lindenmayer system; + % --------------------------------------------------- + % Python logo and title + \begin{scope}[transform canvas ={yshift=21mm}] + \begin{scope}[scale=1.6,yshift=110mm,xshift=35mm] + + +\path[ultra thick,fill =serpent] (0,0) arc (90:-90:-1) -- ++(9,0) -- ++(0,-6 ) -- ++ (-4,0) -- ++(0,-3) -- ++(8,0) -- ++(0,-2) --++(-10,0)--++(0,7) --++(4,0) --++(0,2) --cycle ; +% +% (0,0) arc (90:-90:-1) -- ++(9,0) -- ++(0,-6 ) -- ++ (-4,0) -- ++(0,-3) -- ++(4,0) -- ++(0,-6) -- ++(-8,0) % -- ++ (-1,1) -- ++ (1,1) +%--++(0,2) +%-- ++(6,0) -- ++(0,2) --++(-4,0) -- ++(0,7) --++(4,0) -- ++(0,2) --cycle ; +\path[fill=oeilserpent] (0,1.2) circle (0.3); +\end{scope} + \end{scope} + % --------------------------------------------------- + \begin{scope}[transform canvas ={yshift=21mm}] + % \fill[shift={(Front.center)},pythonlogoup]svg{M 133.72 -122.51 v 52.97 c 0 41.07 -34.81 75.63 -74.52 75.63 h -119.15 c -32.64 0 -59.64 27.93 -59.64 60.61 v 113.59 c 0 32.32 28.11 51.34 59.64 60.61 c 37.76 11.1 73.96 13.12 119.15 0 c 30.03 -8.69 59.64 -26.19 59.64 -60.61 v -45.46 h -119.14 v -15.15 h 119.14 h 59.64 c 34.67 0 47.59 -24.18 59.64 -60.48 c 12.45 -37.37 11.93 -73.3 0 -121.23 c -8.57 -34.51 -24.93 -60.47 -59.64 -60.48 h -44.76 z m -67.01 287.64 c 12.37 0 22.38 10.13 22.38 22.66 c 0 12.57 -10.02 22.8 -22.38 22.8 c -12.32 0 -22.38 -10.23 -22.38 -22.8 c 0 -12.53 10.06 -22.66 22.38 -22.66 z}; + % \fill[shift={(Front.center)},pythonlogodown]svg{M -2.94 -250 c -20.39 .1 -39.87 1.83 -57 4.87 c -50.48 8.92 -59.64 27.58 -59.65 62.01 v 45.46 h 119.29 v 15.15 h -119.29 h -44.76 c -34.67 0 -65.02 20.84 -74.52 60.48 c -10.95 45.44 -11.44 73.79 0 121.23 c 8.48 35.31 28.73 60.47 63.4 60.48 h 41.01 v -54.51 c 0 -39.37 34.06 -74.1 74.51 -74.1 h 119.15 c 33.17 0 59.64 -27.31 59.64 -60.61 v -113.58 c 0 -32.32 -27.27 -56.61 -59.64 -62.01 c -20.49 -3.41 -41.75 -4.96 -62.14 -4.87 z m -64.51 36.57 c 12.32 0 22.38 10.23 22.38 22.8 c 0 12.53 -10.06 22.66 -22.38 22.66 c -12.37 0 -22.38 -10.13 -22.39 -22.66 c 0 -12.57 10.02 -22.8 22.39 -22.8 z}; + % --------------------------------------------------- + % \path[every node/.style={scale=7, font=\titlefont}]%, outer sep=0, inner sep=0}] + \path[every node/.style={scale=7, font=\titlefont}] (Front.center) + (93mm,53mm) node[left] {\textcolor{titlepython}{PYTHON}}; +\path[every node/.style={scale=7, font=\titlefont}](Front.center) +(93mm,23mm) node[left] {\textcolor{titleau}{AU}}; + \path[every node/.style={scale=7, font=\titlefont}](Front.center) +(93mm,-9mm) node[left] {\textcolor{titlelycee}{LYCÉE}}; + + \end{scope} + + % --------------------------------------------------- + \begin{scope}[transform canvas ={yshift=21mm}] + % Auteur + \path (Front.south) +(-53mm,-1mm) node[author,scale=3,font=\authorfont]{\textcolor{titleau}{\bf Arnaud Bodin}}; + % Sous-titre + \path (Front.center) +(20mm,-86mm) node[right,scale=2.5,font=\authorfont]{Algorithmes et}; + \path (Front.center) +(20mm,-96mm) node[right,scale=2.5,font=\authorfont]{programmation}; + \end{scope} + + % --------------------------------------------------- + % Spine + % --------------------------------------------------- + \begin{scope}[transform canvas ={yshift=21mm}] + \node[rotate=-90,scale=2.1] (tranche) at (Spine.center) + {\textcolor{spinepython}{\bf PYTHON}\textcolor{spineau}{\bf ~AU~}\textcolor{spinelycee}{\bf LYCÉE}\textcolor{spinealgo}{\bf ~\textemdash~Algorithmes et programmation}}; + \end{scope} + % --------------------------------------------------- + % Logos Exo7 + % --------------------------------------------------- + \path (Spine.south) +(0,14mm) node{\includegraphics[width=11mm]{exo7_logo_white.pdf}}; + \path (Front.south) +(80mm,25mm) node{\includegraphics[width=21mm]{exo7_logo_white.pdf}}; + % --------------------------------------------------- + % Back + % --------------------------------------------------- + \path (Back.center) node[scale=2,text width=7cm,fill=white,fill opacity=.5,text opacity=.77]{\blindtext}; + % --------------------------------------------------- + \ifshowborders + % --- security zone + \begin{scope}[line width=\LineW,red,opacity=.35] + \draw (-.5*\TrimW,0) rectangle +(\TrimW,\TrimH); + \draw (-.5*\SpineW-\Bleed/3,0) rectangle +(\SpineW+2\Bleed/3,\TrimH); + \end{scope} + % --- guides + \begin{scope}[dashed] + \draw (-.5*\TrimW,0) rectangle +(\TrimW,\TrimH); + \draw (-.5*\SpineW,0) rectangle +(\SpineW,\TrimH); + \end{scope} + \fi + \end{tikzpicture}% +\end{document} diff --git a/cover/python_cover3.pdf b/cover/python_cover3.pdf new file mode 100644 index 0000000..965d295 Binary files /dev/null and b/cover/python_cover3.pdf differ diff --git a/cover/python_cover3.tex b/cover/python_cover3.tex new file mode 100644 index 0000000..b679f9d --- /dev/null +++ b/cover/python_cover3.tex @@ -0,0 +1,251 @@ +% +% A compiler avec xelatex ! +% xelatex -output-driver="xdvipdfmx" python_cover3.tex +% +\documentclass[tikz,border=0mm]{standalone} +\usetikzlibrary{calc} +% ===================================================== +% For the Python logo (that was in SVG) +% ===================================================== +\usetikzlibrary{svg.path} +% ===================================================== +% For the Hilbert curve +% ===================================================== +\usetikzlibrary{shadings,lindenmayersystems} +\pgfdeclarelindenmayersystem{Hilbert curve}{ + \rule{L -> +RF-LFL-FR+} + \rule{R -> -LF+RFR+FL-}} +% ===================================================== +% The font +% ===================================================== +\usepackage{fontspec} +\newfontfamily\titlefont{AlteDin1451Mittelschrift.ttf} +\newfontfamily\roboto{Roboto} +\setmainfont{Roboto} +%\newfontfamily\authorfont{Times New Roman} +%\newfontfamily\authorfont{Roboto} +\newfontfamily\authorfont{AlteDin1451Mittelschrift.ttf} + +% ===================================================== +% The colors +% ===================================================== +\definecolor{scratchgreen}{rgb}{.43000793,.78393555,.27934265} +\definecolor{scratchviolet}{rgb}{.50601196,.10708618,.55937195} + +\definecolor{goldleaf}{HTML}{D1B280} +% 16 Day & Night +\definecolor{darknavy}{HTML}{011A27} +\definecolor{blueberry}{HTML}{073852} +\definecolor{tangerine}{HTML}{F0810F} +\definecolor{daffodil}{HTML}{E7DF44} + +% Arnaud +\definecolor{hazelnut}{HTML}{B99A77} +\definecolor{aquablue}{HTML}{31A9B9} +\definecolor{tomato}{HTML}{CF3721} +\definecolor{avocado}{HTML}{258039} + +\definecolor{cayenne}{HTML}{AF4425} +\definecolor{cinnamon}{HTML}{662E1C} +\definecolor{caramel}{HTML}{C9A66B} + +% Style marron +%\definecolor{coulfond}{HTML}{DDC5A2} +%\definecolor{coulup}{HTML}{301B28} +%\definecolor{couldown}{HTML}{B6452C} +%\definecolor{coulreste}{HTML}{523634} + +% Couleur épreuve +\definecolor{coulfond}{HTML}{CCCCCC} +\definecolor{coulup}{HTML}{D01A55} +\definecolor{couldown}{HTML}{C1D208} +\definecolor{coulreste}{HTML}{666666} + +% Colors by function +\colorlet{background}{coulfond} +\tikzset{ + hilbert/.style = {bottom color=black, top color=white, draw=black, opacity=.14}, + spine/.style = {fill, opacity=.1} +} + +\colorlet{author}{black} + +\colorlet{pythonlogoup}{coulup} +\colorlet{pythonlogodown}{couldown} +\colorlet{titlepython}{white} +\colorlet{titleau}{coulreste} +\colorlet{titlelycee}{white} + +\colorlet{subtitlealgo}{coulreste} + +\colorlet{spinepython}{coulup} +\colorlet{spineau}{couldown} +\colorlet{spinelycee}{coulup} +\colorlet{spinealgo}{white} + + +%======================================================= +% The cover size +%======================================================= +% Calculate the splin +\def\numPages{253} +\newlength{\thickCream}\setlength{\thickCream}{0.0025 in} +\newlength{\thickWhite}\setlength{\thickWhite}{0.002252 in} +\newlength{\SpineW}\setlength{\SpineW}{\numPages\thickWhite} % 236*0.0025 = 0.59 (cream), 262*0.002252 = 0.590024 (white) +% The standard bleed +\newlength{\Bleed}\setlength{\Bleed}{.125 in} +% Set the page size +\newlength{\PageW}\setlength{\PageW}{8.5 in} +\newlength{\PageH}\setlength{\PageH}{11 in} +% Calculate the total dimensions +\newlength{\TrimW}\setlength{\TrimW}{\dimexpr 2\PageW + \SpineW \relax} +\newlength{\TrimH}\setlength{\TrimH}{\PageH} +\newlength{\CropW}\setlength{\CropW}{\dimexpr \TrimW + 2\Bleed \relax} +\newlength{\CropH}\setlength{\CropH}{\dimexpr \TrimH + 2\Bleed \relax} +\newlength{\LineW}\setlength{\LineW}{2\Bleed} +%======================================================= +% Some PDF specials +%======================================================= +\special{pdf: docinfo << +/Author (Exo7) +/Title (Python au Lycée - Algorithmes et programmation) +/Keywords (Python, Lycée) +/Subject (manuel de programmation en Python) +>>} +\edef\pwpt{\the\numexpr \dimexpr0.996264009963\CropW\relax/65536 \relax} %paper width in PS points +\edef\phpt{\the\numexpr \dimexpr0.996264009963\CropH\relax/65536 \relax} %paper height in PS points +\expandafter\special\expandafter{pdf: put @thispage << + /MediaBox [0 0 \pwpt\space\phpt] + /BleedBox [0 0 \pwpt\space\phpt] + /CropBox [0 0 \pwpt\space\phpt] + /TrimBox [0 0 \pwpt\space\phpt]>>} +%======================================================= +% for test +%======================================================= +\usepackage{blindtext} +\newif\ifshowborders\showbordersfalse % to display the security zone (Bleed) +%\showborderstrue + +\tikzset{ + frame/.style 2 args={inner sep=0, outer sep=0, minimum width=#1, minimum height=#2, node contents=} +} + +\begin{document}% + \begin{tikzpicture} + % Clip + \clip (-.5*\CropW,-\Bleed) rectangle +(\CropW,\CropH); + % Set nodes for anchors : Cover, Back, Front and Spine + \path + (0,-\Bleed) node[name=Cover,above,fill=background,frame={\CropW}{\CropH}] + (-\SpineW/2,0) node[name=Back,above left,frame={\PageW}{\PageH}] + (\SpineW/2,0) node[name=Front,above right,frame={\PageW}{\PageH}] + (0,0) node[name=Spine,above,spine,frame={\SpineW}{\PageH}]; + % --------------------------------------------------- + % Background + % --------------------------------------------------- + \def\steps{5} + \shadedraw[shift={(Cover.south west)}, hilbert] + [l-system={Hilbert curve, axiom=L, order=5, step={\CropW/31+.01pt}, angle=90}] + lindenmayer system; + % --------------------------------------------------- + % Auteur + % --------------------------------------------------- + \path (Front.north) +(0,-21mm) node[author,text=subtitlealgo,scale=2.5,font=\authorfont]{\bf Arnaud Bodin}; + % --------------------------------------------------- + % Python logo and title + % --------------------------------------------------- + \begin{scope}[transform canvas ={yshift=21mm}] + \fill[shift={(Front.center)},pythonlogoup]svg{M 133.72 -122.51 v 52.97 c 0 41.07 -34.81 75.63 -74.52 75.63 h -119.15 c -32.64 0 -59.64 27.93 -59.64 60.61 v 113.59 c 0 32.32 28.11 51.34 59.64 60.61 c 37.76 11.1 73.96 13.12 119.15 0 c 30.03 -8.69 59.64 -26.19 59.64 -60.61 v -45.46 h -119.14 v -15.15 h 119.14 h 59.64 c 34.67 0 47.59 -24.18 59.64 -60.48 c 12.45 -37.37 11.93 -73.3 0 -121.23 c -8.57 -34.51 -24.93 -60.47 -59.64 -60.48 h -44.76 z m -67.01 287.64 c 12.37 0 22.38 10.13 22.38 22.66 c 0 12.57 -10.02 22.8 -22.38 22.8 c -12.32 0 -22.38 -10.23 -22.38 -22.8 c 0 -12.53 10.06 -22.66 22.38 -22.66 z}; + \fill[shift={(Front.center)},pythonlogodown]svg{M -2.94 -250 c -20.39 .1 -39.87 1.83 -57 4.87 c -50.48 8.92 -59.64 27.58 -59.65 62.01 v 45.46 h 119.29 v 15.15 h -119.29 h -44.76 c -34.67 0 -65.02 20.84 -74.52 60.48 c -10.95 45.44 -11.44 73.79 0 121.23 c 8.48 35.31 28.73 60.47 63.4 60.48 h 41.01 v -54.51 c 0 -39.37 34.06 -74.1 74.51 -74.1 h 119.15 c 33.17 0 59.64 -27.31 59.64 -60.61 v -113.58 c 0 -32.32 -27.27 -56.61 -59.64 -62.01 c -20.49 -3.41 -41.75 -4.96 -62.14 -4.87 z m -64.51 36.57 c 12.32 0 22.38 10.23 22.38 22.8 c 0 12.53 -10.06 22.66 -22.38 22.66 c -12.37 0 -22.38 -10.13 -22.39 -22.66 c 0 -12.57 10.02 -22.8 22.39 -22.8 z}; + % --------------------------------------------------- + \path[every node/.style={scale=7, font=\titlefont, outer sep=0, inner sep=0}] + (Front.center) +(21mm,21mm) node[titlepython]{PYTHON} + (Front.center) +(-21mm,-21mm) node + {\textcolor{titleau}{AU}\textcolor{titlelycee}{LYCÉE}}; + \path (Cover.east) +(55mm,-105mm) node[left,scale=2.5,text width=.35\PageW,align=left,fill=white,text=subtitlealgo,inner sep=.3em,font=\authorfont]{\bf ~~Algorithmes et programmation~~\vphantom{\Large t}}; + \end{scope} + % --------------------------------------------------- + % Spine + % --------------------------------------------------- + \begin{scope}[transform canvas ={yshift=21mm}] + \node[rotate=90,scale=1.8] (tranche) at (Spine.center) + {\textcolor{spinepython}{PYTHON}\textcolor{spineau}{AU}\textcolor{spinelycee}{LYCÉE}\textcolor{spinealgo}{~~~\textemdash~~Algorithmes et programmation}\vphantom{\large y}}; + \end{scope} + % --------------------------------------------------- + % Logos Exo7 + % --------------------------------------------------- + \path (Spine.south) +(0,14mm) node{\includegraphics[width=11mm]{exo7_logo_white}}; + \path (Front.south) +(0,14mm) node{\includegraphics[width=21mm]{exo7_logo_white}}; + % --------------------------------------------------- + % Back + % --------------------------------------------------- + \path (Back.center) node[scale=1.5,text width=12cm,fill=white,fill opacity=.5,text opacity=.77,align = center]{ + \vspace*{2ex} + + \hyphenchar\font=-1 % pas de césure + + \emph{Python} est le langage idéal pour apprendre la programmation. +C'est un langage puissant qui vous plongera dans le monde des algorithmes. + +\bigskip + +Ce livre vous guide pas à pas à travers des activités mathématiques et informatiques originales adaptées au lycée. Il se complète par des ressources en ligne : tous les codes \emph{Python}, des vidéos et des fiches en couleurs. +Vous avez tout en main pour réussir ! + +\bigskip +\footnotesize + +\begin{center} +\begin{minipage}{0.49\textwidth} +\begin{itemize} +\setlength{\itemsep}{-1pt}% +\item Premiers pas +\item Tortue (Scratch avec Python) +\item Si ... alors ... +\item Fonctions +\item Arithmétique -- Boucle tant que -- I +\item Chaînes de caractères% - Analyse d'un texte +\item Listes I +\item Statistique -- Visualisation de données +\item Fichiers +\item Arithmétique -- Boucle tant que -- II +\item Binaire I +\item Listes II +\item Binaire II +\end{itemize} +\end{minipage} +\begin{minipage}{0.49\textwidth} +\begin{itemize} +\setlength{\itemsep}{0pt}% +\item Probabilités -- Paradoxe de Parrondo +\item Chercher et remplacer +\item Calculatrice polonaise -- Piles +\item Visualiseur de texte -- Markdown +\item L-système +\item Images dynamiques +\item Jeu de la vie +\item Graphes et combinatoire de Ramsey +\item Bitcoin +\item Constructions aléatoires +\end{itemize} +\end{minipage} +\end{center} + + \vspace*{3ex} + + }; + % --------------------------------------------------- + \ifshowborders + % --- security zone + \begin{scope}[line width=\LineW,red,opacity=.35] + \draw (-.5*\TrimW,0) rectangle +(\TrimW,\TrimH); + \draw (-.5*\SpineW-\Bleed/3,0) rectangle +(\SpineW+2\Bleed/3,\TrimH); + \end{scope} + % --- guides + \begin{scope}[dashed] + \draw (-.5*\TrimW,0) rectangle +(\TrimW,\TrimH); + \draw (-.5*\SpineW,0) rectangle +(\SpineW,\TrimH); + \end{scope} + \fi + \end{tikzpicture}% +\end{document} diff --git a/cover/python_cover4.pdf b/cover/python_cover4.pdf new file mode 100644 index 0000000..40cb271 Binary files /dev/null and b/cover/python_cover4.pdf differ diff --git a/cover/python_cover4.tex b/cover/python_cover4.tex new file mode 100644 index 0000000..96bb5b6 --- /dev/null +++ b/cover/python_cover4.tex @@ -0,0 +1,259 @@ +% +% A compiler avec xelatex ! +% xelatex -output-driver="xdvipdfmx" python_cover4.tex +% +\documentclass[tikz,border=0mm]{standalone} +\usetikzlibrary{calc} +% ===================================================== +% For the Python logo (that was in SVG) +% ===================================================== +\usetikzlibrary{svg.path} +% ===================================================== +% For the Hilbert curve +% ===================================================== +\usetikzlibrary{shadings,lindenmayersystems} +\pgfdeclarelindenmayersystem{Hilbert curve}{ + \rule{L -> +RF-LFL-FR+} + \rule{R -> -LF+RFR+FL-}} +% ===================================================== +% The font +% ===================================================== +\usepackage{fontspec} +\newfontfamily\titlefont{AlteDin1451Mittelschrift.ttf} +\newfontfamily\roboto{Roboto} +\setmainfont{Roboto} +%\newfontfamily\authorfont{Times New Roman} +%\newfontfamily\authorfont{Roboto} +\newfontfamily\authorfont{AlteDin1451Mittelschrift.ttf} + +% ===================================================== +% The colors +% ===================================================== +\definecolor{scratchgreen}{rgb}{.43000793,.78393555,.27934265} +\definecolor{scratchviolet}{rgb}{.50601196,.10708618,.55937195} + +\definecolor{goldleaf}{HTML}{D1B280} +% 16 Day & Night +\definecolor{darknavy}{HTML}{011A27} +\definecolor{blueberry}{HTML}{073852} +\definecolor{tangerine}{HTML}{F0810F} +\definecolor{daffodil}{HTML}{E7DF44} + +% Arnaud +\definecolor{hazelnut}{HTML}{B99A77} +\definecolor{aquablue}{HTML}{31A9B9} +\definecolor{tomato}{HTML}{CF3721} +\definecolor{avocado}{HTML}{258039} + +\definecolor{cayenne}{HTML}{AF4425} +\definecolor{cinnamon}{HTML}{662E1C} +\definecolor{caramel}{HTML}{C9A66B} + +% Style marron +%\definecolor{coulfond}{HTML}{DDC5A2} +%\definecolor{coulup}{HTML}{301B28} +%\definecolor{couldown}{HTML}{B6452C} +%\definecolor{coulreste}{HTML}{523634} + +% Couleur épreuve +\definecolor{coulfond}{HTML}{CCCCCC} +\definecolor{coulup}{HTML}{D01A55} +\definecolor{couldown}{HTML}{C1D208} +\definecolor{coulreste}{HTML}{666666} + +% Colors by function +\colorlet{background}{coulfond} +\tikzset{ + hilbert/.style = {bottom color=black, top color=white, draw=black, opacity=.14}, + spine/.style = {fill, opacity=.1} +} + +\colorlet{author}{black} + +\colorlet{pythonlogoup}{coulup} +\colorlet{pythonlogodown}{couldown} +\colorlet{titlepython}{white} +\colorlet{titleau}{coulreste} +\colorlet{titlelycee}{white} + +\colorlet{subtitlealgo}{coulreste} + +\colorlet{spinepython}{coulup} +\colorlet{spineau}{couldown} +\colorlet{spinelycee}{coulup} +\colorlet{spinealgo}{white} + + +%======================================================= +% The cover size +%======================================================= +% Calculate the splin +\def\numPages{274} +\newlength{\thickCream}\setlength{\thickCream}{0.0025 in} +\newlength{\thickWhite}\setlength{\thickWhite}{0.002252 in} +\newlength{\SpineW}\setlength{\SpineW}{\numPages\thickWhite} % 236*0.0025 = 0.59 (cream), 262*0.002252 = 0.590024 (white) +% The standard bleed +\newlength{\Bleed}\setlength{\Bleed}{.125 in} +% Set the page size +\newlength{\PageW}\setlength{\PageW}{7.5 in} +\newlength{\PageH}\setlength{\PageH}{9.25 in} +% Calculate the total dimensions +\newlength{\TrimW}\setlength{\TrimW}{\dimexpr 2\PageW + \SpineW \relax} +\newlength{\TrimH}\setlength{\TrimH}{\PageH} +\newlength{\CropW}\setlength{\CropW}{\dimexpr \TrimW + 2\Bleed \relax} +\newlength{\CropH}\setlength{\CropH}{\dimexpr \TrimH + 2\Bleed \relax} +\newlength{\LineW}\setlength{\LineW}{2\Bleed} +%======================================================= +% Some PDF specials +%======================================================= +\special{pdf: docinfo << +/Author (Exo7) +/Title (Python au Lycée - Algorithmes et programmation) +/Keywords (Python, Lycée) +/Subject (manuel de programmation en Python) +>>} +\edef\pwpt{\the\numexpr \dimexpr0.996264009963\CropW\relax/65536 \relax} %paper width in PS points +\edef\phpt{\the\numexpr \dimexpr0.996264009963\CropH\relax/65536 \relax} %paper height in PS points +\expandafter\special\expandafter{pdf: put @thispage << + /MediaBox [0 0 \pwpt\space\phpt] + /BleedBox [0 0 \pwpt\space\phpt] + /CropBox [0 0 \pwpt\space\phpt] + /TrimBox [0 0 \pwpt\space\phpt]>>} +%======================================================= +% for test +%======================================================= +\usepackage{blindtext} +\newif\ifshowborders\showbordersfalse % to display the security zone (Bleed) +%\showborderstrue + +\tikzset{ + frame/.style 2 args={inner sep=0, outer sep=0, minimum width=#1, minimum height=#2, node contents=} +} + +\begin{document}% + \begin{tikzpicture} + % Clip + \clip (-.5*\CropW,-\Bleed) rectangle +(\CropW,\CropH); + % Set nodes for anchors : Cover, Back, Front and Spine + \path + (0,-\Bleed) node[name=Cover,above,fill=background,frame={\CropW}{\CropH}] + (-\SpineW/2,0) node[name=Back,above left,frame={\PageW}{\PageH}] + (\SpineW/2,0) node[name=Front,above right,frame={\PageW}{\PageH}] + (0,0) node[name=Spine,above,spine,frame={\SpineW}{\PageH}]; + % --------------------------------------------------- + % Background + % --------------------------------------------------- + \def\steps{5} + \shadedraw[shift={(Cover.south west)}, hilbert] + [l-system={Hilbert curve, axiom=L, order=5, step={\CropW/31+.01pt}, angle=90}] + lindenmayer system; + % --------------------------------------------------- + % Python logo and title + % --------------------------------------------------- + \begin{scope}[scale=0.7,transform canvas ={yshift=21mm}] + \fill[shift={(Front.center)},pythonlogoup]svg{M 133.72 -122.51 v 52.97 c 0 41.07 -34.81 75.63 -74.52 75.63 h -119.15 c -32.64 0 -59.64 27.93 -59.64 60.61 v 113.59 c 0 32.32 28.11 51.34 59.64 60.61 c 37.76 11.1 73.96 13.12 119.15 0 c 30.03 -8.69 59.64 -26.19 59.64 -60.61 v -45.46 h -119.14 v -15.15 h 119.14 h 59.64 c 34.67 0 47.59 -24.18 59.64 -60.48 c 12.45 -37.37 11.93 -73.3 0 -121.23 c -8.57 -34.51 -24.93 -60.47 -59.64 -60.48 h -44.76 z m -67.01 287.64 c 12.37 0 22.38 10.13 22.38 22.66 c 0 12.57 -10.02 22.8 -22.38 22.8 c -12.32 0 -22.38 -10.23 -22.38 -22.8 c 0 -12.53 10.06 -22.66 22.38 -22.66 z}; + \fill[shift={(Front.center)},pythonlogodown]svg{M -2.94 -250 c -20.39 .1 -39.87 1.83 -57 4.87 c -50.48 8.92 -59.64 27.58 -59.65 62.01 v 45.46 h 119.29 v 15.15 h -119.29 h -44.76 c -34.67 0 -65.02 20.84 -74.52 60.48 c -10.95 45.44 -11.44 73.79 0 121.23 c 8.48 35.31 28.73 60.47 63.4 60.48 h 41.01 v -54.51 c 0 -39.37 34.06 -74.1 74.51 -74.1 h 119.15 c 33.17 0 59.64 -27.31 59.64 -60.61 v -113.58 c 0 -32.32 -27.27 -56.61 -59.64 -62.01 c -20.49 -3.41 -41.75 -4.96 -62.14 -4.87 z m -64.51 36.57 c 12.32 0 22.38 10.23 22.38 22.8 c 0 12.53 -10.06 22.66 -22.38 22.66 c -12.37 0 -22.38 -10.13 -22.39 -22.66 c 0 -12.57 10.02 -22.8 22.39 -22.8 z}; + % --------------------------------------------------- + \path[every node/.style={scale=5, font=\titlefont, outer sep=0, inner sep=0}] + (Front.center) +(21mm,21mm) node[titlepython]{PYTHON} + (Front.center) +(-21mm,-21mm) node + {\textcolor{titleau}{AU}\textcolor{titlelycee}{LYCÉE}}; + + \path (Cover.east) +(55mm,-125mm) node[left,scale=1.8,text width=.40\PageW,align=left,fill=white,text=subtitlealgo,inner sep=.3em,font=\authorfont,rounded corners=10pt]{\bf ~~Algorithmes et programmation~~\vphantom{\Large t}}; + + \path (Cover.east) +(55mm,-145mm) node[left,scale=1.8,text width=.20\PageW,align=left,fill=white,text=subtitlealgo,inner sep=.4em,font=\authorfont,rounded corners=10pt]{\bf ~~tome 1~~\vphantom{.}}; + + \end{scope} + % --------------------------------------------------- + % Auteur + % --------------------------------------------------- + \path (Front.north) +(0,-21mm) node[author,text=subtitlealgo,scale=2,font=\authorfont]{\bf Arnaud Bodin}; + % --------------------------------------------------- + % Spine + % --------------------------------------------------- + \begin{scope}[transform canvas ={yshift=21mm}] + \node[rotate=90,scale=1.8] (tranche) at (Spine.center) + {\textcolor{spinepython}{PYTHON}\textcolor{spineau}{AU}\textcolor{spinelycee}{LYCÉE}\textcolor{spinealgo}{~~~\textemdash~~tome 1}\vphantom{\large y}}; + \end{scope} + % --------------------------------------------------- + % Logos Exo7 + % --------------------------------------------------- + \path (Spine.south) +(0,14mm) node{\includegraphics[width=11mm]{exo7_logo_white}}; + \path (Front.south) +(0,14mm) node{\includegraphics[width=19mm]{exo7_logo_white}}; + % --------------------------------------------------- + % Back + % --------------------------------------------------- + \path (Back.center) node[scale=1.6,text width=10.5cm,fill=white,fill opacity=.5,text opacity=.77,align = center]{ + \vspace*{2ex} + + \footnotesize + + \hyphenchar\font=-1 % pas de césure + + + + \emph{Python} est le langage idéal pour apprendre la programmation. +C'est un langage puissant qui vous plongera dans le monde des algorithmes. + +\bigskip + +Ce livre vous guide pas à pas à travers des activités mathématiques et informatiques originales adaptées au lycée. Il se complète par des ressources en ligne : tous les codes \emph{Python}, des vidéos et des fiches en couleurs. +Vous avez tout en main pour réussir ! + +\bigskip +\scriptsize + +\begin{center} +\begin{minipage}{0.49\textwidth} +\begin{itemize} +\setlength{\itemsep}{-1pt}% +\item Premiers pas +\item Tortue (Scratch avec Python) +\item Si ... alors ... +\item Fonctions +\item Arithmétique -- Boucle tant que -- I +\item Chaînes de caractères% - Analyse d'un texte +\item Listes I +\item Statistique -- Visualisation de données +\item Fichiers +\item Arithmétique -- Boucle tant que -- II +\item Binaire I +\item Listes II +\item Binaire II +\end{itemize} +\end{minipage} +\begin{minipage}{0.49\textwidth} +\begin{itemize} +\setlength{\itemsep}{0pt}% +\item Probabilités -- Paradoxe de Parrondo +\item Chercher et remplacer +\item Calculatrice polonaise -- Piles +\item Visualiseur de texte -- Markdown +\item L-système +\item Images dynamiques +\item Jeu de la vie +\item Graphes et combinatoire de Ramsey +\item Bitcoin +\item Constructions aléatoires +\end{itemize} +\end{minipage} +\end{center} + + \vspace*{3ex} + + }; + % --------------------------------------------------- + \ifshowborders + % --- security zone + \begin{scope}[line width=\LineW,red,opacity=.35] + \draw (-.5*\TrimW,0) rectangle +(\TrimW,\TrimH); + \draw (-.5*\SpineW-\Bleed/3,0) rectangle +(\SpineW+2\Bleed/3,\TrimH); + \end{scope} + % --- guides + \begin{scope}[dashed] + \draw (-.5*\TrimW,0) rectangle +(\TrimW,\TrimH); + \draw (-.5*\SpineW,0) rectangle +(\SpineW,\TrimH); + \end{scope} + \fi + \end{tikzpicture}% +\end{document} diff --git a/cover/python_cover4_kdp.pdf b/cover/python_cover4_kdp.pdf new file mode 100644 index 0000000..8eac954 Binary files /dev/null and b/cover/python_cover4_kdp.pdf differ diff --git a/cover/python_cover4_kdp_bis.pdf b/cover/python_cover4_kdp_bis.pdf new file mode 100644 index 0000000..05107ab Binary files /dev/null and b/cover/python_cover4_kdp_bis.pdf differ diff --git a/cover/readme_cover.txt b/cover/readme_cover.txt new file mode 100644 index 0000000..700155e --- /dev/null +++ b/cover/readme_cover.txt @@ -0,0 +1,3 @@ +# Il faut applatir la couverture selon le nouveau critèe kdp + +pdf2ps python_cover4.pdf - | ps2pdf - python_cover4_kdp_bis.pdf diff --git a/cover/serpent.tikz b/cover/serpent.tikz new file mode 100644 index 0000000..fec61ad --- /dev/null +++ b/cover/serpent.tikz @@ -0,0 +1,12 @@ +\begin{tikzpicture} +\definecolor{serpent}{HTML}{011A27} +\definecolor{oeilserpent}{HTML}{AAAAAA} + +% \path[ultra thick,fill =serpent] (0,0) arc (90:-90:-1) -- ++(9,0) -- ++(0,-6 ) -- ++ (-4,0) -- ++(0,-3) -- ++(4,0) -- ++(0,-6) -- ++(-8,0) % -- ++ (-1,1) -- ++ (1,1) +% --++(0,2) +% -- ++(6,0) -- ++(0,2) --++(-4,0) -- ++(0,7) --++(4,0) -- ++(0,2) --cycle ; + +\path[fill=oeilserpent] (0,1.2) circle (0.3); + +\draw[ultra thick] (0,0) arc (90:-90:-1) -- ++(9,0) -- ++(0,-6 ) -- ++ (-4,0) -- ++(0,-3) -- ++(8,0) -- ++(0,-2) --++(-10,0)--++(0,7) --++(4,0) --++(0,2) --cycle ; +\end{tikzpicture} \ No newline at end of file diff --git a/divers/4eme_couverture.txt b/divers/4eme_couverture.txt index a47b1b8..bdf77dd 100644 --- a/divers/4eme_couverture.txt +++ b/divers/4eme_couverture.txt @@ -14,7 +14,7 @@ Python est le langage idéal pour apprendre la programmation. C'est un langage puissant qui vous permettra de plonger dans le monde des algorithmes. -Ce livre vous guide pas à pas à travers des activités mathématiques et informatiques originales adaptées au lycée. Il se complète par des ressources en ligne : des vidéos et des fiches en couleurs. +Ce livre vous guide pas à pas à travers des activités mathématiques et informatiques originales adaptées au lycée. Il se complète par des ressources en ligne : tous les codes Python, des vidéos et des fiches en couleurs. Vous avez tout en main pour réussir ! diff --git a/divers/base-fin.svg b/divers/base-fin.svg new file mode 100644 index 0000000..d8650b8 --- /dev/null +++ b/divers/base-fin.svg @@ -0,0 +1,280 @@ + + + + + + + + + + image/svg+xml + + + + + + + + Creative Commons - BY-NC-SA - 4.0 FR + + + + + + + + + + + + + + + + + + + + + + + PYTHON + + + + + + + + + + + + + + + + AU + + + LYCÉE + + + + + + + + + + + + + + + + + + + + + + + + Arnaud Bodin + + diff --git a/divers/base-titre.svg b/divers/base-titre.svg new file mode 100644 index 0000000..bc6f9f8 --- /dev/null +++ b/divers/base-titre.svg @@ -0,0 +1,219 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PYTHON + + + + + + + + + + + + + + + + AU + + + LYCÉE + + + + + + + + + + + + + + Premiers pasPartie 4 + + diff --git a/divers/chapitres.txt b/divers/chapitres.txt new file mode 100644 index 0000000..bb378e0 --- /dev/null +++ b/divers/chapitres.txt @@ -0,0 +1,69 @@ +Python au lycée (tome 1) +Algorithmes et programmation +Livres Exo7 4 +Numéro d’édition (Facultatif) 2 + +Python est le langage idéal pour apprendre la programmation. C'est un langage puissant qui vous plongera dans le monde des algorithmes. Ce livre vous guide pas à pas à travers des activités mathématiques et informatiques originales adaptées au lycée. Il se complète par des ressources en ligne : tous les codes Python, des vidéos et des fiches en couleurs. Vous avez tout en main pour réussir ! + + • Premiers pas• Tortue (Scratch avec Python)• Si ... alors ...• Fonctions• Arithmétique – Boucle tant que – I• Chaînes de caractères• Listes I• Statistique – Visualisation de données• Fichiers• Arithmétique – Boucle tant que – II• Binaire I• Listes II• Binaire II• Probabilités – Paradoxe de Parrondo• Chercher et remplacer• Calculatrice polonaise – Piles• Visualiseur de texte – Markdown• L-système• Images dynamiques• Jeu de la vie• Graphes et combinatoire de Ramsey• Bitcoin• Constructions aléatoires + +Mathématiques +Algorithmes +Programmation +Python +Lycée + + + +Non-fiction > Ordinateurs > Langages de programmation > Python +Scolaire et Ouvrages de référence > Éducation > Ordinateurs et Technologies + +ISBN utilisé sur CreateSpace +9781986820035 + +Date de publication 04/04/2018 + +intérieur nb avec papier blanc + +taille de coupe 7.5 x 9.25 pouces + +Absence de fond perdu + +couv brillante + +Territoire europe + canada + usa + +prix 6,08 € 7,16$ + + + +# NEW +Code ISBN : 9781091267510 +Marque éditoriale : Independently published +prix 6,28 € + + + • Premiers pas + • Tortue (Scratch avec Python) + • Si ... alors ... + • Fonctions + • Arithmétique – Boucle tant que – I + • Chaînes de caractères + • Listes I + • Statistique – Visualisation de données + • Fichiers + • Arithmétique – Boucle tant que – II + • Binaire I + • Listes II + • Binaire II + • Probabilités – Paradoxe de Parrondo + • Chercher et remplacer + • Calculatrice polonaise – Piles + • Visualiseur de texte – Markdown + • L-système + • Images dynamiques + • Jeu de la vie + • Graphes et combinatoire de Ramsey + • Bitcoin + • Constructions aléatoires + diff --git a/divers/description_videos.txt b/divers/description_videos.txt new file mode 100644 index 0000000..3f72569 --- /dev/null +++ b/divers/description_videos.txt @@ -0,0 +1,336 @@ + +Description des vidéos +====================== + + +Mots-clés +========= + +Python, Algorithmes, Programmation, Exo7, Informatique, Mathématiques + + +====================== +Mise en route +====================== + +[Python] Premiers pas - partie 1 +https://youtu.be/9M9yz8bFzuU +Lance-toi ! Console, opérations simples, print(), utiliser un éditeur de texte. + +[Python] Premiers pas - partie 2 +https://youtu.be/9h9nLLRRjls +Variable, affectation, réaffectation. + +[Python] Premiers pas - partie 3 +https://youtu.be/WLTNpIdHIls +Utiliser des fonctions. Module math, racine carrée, trigonométrie, arrondi. + +[Python] Premiers pas - partie 4 +https://youtu.be/zxf7QRfZato +Boucle pour (boucle "for"). Parcourir une liste. range(). + +[Python] Installer Python pour Windows +https://youtu.be/IS117_uXZKE +Comment installer Python 3 sous Windows ? Explications pas à pas. + +[Python] Démarrer Python et utiliser IDLE +https://youtu.be/QtUxL52VPtA +Utiliser la console Python. Utiliser IDLE : nouveau fichier, sauvegarder, lancer Python depuis IDLE. + +[Python] Un éditeur de texte moderne : Sublime Text +https://youtu.be/WWiceaSiMTk +Présentation succinte d'un éditeur de texte très efficace : Sublime Text. + + +====================== + +[Python] Tortue (Scratch avec Python) - partie 1 +https://youtu.be/OpJb6ur4JAk +Utiliser la tortue Python (avancer, tourner, tracer,...) + +[Python] Tortue (Scratch avec Python) - partie 2 +https://youtu.be/7Fb_FOp5NGs +Manipuler plusieurs tortues. + + +====================== +Fondamentaux +====================== + +[Python] Si ... alors ... - partie 1 +https://youtu.be/tjZQ64VjvaU +Test "si ... alors ..." et "si ... alors ... sinon ..." : if/then/else. + +[Python] Si ... alors ... - partie 2 - Entrée au clavier +https://youtu.be/UlSmDST7zfk +Entrée utilisateur au clavier : input()). +Conversion entier/chaîne. + +[Python] Hasard - Module random +https://youtu.be/ll5RENiJZwU +Générer des nombres (presque) au hasard : randint(), random(). + +[Python] Si ... alors ... - partie 3 - Booléens +https://youtu.be/WNJRn4LbxXs +Vrai/faux : les booléens. + +====================== + +[Python] Fonctions - partie 1 +https://youtu.be/lp5KTIduKJw +Définir tes propres fonctions (sans paramètres). def, return + +[Python] Fonctions - partie 2 +https://youtu.be/otOE1xA5wAA +Fonctions avec un paramètre et/ou une sortie. + +[Python] Fonctions - partie 3 +https://youtu.be/QDgY4Ki4Yu8 +Fonctions avec plusieurs paramètres et/ou plusieurs sorties. + +[Python] Fonctions - partie 4 : variable locale +https://youtu.be/QdPTjHN9Q-g +Notions de variable locale. + +====================== + +[Python] Arithmétique - Quotient et reste +https://youtu.be/Qa9eSV4wB_s +Arithmétique avec Python : division euclidienne, quotient, reste, modulo. + +[Python] Boucle tant que I - partie 1 +https://youtu.be/2Xxty4oaHBs +Comprendre la boucle "tant que" : while. Condition vrai/faux. +Exemples avec l'arithmétique. + +[Python] Boucle tant que I - partie 2 +https://youtu.be/NRvv1odnoIU +Encore la boucle "tant que" (while). Bien comprendre la condition. +Exemples avec l'arithmétique : plus petit diviseur, test si un nombre est premier. + +[Python] Temps de calcul - Module timeit +https://youtu.be/l5Pm1EdxWsQ +Mesurer le temps d'exécution d'une fonction. + + +====================== + +[Python] Chaîne de caractères 1 +https://youtu.be/t2DSnx0R_NI +Caractère. Chaîne de caractères. Longueur. Concaténation. Récupérer un caractère d'une chaîne par "chaine[i]". Sous-chaîne. + +[Python] Chaîne de caractères 2 +https://youtu.be/4XN1lN-9jtM +Parcourir une chaîne. Code ascii/unicode. + + +====================== + +[Python] Listes I - partie 1 +https://youtu.be/Vqtmbon5_Nk +Construction d'une liste. Récupérer un élément. Ajouter un élément. +Construction à l'aide d'une boucle. Longueur d'une liste. Parcourir une liste, boucle "pour". + +[Python] Listes I - partie 2 +https://youtu.be/pRje2HvY5OQ +Concaténation. Ajouter un élément au début ou à la fin d'une liste. Trancher des listes. +Manipulation : inverser une liste, supprimer un élément, trier une liste. + +[Python] Listes I - partie 3 +https://youtu.be/lp-MC8Hguk0 +Visualiser une liste avec le module 'matplolib'. + + +====================== +Notions avancées +====================== + +[Python] Statistique - Visualisation de données - partie 1 +https://youtu.be/LfwCejyQrws +Statistiques sur une liste : somme, minimum, maximum, moyenne, +variance, écart-type, exemples. + +[Python] Statistique - Visualisation de données - partie 2 +https://youtu.be/MB79YkqPpJc +Graphique en barres, cumulatif, en pourcentage, en secteurs. +Tracer un arc avec tkinter. + +[Python] Statistique - Visualisation de données - partie 3 +https://youtu.be/xRJFmrD6G9o +Diagramme en boîtes ou diagramme à moustaches. Médiane, quartiles. + +[Python] Graphiques avec tkinter +https://youtu.be/sFqVEJFf8n4 +Créer une fenêtre avec tkinter. Tracer un rectangle, un cercle, afficher du texte. + +[Python] Boutons avec tkinter +https://youtu.be/DwQlqagVcyw +Ajouter des boutons à une fenêtre tkinter. + +[Python] Fichiers - partie 1 - Écrire un fichier +https://youtu.be/kLdHGVD2qZo +Comment écrire un fichier texte ? +Conversion d'un entier ou d'un flottant en une chaîne ('str'). +Exemple du format 'csv'. + +[Python] Fichiers - partie 2 - Lire un fichier +https://youtu.be/e3OWL8e4yZQ +Comment lire un fichier texte ? +Conversion d'une chaîne vers un entier ou un flottant ('int' et 'float'). +Fragmenter une chaînes de caractères ('split'). + +[Python] Fichiers - partie 3 - Images +https://youtu.be/Uw2yKTEqOmI +Comment écire un fichier d'image ? Image noir et blanc, en niveau de gris ou en couleurs. Format pbm, pgm, ppm. + +[Python] Boucle tant que II - Quitter une boucle +https://youtu.be/pU7Wvh6J9iM +Comment quitter une boucle ? Trouver une bonne condition. Drapeau. Commande 'break', commandes 'try/except'. + +[Python] Binaire - partie 1 - Écriture décimale +https://youtu.be/EhxiXresX7Y +Avant de comprendre l'écriture binaire, on comprend l'écriture décimale. +Passage de l'entier vers son écriture décimale et inversement. + +[Python] Binaire - partie 2 - De l'écriture binaire vers l'entier +https://youtu.be/_NrAp2C16j4 +Comment calculer l'entier à partir de son écriture binaire. +Algorithme et écriture avec préfixe '0b'. + +[Python] Binaire - partie 3 - De l'entier vers l'écriture binaire +https://youtu.be/D9ZSxpCvE7A +Comment calculer l'écriture binaire d'un entier. +Calculs à la main, avec la fonction 'bin()' et algorithme. + +[Python] Listes II - partie 1 -Trancher des listes - Trouver le rang +https://youtu.be/J4lV4LJOEk4 +Trancher des listes (suite). Trouver le rang d'un élément ('index'). Opérateur 'in'. + +[Python] Listes II - partie 2 - Liste par compréhension +https://youtu.be/eFgHwutcxIg +Définir une liste en utilisant la syntaxe des listes par compréhension. + +[Python] Listes II - partie 3 - Liste de listes +https://youtu.be/JJVH3lcP_AM +Utiliser une liste de listes. Tableau à double entrée. + +====================== +Projets +====================== + +====================== + +[Python] Probabilités - Paradoxe de Parrondo +https://youtu.be/kBCFpEPAcoE +Deux jeux de hasard défavorables donne un jeu favorable ! + + +====================== + +[Python] Chercher et remplacer - partie 1 +https://youtu.be/pfu9IJR0vZY +Utiliser les fonctions Python puis programmer tes propres fonctions pour chercher et remplacer. +Utiliser les expressions rationnelles (regex, regular expression) : joker et choix. + + +[Python] Chercher et remplacer - partie 2 +https://youtu.be/GL446gvcN-U +Itérations de remplacements avec des lettres '0' et '1'. + + +====================== + +[Python] Calculatrice polonaise - Piles - partie 1 +https://youtu.be/oSbV09DaF5s +Qu'est-ce qu'une pile ? Comment manipuler un pile ? +Empiler. Dépiler. + + +[Python] Calculatrice polonaise - Piles - partie 2 +https://youtu.be/Ak8I7o-rXKg +Programme ta propre calculatrice. Notation polonaise inversée. + + +====================== + +[Python] Visualiseur de texte - Markdown - partie 1 +https://youtu.be/zPhMxjnNnWg +Format Markdown. + +[Python] Visualiseur de texte - Markdown - partie 2 +https://youtu.be/lVNDym8opE0 +Texte avec tkinter. Afficher une ligne au format Markdown. + +[Python] Visualiseur de texte - Markdown - partie 3 +https://youtu.be/ozm80uP9KsA +Justification (version mathématique). + + +====================== + +[Python] L-sytème +https://youtu.be/ShjScrFA5iQ +Trace des jolies figures dont des plantes ! + +[Python] Arguments optionnels +https://youtu.be/6sso3x3sGFs +Comment écrire une fonction avec des arguments en option. + +====================== + +[Python] Images dynamiques - partie 1 +https://youtu.be/WXGci8trILg +Transformation du photomaton. + +[Python] Images dynamiques - partie 2 +https://youtu.be/DlZyWbXkotM +Transformation du boulanger. + + + +====================== + +[Python] Jeu de la vie +https://youtu.be/7SR5-sUnotY +Un monde passionnant des cellules qui naissent et meurent. + +[Python] Souris avec tkinter +https://youtu.be/8d386Op5fsU +Comment récupérer la position du clic de la souris. + + +====================== + +[Python] Graphe et combinatoire de Ramsey +https://youtu.be/CsCSRszXYxI +Un problème simple mais avec beaucoup de calculs. + + +====================== + +[Python] Bitcoin - partie 1 +https://youtu.be/lcVC2fqByEo +Principe général : livre de compte (blockchain), preuve de travail. + +[Python] Bitcoin - partie 2 +https://youtu.be/6yZAHoPGGbw +Fonction de hachage. + +[Python] Bitcoin - partie 3 +https://youtu.be/FPh9huqhJJg +Preuve de travail. Minage. + +[Python] Bitcoin - partie 4 +https://youtu.be/XfVpekxADyM +Tes propres bitcoins. + + +====================== + +[Python] Constructions aléatoires +https://youtu.be/-AgiGtmzvI0 +Blocs qui tombent comme des flocons et arbres browniens. + +[Python] Mouvement avec tkinter +https://youtu.be/DJWA7bFiimA +Comment déplacer un objet avec tkinter afin de simuler le mouvement. diff --git a/divers/postface_livre_python.tex b/divers/postface_livre_python.tex index ba570d9..154a971 100644 --- a/divers/postface_livre_python.tex +++ b/divers/postface_livre_python.tex @@ -11,9 +11,24 @@ \section*{Remerciements} Je remercie vivement Michel Bodin pour avoir testé toutes les premières activités et sa relecture. Merci à François Recher pour son enthousiasme et sa relecture attentive du livre. Merci à Éric Wegrzynowski pour sa relecture et ses idées pour les activités sur les images. -Merci à Philippe Marquet pour sa relecture des premiers chapitres. +Merci à Philippe Marquet pour sa relecture des premiers chapitres. Merci à Kroum Tzanev pour la maquette du livre. +\bigskip + +\begin{center} +Vous pouvez récupérer l'intégralité des codes \Python{} des activités ainsi que tous les fichiers sources sur la page \emph{GitHub} d'Exo7 : +\href{https://github.com/exo7math/python1-exo7}{\og{}GitHub : Python au lycée\fg{}}. + +\medskip + +Les vidéos des cours avec des explications pas à pas et la présentation des projets sont disponibles depuis la chaîne \emph{Youtube} : +\href{https://www.youtube.com/channel/UC6PiFyqBiUjiJ7Q3DRSW2Wg}{\og{}Youtube : Python au lycée\fg{}}. + + +%\\ \centerline{ +%\href{https://www.youtube.com/c/PythonAuLycee}{youtube.com/PythonAuLyce}} +\end{center} \vspace*{\fill} @@ -29,10 +44,7 @@ \section*{Remerciements} \begin{center} Ce livre est diffusé sous la licence \emph{Creative Commons -- BY-NC-SA -- 4.0 FR}. - -Sur le site Exo7 vous pouvez télécharger gratuitement le livre en couleur\\ -et aussi récupérer les codes et fichiers sources. - +Sur le site Exo7 vous pouvez télécharger gratuitement le livre en couleur. \end{center} diff --git a/divers/preface_livre_python.tex b/divers/preface_livre_python.tex index 8524e05..71264db 100644 --- a/divers/preface_livre_python.tex +++ b/divers/preface_livre_python.tex @@ -3,31 +3,35 @@ \vspace*{\fill} \vspace*{5ex} \begin{center} -\fontsize{52}{52}\selectfont +\fontsize{40}{40}\selectfont \textsc{python au lycée} -\vspace*{1ex} +\vspace*{-0.5ex} +\textsc{\fontsize{24}{24}\selectfont tome \fontsize{22}{22}\selectfont 1} -\fontsize{32}{32}\selectfont +\vspace*{2ex} + +%\fontsize{32}{32}\selectfont +\Large \textsc{arnaud bodin} - %\hfil - % \includegraphics[width = 6cm]{logoScratchAuCollege} + \end{center} \vfill \begin{center} -\huge +\Large \textsc{algorithmes \ et \ programmation} \end{center} \begin{center} \LogoExoSept{2} \end{center} -\clearemptydoublepage -%\clearpage + +% \clearemptydoublepage +\clearpage \thispagestyle{empty} \vspace*{\fill} -\section*{Python au lycée} +\section*{Python au lycée -- tome 1} %--------------------------- {\large\textbf{C'est parti !}} @@ -62,6 +66,19 @@ \section*{Python au lycée} L'informatique accompagne à merveille les mathématiques ! L'ordinateur devient indispensable pour manipuler de très grands nombres ou bien tester des conjectures sur de nombreux cas. Tu découvriras dans ce livre des fractales, des L-systèmes, des arbres browniens\ldots{} et la beauté de phénomènes mathématiques complexes. +\bigskip + +\begin{center} +Vous pouvez récupérer l'intégralité des codes \Python{} des activités ainsi que tous les fichiers sources sur la page \emph{GitHub} d'Exo7 : +\href{https://github.com/exo7math/python1-exo7}{\og{}GitHub : Python au lycée\fg{}}. + +\medskip + +Les vidéos des cours avec des explications pas à pas et la présentation des projets sont disponibles depuis la chaîne \emph{Youtube} : +\href{https://www.youtube.com/channel/UC6PiFyqBiUjiJ7Q3DRSW2Wg}{\og{}Youtube : Python au lycée\fg{}}. +\end{center} + + \vspace*{\fill} @@ -75,13 +92,14 @@ \section*{Python au lycée} \newpage + \section*{Résumé des activités} -\newcommand{\titreactivite}[1]{{\large\textbf{#1}}\nopagebreak} +\newcommand{\titreactivite}[1]{{\textbf{#1}}\nopagebreak} \newcommand{\descriptionactivite}[1]{% -\medskip\hfill -\begin{minipage}{0.95\textwidth}#1\end{minipage}\bigskip} +\smallskip\hfill +\begin{minipage}{0.95\textwidth}\small#1\end{minipage}\medskip\smallskip} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \titreactivite{Premiers pas} diff --git a/fichiers/cours-image_coul.pxm b/fichiers/cours-image_coul.ppm similarity index 56% rename from fichiers/cours-image_coul.pxm rename to fichiers/cours-image_coul.ppm index f003eda..6ddef8e 100644 --- a/fichiers/cours-image_coul.pxm +++ b/fichiers/cours-image_coul.ppm @@ -1,5 +1,5 @@ P3 3 2 255 -255 0 0 0 255 0 0 0 255 +255 0 0 0 255 0 0 0 255 0 128 255 255 128 0 128 255 0 diff --git a/fichiers/fichiers.pdf b/fichiers/fichiers.pdf index c5a20a6..c3c8949 100644 Binary files a/fichiers/fichiers.pdf and b/fichiers/fichiers.pdf differ diff --git a/fichiers/fichiers.tex b/fichiers/fichiers.tex index 3278d16..281dcc9 100644 --- a/fichiers/fichiers.tex +++ b/fichiers/fichiers.tex @@ -10,6 +10,17 @@ \objectifs{Tu vas apprendre à lire et à écrire des données dans des fichiers.} + +\insertvideo{kLdHGVD2qZo}{Fichiers - partie 1 - Écrire un fichier} + +\insertvideo{e3OWL8e4yZQ}{Fichiers - partie 2 - Lire un fichier} + +\insertvideo{Uw2yKTEqOmI}{Fichiers - partie 3 - Images} + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{cours}[\'Ecrire dans un fichier] \index{fichier} @@ -30,7 +41,7 @@ \end{lstlisting} \end{minipage} \begin{minipage}{0.3\textwidth} -\includegraphics[scale=0.5]{ecran-fichiers-cours-1} +\includegraphics[scale=\myscale,scale=0.5]{ecran-fichiers-cours-1} \end{minipage} \end{center} @@ -106,18 +117,18 @@ \objectifs{Objectifs : écrire un fichier de notes, puis le lire pour calculer les moyennes.} \begin{enumerate} - \item Génère au hasard un fichier de notes, nommé \ci{notes.txt}, qui est composé de lignes ayant la structure :\\ - \centerline{\ci{Prenom Nom note1 note2 note3}} + \item Génère au hasard un fichier de notes, nommé \ci{notes.txt}, qui est composé de lignes ayant la structure : + \mycenterline{\ci{Prenom Nom note1 note2 note3}} Par exemple : \begin{center} -\includegraphics[scale=0.7]{ecran-fichiers-1a} +\includegraphics[scale=\myscale,scale=0.7]{ecran-fichiers-1a} \end{center} \emph{Indications.} \begin{itemize} \item Construis un liste de prénoms \ci{liste_prenoms = ["Tintin","Harry","Alice",...]}. Puis choisis un prénom au hasard par la commande - \ci{prenom = choice(liste_prenoms)}.\index{choice@\ci{choice}} (il faut importer le module \ci{random}). + \ci{prenom = choice(liste_prenoms)}\index{choice@\ci{choice}} (il faut importer le module \ci{random}). \item Même chose pour les noms ! @@ -128,12 +139,12 @@ \end{itemize} - \item Lis le fichier \ci{notes.txt} que tu as produit. Calcule la moyenne de chaque personne et écrit le résultat dans un fichier \ci{moyennes.txt} où chaque ligne est de la forme :\\ - \centerline{\ci{Prenom Nom moyenne}} + \item Lis le fichier \ci{notes.txt} que tu as produit. Calcule la moyenne de chaque personne et écrit le résultat dans un fichier \ci{moyennes.txt} où chaque ligne est de la forme : + \mycenterline{\ci{Prenom Nom moyenne}} Par exemple : \begin{center} -\includegraphics[scale=0.7]{ecran-fichiers-1b} +\includegraphics[scale=\myscale,scale=0.7]{ecran-fichiers-1b} \end{center} \emph{Indications.} @@ -160,19 +171,22 @@ Le format \emph{csv}\index{csv@\emph{csv}} (pour \emph{comma-separated values}) est un format très simple de fichier texte contenant des données. Chaque ligne du fichier contient des données (des nombres ou du texte). Sur une même ligne les données sont séparées par une virgule (d'où le nom du format, même si d'autres séparateurs sont possibles). -\textbf{Exemple.} Voici un fichier qui contient les noms, prénoms, années de naissances, la taille ainsi que le nombre de prix Nobel reçus : - \begin{center} +\medskip + +\textbf{Exemple.} Voici un fichier qui contient les noms, prénoms, années de naissance, la taille ainsi que le nombre de prix Nobel reçus : +\begin{center} \begin{minipage}{0.4\textwidth} \begin{lstlisting} CURIE,Marie,1867,1.55,2 EINSTEIN,Albert,1879,1.75,1 -NOBEL,Alfed,1833,1.70,0 +NOBEL,Alfred,1833,1.70,0 \end{lstlisting} \end{minipage} \end{center} \end{cours} +%\medskip %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Activité 2 @@ -188,7 +202,7 @@ Voici un exemple : \begin{center} -\includegraphics[scale=0.6]{ecran-fichiers-2a} +\includegraphics[scale=\myscale,scale=0.6]{ecran-fichiers-2a} \end{center} \begin{itemize} @@ -198,18 +212,18 @@ \end{itemize} \begin{center} -\includegraphics[scale=0.4]{ecran-fichiers-2b} +\includegraphics[scale=\myscale,scale=0.4]{ecran-fichiers-2b} \end{center} \item Lit le fichier \ci{ventes.csv} pour afficher les courbes de ventes. \begin{center} -\includegraphics[scale=0.5]{ecran-fichiers-2c} +\includegraphics[scale=\myscale,scale=0.55]{ecran-fichiers-2c} \end{center} \emph{Indications.} \begin{itemize} - \item Le package \ci{matplotlib} permet d'afficher facilement des graphiques, il s'appelle souvent avec l'instruction :\\ - \centerline{\ci{import matplotlib.pyplot as plt}} + \item Le package \ci{matplotlib} permet d'afficher facilement des graphiques, il s'appelle souvent avec l'instruction : + \mycenterline{\ci{import matplotlib.pyplot as plt}} \item Voici comment visualiser deux listes de données \ci{liste1} et \ci{liste2} : \begin{center} @@ -261,7 +275,7 @@ \end{lstlisting} \end{minipage} \begin{minipage}{0.3\textwidth} -\includegraphics[scale=0.2]{ecran-cours-image_nb} +\includegraphics[scale=\myscale,scale=0.2]{ecran-cours-image_nb} \end{minipage} \end{center} @@ -292,7 +306,7 @@ \end{lstlisting} \end{minipage} \begin{minipage}{0.3\textwidth} -\includegraphics[scale=0.2]{ecran-cours-image_gris} +\includegraphics[scale=\myscale,scale=0.2]{ecran-cours-image_gris} \end{minipage} \end{center} @@ -323,7 +337,7 @@ \end{lstlisting} \end{minipage} \begin{minipage}{0.3\textwidth} -\includegraphics[scale=0.2]{ecran-cours-image_coul} +\includegraphics[scale=\myscale,scale=0.2]{ecran-cours-image_coul} \end{minipage} \end{center} @@ -351,39 +365,39 @@ \begin{enumerate} \item Génère un fichier \ci{image_nb.pbm} qui représente une image en noir et blanc (par exemple de taille $300 \times 200$) selon le motif suivant : \begin{center} -\includegraphics[scale=0.5]{ecran-image_nb} +\includegraphics[scale=\myscale,scale=0.5]{ecran-image_nb} \end{center} -\emph{Indications.} Si $i$ désigne le numéro de ligne et $j$ le numéro de colonne (en partant du haut à gauche), alors le pixel en position $(i,j)$ est blanc si $i+j$ est compris entre $0$ et $9$, ou compris entre $20$ et $29$, ou entre $40$ et $49$,\ldots{} Ce qui s'obtient par la formule :\\ -\centerline{\ci{coul = (i+j)//10 \% 2}} +\emph{Indications.} Si $i$ désigne le numéro de ligne et $j$ le numéro de colonne (en partant du haut à gauche), alors le pixel en position $(i,j)$ est blanc si $i+j$ est compris entre $0$ et $9$, ou compris entre $20$ et $29$, ou entre $40$ et $49$,\ldots{} Ce qui s'obtient par la formule : +\mycenterline{\ci{coul = (i+j)//10 \% 2}} qui renvoie $0$ ou $1$ comme désiré. \item Génère un fichier \ci{image_gris.pgm} qui représente une image en niveaux de gris (par exemple de taille $200 \times 200$ avec $256$ niveaux de gris) selon le motif suivant : \begin{center} -\includegraphics[scale=0.7]{ecran-image_gris} +\includegraphics[scale=\myscale,scale=0.7]{ecran-image_gris} \end{center} -\emph{Indications.} Cette fois la formule est :\\ -\centerline{\ci{coul = (i**2 + j**2) \% 256}} +\emph{Indications.} Cette fois la formule est : +\mycenterline{\ci{coul = (i**2 + j**2) \% 256}} qui renvoie un entier entre $0$ et $255$. \item Génère un fichier \ci{image_coul.ppm} qui représente une image en couleurs (par exemple de taille $200 \times 200$ avec $256$ niveaux de rouge, vert et bleu) selon le motif suivant : \begin{center} -\includegraphics[scale=0.7]{ecran-image_coul} +\includegraphics[scale=\myscale,scale=0.7]{ecran-image_coul} \end{center} -\emph{Indications.} Cette fois la formule est :\\ -\centerline{\ci{R = (i*j) \% 256}} -\centerline{\ci{V = i \% 256}} -\centerline{\ci{B = (i + j)//3 \% 256}} +\emph{Indications.} Cette fois la formule est : +\mycenterline{\ci{R = (i*j) \% 256}} +\mycenterline{\ci{V = i \% 256}} +\mycenterline{\ci{B = (i + j)//3 \% 256}} qui donne les niveaux de rouge, vert et bleu du pixel $(i,j)$. \item Écris une fonction \ci{inverser_couleurs_nb(fichier)} qui lit un fichier image noir et blanc \ci{.pbm} et crée un nouveau fichier dans lequel les pixels blancs sont devenus noirs et inversement. Exemple : à gauche l'image de départ, à droite l'image d'arrivée. \begin{center} -\includegraphics[scale=0.3]{ecran-simple_nb}\qquad\qquad -\includegraphics[scale=0.3]{ecran-simple_nb_inverse} +\includegraphics[scale=\myscale,scale=0.3]{ecran-simple_nb}\qquad\qquad +\includegraphics[scale=\myscale,scale=0.3]{ecran-simple_nb_inverse} \end{center} \item Écris une fonction \ci{couleurs_vers_gris(fichier)} qui lit un fichier image couleur au format \ci{.ppm} et crée un nouveau fichier au format \ci{.pgm} dans lequel les pixels couleurs sont transformés en niveaux de gris. @@ -398,8 +412,8 @@ Exemple : à gauche l'image de départ en couleur, à droite l'image d'arrivée en niveau de gris. \begin{center} -\includegraphics[scale=0.5]{ecran-image_coul}\qquad\qquad -\includegraphics[scale=0.5]{ecran-image_coul_gris} +\includegraphics[scale=\myscale,scale=0.5]{ecran-image_coul}\qquad\qquad +\includegraphics[scale=\myscale,scale=0.5]{ecran-image_coul_gris} \end{center} @@ -429,12 +443,12 @@ \textbf{Exemple.} Voici un exemple de fichier en entrée : \begin{center} -\includegraphics[scale=0.7]{ecran-fichiers-4a} +\includegraphics[scale=\myscale,scale=0.7]{ecran-fichiers-4a} \end{center} Et voici le fichier de sortie produit par le programme : \begin{center} -\includegraphics[scale=0.7]{ecran-fichiers-4b} +\includegraphics[scale=\myscale,scale=0.7]{ecran-fichiers-4b} \end{center} On lit sur ce fichier que la distance entre Lille et Marseille est de $1077$ kilomètres. @@ -454,12 +468,12 @@ \textbf{Exemple.} Voici un exemple de fichier en entrée : \begin{center} -\includegraphics[scale=0.7]{ecran-fichiers-4c} +\includegraphics[scale=\myscale,scale=0.7]{ecran-fichiers-4c} \end{center} Et voici le fichier de sortie produit par le programme : \begin{center} -\includegraphics[scale=0.55]{ecran-fichiers-4d} +\includegraphics[scale=\myscale,scale=0.55]{ecran-fichiers-4d} \end{center} diff --git a/fonctions/fonctions.pdf b/fonctions/fonctions.pdf index 0d63b14..3c27af6 100644 Binary files a/fonctions/fonctions.pdf and b/fonctions/fonctions.pdf differ diff --git a/fonctions/fonctions.tex b/fonctions/fonctions.tex index 3930035..3b22185 100644 --- a/fonctions/fonctions.tex +++ b/fonctions/fonctions.tex @@ -10,6 +10,20 @@ \objectifs{\'Ecrire une fonction, c'est la façon la plus simple de regrouper du code pour une tâche bien particulière, dans le but de l'exécuter une ou plusieurs fois par la suite.} + +\insertvideo{lp5KTIduKJw}{Fonctions - partie 1} + +\insertvideo{otOE1xA5wAA}{Fonctions - partie 2} + +\insertvideo{QDgY4Ki4Yu8}{Fonctions - partie 3} + +\insertvideo{QdPTjHN9Q-g}{Fonctions - partie 4} + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \begin{cours}[Fonction (début)] \index{fonction} @@ -18,7 +32,7 @@ Pour définir une fonction avec \Python{}, c'est très simple. Voici deux exemples : \begin{center} -\begin{minipage}{0.4\textwidth} +\begin{minipage}{0.5\textwidth} \begin{lstlisting} def dit_bonjour(): print("Bonjour le monde !") @@ -189,7 +203,10 @@ \item Dans les instructions d'une fonction, on peut bien sûr faire appel à d'autres fonctions ! - \item Il est important de bien commenter tes programmes. Pour documenter une fonction, tu peux décrire ce qu'elle fait en commençant par un \emph{docstring}\index{docstring@\emph{docstring}}\index{fonction!docstring@\emph{docstring}}, c'est-à-dire une description (en français) entourée par trois guillemets : \ci{""" Ma fonction fait ceci et cela. """} à placer juste après l'entête. + \item Il est important de bien commenter tes programmes. Pour documenter une fonction, tu peux décrire ce qu'elle fait en commençant par un \emph{docstring}\index{docstring@\emph{docstring}}\index{fonction!docstring@\emph{docstring}}, c'est-à-dire une description (en français) entourée par trois guillemets : + \mycenterline{\ci{""" Ma fonction fait ceci et cela. """}} + + à placer juste après l'entête. \item Lorsque l'on définit une fonction, les variables qui apparaissent entre les parenthèses sont appelées les \defi{paramètres} ; par contre, lorsque l'on appelle la fonction, les valeurs entre les parenthèses sont appelées les \defi{arguments}\index{argument}\index{fonction!argument}. Il y a bien sûr une correspondance entre les deux. @@ -221,12 +238,12 @@ \item \textbf{Devises.} \begin{enumerate} - \item Écris une fonction \ci{conversion_euros_vers_dollars(montant)} qui dépend d'un paramètre et qui pour une somme d'argent \ci{montant}, exprimée en euros, renvoie sa valeur en dollars (tu prendras par exemple $1$ euro = $1,15$ dollar). + \item Écris une fonction \ci{conversion_euros_vers_dollars(montant)} qui dépend d'un paramètre et qui pour une somme d'argent \ci{montant}, exprimée en euros, renvoie sa valeur en dollars (tu prendras par exemple $1$ euro = $1.15$ dollar). \item Écris une fonction \ci{conversion_euros(montant,devise)} qui dépend d'un paramètre \ci{montant} et d'une monnaie \ci{devise} et qui convertit la somme \ci{montant} donnée en euros, dans la devise souhaitée. Exemples de devises : - $1$ euro = $1,15$ dollar ; - $1$ euro = $0,81$ livre ; + $1$ euro = $1.15$ dollar ; + $1$ euro = $0.81$ livre ; $1$ euro = $130$ yens. Par exemple \ci{conversion_euros(100,"livre")} renvoie $81$. @@ -259,8 +276,9 @@ \item Utilise ta fonction précédente pour conjecturer à partir de quel rayon, l'aire d'un disque est plus grande que le périmètre de ce disque. - \emph{Indication.} Si tu veux balayer les rayons en incrémentant la valeur de $0.1$ à chaque fois, tu peux construire une boucle ainsi :\\ - \centerline{\ci{for rayon in range(0,30):}} + \emph{Indication.} Si tu veux balayer les rayons en incrémentant la valeur de $0.1$ à chaque fois, tu peux construire une boucle ainsi : + \mycenterline{\ci{for rayon in range(0,30):}} + puis faire un appel à la fonction par \ci{perimetre_aire_disque(rayon/10)}. \end{enumerate} \end{enumerate} @@ -281,7 +299,7 @@ \objectifs{Objectifs : définir quelques fonctions qui dessinent des figures géométriques. Créer une fonction est similaire à créer un bloc avec \emph{Scratch}.} \begin{center} -\includegraphics[scale=0.4]{ecran-fonctions-tortue} +\includegraphics[scale=\myscale,scale=0.4]{ecran-fonctions-tortue} \end{center} \begin{enumerate} @@ -443,7 +461,7 @@ \begin{enumerate} \item Construis une fonction \ci{sincos(x)} qui renvoie $(\sin(x))^2 + (\cos(x))^2$ et une autre \ci{un(x)} qui renvoie toujours $1$. Ces deux fonctions sont-elles expérimentalement égales (au sens de la première question) ? Cherche quelle peut être la cause de cette réponse. - \item On pose $\epsilon = 0,00001$. On dit que deux fonctions (d'une variable) $f$ et $g$ sont \defi{expérimentalement approximativement égales} si $|f(i)-g(i)| \le \epsilon$ pour $i=-100,-99,\ldots,100$. Est-ce que maintenant les deux fonctions définies par \ci{sincos(x)} et \ci{un(x)} vérifient ce critère ? + \item On pose $\epsilon = 0.00001$. On dit que deux fonctions (d'une variable) $f$ et $g$ sont \defi{expérimentalement approximativement égales} si $|f(i)-g(i)| \le \epsilon$ pour $i=-100,-99,\ldots,100$. Est-ce que maintenant les deux fonctions définies par \ci{sincos(x)} et \ci{un(x)} vérifient ce critère ? \item Vérifie de façon expérimentale et approchée les égalités : $$\sin(2x) = 2\sin(x)\cos(x), \qquad \cos\left(\frac\pi2-x\right)=\sin(x).$$ diff --git a/fonctions/fonctions_4.py b/fonctions/fonctions_4.py index 2f2d888..1bd3dfb 100644 --- a/fonctions/fonctions_4.py +++ b/fonctions/fonctions_4.py @@ -74,7 +74,8 @@ def test_multiplication(a,b,lang): question = "Combien vaut le produit a x b ? " reponse_juste = "Bravo !" reponse_fausse = "Eh non !" - elif lang == "anglais": + + if lang == "anglais": question = "How much is the product a x b? " reponse_juste = "Well done!" reponse_fausse = "It's wrong!" diff --git a/fonctions/pres-fonctions.pdf b/fonctions/pres-fonctions.pdf new file mode 100644 index 0000000..736ccca Binary files /dev/null and b/fonctions/pres-fonctions.pdf differ diff --git a/fonctions/pres-fonctions.tex b/fonctions/pres-fonctions.tex new file mode 100644 index 0000000..966a75f --- /dev/null +++ b/fonctions/pres-fonctions.tex @@ -0,0 +1,49 @@ +\documentclass[11pt,class=report,crop=false]{standalone} +\usepackage[screen]{../python} + + +\pagestyle{empty} + +\begin{document} + + +%==================================================================== +\chapitre{Fonctions} +%==================================================================== + +%\section*{Fonctions} + +\mybox{ +\myfigure{0.7}{ + \tikzinput{fig-fonctions-cours-1} +} } + +\newpage + +\section*{Fonctions avec paramètre et sortie} + +\mybox{ +\myfigure{0.7}{ + \tikzinput{fig-fonctions-cours-2} +} } + +\newpage + +\section*{Fonctions avec plusieurs paramètres/plusieurs sorties} + +\mybox{ +\myfigure{0.7}{ + \tikzinput{fig-fonctions-cours-3} +} } + +\newpage + +\section*{Variable locale} + + +\mybox{ +\myfigure{0.7}{ + \tikzinput{fig-fonctions-cours-4} +} } + +\end{document} diff --git a/guide/guide-biblio.pdf b/guide/guide-biblio.pdf index c24cf01..401ab19 100644 Binary files a/guide/guide-biblio.pdf and b/guide/guide-biblio.pdf differ diff --git a/guide/guide-biblio.tex b/guide/guide-biblio.tex index 8c9a8cd..63884c4 100644 --- a/guide/guide-biblio.tex +++ b/guide/guide-biblio.tex @@ -15,22 +15,25 @@ \section*{Ressources générales} \begin{itemize} \item \emph{Apprendre à programmer avec Python 3} de Gérard Swinnen, aux éditions Eyrolles. C'est un des livres de référence en français pour débuter. La seconde moitié du livre contient des notions beaucoup plus avancées. - Le livre est disponible gratuitement en téléchargement, selon la licence \emph{Creative Commons BY-NC-SA} :\\ - \centerline{ + Le livre est disponible gratuitement en téléchargement, selon la licence \emph{Creative Commons BY-NC-SA} : + \mycenterline{ \href{https://inforef.be/swi/python.htm}{inforef.be/swi/python.htm} } - \item La documentation officielle de \Python{} contient des tutoriels et les explications de chacune des fonctions. Malheureusement certaines pages sont en anglais\\ - \centerline{ + + \item La documentation officielle de \Python{} contient des tutoriels et les explications de chacune des fonctions. Malheureusement certaines pages sont en anglais + \mycenterline{ \href{https://docs.python.org/fr/3/}{docs.python.org/fr/3/} } - \item \emph{Wikipedia} est une source fiable pour en savoir plus sur certaines notions (principalement les projets) mais le niveau n'est pas toujours adapté à un lycéen. + + \item \emph{Wikipédia} est une source fiable pour en savoir plus sur certaines notions (principalement les projets) mais le niveau n'est pas toujours adapté à un lycéen. \item \emph{Internet} et en particulier les forums ont bien souvent la réponse aux questions que tu te poses ! - \item Les plus fondus d'entre vous peuvent participer au \emph{projet Euler} (en anglais) qui propose une liste d'énigmes mathématico-informatique. Accrochez-vous !\\ - \centerline{ + \item Les plus fondus d'entre vous peuvent participer au \emph{projet Euler} (en anglais) qui propose une liste d'énigmes mathématico-informatique. Accrochez-vous ! + \mycenterline{ \href{https://projecteuler.net/}{projecteuler.net} } + \end{itemize} @@ -44,8 +47,8 @@ \section{Premiers pas} \section{Tortue (Scratch avec Python)} L'idéal c'est de bien maîtriser \emph{Scratch} avant de s'attaquer à \Python{} ! -Pour ceux qui ont zappé \emph{Scratch}, il y a les activités \emph{Scratch au collège}. Le livre et les vidéos sont disponibles ici :\\ -\centerline{ +Pour ceux qui ont zappé \emph{Scratch}, il y a les activités \emph{Scratch au collège}. Le livre et les vidéos sont disponibles ici : +\mycenterline{ \href{http://exo7.emath.fr/}{exo7.emath.fr} \qquad et \qquad \href{https://www.youtube.com/ScratchAuCollege}{youtube.com/ScratchAuCollege} } @@ -71,7 +74,9 @@ \section{Si ... alors ...} Certains éditeurs \Python{} permettent aussi une exécution \og{}pas à pas\fg{} du programme. On reviendra par la suite sur le \og{}vrai\fg{} et le \og{}faux\fg{}. -Il existe aussi le test \ci{if ... elif ... elif ... else ...} qui permet d'enchaîner les tests et qui n'est pas abordé ici. +Il existe aussi le test +\mycenterline{\ci{if ... elif ... elif ... else ...}} +qui permet d'enchaîner les tests et qui n'est pas abordé ici. Bien comprendre \ci{if ... else ...} est suffisant ! @@ -85,7 +90,7 @@ \section{Fonctions} \ci{fonc(y)}. Le \ci{x} correspond à une variable mathématique muette. En informatique, on préfère parler de la \defi{portée} de la variable qui peut être locale ou globale. -Ce que l'on peut retenir, c'est que tout ce qui passe à l'intérieur d'un fonction n'est pas accessible en dehors de la fonction. Il faut juste utiliser ce que renvoie la fonction. +Ce que l'on peut retenir, c'est que tout ce qui passe à l'intérieur d'une fonction n'est pas accessible en dehors de la fonction. Il faut juste utiliser ce que renvoie la fonction. Il faut s’interdire l'utilisation de \ci{global} dans un premier temps. Dernier point, il est vraiment important de commenter abondamment ton code et de bien expliquer ce que font tes fonctions. Si tu définis une fonction \ci{fonc(x)} : prévois trois lignes de commentaires pour (a) dire ce que fait cette fonction, (b) dire quelle entrée est attendue (\ci{x} doit être un entier ? un nombre flottant ? positif ?\ldots), (c) dire ce que renvoie la fonction. @@ -169,7 +174,7 @@ \section{Binaire I} Comme les ordinateurs travaillent avec des $0$ et $1$ il faut être à l'aise avec l'écriture binaire. Le passage à l'écriture binaire n'est pas très difficile, il est tout de même préférable de faire quelques exemples à la main avant de s'attaquer à la programmation. -On utilisera l'écriture binaire pour d'autres problèmes sur le principe suivant : vous avez $4$ interrupteurs alors $1001$ signifie que vous actionnez le premier et le dernier interrupteur et pas les autres. +On utilisera l'écriture binaire pour d'autres problèmes sur le principe suivant : vous avez $4$ interrupteurs alors $1.0.0.1$ signifie que vous actionnez le premier et le dernier interrupteur et pas les autres. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -238,15 +243,15 @@ \section{L-système} Pour les L-systèmes définis par des expressions contenant des crochets on retrouve la notion de pile. Les formules sont tirées du livre \emph{The algorithmic beauty of plants}, par -P.~Prusinkiewicz et A.~Lindenmayer (Springer-Verlag, 2004) en accès libre ici : -\href{http://algorithmicbotany.org/papers/abop/abop.pdf}{\emph{The algorithmic beauty of plants} (pdf)}. +P.~Prusinkiewicz et A.~Lindenmayer (Springer-Verlag, 2004) disponible en accès libre : +\href{http://algorithmicbotany.org/papers/abop/abop.pdf}{\emph{The algorithmic beauty of plants}}. -Les illustrations qui débutent chaque partie sont des itérations du L-système appelé la courbe de Hilbert et défini par :\\ -\centerline{ +Les illustrations qui débutent chaque partie de ce livre sont des itérations du L-système appelé la courbe de Hilbert et défini par : +\mycenterline{ \ci{depart = "X"} -\qquad +\quad \ci{regle1 = ("X","gYAdXAXdAYg")} -\qquad +\quad \ci{regle2 = ("Y","dXAgYAYgAXd")} } @@ -283,11 +288,11 @@ \section{Bitcoin} Le principe de la \emph{blockchain} et de la preuve de travail ne sont pas si compliqués, tu trouveras des explications plus détaillées dans les articles de Jean-Paul Delahaye parus dans la revue \emph{Pour la science} : \begin{itemize} \item Bitcoin, la cryptomonnaie (2013) - \href{http://www.lifl.fr/~jdelahay/pls/2013/241.pdf}{www.lifl.fr/~jdelahay/pls/2013/241.pdf} + \href{http://www.lifl.fr/~jdelahay/pls/2013/241.pdf}{\small (www.lifl.fr/$\sim$jdelahay/pls/2013/241.pdf)} \item Les preuves de travail (2014) - \href{http://cristal.univ-lille.fr/~jdelahay/pls/2014/245.pdf}{cristal.univ-lille.fr/~jdelahay/pls/2014/245.pdf} + \href{http://cristal.univ-lille.fr/$\sim$jdelahay/pls/2014/245.pdf}{\small (cristal.univ-lille.fr/\~jdelahay/pls/2014/245.pdf)} \item Du bitcoin à Ethereum : l’ordinateur-monde (2016) - \href{http://cristal.univ-lille.fr/~jdelahay/pls/2016/276.pdf}{cristal.univ-lille.fr/~jdelahay/pls/2016/276.pdf} + \href{http://cristal.univ-lille.fr/$\sim$jdelahay/pls/2016/276.pdf}{\small (cristal.univ-lille.fr/\~jdelahay/pls/2016/276.pdf)} \end{itemize} diff --git a/guide/guide-fonctions.pdf b/guide/guide-fonctions.pdf index 0fac6ba..1e5087f 100644 Binary files a/guide/guide-fonctions.pdf and b/guide/guide-fonctions.pdf differ diff --git a/guide/guide-fonctions.tex b/guide/guide-fonctions.tex index b0b3389..aa3bd48 100644 --- a/guide/guide-fonctions.tex +++ b/guide/guide-fonctions.tex @@ -19,15 +19,15 @@ \section{Mathématiques} \item \ci{a \% b}\quad reste de la division euclidienne, appelé $a$ modulo $b$ \item \ci{abs(x)}\quad valeur absolue \item \ci{x ** n}\quad puissance $x^n$ - \item \ci{4.56e12}\quad pour $4,56 \times 10^{12}$ + \item \ci{4.56e12}\quad pour $4.56 \times 10^{12}$ \end{itemize} \bigskip \textbf{Module \og{}math\fg{}} -L'usage d'autres fonctions mathématiques nécessite le recours au module \ci{math} qui s'appelle par la commande :\\ -\centerline{\ci{from math import *}} +L'usage d'autres fonctions mathématiques nécessite le recours au module \ci{math} qui s'appelle par la commande : +\mycenterline{\ci{from math import *}} \begin{itemize} \item \ci{sqrt(x)}\quad racine carrée $\sqrt{x}$ @@ -41,12 +41,12 @@ \section{Mathématiques} \textbf{Module \og{}random\fg{}} -Le module \ci{random} génère des nombres de façon pseudo-aléatoire. Il s'appelle par la commande :\\ -\centerline{\ci{from random import *}} +Le module \ci{random} génère des nombres de façon pseudo-aléatoire. Il s'appelle par la commande : +\mycenterline{\ci{from random import *}} \begin{itemize} \item \ci{random()}\quad à chaque appel, renvoie un nombre flottant $x$ au hasard vérifiant $0 \le x < 1$. - \item \ci{radint(a,b)} \quad à chaque appel, renvoie un nombre entier $n$ au hasard vérifiant $a \le n \le b$. + \item \ci{randint(a,b)} \quad à chaque appel, renvoie un nombre entier $n$ au hasard vérifiant $a \le n \le b$. \item \ci{choice(liste)} \quad à chaque appel, tire au hasard un élément de la liste. \item \ci{liste.shuffle()} \quad mélange la liste (la liste est modifiée). \end{itemize} @@ -68,7 +68,7 @@ \section{Mathématiques} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Booléens} -Un booléen est une donnée qui prend soit la valeur \ci{True} (\og{}vrai\fg{}), soit la valeur \ci{False} (\og{}faux\fg{}). +Un booléen est une donnée qui prend soit la valeur \ci{True} (\og{}Vrai\fg{}), soit la valeur \ci{False} (\og{}Faux\fg{}). \bigskip @@ -223,7 +223,7 @@ \section{Chaînes de caractères II} \item \ci{ord(c)} \quad renvoie le numéro de code ASCII/unicode associé au caractère $c$. Exemple : \ci{ord("A")} renvoie \ci{65} ; \ci{ord("a")} renvoie \ci{97}. \end{itemize} -Le début de la table des codes ASCII/unicode est donnée ci-dessous. +Le début de la table des codes ASCII/unicode est donné ci-dessous. \myfigure{0.8}{ \small @@ -279,7 +279,7 @@ \section{Chaînes de caractères II} Exemples : \begin{itemize} - \item \ci{"".join(["Etre", "ou", "ne", "pas", "etre."])} \quad renvoie \ci{'Etreounepasetre.'} Il manque les espaces. + \item \ci{"".join(["Etre", "ou", "ne", "pas", "etre."])} \ renvoie \ci{'Etreounepasetre.'} Il manque les espaces. \item \ci{" ".join(["Etre", "ou", "ne", "pas", "etre."])} \ renvoie \ci{'Etre ou ne pas etre.'} C'est mieux lorsque le séparateur est une espace. \item \ci{"--".join(["Etre", "ou", "ne", "pas", "etre."])} renvoie @@ -345,7 +345,7 @@ \section{Listes I} \item \ci{nouv_liste = liste + [element]} \quad fournit une nouvelle liste avec un élément en plus à la fin. Exemple : \ci{[1,2,3,4] + [5]} vaut \ci{[1,2,3,4,5]}. \item \ci{[element] + liste} \quad renvoie une liste où l'élément est ajouté au début. Exemple : \ci{[5] + [1,2,3,4]} vaut \ci{[5,1,2,3,4]}. \item \ci{liste1 + liste2} \quad concatène les deux listes. - Exemple : \ci{liste1 = [4,5,6]} et \ci{liste2 = [7,8,9]} alors \ci{liste1 + liste2} vaut \ci{[4,5,6,7,8,9]}. + Exemple : avec \ci{liste1 = [4,5,6]} et \ci{liste2 = [7,8,9]} alors \ci{liste1 + liste2} vaut \ci{[4,5,6,7,8,9]}. \end{itemize} \bigskip @@ -360,8 +360,8 @@ \section{Listes I} \end{lstlisting} \end{minipage} \end{center} -\`A la fin \ci{liste_carres} vaut :\\ -\centerline{\ci{[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]}} +\`A la fin \ci{liste_carres} vaut : +\mycenterline{\ci{[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]}} \bigskip @@ -443,8 +443,9 @@ \section{Listes II} \ci{liste.index(element)} renvoie la première position à laquelle l'élément a été trouvé. Exemple : avec \ci{liste = [12, 30, 5, 9, 5, 21]}, \ci{liste.index(5)} renvoie $2$. - \item Si on souhaite juste savoir si un élément appartient à une liste, alors l'instruction :\\ - \centerline{\ci{element in liste}} + \item Si on souhaite juste savoir si un élément appartient à une liste, alors l'instruction : + \mycenterline{\ci{element in liste}} + renvoie \ci{True} ou \ci{False}. Exemple : avec \ci{liste = [12, 30, 5, 9, 5, 21]}, \og\ci{9 in liste}\fg{} est vrai, alors que \og\ci{8 in liste}\fg{} est faux. @@ -512,8 +513,8 @@ \section{Listes II} \textbf{Liste de listes} -Exemple : \\ - \centerline{\ci{tableau = [ [2,14,5], [3,5,7], [15,19,4], [8,6,5] ]}} +Exemple : + \mycenterline{\ci{tableau = [ [2,14,5], [3,5,7], [15,19,4], [8,6,5] ]}} correspond au tableau : \myfigure{0.7}{ \tikzinput{fig-tableau} @@ -547,8 +548,8 @@ \section{Entrée/sortie} Exemple : \ci{print("Valeur =",14)} affiche \ci{Valeur = 14}. Exemple : \ci{print("Ligne 1 \\n Ligne 2")} affiche sur deux lignes. - \item \textbf{Séparateur.} \ci{print(...,sep="...")} \quad change le séparateur (par défaut le séparateur est le caractère espace). Exemple : \ci{print("Bob",17,13,16,sep=" ; ")} affiche - \ci{Bob ; 17 ; 13 ; 16}. + \item \textbf{Séparateur.} \ci{print(...,sep="...")} \quad change le séparateur (par défaut le séparateur est le caractère espace). Exemple : \ci{print("Bob",17,13,16,sep="; ")} affiche + \ci{Bob; 17; 13; 16}. \item \textbf{Fin de ligne.} \ci{print(...,end="...")} \quad change le caractère placé à la fin (par défaut c'est le saut de ligne \ci{\\n}). Exemple \ci{print(17,end="")} puis \ci{print(89)} affiche \ci{1789} sur une seule ligne. @@ -632,7 +633,7 @@ \section{Fichiers} \textbf{Lire un fichier (méthode officielle)} \begin{lstlisting} -with open("mon_fichier.txt",r) as fic: +with open("mon_fichier.txt","r") as fic: for ligne in fic: print(ligne) \end{lstlisting} @@ -641,8 +642,8 @@ \section{Fichiers} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Tortue} -Le module \ci{turtle} s'appelle par la commande :\\ -\centerline{\ci{from turtle import *}} +Le module \ci{turtle} s'appelle par la commande : +\mycenterline{\ci{from turtle import *}} \bigskip @@ -661,7 +662,7 @@ \section{Tortue} \item \ci{down()} \quad abaisse le stylo \item \ci{up()} \quad relève le stylo \item \ci{width(epaisseur)} \quad change l'épaisseur du trait - \item \ci{color(couleur)} \quad change la couleur du trait : \ci{"red"}, \ci{"green"}, \ci{"blue"}, \ci{"orange"}, \ci{"purple"},\ldots + \item \ci{color(couleur)} \quad change la couleur du trait : \ci{"red"}, \ci{"green"}, \ci{"blue"}, \ci{"orange"}\ldots \item \ci{position()} \quad renvoie la position $(x,y)$ de la tortue \item \ci{heading()} \quad renvoie la direction \ci{angle} vers laquelle pointe la tortue @@ -695,7 +696,7 @@ \section{Matplotlib} Avec le module \ci{matplotlib} il est très facile de tracer une liste. Voici un exemple. \begin{center} -\includegraphics[scale=0.5]{../listes/ecran-liste-cours-visualisation} +\includegraphics[scale=\myscale,scale=0.5]{../listes/ecran-liste-cours-visualisation} \end{center} \begin{lstlisting} @@ -735,7 +736,7 @@ \subsection{Graphiques} Pour afficher ceci : \begin{center} -\includegraphics[scale=0.6]{../statistique/ecran-stat-cours-intro} +\includegraphics[scale=\myscale,scale=0.6]{../statistique/ecran-stat-cours-intro} \end{center} le code est : \begin{lstlisting} @@ -790,8 +791,7 @@ \subsection{Graphiques} \textbf{Portion de cercle.} La fonction \ci{create_arc()} n'est pas très intuitive. Il faut penser que l'on dessine un cercle, en précisant les coordonnées de deux sommets opposés d'un carré qui l'entoure, puis en précisant l'angle de début et l'angle du secteur (en degrés). - -\centerline{\ci{canvas.create_arc(x1,y1,x2,y2,start=debut_angle,extent=mon_angle)}} +\mycenterline{\ci{canvas.create_arc(x1,y1,x2,y2,start=debut_angle,extent=mon_angle)}} \myfigure{0.8}{ @@ -807,7 +807,7 @@ \subsection{Boutons} Voici un petit programme qui affiche une fenêtre avec deux boutons. Le premier bouton change la couleur du rectangle, le second termine le programme. \begin{center} -\includegraphics[scale=0.6]{../statistique/ecran-stat-cours-boutons} +\includegraphics[scale=\myscale,scale=0.6]{../statistique/ecran-stat-cours-boutons} \end{center} Le code est : \begin{lstlisting} @@ -820,15 +820,15 @@ \subsection{Boutons} def action_bouton(): canvas.delete("all") # Efface tout - couleurs = ["red","orange","yellow","green","cyan","blue","violet","purple"] + couleurs = ["red","orange","yellow","green","cyan","blue","violet"] coul = choice(couleurs) # Couleur au hasard canvas.create_rectangle(100,50,300,150,width=5,fill=coul) return -bouton_couleur = Button(root,text="Afficher", width=20, command=action_bouton) +bouton_couleur=Button(root,text="Afficher",width=20,command=action_bouton) bouton_couleur.pack() -bouton_quitter = Button(root,text="Quitter", width=20, command=root.quit) +bouton_quitter = Button(root,text="Quitter",width=20,command=root.quit) bouton_quitter.pack() root.mainloop() @@ -837,11 +837,11 @@ \subsection{Boutons} Quelques explications : \begin{itemize} \item On crée un bouton par la commande \ci{Button}. L'option \ci{text} personnalise le texte qui s'affiche sur le bouton. On ajoute le bouton créé à la fenêtre par la méthode \ci{pack}. - \item Le plus important est l'action associée au bouton ! C'est l'option \ci{command} qui reçoit le nom de la fonction à exécuter lorsque le bouton est cliqué. Pour notre exemple \ci{command=action_bouton} associe au clic sur le bouton un changement de couleur. + \item Le plus important est l'action associée au bouton ! C'est l'option \ci{command} qui reçoit le nom de la fonction à exécuter lorsque le bouton est cliqué. Pour notre exemple \ci{command = action_bouton} associe au clic sur le bouton un changement de couleur. - \item Attention ! il faut donner le nom de la fonction sans parenthèses : \ci{commande=ma_fonction} et pas \ci{command=ma_fonction()}. + \item Attention ! il faut donner le nom de la fonction sans parenthèses : \ci{command=ma_fonction} et pas \ci{command = ma_fonction()}. - \item Pour associer au bouton \og{}Quitter\fg{} la fermeture du programme, l'argument est \ci{command=root.quit}. + \item Pour associer au bouton \og{}Quitter\fg{} la fermeture du programme, l'argument est \ci{command = root.quit}. \item La commande \ci{canvas.delete("all")} efface tous les dessins de notre fenêtre graphique. @@ -853,7 +853,7 @@ \subsection{Texte} Voici comment afficher du texte avec \Python{} et le module des fenêtres graphiques \ci{tkinter}. \begin{center} -\includegraphics[scale=0.6]{../markdown/ecran-markdown-7} +\includegraphics[scale=\myscale,scale=0.6]{../markdown/ecran-markdown-7} \end{center} Le code est : \begin{lstlisting} @@ -881,7 +881,7 @@ \subsection{Texte} % \item On rappelle que pour le repère graphique l'axe des ordonnées est dirigé vers le bas. Pour définir un rectangle, il suffit de préciser les coordonnées % $(x_1,y_1)$, $(x_2,y_2)$ de deux sommets opposés (voir la figure ci-dessous). - \item Le texte est affiché par la fonction \ci{canvas.create_text()}. Il faut préciser les coordonnées $(x,y)$ du point à partir duquel l'on souhaite afficher le texte. + \item Le texte est affiché par la fonction \ci{canvas.create_text()}. Il faut préciser les coordonnées $(x,y)$ du point à partir duquel on souhaite afficher le texte. \item L'option \ci{text} permet de passer la chaîne de caractères à afficher. @@ -921,7 +921,7 @@ \subsection{Clic de souris} x = event.x y = event.y canvas.create_rectangle(x,y,x+10,y+10,fill="red") - print("Clic a x =",x,", y =",y) + print("Clic à x =",x,", y =",y) return # Association clic/action @@ -936,8 +936,9 @@ \subsection{Clic de souris} \begin{itemize} \item La création de la fenêtre est habituelle. Le programme se termine par le lancement de la fenêtre avec la commande \ci{mainloop()}. - \item Le premier point clé est d'associer un clic de souris à une action, c'est ce que fait la ligne \\ -\centerline{\ci{canvas.bind("", action_clic_souris)}} + \item Le premier point clé est d'associer un clic de souris à une action, c'est ce que fait la ligne +\mycenterline{\ci{canvas.bind("", action_clic_souris)}} + Chaque fois que le bouton gauche de la souris est cliqué, \Python{} exécute la fonction \ci{action_clic_souris}. Note qu'il n'y a pas de parenthèses pour l'appel à la fonction. \item Second point clé : la fonction \ci{action_clic_souris} récupère les coordonnées du clic et ici ensuite fait deux choses : elle affiche un petit rectangle à l'endroit du clic et affiche dans la fenêtre du terminal les coordonnées $(x,y)$. @@ -951,7 +952,7 @@ \subsection{Mouvement} Voici un programme qui fait se déplacer un petit carré en le faisant rebondir sur les bords de la fenêtre. \begin{center} -\includegraphics[scale=0.5]{../aleatoire/ecran-alea-cours-mouv} +\includegraphics[scale=\myscale,scale=0.5]{../aleatoire/ecran-alea-cours-mouv} \end{center} Voici les points principaux : @@ -960,8 +961,8 @@ \subsection{Mouvement} \item Cet objet est (un petit peu) déplacé par la fonction \ci{deplacer()} qui décale le rectangle de \ci{(dx,dy)}. - \item Le point clé est que cette fonction sera exécutée une nouvelle fois après un court laps de temps. La commande :\\ - \centerline{\ci{canvas.after(50,deplacer)}} + \item Le point clé est que cette fonction sera exécutée une nouvelle fois après un court laps de temps. La commande : + \mycenterline{\ci{canvas.after(50,deplacer)}} demande une nouvelle exécution de la fonction \ci{deplacer()} après un court délai (ici $50$ millisecondes). \item La répétition de petits déplacements simule le mouvement. @@ -1009,10 +1010,10 @@ \subsection{Mouvement} return # Boutons -bouton_couleur = Button(root,text="Déplacer", width=20, command=action_deplacer) -bouton_couleur.pack(pady=10) +bouton_deplacer=Button(root,text="Déplacer",width=20,command=action_deplacer) +bouton_deplacer.pack(pady=10) -bouton_quitter = Button(root,text="Quitter", width=20, command=root.quit) +bouton_quitter = Button(root,text="Quitter",width=20,command=root.quit) bouton_quitter.pack(side=BOTTOM, pady=10) root.mainloop() diff --git a/guide/guide-python.pdf b/guide/guide-python.pdf index 7d659b5..cb64559 100644 Binary files a/guide/guide-python.pdf and b/guide/guide-python.pdf differ diff --git a/guide/guide-python.tex b/guide/guide-python.tex index b3654fd..bbe474d 100644 --- a/guide/guide-python.tex +++ b/guide/guide-python.tex @@ -59,7 +59,7 @@ \section{Type de données} \item \ci{int} \quad Entier. Exemples : \ci{123} ou \ci{-15}. \item \ci{float} \quad Nombre flottant (ou à virgule). Exemples : \ci{4.56}, \ci{-0.001}, \ci{6.022e23} (pour $6.022 \times 10^{23}$), \ci{4e-3} (pour $0.004 = 4 \times 10^{-3}$). - \item \ci{str} \quad Caractère ou chaînes de caractères. Exemples : \ci{'Y'}, + \item \ci{str} \quad Caractère ou chaîne de caractères. Exemples : \ci{'Y'}, \ci{"k"}, \ci{'Hello'}, \ci{"World !"}. \item \ci{bool} \quad Booléen. \ci{True} ou \ci{False}. \item \ci{list} \quad Liste. Exemple : \ci{[1,2,3,4]}. @@ -222,8 +222,8 @@ \subsection{Variable globale} Une \defi{variable globale} est une variable qui est définie pour l'ensemble du programme. Il n'est généralement pas recommandé d'utiliser de telles variables, mais cela peut être utile dans certain cas. Voyons un exemple. -On déclare la variable globale, ici la constante de gravitation, en début de programme comme une variable classique : \\ -\centerline{\ci{gravitation = 9.81}} +On déclare la variable globale, ici la constante de gravitation, en début de programme comme une variable classique : +\mycenterline{\ci{gravitation = 9.81}} La contenu de la variable \ci{gravitation} est maintenant accessible partout. Par contre, si on souhaite changer la valeur de cette variable dans une fonction, il faut bien préciser à \Python{} que l'on est conscient de modifier une variable globale ! @@ -232,7 +232,7 @@ \subsection{Variable globale} \begin{lstlisting} def sur_la_lune(): - global gravitation # Oui, je veux modifier cette variable globale ! + global gravitation # Oui, je veux modifier cette variable globale! gravitation = 1.625 # Nouvelle valeur pour tout le programme ... \end{lstlisting} @@ -242,8 +242,8 @@ \subsection{Variable globale} \subsection{Arguments optionnels} -Il est possible de donner des arguments optionnels. Voici comment définir une fonction (ici qui dessinerait un trait) en donnant des valeurs par défaut :\\ - \centerline{\ci{def tracer(longueur, epaisseur=5, couleur="blue"):}} +Il est possible de donner des arguments optionnels. Voici comment définir une fonction (ici qui dessinerait un trait) en donnant des valeurs par défaut : + \mycenterline{\ci{def tracer(longueur, epaisseur=5, couleur="blue"):}} \begin{itemize} \item La commande \ci{tracer(100)} trace mon trait, et comme je n'ai précisé que la longueur, les arguments \ci{epaisseur} et \ci{couleur} prennent les valeurs par défaut ($5$ et bleu). diff --git a/images/images.pdf b/images/images.pdf index 4587613..b8f9afe 100644 Binary files a/images/images.pdf and b/images/images.pdf differ diff --git a/images/images.tex b/images/images.tex index e9c9887..8f816f6 100644 --- a/images/images.tex +++ b/images/images.tex @@ -15,6 +15,12 @@ \index{image} + +\insertvideo{WXGci8trILg}{Images dynamiques - partie 1} + +\insertvideo{DlZyWbXkotM}{Images dynamiques - partie 2} + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -63,21 +69,21 @@ Voici une image $256 \times 256$ et sa première transformation : \begin{center} -\includegraphics[scale=0.4]{images_fiche/pi_gimp_new_photo_0.png}\qquad\qquad -\includegraphics[scale=0.4]{images_fiche/pi_gimp_new_photo_1.png} +\includegraphics[scale=\myscale,scale=0.4]{images_fiche/pi_gimp_new_photo_0.png}\qquad\qquad +\includegraphics[scale=\myscale,scale=0.4]{images_fiche/pi_gimp_new_photo_1.png} \end{center} Voici ce qui se passe si on répète plusieurs fois la transformation du photomaton : \begin{center} -\includegraphics[scale=0.3]{images_fiche/pi_gimp_new_photo_2.png}\qquad -\includegraphics[scale=0.3]{images_fiche/pi_gimp_new_photo_3.png}\qquad -\includegraphics[scale=0.3]{images_fiche/pi_gimp_new_photo_4.png} +\includegraphics[scale=\myscale,scale=0.3]{images_fiche/pi_gimp_new_photo_2.png}\qquad +\includegraphics[scale=\myscale,scale=0.3]{images_fiche/pi_gimp_new_photo_3.png}\qquad +\includegraphics[scale=\myscale,scale=0.3]{images_fiche/pi_gimp_new_photo_4.png} \end{center} \begin{center} -\includegraphics[scale=0.3]{images_fiche/pi_gimp_new_photo_5.png}\qquad -\includegraphics[scale=0.3]{images_fiche/pi_gimp_new_photo_6.png}\qquad -\includegraphics[scale=0.3]{images_fiche/pi_gimp_new_photo_7.png}\qquad -\includegraphics[scale=0.3]{images_fiche/pi_gimp_new_photo_8.png} +\includegraphics[scale=\myscale,scale=0.3]{images_fiche/pi_gimp_new_photo_5.png}\qquad +\includegraphics[scale=\myscale,scale=0.3]{images_fiche/pi_gimp_new_photo_6.png}\qquad +\includegraphics[scale=\myscale,scale=0.3]{images_fiche/pi_gimp_new_photo_7.png}\qquad +\includegraphics[scale=\myscale,scale=0.3]{images_fiche/pi_gimp_new_photo_8.png} \end{center} L'image devient de plus en plus brouillée, mais au bout d'un certain nombre de répétitions de la transformation, on retombe sur l'image de départ ! \end{cours} @@ -92,7 +98,7 @@ \begin{activite}[Transformation du photomaton] -\objectifs{Objectifs : programmer la transformation du photomaton qui décompose une image en sous-images. Lorsque l'on itère cette transformation l'image se destructure petit à petit, puis d'un coup se reforme !} +\objectifs{Objectifs : programmer la transformation du photomaton qui décompose une image en sous-images. Lorsque l'on itère cette transformation l'image se déstructure petit à petit, puis d'un coup se reforme !} @@ -118,11 +124,11 @@ 13&15&14&16 \end{array}$$ - \emph{Indications.} Tu peux initialiser un nouveau tableau par la commande :\\ - \centerline{\ci{nouv_tableau = [[0 for j in range(n)] for i in range(n)]}} + \emph{Indications.} Tu peux initialiser un nouveau tableau par la commande : + \mycenterline{\ci{nouv_tableau = [[0 for j in range(n)] for i in range(n)]}} - Puis le remplir par des commandes du type :\\ - \centerline{\ci{nouv_tableau[ii][jj] = tableau[i][j]}} + Puis le remplir par des commandes du type : + \mycenterline{\ci{nouv_tableau[ii][jj] = tableau[i][j]}} \item Programme une fonction \ci{photomaton_iterer(tableau,k)} qui renvoie le tableau calculé après $k$ itérations de la transformation du photomaton. @@ -137,19 +143,19 @@ Voici l'image de départ de taille $256 \times 256$ et les images obtenues par itérations de la transformation du photomaton pour $k=1$ jusqu'à $k=8$. Au bout de $8$ itérations on retrouve l'image initiale ! \begin{center} -\includegraphics[scale=0.4]{images_fiche/chat_gimp_new_photo_0.png} +\includegraphics[scale=\myscale,scale=0.4]{images_fiche/chat_gimp_new_photo_0.png} \end{center} \begin{center} -\includegraphics[scale=0.3]{images_fiche/chat_gimp_new_photo_1.png}\qquad -\includegraphics[scale=0.3]{images_fiche/chat_gimp_new_photo_2.png}\qquad -\includegraphics[scale=0.3]{images_fiche/chat_gimp_new_photo_3.png}\qquad -\includegraphics[scale=0.3]{images_fiche/chat_gimp_new_photo_4.png} +\includegraphics[scale=\myscale,scale=0.3]{images_fiche/chat_gimp_new_photo_1.png}\qquad +\includegraphics[scale=\myscale,scale=0.3]{images_fiche/chat_gimp_new_photo_2.png}\qquad +\includegraphics[scale=\myscale,scale=0.3]{images_fiche/chat_gimp_new_photo_3.png}\qquad +\includegraphics[scale=\myscale,scale=0.3]{images_fiche/chat_gimp_new_photo_4.png} \end{center} \begin{center} -\includegraphics[scale=0.3]{images_fiche/chat_gimp_new_photo_5.png}\qquad -\includegraphics[scale=0.3]{images_fiche/chat_gimp_new_photo_6.png}\qquad -\includegraphics[scale=0.3]{images_fiche/chat_gimp_new_photo_7.png}\qquad -\includegraphics[scale=0.3]{images_fiche/chat_gimp_new_photo_8.png} +\includegraphics[scale=\myscale,scale=0.3]{images_fiche/chat_gimp_new_photo_5.png}\qquad +\includegraphics[scale=\myscale,scale=0.3]{images_fiche/chat_gimp_new_photo_6.png}\qquad +\includegraphics[scale=\myscale,scale=0.3]{images_fiche/chat_gimp_new_photo_7.png}\qquad +\includegraphics[scale=\myscale,scale=0.3]{images_fiche/chat_gimp_new_photo_8.png} \end{center} @@ -187,11 +193,11 @@ \end{minipage} \begin{minipage}{0.3\textwidth} \begin{center} -\includegraphics[scale=0.15]{input/ecran-test-pgm} +\includegraphics[scale=\myscale,scale=0.15]{input/ecran-test-pgm} \end{center} \end{minipage} \end{center} -Par exemple avec \ci{tableau = [ [128,192,128,192,128],[224...]]}, la commande \ci{tableau_vers_image(tableau,"test")} écrit un fichier \ci{test.pgm} (à gauche) qui s'afficherait comme l'image à droite. +Par exemple avec \ci{tableau = [ [128,192,128,192,128], [224,...] ]}, la commande \ci{tableau_vers_image(tableau,"test")} écrit un fichier \ci{test.pgm} (à gauche) qui s'afficherait comme l'image à droite. @@ -227,7 +233,7 @@ \medskip -\emph{Formules.} Un élément en position $(i,j)$ du tableau d'arrivée, correspond à un élément $(2i,j//2)$ (si $j$ est pair) ou bien $(2i+1,j//2)$ (si $j$ est impair) avec ici $0 \le i < \frac n2$ et $0 \le j < 2n$. +\emph{Formules.} Un élément en position $(i,j)$ du tableau d'arrivée, correspond à un élément $(2i,j//2)$ (si $j$ est pair) ou bien $(2i+1,j//2)$ (si $j$ est impair) du tableau de départ, avec ici $0 \le i < \frac n2$ et $0 \le j < 2n$. \medskip @@ -279,21 +285,24 @@ Voyons un exemple de l'action de plusieurs transformations du boulanger. À gauche l'image initiale de taille $128 \times 128$, puis le résultat de $k=1,2,3$ itérations. + \begin{center} -\includegraphics[scale=0.6]{images_fiche/surf_gimp_new_boul_0.png}\qquad -\includegraphics[scale=0.6]{images_fiche/surf_gimp_new_boul_1.png}\qquad -\includegraphics[scale=0.6]{images_fiche/surf_gimp_new_boul_2.png}\qquad -\includegraphics[scale=0.6]{images_fiche/surf_gimp_new_boul_3.png} +\includegraphics[scale=\myscale,scale=0.65]{images_fiche/surf_gimp_new_boul_0.png}\qquad +\includegraphics[scale=\myscale,scale=0.65]{images_fiche/surf_gimp_new_boul_1.png}\qquad +\includegraphics[scale=\myscale,scale=0.65]{images_fiche/surf_gimp_new_boul_2.png}\qquad +\includegraphics[scale=\myscale,scale=0.65]{images_fiche/surf_gimp_new_boul_3.png} \end{center} Voici les images pour $k=12,13,14,15$ itérations : + \begin{center} -\includegraphics[scale=0.6]{images_fiche/surf_gimp_new_boul_12.png}\qquad -\includegraphics[scale=0.6]{images_fiche/surf_gimp_new_boul_13.png}\qquad -\includegraphics[scale=0.6]{images_fiche/surf_gimp_new_boul_14.png}\qquad -\includegraphics[scale=0.6]{images_fiche/surf_gimp_new_boul_15.png} +\includegraphics[scale=\myscale,scale=0.65]{images_fiche/surf_gimp_new_boul_12.png}\qquad +\includegraphics[scale=\myscale,scale=0.65]{images_fiche/surf_gimp_new_boul_13.png}\qquad +\includegraphics[scale=\myscale,scale=0.65]{images_fiche/surf_gimp_new_boul_14.png}\qquad +\includegraphics[scale=\myscale,scale=0.65]{images_fiche/surf_gimp_new_boul_15.png} \end{center} + \end{cours} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -347,24 +356,24 @@ \end{enumerate} -Voici un exemple avec une image de taille $256 \times 256$, d'abord l'image initiale, puis une première itération ($k=1$) et un deuxième itération ($k=2$). +Voici un exemple avec une image de taille $256 \times 256$, d'abord l'image initiale, puis une première itération ($k=1$) et une deuxième itération ($k=2$). \begin{center} -\includegraphics[scale=0.4]{images_fiche/reveil_gimp_new_boul_0.png}\qquad -\includegraphics[scale=0.4]{images_fiche/reveil_gimp_new_boul_1.png}\qquad -\includegraphics[scale=0.4]{images_fiche/reveil_gimp_new_boul_2.png} +\includegraphics[scale=\myscale,scale=0.4]{images_fiche/reveil_gimp_new_boul_0.png}\qquad +\includegraphics[scale=\myscale,scale=0.4]{images_fiche/reveil_gimp_new_boul_1.png}\qquad +\includegraphics[scale=\myscale,scale=0.4]{images_fiche/reveil_gimp_new_boul_2.png} \end{center} $k=3,4,5$ : \begin{center} -\includegraphics[scale=0.4]{images_fiche/reveil_gimp_new_boul_3.png}\qquad -\includegraphics[scale=0.4]{images_fiche/reveil_gimp_new_boul_4.png}\qquad -\includegraphics[scale=0.4]{images_fiche/reveil_gimp_new_boul_5.png} +\includegraphics[scale=\myscale,scale=0.4]{images_fiche/reveil_gimp_new_boul_3.png}\qquad +\includegraphics[scale=\myscale,scale=0.4]{images_fiche/reveil_gimp_new_boul_4.png}\qquad +\includegraphics[scale=\myscale,scale=0.4]{images_fiche/reveil_gimp_new_boul_5.png} \end{center} $k=15,16,17$ : \begin{center} -\includegraphics[scale=0.4]{images_fiche/reveil_gimp_new_boul_15.png}\qquad -\includegraphics[scale=0.4]{images_fiche/reveil_gimp_new_boul_16.png}\qquad -\includegraphics[scale=0.4]{images_fiche/reveil_gimp_new_boul_17.png} +\includegraphics[scale=\myscale,scale=0.4]{images_fiche/reveil_gimp_new_boul_15.png}\qquad +\includegraphics[scale=\myscale,scale=0.4]{images_fiche/reveil_gimp_new_boul_16.png}\qquad +\includegraphics[scale=\myscale,scale=0.4]{images_fiche/reveil_gimp_new_boul_17.png} \end{center} Pour $k=17$ on retrouve l'image de départ ! diff --git a/images/pres-images.pdf b/images/pres-images.pdf new file mode 100644 index 0000000..554231a Binary files /dev/null and b/images/pres-images.pdf differ diff --git a/images/pres-images.tex b/images/pres-images.tex new file mode 100644 index 0000000..bb0eaca --- /dev/null +++ b/images/pres-images.tex @@ -0,0 +1,221 @@ +\documentclass[12pt,class=report,crop=false]{standalone} +\usepackage[screen]{../python} + + +\pagestyle{empty} + +\begin{document} + +% Commande spécifique +\newcommand{\badletter}[1]{\underline{\textcolor{red}{#1}}} + + + +%==================================================================== +\chapitre{Images dynamiques} +%==================================================================== + + +\section*{Transformation du photomaton} + + +On part d'un tableau $n\times n$, avec $n$ pair, chaque élément du tableau représente un pixel. + +\myfigure{0.7}{ +\tikzinput{fig-images-1} +} + + +\medskip +\mybox{ +Pour chaque couple $(i,j)$, on calcule son image $(i',j')$ par la transformation du photomaton selon les formules suivantes : +\begin{itemize} + \item Si $i$ et $j$ sont pairs : $(i',j') = (i//2,j//2)$. + \item Si $i$ est pair et $j$ est impair : $(i',j') = (i//2,(n+j)//2)$. + \item Si $i$ est impair et $j$ est pair : $(i',j') = ((n+i)//2,j//2)$. + \item Si $i$ et $j$ sont impairs : $(i',j') = ((n+i)//2,(n+j)//2)$. +\end{itemize} +} +\newpage + +\medskip +\emph{Exemple.} + +$$\begin{array}{cccc} + 1& 2& 3& 4\\ + 5& 6& 7& 8\\ + 9&10&11&12\\ + 13&14&15&16 +\end{array}\qquad\qquad +\begin{array}{cccc} + 1& 3& 2& 4\\ + 9&11&10&12\\ + 5& 7& 6& 8\\ + 13&15&14&16 +\end{array}$$ + + +\newpage + +Voici une image $256 \times 256$ et sa première transformation : + +\begin{center} +\includegraphics[scale=0.4]{images_fiche/pi_gimp_new_photo_0.png}\qquad\qquad +\includegraphics[scale=0.4]{images_fiche/pi_gimp_new_photo_1.png} +\end{center} + +Voici ce qui se passe si on répète plusieurs fois la transformation du photomaton : +\begin{center} +\includegraphics[scale=0.3]{images_fiche/pi_gimp_new_photo_2.png}\qquad +\includegraphics[scale=0.3]{images_fiche/pi_gimp_new_photo_3.png}\qquad +\includegraphics[scale=0.3]{images_fiche/pi_gimp_new_photo_4.png} +\end{center} +\begin{center} +\includegraphics[scale=0.3]{images_fiche/pi_gimp_new_photo_5.png}\qquad +\includegraphics[scale=0.3]{images_fiche/pi_gimp_new_photo_6.png}\qquad +\includegraphics[scale=0.3]{images_fiche/pi_gimp_new_photo_7.png}\qquad +\includegraphics[scale=0.3]{images_fiche/pi_gimp_new_photo_8.png} +\end{center} + +\newpage + +Tu peux initialiser un nouveau tableau par la commande :\\ + \centerline{\ci{nouv_tableau = [[0 for j in range(n)] for i in range(n)]}} + + Puis le remplir par des commandes du type :\\ + \centerline{\ci{nouv_tableau[ii][jj] = tableau[i][j]}} + + +\newpage + +\evidence{Format \og{}pgm\fg{}} + +Fichier image au format \og{}pgm\fg{} à partir d'un tableau de niveaux de gris. + +\begin{center} +\begin{minipage}{0.3\textwidth} +\begin{lstlisting} +P2 +5 5 +255 +128 192 128 192 128 +224 0 228 0 224 +228 228 228 228 228 +224 64 64 64 224 +192 192 192 192 192 +\end{lstlisting} +\end{minipage} +\begin{minipage}{0.3\textwidth} +\begin{center} +\includegraphics[scale=0.15]{input/ecran-test-pgm} +\end{center} +\end{minipage} +\end{center} + + + +\newpage + + + +\section*{Transformation du boulanger} + +On part d'un tableau $n\times n$, avec $n$ pair dont chaque élément représente un pixel. +On va appliquer deux transformations élémentaires à chaque fois. + +\evidence{Étirer.} Le principe est le suivant : les deux premières lignes (chacune de longueur $n$) produisent une seule ligne de longueur $2n$ en mixant les valeurs de chaque ligne en alternant un élément du haut, un élément du bas. + +\medskip + +\myfigure{1}{ +\tikzinput{fig-images-2} +} + + +\myfigure{1}{ +\tikzinput{fig-images-2bis} +} + +\medskip + +\mybox{ +\emph{Formules.} Un élément en position $(i,j)$ du tableau d'arrivée, correspond à un élément $(2i,j//2)$ (si $j$ est pair) ou bien $(2i+1,j//2)$ (si $j$ est impair) avec ici $0 \le i < \frac n2$ et $0 \le j < 2n$. +} + +\newpage + + +\emph{Exemple.} Voici un tableau $4 \times 4$ à gauche, et le tableau étiré $2 \times 8$ à droite. +Les lignes $0$ et $1$ à gauche donnent la ligne $0$ à droite. +Les lignes $2$ et $3$ à gauche donne la ligne $1$ à droite. +$$\begin{array}{cccc} + 1& 2& 3& 4\\ + 5& 6& 7& 8\\ + 9&10&11&12\\ + 13&14&15&16 +\end{array}\qquad\qquad +\begin{array}{cccccccc} + 1& 5& 2& 6& 3& 7& 4& 8 \\ + 9&13&10&14&11&15&12&16 +\end{array}$$ + + \newpage + +\evidence{Replier.} Le principe est le suivant : la partie droite d'un tableau étiré est retournée, puis ajoutée sous la partie gauche. Partant d'un tableau $\frac n2 \times 2n$ on obtient un tableau $n \times n$. + + +\myfigure{0.7}{ +\tikzinput{fig-images-3} +} + +\mybox{ +\emph{Formules.} +Pour $0 \le i < \frac n2$ et $0 \le j < n$ les éléments en position $(i,j)$ du tableau sont conservés. +Pour $\frac n2 \le i < n$ et $0 \le j < n$ un élément du tableau +d'arrivée $(i,j)$, correspond à un élément $\big(\frac{n}{2} - i - 1,2n-1-j\big)$ du tableau de départ. +} + +\newpage + + +\emph{Exemple.} +À partir du tableau étiré $2 \times 8$ à gauche, on obtient un tableau replié $4 \times 4$ à droite. +$$ +\begin{array}{cccccccc} + 1& 5& 2& 6& 3& 7& 4& 8 \\ + 9&13&10&14&11&15&12&16 +\end{array}\qquad\qquad +\begin{array}{cccc} + 1& 5& 2& 6\\ + 9& 13& 10& 14\\ + 16&12&15&11\\ + 8&4&7&3 +\end{array}$$ + + +\newpage + + +La \defi{transformation du boulanger} est la succession d'un étirement et d'un repliement. Partant d'un tableau $n \times n$ on obtient encore un tableau $n \times n$. + + +Voyons un exemple de l'action de plusieurs transformations du boulanger. +À gauche l'image initiale de taille $128 \times 128$, puis le résultat de $k=1,2,3$ itérations. +\begin{center} +\includegraphics[scale=0.6]{images_fiche/surf_gimp_new_boul_0.png}\qquad +\includegraphics[scale=0.6]{images_fiche/surf_gimp_new_boul_1.png}\qquad +\includegraphics[scale=0.6]{images_fiche/surf_gimp_new_boul_2.png}\qquad +\includegraphics[scale=0.6]{images_fiche/surf_gimp_new_boul_3.png} +\end{center} + + +Voici les images pour $k=12,13,14,15$ itérations : +\begin{center} +\includegraphics[scale=0.6]{images_fiche/surf_gimp_new_boul_12.png}\qquad +\includegraphics[scale=0.6]{images_fiche/surf_gimp_new_boul_13.png}\qquad +\includegraphics[scale=0.6]{images_fiche/surf_gimp_new_boul_14.png}\qquad +\includegraphics[scale=0.6]{images_fiche/surf_gimp_new_boul_15.png} +\end{center} + + +\end{document} diff --git a/listes/fig-listes-1.tikz b/listes/fig-listes-1.tikz index bcbef5f..1312329 100644 --- a/listes/fig-listes-1.tikz +++ b/listes/fig-listes-1.tikz @@ -1,4 +1,4 @@ -\begin{tikzpicture}[thick,scale=1.5, every node/.style={scale=1}] +\begin{tikzpicture}[thick,scale=1.7, every node/.style={scale=1}] \draw (0,0) grid ++(6,1); diff --git a/listes/fig-listes-3.tikz b/listes/fig-listes-3.tikz index 4ffff97..43106db 100644 --- a/listes/fig-listes-3.tikz +++ b/listes/fig-listes-3.tikz @@ -1,4 +1,4 @@ -\begin{tikzpicture}[thick,scale=1.5, every node/.style={scale=1}] +\begin{tikzpicture}[thick,scale=1.7, every node/.style={scale=1}] \draw (0,0) grid ++(7,1); diff --git a/listes/listes-1.pdf b/listes/listes-1.pdf index 4c66d06..a16e940 100644 Binary files a/listes/listes-1.pdf and b/listes/listes-1.pdf differ diff --git a/listes/listes-1.tex b/listes/listes-1.tex index c72e06d..c887f85 100644 --- a/listes/listes-1.tex +++ b/listes/listes-1.tex @@ -13,6 +13,15 @@ \objectifs{Une liste est une façon de regrouper des éléments en un seul objet. Après avoir défini une liste, on peut récupérer un par un chaque élément de la liste, mais aussi en ajouter de nouveaux\ldots} + +\insertvideo{Vqtmbon5_Nk}{Listes I - partie 1 - construction} + +\insertvideo{pRje2HvY5OQ}{Listes I - partie 2 - manipulation} + +\insertvideo{lp-MC8Hguk0}{Listes I - partie 3 - visualisation} + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -63,8 +72,8 @@ \end{lstlisting} \end{minipage} \end{center} -\`A la fin \ci{liste_carres} vaut :\\ -\centerline{\ci{[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]}} +\`A la fin \ci{liste_carres} vaut : +\mycenterline{\ci{[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]}} \end{itemize} @@ -92,8 +101,8 @@ print(i,liste[i]) \end{lstlisting} -\item Pour obtenir une liste à partir de \ci{range()} il faut écrire :\\ -\centerline{\ci{list(range(n))}} +\item Pour obtenir une liste à partir de \ci{range()} il faut écrire : +\mycenterline{\ci{list(range(n))}} \end{itemize} \end{cours} @@ -137,23 +146,27 @@ \sauteligne \begin{itemize} \item \textbf{Concaténer deux listes.}\index{liste!fusionner}\index{concatenation@concaténation} Si on a deux listes, on peut les fusionner par l'opérateur \og{}\ci{+}\fg{}. Par exemple avec - \ci{liste1 = [4,5,6]} et \ci{liste2 = [7,8,9]} \\ - \centerline{\ci{liste1 + liste2} \quad vaut \quad \ci{[4,5,6,7,8,9]}.} + \ci{liste1 = [4,5,6]} et \ci{liste2 = [7,8,9]} + \mycenterline{\ci{liste1 + liste2} \quad vaut \quad \ci{[4,5,6,7,8,9]}.} - \item \textbf{Ajouter un élément à la fin.}\index{liste!ajouter} L'opérateur \og{}\ci{+}\fg{} fournit une autre méthode permettant d'ajouter un élément à une liste :\\ - \centerline{\ci{liste = liste + [element]}} + \item \textbf{Ajouter un élément à la fin.}\index{liste!ajouter} L'opérateur \og{}\ci{+}\fg{} fournit une autre méthode permettant d'ajouter un élément à une liste : + \mycenterline{\ci{liste = liste + [element]}} + Par exemple \ci{[1,2,3,4] + [5]} vaut \ci{[1,2,3,4,5]}. Attention ! Il faut entourer l'élément à ajouter de crochets. C'est une méthode alternative à \ci{liste.append(element)}. - \item \textbf{Ajouter un élément au début.} Avec :\\ - \centerline{\ci{liste = [element] + liste}} + \item \textbf{Ajouter un élément au début.} Avec : + \mycenterline{\ci{liste = [element] + liste}} + on ajoute l'élément en début de liste. Par exemple \ci{[5] + [1,2,3,4]} vaut \ci{[5,1,2,3,4]}. \item \textbf{Trancher des listes.}\index{liste!sous-liste} On peut extraire d'un seul coup toute une partie de la liste : \ci{liste[a:b]} renvoie la sous-liste des éléments de rang $a$ à $b-1$. + \smallskip + \myfigure{0.4}{ \tikzinput{fig-listes-3} } @@ -271,8 +284,9 @@ \emph{Indications.} \begin{itemize} \item Commence par définir \ci{nouv_liste = list(liste)} et travaille uniquement avec cette nouvelle liste. - \item Pour que l'indice $i$ parcourt les indices à rebours de $n-1$ à $0$, tu peux utiliser la commande :\\ -\centerline{\ci{for i in range(n-1,-1,-1):}} + \item Pour que l'indice $i$ parcourt les indices à rebours de $n-1$ à $0$, tu peux utiliser la commande : +\mycenterline{\ci{for i in range(n-1,-1,-1):}} + En effet \ci{range(a,b,-1)} correspond à la liste décroissante des entiers $i$ vérifiant $a \ge i > b$ (comme d'habitude la borne de droite n'est pas incluse). \end{itemize} @@ -307,15 +321,15 @@ \begin{activite}[Arithmétique] -\objectifs{Objectifs : améliorer quelques fonctions de la fiche \og{}Arithmétique -- Boucle tant que\fg{}.} +\objectifs{Objectifs : améliorer quelques fonctions de la fiche \og{}Arithmétique -- Boucle tant que -- I\fg{}.} \index{facteur premier} \index{nombre premier} \begin{enumerate} - \item \textbf{Facteurs premiers.} Programme une fonction \ci{facteurs_premiers(n)} qui renvoie la liste de tous les facteurs premiers d'un entier $n\ge2$. Par exemple, pour $n = 12\,936$, dont la décomposition en facteurs premiers est $n = 2^3 \times 3 \times 7^2 \times 11$, la fonction renvoie \ci{[2, 2, 2, 3, 7, 7, 11] }. + \item \textbf{Facteurs premiers.} Programme une fonction \ci{facteurs_premiers(n)} qui renvoie la liste de tous les facteurs premiers d'un entier $n\ge2$. Par exemple, pour $n = 12\,936$, dont la décomposition en facteurs premiers est $n = 2^3 \times 3 \times 7^2 \times 11$, la fonction renvoie \ci{[2, 2, 2, 3, 7, 7, 11] }. - \emph{Indications.} Consulte la fiche \og{}Arithmétique -- Boucle tant que\fg{}. Le corps de l'algorithme est le suivant : + \emph{Indications.} Consulte la fiche \og{}Arithmétique -- Boucle tant que -- I\fg{}. Le corps de l'algorithme est le suivant : \begin{center} \begin{minipage}{0.7\textwidth} @@ -327,10 +341,15 @@ \end{minipage} \end{center} - \item \textbf{Liste de nombres premiers.} \'Ecris une fonction \ci{liste_premiers(n)} qui renvoie la liste de tous les nombres premiers strictement inférieurs à $n$. Par exemple \ci{liste_premiers(100)} renvoie la liste :\\ - \centerline{\ci{[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]}} + \item \textbf{Liste de nombres premiers.} \'Ecris une fonction \ci{liste_premiers(n)} qui renvoie la liste de tous les nombres premiers strictement inférieurs à $n$. Par exemple \ci{liste_premiers(100)} renvoie la liste : + \mycenterline{\small\ci{[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]}} + + Pour cela, tu vas programmer un algorithme qui est une version simple du crible d'Ératosthène : + + \index{crible@crible d'Ératosthène} + + \medskip - Pour cela, tu vas programmer un algorithme qui est une version simple du crible d'Ératosthène :\index{crible@crible d'Ératosthène} \begin{algorithme} \sauteligne \begin{itemize} @@ -339,7 +358,9 @@ \item Entrée : un entier $n \ge 2$. \item Sortie : la liste des nombres premiers $< n$. \end{itemize} + + \item Initialiser \ci{liste} qui contient tous les entiers de $2$ à $n-1$. \item Pour $d$ allant de $2$ à $n-1$ :\\ @@ -350,7 +371,8 @@ \end{itemize} \end{algorithme} - + % \medskip + \emph{Indications.} \begin{itemize} \item Pars de \ci{liste = list(range(2,n))}. @@ -364,6 +386,7 @@ \begin{itemize} \item Au départ la liste est $$[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29]$$ + \item On part avec $d=2$, on élimine tous les nombres divisibles par $2$, sauf si c'est le nombre $2$ : on élimine donc $4$, $6$, $8$,\ldots, la liste est maintenant : $[2,3,5,7,9,11,13,15,17,19,21,23,25,27,29]$. \item On continue avec $d=3$, on élimine les multiples de $3$ (sauf $3$), après ces opérations la liste est : $[2,3,5,7,11,13,17,19,23,25,29]$. \item Avec $d=4$, on élimine les multiples de $4$ (mais il n'y en a plus). @@ -377,12 +400,13 @@ \end{activite} + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{cours}[Visualiser une liste] - Avec le module \ci{matplotlib} il est très facile de visualiser les éléments d'une liste de nombres. \index{matplolib@\ci{matplotlib}} @@ -390,7 +414,7 @@ \index{graphique} \begin{center} -\includegraphics[scale=0.5]{ecran-liste-cours-visualisation} +\includegraphics[scale=\myscale,scale=0.45]{ecran-liste-cours-visualisation} \end{center} \begin{lstlisting} @@ -420,13 +444,14 @@ \end{itemize} +\bigskip -Pour afficher des points $(x_i,y_i)$ il faut fournir la listes des abscisses puis la listes des ordonnées :\\ -\centerline{\ci{plt.plot(liste_x,liste_y,color="red")}} +Pour afficher des points $(x_i,y_i)$ il faut fournir la listes des abscisses puis la listes des ordonnées : +\mycenterline{\ci{plt.plot(liste_x,liste_y,color="red")}} Voici un exemple de graphe obtenu en affichant des points de coordonnées du type $(x,y)$ avec $y = x^2$. \begin{center} -\includegraphics[scale=0.5]{ecran-liste-cours-visualisation-bis} +\includegraphics[scale=\myscale,scale=0.45]{ecran-liste-cours-visualisation-bis} \end{center} @@ -434,7 +459,7 @@ import matplotlib.pyplot as plt liste_x = [2, 3, 5, 7, 9] -liste_y = [4, 9,25,49,81] +liste_y = [4, 9, 25, 49, 81] plt.plot(liste_x,liste_y,color="red") plt.grid() plt.show() @@ -454,7 +479,7 @@ \index{tir balistique} \begin{center} -\includegraphics[scale=0.5]{ecran-liste-I-tir-bis} +\includegraphics[scale=\myscale,scale=0.45]{ecran-liste-I-tir-bis} \end{center} On tire un boulet de canon depuis l'origine $(0,0)$. L'équation de la trajectoire est donnée par la formule : @@ -481,7 +506,7 @@ \emph{Méthode.} Pour $i$ allant de $0$ à $n$ : \begin{itemize} - \item calcule $x_i = i \cdot \dfrac{x_{\max}}{n}$, + \item calcule $x_i = i \cdot \frac{x_{\max}}{n}$, \item calcule $y_i = y(x_i)$ par la formule de la trajectoire, \item ajoute $y_i$ à la liste. \end{itemize} diff --git a/listes/listes-2.pdf b/listes/listes-2.pdf index ee503b9..1170694 100644 Binary files a/listes/listes-2.pdf and b/listes/listes-2.pdf differ diff --git a/listes/listes-2.tex b/listes/listes-2.tex index ed45b06..2f19c77 100644 --- a/listes/listes-2.tex +++ b/listes/listes-2.tex @@ -15,6 +15,12 @@ \index{liste} +\insertvideo{J4lV4LJOEk4}{Listes II - partie 1 - trancher des listes, trouver le rang} + +\insertvideo{eFgHwutcxIg}{Listes II - partie 2 - liste par compréhension} + +\insertvideo{JJVH3lcP_AM}{Listes II - partie 3 - liste de listes} + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -64,8 +70,9 @@ \ci{liste.index(5)} renvoie $2$. \item \index{in@\ci{in}} - Si on souhaite juste savoir si un élément appartient à une liste, alors l'instruction :\\ - \centerline{\ci{element in liste}} + Si on souhaite juste savoir si un élément appartient à une liste, alors l'instruction : + \mycenterline{\ci{element in liste}} + renvoie \ci{True} ou \ci{False}. Exemple : avec \ci{liste = [12, 30, 5, 9, 5, 21]}, \og\ci{9 in liste}\fg{} est vrai, alors que \og\ci{8 in liste}\fg{} est faux. @@ -99,16 +106,18 @@ \index{liste!de listes} \index{tableau} - Une liste peut contenir d'autres listes, par exemple :\\ - \centerline{\ci{maliste = [ ["Harry", "Hermione", "Ron"], [101,103] ]}} + Une liste peut contenir d'autres listes, par exemple : + \mycenterline{\ci{maliste = [ ["Harry", "Hermione", "Ron"], [101,103] ]}} + contient deux listes. - Nous allons nous intéresser à des listes qui contiennent des listes d'entiers, que nous appellerons des \defi{tableaux}. Par exemple : \\ - \centerline{\ci{tableau = [ [2,14,5], [3,5,7], [15,19,4], [8,6,5] ]}} + Nous allons nous intéresser à des listes qui contiennent des listes d'entiers, que nous appellerons des \defi{tableaux}. Par exemple : + \mycenterline{\ci{tableau = [ [2,14,5], [3,5,7], [15,19,4], [8,6,5] ]}} + Alors \ci{tableau[i]} renvoie la sous-liste de rang $i$, alors que \ci{tableau[i][j]} renvoie l'entier situé au rang $j$ dans la sous-liste de rang $i$. Par exemple : \begin{itemize} - \item \ci{tableau[0]} renvoie la sous-liste \ci{[2,14,5]}, - \item \ci{tableau[1]} renvoie la sous-liste \ci{[3,5,7]}, + \item \ci{tableau[0]} renvoie la liste \ci{[2,14,5]}, + \item \ci{tableau[1]} renvoie la liste \ci{[3,5,7]}, \item \ci{tableau[0][0]} renvoie l'entier \ci{2}, \item \ci{tableau[0][1]} renvoie l'entier \ci{14}, \item \ci{tableau[2][1]} renvoie l'entier \ci{19}. @@ -155,10 +164,10 @@ \objectifs{Objectifs : chercher à atteindre le total de $100$ dans une liste de nombres.} On considère une liste de $n$ entiers compris entre $1$ et $99$ (inclus). -Par exemple la liste de $n=20$ entiers :\\ -\centerline{\ci{[16,2,85,27,9,45,98,73,12,26,46,25,26,49,18,99,10,86,7,42]}} -qui a été obtenue au hasard par la commande :\\ -\centerline{\ci{liste_20 = [randint(1,99) for i in range(20)]}} +Par exemple la liste de $n=20$ entiers : +\mycenterline{\ci{[16,2,85,27,9,45,98,73,12,26,46,25,26,49,18,99,10,86,7,42]}} +qui a été obtenue au hasard par la commande : +\mycenterline{\ci{liste_20 = [randint(1,99) for i in range(20)]}} On cherche différentes manières de trouver des nombres de la liste dont la somme fait exactement $100$. @@ -195,8 +204,8 @@ Dans cette activité nous travaillons avec des tableaux carrés de taille $n \times n$ contenant des entiers. L'élément \ci{tableau} est donc une liste de $n$ listes ayant chacune $n$ éléments. -Par exemple (avec $n=3$) : \\ -\centerline{\ci{tableau = [ [1,2,3], [4,5,6], [7,8,9] ]}} +Par exemple (avec $n=3$) : +\mycenterline{\ci{tableau = [ [1,2,3], [4,5,6], [7,8,9] ]}} représente le tableau : $$\begin{array}{ccc}1&2&3\\4&5&6\\7&8&9\end{array}$$ @@ -209,8 +218,8 @@ \item Écris une fonction \ci{somme_tout(tableau)} qui calcule la somme totale de tous les éléments. Pour l'exemple la somme totale vaut $45$. - \item Écris une fonction \ci{affiche_tableau(tableau)} qui affiche proprement à l'écran un tableau. Tu peux utiliser la commande :\\ -\centerline{\ci{print('\{:>3d\}'.format(tableau[i][j]), end="")}} + \item Écris une fonction \ci{affiche_tableau(tableau)} qui affiche proprement à l'écran un tableau. Tu peux utiliser la commande : +\mycenterline{\ci{print('\{:>3d\}'.format(tableau[i][j]), end="")}} \emph{Explications.} \begin{itemize} @@ -275,10 +284,10 @@ 3&8&1\\2&4&6\\7&0&5 \end{array}$$ -\emph{Indications.} Pour définir un nouveau carré, commence par le remplir avec des $0$ :\\ -\centerline{\ci{nouv_carre = [[0 for j in range(n)] for i in range(n)]}} -puis remplis-le avec les bonnes valeurs par des commandes du type :\\ -\centerline{\ci{nouv_carre[i][j] = ...}} +\emph{Indications.} Pour définir un nouveau carré, commence par le remplir avec des $0$ : +\mycenterline{\ci{nouv_carre = [[0 for j in range(n)] for i in range(n)]}} +puis remplis-le avec les bonnes valeurs par des commandes du type : +\mycenterline{\ci{nouv_carre[i][j] = ...}} \item \textbf{Multiplication.} Définis une fonction \ci{multiplication_carre(carre,k)} qui multiplie par $k$ tous les éléments du carré. Avec l'exemple du carré $3\times 3$, la commande \ci{multiplication_carre(carre,2)} multiplie tous les éléments par $2$ et renvoie donc un tableau qui s'afficherait ainsi : @@ -330,7 +339,7 @@ \end{array} $$ -\item \textbf{Addition de blocs.} Définis une fonction \ci{addition_bloc_carre(grand_carre,petit_carre)} qui ajoute par bloc un petit carré au grand carré comme sur l'exemple ci-dessous. Le petit carré $2 \times 2$ à gauche est ajouté au grand carré au centre pour donné le résultat à droite. Pour cette addition le grand carré est décomposé en $9$ blocs, il y a en tout $36$ additions. +\item \textbf{Addition de blocs.} Définis une fonction \ci{addition_bloc_carre(grand_carre,petit_carre)} qui ajoute par bloc un petit carré de taille $n \times n$ au grand carré de taille $nm \times nm$ comme sur l'exemple ci-dessous avec $n=2$ et $m=3$ (donc $nm=6$). Le petit carré $2 \times 2$ à gauche est ajouté au grand carré au centre pour donner le résultat à droite. Pour cette addition le grand carré est décomposé en $9$ blocs, il y a en tout $36$ additions. $$ \begin{array}{cc} 1& 2 \\ @@ -367,7 +376,7 @@ \item Sortie : un carré magique $C$ de taille $(nm)\times(nm)$. \end{itemize} - \item Définis le carré $C_{3a}$ en retirant $1$ à tous les éléments de $C_2$. (Utilise la commande \ci{addition(carre2,-1)}.) + \item Définis le carré $C_{3a}$ en retirant $1$ à tous les éléments de $C_2$. (Utilise la commande \ci{addition_carre(carre2,-1)}.) \item Définis le carré $C_{3b}$ comme l'homothétie du carré $C_{3a}$ de rapport $n$. (Utilise la commande \ci{homothetie(carre3a,n)}.) diff --git a/listes/listes_I_cours.py b/listes/listes_I_cours.py index d93e39e..04e31a7 100644 --- a/listes/listes_I_cours.py +++ b/listes/listes_I_cours.py @@ -26,7 +26,7 @@ # plt.show() liste_x = [2, 3, 5, 7, 9] -liste_y = [4, 9,25,49,81] +liste_y = [4, 9, 25, 49, 81] plt.plot(liste_x,liste_y,color="red") plt.grid() plt.show() diff --git a/listes/pres-listes-1.pdf b/listes/pres-listes-1.pdf new file mode 100644 index 0000000..5e3f777 Binary files /dev/null and b/listes/pres-listes-1.pdf differ diff --git a/listes/pres-listes-1.tex b/listes/pres-listes-1.tex new file mode 100644 index 0000000..ea978fe --- /dev/null +++ b/listes/pres-listes-1.tex @@ -0,0 +1,334 @@ +\documentclass[12pt,class=report,crop=false]{standalone} +\usepackage[screen]{../python} + +\pagestyle{empty} + +\begin{document} + +% Commande spécifique +\newcommand{\badletter}[1]{\underline{\textcolor{red}{#1}}} + + + +%==================================================================== +\chapitre{Listes I} +%==================================================================== + + +\section*{Construction d'une liste} + +Une \defi{liste}\index{liste} est une suite d'éléments. + +\bigskip +\begin{itemize} + \item \ci{[5,-7,12,99]} + \item \ci{["Mars","Avril","Mai"]} + \item \ci{[3.14,"pi",10e-3,"x",True]} +\end{itemize} + +\bigskip + +\begin{itemize} + \item Une liste se définit par des éléments entre crochets : + \begin{itemize} + \item \ci{liste1 = [5,4,3,2,1]} + \item \ci{liste2 = ["Vendredi","Samedi","Dimanche"]} + \item \ci{liste3 = []} la liste vide (très utile pour la compléter plus tard !). + \end{itemize} +\end{itemize} + +\newpage + +\section*{Accéder à un élément} + + Pour obtenir un élément de la liste, il suffit d'écrire + + \centerline{\ci{liste[i]}} + + où $i$ est le rang de l'élément souhaité. + +\bigskip + + \textbf{Attention.} On commence à compter à partir du rang $0$ ! + +\bigskip + + + Par exemple après l'instruction \ci{liste = ["A","B","C","D","E","F"]} alors + \begin{itemize} + \item \ci{liste[0]} renvoie \ci{"A"} + \item \ci{liste[1]} renvoie \ci{"B"} + \item \ci{liste[2]} renvoie \ci{"C"} + \item \ci{liste[3]} renvoie \ci{"D"} + \item \ci{liste[4]} renvoie \ci{"E"} + \item \ci{liste[5]} renvoie \ci{"F"} + \end{itemize} + + \medskip + + \myfigure{0.6}{ + \tikzinput{fig-listes-1} +} + +\newpage + + +\section*{Ajouter un élément} + + Pour ajouter un élément à la fin de la liste, il suffit d'utiliser la commande + + \centerline{\ci{maliste.append(element)}} + + \bigskip + \bigskip + + \begin{itemize} + \item \ci{premiers = [2,3,5,7]}, + \item puis \ci{premiers.append(11)} rajoute $11$ à la liste, + \item puis \ci{premiers.append(13)} alors maintenant la liste \ci{premiers} vaut \ci{[2,3,5,7,11,13]}. + \end{itemize} + +\newpage + +\section*{Une construction} + + Voici comment construire la liste qui contient les premiers carrés. + + \bigskip + \bigskip + + \begin{center} + \begin{minipage}{0.9\textwidth} +\begin{lstlisting} +liste_carres = [] # On part d'un liste vide +for i in range(10): + liste_carres.append(i**2) # On ajoute un carré +\end{lstlisting} + \end{minipage} + \end{center} +\`A la fin \ci{liste_carres} vaut :\\ +\centerline{\ci{[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]}} + + +\newpage + + \section*{Parcourir une liste} + +\begin{itemize} + \item \textbf{Longueur d'une liste.} \ci{len(liste)} + + \begin{itemize} + \item La liste \ci{[5,4,3,2,1]} est de longueur $5$, + \item la liste \ci{["Vendredi","Samedi","Dimanche"]} de longueur $3$, + \item la liste vide \ci{[]} de longueur $0$. + \end{itemize} + + \bigskip + + + \item \textbf{Parcourir une liste.} + Voici la façon la plus simple de parcourir une liste (et ici d'afficher chaque élément) : +\index{for@\ci{for}}\index{boucle!pour} +\begin{lstlisting} +for element in liste: + print(element) +\end{lstlisting} + + \bigskip + + \item \textbf{Parcourir une liste (bis).} + Parfois on a besoin de connaître le rang des éléments. Voici une autre façon de faire (qui affiche ici le rang et l'élément). +\begin{lstlisting} +n = len(liste) +for i in range(n): + print(i,liste[i]) +\end{lstlisting} + + \bigskip + +\item Pour obtenir une liste à partir de \ci{range()} il faut écrire :\\ +\centerline{\ci{list(range(n))}} +\end{itemize} + + +\newpage + + +\section*{Concaténer} + +\begin{itemize} + \item \textbf{Concaténer deux listes.} + Si on a deux listes, on peut les fusionner par l'opérateur \og{}\ci{+}\fg{}. + + Exemple. + \ci{liste1 = [4,5,6]} et \ci{liste2 = [7,8,9]} \\ + \centerline{\ci{liste1 + liste2} \quad vaut \quad \ci{[4,5,6,7,8,9]}.} + + \bigskip + \bigskip + + \item \textbf{Ajouter un élément à la fin.} + + \centerline{\ci{liste = liste + [element]}} + + Exemple. \ci{[1,2,3,4] + [5]} vaut \ci{[1,2,3,4,5]}. + + C'est une méthode alternative à \ci{liste.append(element)}. + + \bigskip + \bigskip + + \item \textbf{Ajouter un élément au début.} + + \centerline{\ci{liste = [element] + liste}} + + + Exemple \ci{[5] + [1,2,3,4]} vaut \ci{[5,1,2,3,4]}. +\end{itemize} + +\newpage + + +\section*{Trancher des listes} + +\index{liste!sous-liste} On peut extraire d'un seul coup toute une partie de la liste : + +\centerline{\ci{liste[a:b]}} + +renvoie la sous-liste des éléments de rang $a$ à $b-1$. + + + \bigskip + + \myfigure{0.4}{ + \tikzinput{fig-listes-3} +} + + \bigskip + \bigskip + + Par exemple si \ci{liste = ["A","B","C","D","E","F","G"]} alors + \begin{itemize} + \item \ci{liste[1:4]} renvoie \ci{["B","C","D"]} + \item \ci{liste[0:2]} renvoie \ci{["A","B"]} + \item \ci{liste[4:7]} renvoie \ci{["E","F","G"]} + \end{itemize} + + \bigskip + + Il faut encore une fois faire attention à ce que le rang d'une liste commence à $0$ et que le tranchage \ci{liste[a:b]} s'arrête au rang $b-1$. + + + +\newpage + +\section*{Manipulation des listes} + +\begin{itemize} + \item \textbf{Inverser une liste.}\index{liste!inverser} Voici trois méthodes :\index{reverse@\ci{reverse/reversed}} +\begin{itemize} + \item \ci{maliste.reverse()} modifie la liste sur place (c'est-à-dire que \ci{maliste} est maintenant renversée, la commande ne renvoie rien) ; + \item \ci{list(reversed(maliste))} renvoie une nouvelle liste ; + \item \ci{maliste[::-1]} renvoie une nouvelle liste. +\end{itemize} + + \bigskip + \bigskip + + \item \textbf{Supprimer un élément.} La commande \ci{liste.remove(element)}\index{liste!supprimer}\index{remove@\ci{remove}} supprime la première occurrence trouvée (la liste est modifiée). Par exemple avec \ci{liste = [2,5,3,8,5]} la commande \ci{liste.remove(5)} modifie la liste qui maintenant vaut \ci{[2,3,8,5]} (le premier $5$ a disparu). + + \bigskip + \bigskip + + \item \textbf{Supprimer un élément (bis).} La commande \ci{del liste[i]}\index{del@\ci{del}} supprime l'élément de rang $i$ (la liste est modifiée). + +\end{itemize} + + +\newpage + +\section*{Tri} + +\index{liste!trier} +\index{sorted@\ci{sort/sorted}} + + \begin{fonctionpython}[\ci{python : sorted()}] + Usage : \ci{sorted(liste)}\\ + Entrée : une liste \\ + Sortie : la liste ordonnée des éléments + + \medskip + + Exemple : \ci{sorted([13,11,7,4,6,8,12,6])} renvoie la liste \ci{[4,6,6,7,8,11,12,13]}. + + \end{fonctionpython} + + Attention ! Il existe aussi une méthode \ci{liste.sort()} qui modifie la liste sur place. + +\newpage + +\section*{Visualiser une liste} + +Avec le module \ci{matplotlib} il est très facile de visualiser les éléments d'une liste de nombres. + +\begin{center} +\includegraphics[scale=0.45]{ecran-liste-cours-visualisation} +\end{center} + +\begin{lstlisting} +import matplotlib.pyplot as plt + +liste1 = [3,5,9,8,0,3] +liste2 = [4,7,7,2,8,9] + +plt.plot(liste1,color="red") +plt.plot(liste2,color="blue") +plt.grid() +plt.show() +\end{lstlisting} + + +%\newpage +% +%\emph{Explications.} +%\begin{itemize} +% \item Le module s'appelle \ci{matplotlib.pyplot} et on lui donne le nouveau nom plus simple de \ci{plt}. +% +% \item Attention ! Le module \ci{matplotlib} n'est pas toujours installé par défaut avec \Python. +% +% \item \ci{plt.plot(liste)}\index{plot@\ci{plot}} trace les points d'une liste (sous la forme $(i,\ell_i)$) qui sont reliés par des segments. +% +% \item \ci{plt.grid()} trace une grille. +% +% \item \ci{plt.show()} affiche tout. +% +%\end{itemize} + + + + +\newpage + +\section*{Visualiser des points} + +Pour afficher des points $(x_i,y_i)$ il faut fournir la listes des abscisses puis la listes des ordonnées :\\ +\centerline{\ci{plt.plot(liste_x,liste_y,color="red")}} +Voici un exemple de graphe obtenu en affichant des points de coordonnées du type $(x,y)$ avec $y = x^2$. + +\begin{center} +\includegraphics[scale=0.45]{ecran-liste-cours-visualisation-bis} +\end{center} + + +\begin{lstlisting} +import matplotlib.pyplot as plt + +liste_x = [2, 3, 5, 7, 9] +liste_y = [4, 9,25,49,81] +plt.plot(liste_x,liste_y,color="red") +plt.grid() +plt.show() +\end{lstlisting} + + +\end{document} diff --git a/listes/pres-listes-2.pdf b/listes/pres-listes-2.pdf new file mode 100644 index 0000000..36bb78e Binary files /dev/null and b/listes/pres-listes-2.pdf differ diff --git a/listes/pres-listes-2.tex b/listes/pres-listes-2.tex new file mode 100644 index 0000000..b2d77ee --- /dev/null +++ b/listes/pres-listes-2.tex @@ -0,0 +1,128 @@ +\documentclass[12pt,class=report,crop=false]{standalone} +\usepackage[screen]{../python} + +\pagestyle{empty} + +\begin{document} + +% Commande spécifique +\newcommand{\badletter}[1]{\underline{\textcolor{red}{#1}}} + + + +%==================================================================== +\chapitre{Listes II} +%==================================================================== + + + + +\section*{Trancher des listes} + + \begin{itemize} + \item Tu connais déjà \ci{maliste[a:b]} qui renvoie la sous-liste des éléments du rang $a$ au rang $b-1$. + + \item \ci{maliste[a:]} renvoie la liste des éléments du rang $a$ jusqu'à la fin. + + \item \ci{maliste[:b]} renvoie la liste des éléments du début jusqu'au rang $b-1$. + + \item \ci{maliste[-1]} renvoie le dernier élément, \ci{maliste[-2]} renvoie l'avant-dernier élément,\ldots + \end{itemize} + + + +\bigskip + +\textbf{Exercice.} + \myfigure{0.7}{ + \tikzinput{fig-listes-4} +} + Avec \ci{maliste = [7,2,4,5,3,10,9,8,3]}, +que renvoient les instructions suivantes ? + + +\begin{itemize} + \item \ci{maliste[3:5]} + \item \ci{maliste[4:]} + \item \ci{maliste[:6]} + \item \ci{maliste[-1]} +\end{itemize} + +\newpage + +\section*{Trouver le rang d'un élément} + + \ci{liste.index(element)} renvoie la première position à laquelle l'élément a été trouvé. Exemple : avec \ci{liste = [12, 30, 5, 9, 5, 21]}, + \ci{liste.index(5)} renvoie $2$. + + +\bigskip +\bigskip + + Si on souhaite juste savoir si un élément appartient à une liste, alors l'instruction :\\ + \centerline{\ci{element in liste}} + renvoie \ci{True} ou \ci{False}. + Exemple : avec \ci{liste = [12, 30, 5, 9, 5, 21]}, + \og\ci{9 in liste}\fg{} est vrai, alors que \og\ci{8 in liste}\fg{} est faux. + + +\newpage + +\section*{Liste par compréhension} + + $$E = \{0,2,4,6,8,10\}$$ + + $$E = \{ x \in \Nn \mid x \le 10 \text{ et } x \text{ est pair} \}$$ + +\bigskip +\bigskip + + Liste par compréhension \Python{} + \bigskip + + \begin{itemize} + \item Partons d'une liste, par exemple \ci{maliste = [1,2,3,4,5,6,7,6,5,4,3,2,1]}. + \bigskip + \item La commande \ci{liste_doubles = [ 2*x for x in maliste ]} renvoie une liste qui contient les doubles des éléments de la liste \ci{maliste}. C'est donc la liste + \ci{[2,4,6,8,...]}. +\bigskip + \item La commande \ci{liste_carres = [ x**2 for x in maliste ]} renvoie la liste des carrés des éléments de la liste initiale. C'est donc la liste \ci{[1,4,9,16,...]}. +\bigskip + \item La commande \ci{liste_partielle = [x for x in maliste if x > 2]} + extrait la liste composée des seuls éléments strictement supérieurs à $2$. C'est donc la liste \ci{[3,4,5,6,7,6,5,4,3]}. + \end{itemize} + + +\newpage + +\section*{Liste de listes} + + + + Une liste peut contenir d'autres listes, par exemple :\\ + \centerline{\ci{maliste = [ ["Harry", "Hermione", "Ron"], [101,103] ]}} + contient deux listes. + +\bigskip +\bigskip + + Listes qui contiennent des listes d'entiers : des \defi{tableaux}. + + Par exemple : \\ + \centerline{\ci{tableau = [ [2,14,5], [3,5,7], [15,19,4], [8,6,5] ]}} + + $$\begin{array}{ccc}2&14&5\\3&5&7\\15&19&4\\8&6&5\end{array}$$ + +\bigskip + + Alors \ci{tableau[i]} renvoie la sous-liste de rang $i$, alors que + \ci{tableau[i][j]} renvoie l'entier situé au rang $j$ dans la sous-liste de rang $i$. Par exemple : + \begin{itemize} + \item \ci{tableau[0]} renvoie la liste \ci{[2,14,5]}, + \item \ci{tableau[1]} renvoie la liste \ci{[3,5,7]}, + \item \ci{tableau[0][0]} renvoie l'entier \ci{2}, + \item \ci{tableau[0][1]} renvoie l'entier \ci{14}, + \item \ci{tableau[2][1]} renvoie l'entier \ci{19}. +\end{itemize} + +\end{document} diff --git a/livre-python1-print.pdf b/livre-python1-print.pdf new file mode 100644 index 0000000..f571f4c Binary files /dev/null and b/livre-python1-print.pdf differ diff --git a/livre-python1-print.tex b/livre-python1-print.tex index 87abe83..47dbb2d 100644 --- a/livre-python1-print.tex +++ b/livre-python1-print.tex @@ -1,5 +1,5 @@ %\documentclass[11pt]{report} -\documentclass[11pt,twoside,openright]{report} +\documentclass[10pt,twoside,openright]{report} %\usepackage[screen]{python} \usepackage[print]{python} @@ -38,7 +38,7 @@ \part{Mise en route} %====================================== % Fondamentaux %====================================== - +\clearemptydoublepage \part{Fondamentaux} % 1 - Si-alors @@ -60,7 +60,7 @@ \part{Fondamentaux} %====================================== % Avancé %====================================== - +\clearemptydoublepage \part{Notions avancées} % 1 - Statistique @@ -85,7 +85,7 @@ \part{Notions avancées} %====================================== % Projets %====================================== - +\clearemptydoublepage \part{Projets} % 1 - Probabilités @@ -98,7 +98,7 @@ \part{Projets} \import{piles/}{piles.tex} % 4 - Markdown -\import{markdown/}{markdown.tex} +\import{markdown/}{texte_markdown.tex} % 5 - L-systèmes \import{lsysteme/}{lsysteme.tex} @@ -132,6 +132,7 @@ \part{Projets} %====================================== % Guide de survie %====================================== +\clearemptydoublepage \part{Guides} % 1 - Python @@ -153,11 +154,12 @@ \part{Guides} \import{divers/}{postface_livre_python.tex} + \vfill \bigskip \bigskip -\centerline{Version 0.06 -- Février 2018} +\mycenterline{Version 1.03 -- Avril 2019} diff --git a/livre-python1.pdf b/livre-python1.pdf index 60895c6..4894e35 100644 Binary files a/livre-python1.pdf and b/livre-python1.pdf differ diff --git a/livre-python1.tex b/livre-python1.tex index cbc3c75..d0a4f49 100644 --- a/livre-python1.tex +++ b/livre-python1.tex @@ -16,12 +16,9 @@ \debutchapitres \pagenumbering{arabic} -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Les feuilles \clearemptydoublepage - %====================================== % Introduction %====================================== @@ -98,7 +95,7 @@ \part{Projets} \import{piles/}{piles.tex} % 4 - Markdown -\import{markdown/}{markdown.tex} +\import{markdown/}{texte_markdown.tex} % 5 - L-systèmes \import{lsysteme/}{lsysteme.tex} @@ -157,7 +154,7 @@ \part{Guides} \bigskip \bigskip -\centerline{Version 0.07 -- Mars 2018} +\mycenterline{Version 1.03 -- Avril 2019} diff --git a/lsysteme/argument_optionnel.py b/lsysteme/argument_optionnel.py new file mode 100644 index 0000000..0d72a27 --- /dev/null +++ b/lsysteme/argument_optionnel.py @@ -0,0 +1,22 @@ + +def tracer(longueur, epaisseur, couleur): + ... + +tracer(100, 5, "blue") + + + +def tracer(longueur, epaisseur=5, couleur="blue") + ... + +tracer(100) + +tracer(100, epaisseur=10) + +tracer(100, couleur="red") + +tracer(100, epaisseur=10, couleur="red") + +tracer(100, 10, "red") + +tracer(couleur="red", epaisseur=10, longueur=100) diff --git a/lsysteme/lsysteme.pdf b/lsysteme/lsysteme.pdf index a3dde94..4d0be6a 100644 Binary files a/lsysteme/lsysteme.pdf and b/lsysteme/lsysteme.pdf differ diff --git a/lsysteme/lsysteme.tex b/lsysteme/lsysteme.tex index 29d8dca..36c0d80 100644 --- a/lsysteme/lsysteme.tex +++ b/lsysteme/lsysteme.tex @@ -11,24 +11,28 @@ \chapitre{L-système} %==================================================================== -\objectifs{Les L-systèmes offrent une façon très simple de coder des phénomènes complexes. À partir d'un mot initial et d'opérations de remplacement, on arrive à des mots compliqués. Lorsque l'on \og{}dessine\fg{} ces mots, on obtient de superbes figures fractales. Le \og{}L\fg{} vient du botaniste A. Lindenmayer qui a inventé les L-systèmes afin de modéliser les plantes. +\objectifs{Les L-systèmes offrent une façon très simple de coder des phénomènes complexes. À partir d'un mot initial et d'opérations de remplacement, on arrive à des mots compliqués. Lorsque l'on \og{}dessine\fg{} ces mots, on obtient de superbes figures fractales. Le \og{}L\fg{} vient du botaniste A.~Lindenmayer qui a inventé les L-systèmes afin de modéliser les plantes. } \begin{center} -\includegraphics[scale=0.3]{ecran-lsysteme-14} +\includegraphics[scale=\myscale,scale=0.3]{ecran-lsysteme-14} \end{center} \index{lsysteme@L-système} \index{remplacer} \index{tortue} +\insertvideo{ShjScrFA5iQ}{L-sytème} + +\insertvideo{6sso3x3sGFs}{Arguments optionnels} + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{cours}[L-système] Un \defi{L-système} est la donnée d'un mot initial et de règles de remplacement. -Voici un exemple avec le mot de départ et une seule règle : \\ -\centerline{\mot{BgAdB} \qquad \mot{A} $\rightarrow$ \mot{ABA}} +Voici un exemple avec le mot de départ et une seule règle : +\mycenterline{\mot{BgAdB} \qquad \mot{A} $\rightarrow$ \mot{ABA}} Le \defi{$k$-ème itéré} du L-système s'obtient en appliquant $k$ fois la substitution au mot de départ. @@ -43,8 +47,7 @@ Lorsqu'il y a deux règles (ou plus) il faut les appliquer en même temps. Voici un exemple de L-système à deux règles : - \\ -\centerline{\mot{A} \qquad \mot{A} $\rightarrow$ \mot{BgA} \qquad \mot{B} $\rightarrow$ \mot{BB}} +\mycenterline{\mot{A} \qquad \mot{A} $\rightarrow$ \mot{BgA} \qquad \mot{B} $\rightarrow$ \mot{BB}} Avec notre exemple : \begin{itemize} \item Première itération. Le mot de départ est \mot{A}, on applique la première règle \mot{A} $\rightarrow$ \mot{BgA} (la seconde règle ne s'applique pas, car il n'y a pas encore de \mot{B}): on obtient le mot \mot{BgA}. @@ -64,16 +67,16 @@ Je veux programmer une fonction qui trace un trait d'une longueur donnée, avec la possibilité de changer l'épaisseur du trait et la couleur. -Une méthode serait de définir une fonction par : \\ - \centerline{\ci{def tracer(longueur, epaisseur, couleur):}} - Je l'appellerais alors par exemple par :\\ - \centerline{\ci{tracer(100, 5, "blue"):}} +Une méthode serait de définir une fonction par : + \mycenterline{\ci{def tracer(longueur, epaisseur, couleur):}} + Je l'appellerais alors par exemple par : + \mycenterline{\ci{tracer(100, 5, "blue"):}} Mais comme mes traits auront le plupart du temps l'épaisseur $5$ et la couleur bleue, je perds du temps et de la lisibilité en redonnant ces informations à chaque fois. \medskip -Avec \Python{} il est possible de donner des arguments optionnels. Voici une meilleure façon de faire en donnant des valeurs par défaut :\\ - \centerline{\ci{def tracer(longueur, epaisseur=5, couleur="blue"):}} +Avec \Python{} il est possible de donner des arguments optionnels. Voici une meilleure façon de faire en donnant des valeurs par défaut : + \mycenterline{\ci{def tracer(longueur, epaisseur=5, couleur="blue"):}} \begin{itemize} \item La commande \ci{tracer(100)} trace mon trait, et comme je n'ai précisé que la longueur, les arguments \ci{epaisseur} et \ci{couleur} prennent les valeurs par défaut ($5$ et bleu). @@ -118,7 +121,7 @@ Par exemple : \ci{trace_lsysteme("AgAdAAdAdA")} affiche ceci : \begin{center} -\includegraphics[scale=0.6]{ecran-lsysteme-1} +\includegraphics[scale=\myscale,scale=0.6]{ecran-lsysteme-1} \end{center} \end{activite} @@ -135,7 +138,7 @@ \objectifs{Objectifs : tracer le flocon de Koch à partir d'un mot obtenu par itérations.} \begin{center} -\includegraphics[scale=0.4]{ecran-lsysteme-2} +\includegraphics[scale=\myscale,scale=0.4]{ecran-lsysteme-2} \end{center} \begin{enumerate} @@ -151,29 +154,34 @@ \item \ci{regle = ("A","AgAdAdAgA")} c'est-à-dire \mot{A} $\rightarrow$ \mot{AgAdAdAgA} \item pour \ci{k = 0}, la fonction renvoie le mot de départ \ci{A}, \item pour \ci{k = 1}, la fonction renvoie \ci{AgAdAdAgA}, - \item pour \ci{k = 2}, la fonction renvoie :\\ \centerline{\ci{AgAdAdAgAgAgAdAdAgAdAgAdAdAgAdAgAdAdAgAgAgAdAdAgA}} + \item pour \ci{k = 2}, la fonction renvoie : + \mycenterline{\ci{AgAdAdAgAgAgAdAdAgAdAgAdAdAgAdAgAdAdAgAgAgAdAdAgA}} + \item pour \ci{k = 3}, la fonction renvoie : \ci{AgAdAdAgAgA...} un mot de $249$ lettres. \end{itemize} - \item Trace les premières images du flocon de Koch donné comme ci-dessus par : \\ - \centerline{départ : \mot{A} \qquad règle : \mot{A} $\rightarrow$ \mot{AgAdAdAgA}} + \item Trace les premières images du flocon de Koch donné comme ci-dessus par : + \mycenterline{départ : \mot{A} \qquad règle : \mot{A} $\rightarrow$ \mot{AgAdAdAgA}} Ici les images pour $k=1$ jusqu'à $k=5$. Pour $k=1$, le mot est \mot{AgAdAdAgA} et tu peux vérifier le tracé sur la première image. \begin{center} -\includegraphics[scale=0.22]{ecran-lsysteme-3a} -\includegraphics[scale=0.22]{ecran-lsysteme-3b} -\includegraphics[scale=0.22]{ecran-lsysteme-3c} -\includegraphics[scale=0.22]{ecran-lsysteme-3d} -\includegraphics[scale=0.22]{ecran-lsysteme-3e} +\includegraphics[scale=\myscale,scale=0.22]{ecran-lsysteme-3a} +\includegraphics[scale=\myscale,scale=0.22]{ecran-lsysteme-3b} +\includegraphics[scale=\myscale,scale=0.22]{ecran-lsysteme-3c} +\includegraphics[scale=\myscale,scale=0.22]{ecran-lsysteme-3d} +\includegraphics[scale=\myscale,scale=0.22]{ecran-lsysteme-3e} \end{center} \item Trace d'autres figures fractales à partir des L-systèmes suivants. Pour tous ces exemples le mot de départ est \ci{"AdAdAdA"} (un carré) et la règle est à choisir parmi : + +\medskip + \begin{itemize} - \item \ci{("A"," AdAgAgAAdAdAgA")} + \item \ci{("A","AdAgAgAAdAdAgA")} \item \ci{("A","AgAAdAAdAdAgAgAAdAdAgAgAAgAAdA")} \item \ci{("A","AAdAdAdAdAA")} \item \ci{("A","AAdAddAdA")} @@ -183,15 +191,18 @@ \item \ci{("A","AdAgAdAdA")} \end{itemize} +\medskip + \begin{center} -\includegraphics[scale=0.3]{ecran-lsysteme-4}\quad -\includegraphics[scale=0.2]{ecran-lsysteme-5}\quad -\includegraphics[scale=0.27]{ecran-lsysteme-6} +\includegraphics[scale=\myscale,scale=0.3]{ecran-lsysteme-4}\quad +\includegraphics[scale=\myscale,scale=0.2]{ecran-lsysteme-5}\quad +\includegraphics[scale=\myscale,scale=0.27]{ecran-lsysteme-6} \end{center} \end{enumerate} + \objectifs{Invente et trace tes propres L-systèmes !} \end{activite} @@ -209,7 +220,7 @@ \index{triangle de Sierpinski} \begin{center} -\includegraphics[scale=0.4]{ecran-lsysteme-7e} +\includegraphics[scale=\myscale,scale=0.35]{ecran-lsysteme-7e} \end{center} \begin{enumerate} @@ -229,27 +240,28 @@ \item \ci{regle2 = ("B","BB")} c'est-à-dire \mot{B} $\rightarrow$ \mot{BB} \item pour \ci{k = 0}, la fonction renvoie le mot de départ \ci{AdBdB}, \item pour \ci{k = 1}, la fonction renvoie \ci{AdBgAgBdAdBBdBB}, - \item pour \ci{k = 2}, la fonction renvoie :\\ - \centerline{\ci{AdBgAgBdAdBBgAdBgAgBdAgBBdAdBgAgBdAdBBBBdBBBB}} + \item pour \ci{k = 2}, la fonction renvoie : + \mycenterline{\ci{AdBgAgBdAdBBgAdBgAgBdAgBBdAdBgAgBdAdBBBBdBBBB}} \end{itemize} - \item Trace les premières images du triangle de Sierpinski donné comme ci-dessus par : \\ - \centerline{départ : \mot{AdBdB} \qquad règles : \mot{A} $\rightarrow$ \mot{AdBgAgBdA} \quad \mot{B} $\rightarrow$ \mot{BB}} + \item Trace les premières images du triangle de Sierpinski donné comme ci-dessus par : + \mycenterline{départ : \mot{AdBdB} \qquad règles : \mot{A} $\rightarrow$ \mot{AdBgAgBdA} \quad \mot{B} $\rightarrow$ \mot{BB}} + L'angle est de $-120$ degrés. Voici les images pour $k=0$ jusqu'à $k=4$. \begin{center} -\includegraphics[scale=0.22]{ecran-lsysteme-7a} -\includegraphics[scale=0.22]{ecran-lsysteme-7b} -\includegraphics[scale=0.22]{ecran-lsysteme-7c} -\includegraphics[scale=0.22]{ecran-lsysteme-7d} -\includegraphics[scale=0.22]{ecran-lsysteme-7e} +\includegraphics[scale=\myscale,scale=0.22]{ecran-lsysteme-7a} +\includegraphics[scale=\myscale,scale=0.22]{ecran-lsysteme-7b} +\includegraphics[scale=\myscale,scale=0.22]{ecran-lsysteme-7c} +\includegraphics[scale=\myscale,scale=0.22]{ecran-lsysteme-7d} +\includegraphics[scale=\myscale,scale=0.22]{ecran-lsysteme-7e} \end{center} \item Trace d'autres figures fractales à partir des L-systèmes suivants. \begin{itemize} - \item La courbe du dragon :\\ -\centerline{\ci{ + \item La courbe du dragon : +\mycenterline{\ci{ depart="AX" regle1=("X","XgYAg") regle2=("Y","dAXdY") @@ -257,26 +269,24 @@ Les lettres \ci{X} et \ci{Y} ne correspondent à aucune action. - \item Une variante du triangle de Sierpinski, avec \ci{angle = 60} :\\ -\centerline{\ci{ + \item Une variante du triangle de Sierpinski, avec \ci{angle = 60} : +\mycenterline{\ci{ depart="A" regle1=("A","BdAdB") regle2=("B","AgBgA") }} -\item La courbe de Gosper, avec \ci{angle = 60} :\\ -\centerline{\ci{ -depart="A" -regle1=("A","AgBggBdAddAAdBg") -regle2=("B","dAgBBggBgAddAdB") -}} +\item La courbe de Gosper, avec \ci{angle = 60} : +\mycenterline{\ci{depart="A"}} +\mycenterline{\ci{regle1=("A","AgBggBdAddAAdBg")}} +\mycenterline{\ci{regle2=("B","dAgBBggBgAddAdB")}} \end{itemize} \begin{center} -\includegraphics[scale=0.15]{ecran-lsysteme-8}\quad -\includegraphics[scale=0.33]{ecran-lsysteme-9}\quad -\includegraphics[scale=0.24]{ecran-lsysteme-10} +\includegraphics[scale=\myscale,scale=0.15]{ecran-lsysteme-8}\quad +\includegraphics[scale=\myscale,scale=0.33]{ecran-lsysteme-9}\quad +\includegraphics[scale=\myscale,scale=0.24]{ecran-lsysteme-10} \end{center} @@ -302,9 +312,10 @@ \item On modélise une pile par une liste. \item Au départ la pile est vide : \ci{pile = []}. - \item \textbf{Empiler.} On ajoute les éléments en fin de liste : \ci{pile = pile + [element]}. - \item \textbf{Dépiler.} On retire un élément par la commande \ci{pop()}\index{pop@\ci{pop}}\index{depiler@dépiler} :\\ - \centerline{\ci{element = pile.pop()}} + \item \textbf{Empiler.} On ajoute les éléments en fin de liste : \ci{pile.append(element)} ou bien \ci{pile = pile + [element]}. + \item \textbf{Dépiler.} On retire un élément par la commande \ci{pop()}\index{pop@\ci{pop}}\index{depiler@dépiler} : + \mycenterline{\ci{element = pile.pop()}} + qui renvoie le dernier élément de la pile et le supprime de la liste. \item Sur le dessin et dans l'activité suivante, les éléments de la pile sont du type $\big((x,y),\theta\big)$ qui stockeront un état de la tortue : $(x,y)$ est la position et $\theta$ sa direction. @@ -323,7 +334,7 @@ \objectifs{Objectifs : améliorer nos tracés en autorisant d'avancer sans tracer et aussi à l'aide d'une sorte de retour en arrière, afin de tracer des plantes.} \begin{center} -\includegraphics[scale=0.25]{ecran-lsysteme-17} +\includegraphics[scale=\myscale,scale=0.27]{ecran-lsysteme-17} \end{center} \begin{enumerate} @@ -339,7 +350,7 @@ \item \ci{regle2 = ("a","aaaaaa")} \end{itemize} \begin{center} -\includegraphics[scale=0.2]{ecran-lsysteme-11} +\includegraphics[scale=\myscale,scale=0.2]{ecran-lsysteme-11} \end{center} \item \textbf{Retour en arrière.} @@ -384,37 +395,37 @@ \begin{itemize} \item -\ci{"A"} +\ci{"A"} \quad \ci{("A","A[gA]A[dA][A]")} \item -\ci{"A"} +\ci{"A"} \quad \ci{("A","A[gA]A[dA]A")} \item -\ci{"A"} +\ci{"A"} \quad \ci{("A","AAd[dAgAgA]g[gAdAdA]")} \item -\ci{"X"} -\ci{("X","A[gX][X]A[gX]dAX")} +\ci{"X"} \quad +\ci{("X","A[gX][X]A[gX]dAX")} \quad \ci{("A","AA")} \item -\ci{"X"} -\ci{("X","A[gX]A[dX]AX")} +\ci{"X"} \quad +\ci{("X","A[gX]A[dX]AX")} \quad \ci{("A","AA")} \item -\ci{"X"} -\ci{("X","Ad[[X]gX]gA[gAX]dX")} +\ci{"X"} \quad +\ci{("X","Ad[[X]gX]gA[gAX]dX")} \quad \ci{("A","AA")} \end{itemize} \begin{center} -\includegraphics[scale=0.27]{ecran-lsysteme-15}\qquad -\includegraphics[scale=0.25]{ecran-lsysteme-16}\qquad -\includegraphics[scale=0.25]{ecran-lsysteme-12} +\includegraphics[scale=\myscale,scale=0.27]{ecran-lsysteme-15}\qquad +\includegraphics[scale=\myscale,scale=0.25]{ecran-lsysteme-16}\qquad +\includegraphics[scale=\myscale,scale=0.25]{ecran-lsysteme-12} \end{center} diff --git a/lsysteme/pres-lsysteme.pdf b/lsysteme/pres-lsysteme.pdf new file mode 100644 index 0000000..63bc2d7 Binary files /dev/null and b/lsysteme/pres-lsysteme.pdf differ diff --git a/lsysteme/pres-lsysteme.tex b/lsysteme/pres-lsysteme.tex new file mode 100644 index 0000000..e3906ad --- /dev/null +++ b/lsysteme/pres-lsysteme.tex @@ -0,0 +1,68 @@ +\documentclass[12pt,class=report,crop=false]{standalone} +\usepackage[screen]{../python} + +\pagestyle{empty} + +\begin{document} + +% Commande spécifique +\newcommand{\badletter}[1]{\underline{\textcolor{red}{#1}}} + + + +%==================================================================== +\chapitre{L-système} +%==================================================================== + + +Un \defi{L-système} est la donnée d'un mot initial et de règles de remplacement. +Voici un exemple avec le mot de départ et une seule règle : \\ +\centerline{\mot{BgAdB} \qquad \mot{A} $\rightarrow$ \mot{ABA}} + + +Le \defi{$k$-ème itéré} du L-système s'obtient en appliquant $k$ fois la substitution au mot de départ. +Avec notre exemple : +\begin{itemize} + \item Première itération. Le mot de départ est \mot{BgAdB}, la règle est \mot{A} $\rightarrow$ \mot{ABA} : on remplace le \mot{A} par \mot{ABA}. On obtient le mot \mot{BgABAdB}. + + \item Deuxième itération. On part du mot obtenu \mot{BgABAdB}, on remplace les deux \mot{A} par \mot{ABA} : on obtient le mot \mot{BgABABABAdB}. + + \item Le troisième itéré est \mot{BgABABABABABABABAdB}, etc. +\end{itemize} + + +\newpage + + +Lorsqu'il y a deux règles (ou plus) il faut les appliquer en même temps. +Voici un exemple de L-système à deux règles : + \\ +\centerline{\mot{A} \qquad \mot{A} $\rightarrow$ \mot{BgA} \qquad \mot{B} $\rightarrow$ \mot{BB}} +Avec notre exemple : +\begin{itemize} + \item Première itération. Le mot de départ est \mot{A}, on applique la première règle \mot{A} $\rightarrow$ \mot{BgA} (la seconde règle ne s'applique pas, car il n'y a pas encore de \mot{B}): on obtient le mot \mot{BgA}. + + \item Deuxième itération. On part du mot obtenu \mot{BgA}, on remplace les \mot{A} par \mot{BgA} et en même temps les \mot{B} par \mot{BB} : on obtient le mot \mot{BBgBgA}. + + \item Le troisième itéré est \mot{BBBBgBBgBgA}, etc. +\end{itemize} + + + +\newpage + +On te donne un mot (par exemple \mot{AgAdAAdAdA}) dans lequel chaque lettre (lues de gauche à droite) correspond à une instruction pour la tortue \Python{}. + +\begin{itemize} + \item \mot{A} ou \mot{B} : avance d'une quantité fixée (en traçant), + \item \mot{g} : tourne à gauche, sans avancer, d'un angle fixé (le plus souvent $90$ degrés), + \item \mot{d} : tourne à droite d'un angle fixé. +\end{itemize} + +Les autres caractères ne font rien. (On ajoutera d'autres commandes plus loin). + + +\begin{center} +\includegraphics[scale=0.6]{ecran-lsysteme-1} +\end{center} +\end{document} diff --git a/markdown/markdown.pdf b/markdown/markdown.pdf index 0da4cf4..612f5db 100644 Binary files a/markdown/markdown.pdf and b/markdown/markdown.pdf differ diff --git a/markdown/texte_markdown.pdf b/markdown/texte_markdown.pdf new file mode 100644 index 0000000..cff0d3a Binary files /dev/null and b/markdown/texte_markdown.pdf differ diff --git a/markdown/markdown.tex b/markdown/texte_markdown.tex similarity index 96% rename from markdown/markdown.tex rename to markdown/texte_markdown.tex index 67dd304..341e553 100644 --- a/markdown/markdown.tex +++ b/markdown/texte_markdown.tex @@ -17,6 +17,12 @@ \objectifs{Tu vas programmer un traitement de texte tout simple qui affiche proprement des paragraphes et met en évidence les mots en gras et en italiques.} +\insertvideo{zPhMxjnNnWg}{Visualiseur de texte - Markdown - partie 1} + +\insertvideo{lVNDym8opE0}{Visualiseur de texte - Markdown - partie 2} + +\insertvideo{ozm80uP9KsA}{Visualiseur de texte - Markdown - partie 3} + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -97,7 +103,7 @@ \begin{enumerate} \item Définis une fenêtre \ci{tkinter} de taille $800 \times 600$ par exemple. - \item Dessine un rectangle gris (qui sera notre zone de texte) de taille \ci{largeur} $\times$ \ci{hauteur} (par exemple $700 \times 600$). + \item Dessine un rectangle gris (qui sera notre zone de texte) de taille \ci{largeur} $\times$ \ci{hauteur} (par exemple $700 \times 500$). \item Définis plusieurs types de fontes : \ci{fonte_titre}, \ci{fonte_sous_titre}, \ci{fonte_gras}, \ci{font_italique}, \ci{fonte_texte}. @@ -281,7 +287,7 @@ \begin{enumerate} - \item Écris une fonction \ci{coupures_simple()} qui calcule les indices permettant de réaliser les coupures correspondant à la figure ci-dessous, c'est-à-dire un alignement à gauche (sans espaces) et sans dépasser la longueur totale de la ligne (ici de longueur $100$). + \item Écris une fonction \ci{coupures_simples()} qui calcule les indices permettant de réaliser les coupures correspondant à la figure ci-dessous, c'est-à-dire un alignement à gauche (sans espaces) et sans dépasser la longueur totale de la ligne (ici de longueur $100$). \begin{center} \includegraphics[scale=0.5]{ecran-coupures-2} @@ -295,7 +301,7 @@ Exemple : \ci{coupures_simples(longueurs)} où \ci{longueurs} est l'exemple donné ci-dessus, renvoie la liste \ci{[0, 9, 17, 27, 39, 49, 50]}. C'est-à-dire que : \begin{itemize} - \item la première ligne correspond aux indices $0$ à $8$ (donnés pas \ci{range(0,9)}), + \item la première ligne correspond aux indices $0$ à $8$ (donnés par \ci{range(0,9)}), \item la deuxième ligne correspond aux indices $9$ à $16$ (donnés par \ci{range(9,17)}), \item la troisième ligne correspond aux indices $17$ à $26$ (donnés par \ci{range(17,27)}), \item \ldots diff --git a/piles/fig-piles3.tikz b/piles/fig-piles3.tikz index 29fabe5..972972f 100644 --- a/piles/fig-piles3.tikz +++ b/piles/fig-piles3.tikz @@ -23,7 +23,7 @@ \begin{scope}[xshift=10cm] -\node at (0,1) {\bf\texttt{pile = [4,2,11,7]}}; +\node[scale=1.1] at (0,1) {\bf\texttt{pile = [4,2,11,7]}}; \node at (0,-2) {\bf Mod\`ele sous forme de liste}; \end{scope} diff --git a/piles/piles.pdf b/piles/piles.pdf index 6499580..0929720 100644 Binary files a/piles/piles.pdf and b/piles/piles.pdf differ diff --git a/piles/piles.tex b/piles/piles.tex index 551e050..104b7bb 100644 --- a/piles/piles.tex +++ b/piles/piles.tex @@ -16,6 +16,11 @@ \objectifs{Tu vas programmer ta propre calculatrice ! Pour cela tu vas découvrir une nouvelle notation pour les formules et aussi découvrir ce qu'est une \og{}pile\fg{} en informatique.} +\insertvideo{oSbV09DaF5s}{Calculatrice polonaise - Piles - partie 1} + +\insertvideo{Ak8I7o-rXKg}{Calculatrice polonaise - Piles - partie 2} + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -32,7 +37,7 @@ \tikzinput{fig-piles1} } -\myfigure{0.5}{ +\myfigure{0.45}{ \tikzinput{fig-piles2} } @@ -60,8 +65,8 @@ Une \defi{variable globale} est une variable qui est définie pour l'ensemble du programme. Il n'est généralement pas recommandé d'utiliser de telles variables mais cela peut être utile dans certain cas. Voyons un exemple. -On déclare la variable globale, ici la constante de gravitation, en début de programme comme une variable classique : \\ -\centerline{\ci{gravitation = 9.81}} +On déclare la variable globale, ici la constante de gravitation, en début de programme comme une variable classique : +\mycenterline{\ci{gravitation = 9.81}} La contenu de la variable \ci{gravitation} est maintenant accessible partout. Par contre, si on souhaite changer la valeur de cette variable dans une fonction, il faut bien préciser à \Python{} que l'on est conscient de modifier une variable globale ! @@ -70,7 +75,7 @@ \begin{lstlisting} def sur_la_lune(): - global gravitation # Oui, je veux modifier cette variable globale ! + global gravitation # Oui, je veux modifier cette variable globale! gravitation = 1.625 # Nouvelle valeur pour tout le programme ... \end{lstlisting} @@ -94,8 +99,8 @@ } La pile sera stockée dans une variable globale \ci{pile}. -Il faut commencer chaque fonction qui modifie la pile par la commande : \\ -\centerline{\ci{global pile}} +Il faut commencer chaque fonction qui modifie la pile par la commande : +\mycenterline{\ci{global pile}} \begin{enumerate} @@ -221,10 +226,10 @@ Rappelons que l'on peut convertir une chaîne en un entier par la commande \ci{int(chaine)}. Le petit programme suivant teste si une chaîne peut être convertie en un entier positif : \begin{lstlisting} -machaine = "1789" # Une chaîne +machaine = "1789" # Une chaîne if machaine.isdigit(): - monentier = int(chaine) # monentier est un entier -else: # Problème + monentier = int(machaine) # monentier est un entier +else: # Problème print("Je ne sais pas convertir la chaîne en un entier !") \end{lstlisting} @@ -255,7 +260,7 @@ Pour cela, il dispose d'une gare de sortie et d'une zone d'attente : un wagon peut soit être directement envoyé à la gare de sortie, soit être momentanément stocké dans la zone d'attente. -\myfigure{0.7}{ +\myfigure{0.8}{ \tikzinput{fig-triage3} } @@ -272,11 +277,11 @@ \item \textbf{Phase 2.} Ensuite, déplacez un par un les wagons (rouges) de la zone d'attente vers la gare de sortie en les raccrochant aux autres. \end{itemize} -\myfigure{0.7}{ +\myfigure{0.8}{ \tikzinput{fig-triage4} } -\myfigure{0.7}{ +\myfigure{0.8}{ \tikzinput{fig-triage5} } @@ -296,7 +301,7 @@ \end{itemize} -En suivant les instructions du chef de gare, écris une fonction \ci{tri_wagons()} qui sépare les wagons bleus et rouges d'un train. +En suivant les instructions du chef de gare et en utilisant les opérations sur une pile, écris une fonction \ci{tri_wagons()} qui sépare les wagons bleus et rouges d'un train. \begin{fonction}[\ci{tri_wagons()}] @@ -445,7 +450,8 @@ \begin{itemize} \item dépiler une fois pour obtenir un nombre $b$, \item dépiler une seconde fois pour obtenir un nombre $a$, - \item calculer $a+b$ ou $a \times b$ selon l'opération. + \item calculer $a+b$ ou $a \times b$ selon l'opération, + \item ajouter ce résultat à la pile. \end{itemize} \end{itemize} \item À la fin, la pile ne contient qu'un seul élément, c'est le résultat du calcul. @@ -589,10 +595,10 @@ \begin{activite}[Conversion en écriture polonaise] -\objectifs{Objectifs : transformer une expression algébrique classique avec parenthèse en une écriture polonaise. L'algorithme est une version très améliorée de l'activité précédente. Nous ne donnerons pas de justification.} +\objectifs{Objectifs : transformer une expression algébrique classique avec parenthèses en une écriture polonaise. L'algorithme est une version très améliorée de l'activité précédente. Nous ne donnerons pas de justification.} -Tu es habitué à l'écriture \og{}$(13+5) \times 7$\fg{} ; tu as vu que l'ordinateur savait facilement calculer \og{}$13 \ 5 \ + \ 7 \ \times$\fg{}. Il ne reste plus qu'à passer de l'expression algébrique classique (avec parenthèses) à l'écriture polonaise (sans parenthèses) ! +Tu es habitué à l'écriture \og{}$(13+5) \times 7$\fg{} ; tu as vu que l'ordinateur savait facilement calculer \og{}$13 \ 5 \ + \ 7 \ \times$\fg{}. Il ne reste plus qu'à passer de l'expression algébrique classique (avec parenthèses) à l'écriture polonaise (sans parenthèses) ! Voici l'algorithme pour des expressions ne comportant que des additions et des multiplications. @@ -618,9 +624,9 @@ tant que la pile n'est pas vide : \\ \indentation dépiler un élément,\\ \indentation si cet élément est l'opérateur de multiplication \ci{"*"}, alors :\\ - \indentation \indentation ajouter cet élément à la chaîne de sortie \ci{polonaise}\\ + \indentation \indentation ajouter cet élément \ci{"*"} à la chaîne de sortie \ci{polonaise}\\ \indentation sinon :\\ - \indentation \indentation empiler cet élément (on le remet sur la pile après l'avoir enlevé)\\ + \indentation \indentation empiler cet élément \ci{"*"} (on le remet sur la pile après l'avoir enlevé)\\ \indentation \indentation terminer immédiatement la boucle \og{}tant que\fg{} (avec \ci{break})\\ enfin, ajouter l'opérateur d'addition \ci{"+"} à la pile. @@ -675,8 +681,9 @@ \begin{itemize} \item Définis une expression \ci{exp = "( 17 * ( 2 + 3 ) ) + ( 4 + ( 8 * 5 ) )"} \item Demande à \Python{} de calculer cette expression : \ci{eval(exp)}.\index{eval@\ci{eval}} \Python{} renvoie \ci{129}. - \item Convertis l'expression en écriture polonaise : \ci{ecriture_polonaise(exp)} renvoie \\ - \centerline{ \ci{"17 2 3 + * 4 8 5 * + +"} } + \item Convertis l'expression en écriture polonaise : \ci{ecriture_polonaise(exp)} renvoie + \mycenterline{ \ci{"17 2 3 + * 4 8 5 * + +"} } + \item Avec ta calculatrice calcule le résultat : \ci{calculatrice_polonaise("17 2 3 + * 4 8 5 * + +")} renvoie \ci{129}. On obtient bien le même résultat ! \end{itemize} diff --git a/piles/pres-piles.pdf b/piles/pres-piles.pdf new file mode 100644 index 0000000..a67e344 Binary files /dev/null and b/piles/pres-piles.pdf differ diff --git a/piles/pres-piles.tex b/piles/pres-piles.tex new file mode 100644 index 0000000..090d83a --- /dev/null +++ b/piles/pres-piles.tex @@ -0,0 +1,225 @@ +\documentclass[12pt,class=report,crop=false]{standalone} +\usepackage[screen]{../python} + +\pagestyle{empty} + +\begin{document} + +% Commande spécifique +\newcommand{\badletter}[1]{\underline{\textcolor{red}{#1}}} + + + +%==================================================================== +\chapitre{Calculatrice polonaise -- Piles} +%==================================================================== + + + Une \defi{pile} est une suite de données munie de trois opérations de base : + \begin{itemize} + \item \defi{empiler}\index{empiler} : on ajoute un élément au sommet de la pile, + \item \defi{dépiler}\index{depiler@dépiler} : on lit la valeur de l'élément au sommet de la pile et on retire cet élément de la pile, + \item et enfin, on peut tester si la pile est vide. + \end{itemize} + +\myfigure{0.6}{ + \tikzinput{fig-piles1} +} + + + +\newpage + +\myfigure{0.5}{ + \tikzinput{fig-piles2} +} + + +\newpage + + +\myfigure{0.6}{ + \tikzinput{fig-piles3} +} + +\newpage + + \centerline{Variable globale \ci{pile}} + + \bigskip + + + \begin{fonction}[\ci{empile()}] + Usage : \ci{empile(element)} \\ + Entrée : un entier, une chaîne\ldots \\ + Sortie : rien \\ + Action : la pile contient un élément en plus + + \medskip + + Exemple : si au départ \ci{pile = [5,1,3]} alors, après l'instruction \ci{empile(8)}, la pile vaut \ci{[5,1,3,8]} et si on continue avec l'instruction +\ci{empile(6)}, la pile vaut maintenant \ci{[5,1,3,8,6]}. + \end{fonction} + + +\newpage + + + \begin{fonction}[\ci{depile()}] + Usage : \ci{depile()} \\ + Entrée : rien \\ + Sortie : l'élément du sommet de la pile \\ + Action : la pile contient un élément de moins + + \medskip + + Exemple : si au départ \ci{pile = [13,4,9]} alors l'instruction \ci{depile()} renvoie la valeur \ci{9} et la pile vaut maintenant \ci{[13,4]} ; si on exécute une nouvelle instruction \ci{depile()}, elle renvoie cette fois la valeur \ci{4} et la pile vaut maintenant \ci{[13]}. + \end{fonction} + +\newpage + + \begin{fonction}[\ci{pile_est_vide()}] + Usage : \ci{pile_est_vide()} \\ + Entrée : rien \\ + Sortie : vrai ou faux \\ + Action : ne fait rien sur la pile + + \medskip + + Exemple : + \begin{itemize} + \item si \ci{pile = [13,4,9]} alors l'instruction \ci{pile_est_vide()} renvoie \ci{False}, + \item si \ci{pile = []} alors l'instruction \ci{pile_est_vide()} renvoie \ci{True}. + \end{itemize} + \end{fonction} + + +\newpage + +\section*{Calculatrice polonaise} + +\begin{itemize} + + \item + classique : $7 + 6$ \quad ; \quad + polonaise : $7 \ \ 6 \ \ +$ + + \item + classique : $(10 + 5) \times 3$ \quad ; \quad + polonaise : $10 \ \ 5 \ \ + \ \ 3 \ \ \times$ + + \item + classique : $10 + 2 \times 3$ \quad ; \quad + polonaise : $10 \ \ 2 \ \ 3 \ \ \times \ \ +$ + + \item + classique : $(2 + 8) \times (6 + 11)$ \quad ; \quad + polonaise : $2 \ \ 8 \ \ + \ \ 6 \ \ 11 \ \ + \ \ \times$ +\end{itemize} + +\newpage + +\begin{itemize} + \item On lit l'expression de gauche à droite : +$$\color{red}\underrightarrow{\color{black}2 \ \ 8 \ \ + \ \ 6 \ \ 11 \ \ + \ \ \times}$$ + + \item Lorsque l'on rencontre un premier opérateur ($+$, $\times$,\ldots) on calcule l'opération \emph{avec les deux membres juste avant cet opérateur} : +$$\underbrace{\color{red}2 \ \ 8 \ \ +}_{2 + 8} \ \ 6 \ \ 11 \ \ + \ \ \times$$ + + \item On remplace cette opération par le résultat : +$$\underbrace{\color{red} 10}_{\substack{\text{résultat de }\\2 + 8}} \ \ 6 \ \ 11 \ \ + \ \ \times$$ + + \item On continue la lecture de l'expression (on cherche le premier opérateur et les deux termes juste avant) : + $$10 \ \ \underbrace{\color{red}6 \ \ 11 \ \ +}_{6 + 11 = 17} \ \ \times + \qquad \text{ devient } \qquad +10 \ \ 17 \ \ \times \qquad \text{ qui vaut } \qquad 170$$ + + \item À la fin il ne reste qu'une valeur, c'est le résultat ! (Ici $170$.) +\end{itemize} + + +\newpage + +\begin{itemize} + \item $8 \ \ 2 \ \ \div \ \ 3 \ \ \times \ \ 7 \ \ +$ + + + \bigskip + +$$\underbrace{8 \ \ 2 \ \ \div}_{8 \div 2 = 4} \ \ 3 \ \ \times \ \ 7 \ \ + +\quad\text{ devient }\quad +\underbrace{4 \ \ 3 \ \ \times}_{4 \times 3 = 12} \ \ 7 \ \ + +\quad\text{ devient }\quad + 12 \ \ 7 \ \ + +\quad\text{ qui vaut }\quad +19$$ + + + \bigskip + + \bigskip + + \item $11 \ \ 9 \ \ 4 \ \ 3 \ \ + \ \ - \ \ \times$ + + \bigskip + +$$11 \ \ 9 \ \ \underbrace{4 \ \ 3 \ \ +}_{4+3=7} \ \ - \ \ \times +\quad\text{ devient }\quad +11 \ \ \underbrace{9 \ \ 7 \ \ -}_{9 - 7 = 2} \ \ \times +\quad\text{ devient }\quad +11 \ \ 2 \ \ \times +\quad\text{ qui vaut }\quad +22$$ +\end{itemize} + +\newpage + + \begin{algorithme} + \sauteligne + \begin{itemize} + \item + \begin{itemize} + \item Entrée : une expression en écriture polonaise (une chaîne de caractères). + \item Sortie : la valeur de cette expression. + \item Exemple : \ci{"2 3 + 4 *"} (le calcul $(2+3) \times 4$) donne $20$. + \end{itemize} + + \item Partir avec une pile vide. + + \item Pour chaque élément de l'expression (lue de gauche à droite) : + \begin{itemize} + \item si l'élément est un nombre, alors ajouter ce nombre à la pile, + + \item si l'élément est une opération, alors : + \begin{itemize} + \item dépiler une fois pour obtenir un nombre $b$, + \item dépiler une seconde fois pour obtenir un nombre $a$, + \item calculer $a+b$ ou $a \times b$ selon l'opération, + \item ajouter ce résultat à la pile. + \end{itemize} + \end{itemize} + \item À la fin, la pile ne contient qu'un seul élément, c'est le résultat du calcul. + + \end{itemize} + \end{algorithme} + + +\newpage + +\begin{fonction}[\ci{calculatrice_polonaise()}] + Usage : \ci{calculatrice_polonaise(expression)} \\ + Entrée : une expression en notation polonaise (chaîne de caractères) \\ + Sortie : le résultat du calcul \\ + Action : utilise une pile + + \medskip + + Exemple : + \begin{itemize} + \item \ci{calculatrice_polonaise("2 3 4 + +")} renvoie \ci{9} + \item \ci{calculatrice_polonaise("2 3 + 5 *")} renvoie \ci{25} + \end{itemize} +\end{fonction} + + +\end{document} diff --git a/premiers_pas/premiers_pas.pdf b/premiers_pas/premiers_pas.pdf index 6541e1b..3515b56 100644 Binary files a/premiers_pas/premiers_pas.pdf and b/premiers_pas/premiers_pas.pdf differ diff --git a/premiers_pas/premiers_pas.tex b/premiers_pas/premiers_pas.tex index cdf8024..3d27a0d 100644 --- a/premiers_pas/premiers_pas.tex +++ b/premiers_pas/premiers_pas.tex @@ -8,9 +8,23 @@ \chapitre{Premiers pas} %==================================================================== + \objectifs{Lance-toi dans la programmation ! Dans cette toute première activité, tu vas apprendre à manipuler des nombres, des variables et tu vas coder tes premières boucles avec \Python.} +\insertvideo{9M9yz8bFzuU}{Premiers pas - partie 1 - Lance-toi !} + +\insertvideo{9h9nLLRRjls}{Premiers pas - partie 2 - Variable} + +\insertvideo{WLTNpIdHIls}{Premiers pas - partie 3 - Fonctions} + +\insertvideo{zxf7QRfZato}{Premiers pas - partie 4 - Boucle pour} + +\insertvideo{IS117_uXZKE}{Installer Python} + +\insertvideo{QtUxL52VPtA}{Démarrer Python et utiliser IDLE} + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -55,7 +69,7 @@ $$(1+2)\times(3+4)\times(5+6)\times(7+8)\times\cdots$$ \item Quels sont les trois derniers chiffres de - $$\underbrace{123456789 \times 123456789 \times \cdots}_{7 \text{ occurrences de } 123456789} \quad ?$$ + $$123456789 \times 123456789 \times 123456789 \times 123456789 \times 123456789 \times 123456789 \times 123456789 \quad ?$$ \item $7$ est le premier entier tel que son inverse a une écriture décimale périodique de longueur $6$ : $$\frac{1}{7} = 0.\underbrace{142857}\underbrace{142857}\underbrace{142857}\ldots$$ Trouve le premier entier dont l'inverse a une écriture décimale périodique de longueur $7$ : @@ -288,8 +302,8 @@ Dans le module \ci{math} il y aussi des fonctions pour arrondir un nombre décimal : \begin{itemize} \item \ci{round()}\index{round@\ci{round}} arrondit à l'entier le plus proche : \ci{round(5.6)} renvoie \ci{6}, \ci{round(1.5)} renvoie \ci{2}. - \item \ci{floor()}\index{floor@\ci{floor}} renvoie l'entier inférieur ou égal : \ci{round(5.6)} renvoie \ci{5}. - \item \ci{ceil()}\index{ceil@\ci{ceil}} renvoie l'entier supérieur ou égal : \ci{round(5.6)} renvoie \ci{6}. + \item \ci{floor()}\index{floor@\ci{floor}} renvoie l'entier inférieur ou égal : \ci{floor(5.6)} renvoie \ci{5}. + \item \ci{ceil()}\index{ceil@\ci{ceil}} renvoie l'entier supérieur ou égal : \ci{ceil(5.6)} renvoie \ci{6}. \end{itemize} \end{itemize} @@ -305,7 +319,7 @@ \objectifs{Objectifs : utiliser des fonctions de \Python{} et du module \ci{math}.} \begin{enumerate} - \item La fonction \Python{} est \ci{gcd(a,b)}\index{gcd@\ci{gcd}}\index{pgcd} (sans le \og{}p\fg{}, pour \emph{greatest common divisor}). Calcule le pgcd de $a = 10\,403$ et $b = 10\,506$. Déduis-en le ppcm\index{ppcm} de $a$ et $b$. La fonction ppcm n'existe pas, tu dois utiliser la formule : + \item La fonction \Python{} pour le pgcd est \ci{gcd(a,b)}\index{gcd@\ci{gcd}}\index{pgcd} (sans le \og{}p\fg{}, pour \emph{greatest common divisor}). Calcule le pgcd de $a = 10\,403$ et $b = 10\,506$. Déduis-en le ppcm\index{ppcm} de $a$ et $b$. La fonction ppcm n'existe pas, tu dois utiliser la formule : $$\text{ppcm}(a,b) = \frac{a \times b}{\text{pgcd}(a,b)}.$$ \item Trouve par tâtonnement un nombre réel $x$ qui vérifie toutes les conditions suivantes (plusieurs solutions sont possibles) : @@ -425,25 +439,27 @@ \index{list@\ci{list}} \mybox { + \begin{minipage}{0.95\textwidth} \begin{itemize} \item \textbf{\ci{range()}.} \begin{itemize} - \item avec \ci{range(n)} on parcourt les entiers de $0$ à $n-1$. + \item Avec \ci{range(n)} on parcourt les entiers de $0$ à $n-1$. Par exemple \ci{range(10)} correspond à la liste \ci{[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}. Attention ! la liste s'arrête bien à $n-1$ et pas à $n$. Ce qu'il faut retenir c'est que la liste contient bien $n$ éléments (car elle commence à $0$). - Si tu veux afficher la liste des éléments parcourus, il faut utiliser la commande :\\ - \centerline{\ci{list(range(10))}} + \item Si tu veux afficher la liste des éléments parcourus, il faut utiliser la commande : + \mycenterline{\ci{list(range(10))}} - \item avec \ci{range(a,b)} on parcourt les éléments de $a$ à $b-1$. + \item Avec \ci{range(a,b)} on parcourt les éléments de $a$ à $b-1$. Par exemple \ci{range(10,20)} correspond à la liste \ci{[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]}. - \item avec \ci{range(a,b,pas)} on parcourt les éléments $a$, $a+\text{pas}$, $a + 2\text{pas}$\ldots{} Par exemple \ci{range(10,20,2)} correspond à la liste \ci{[10, 12, 14, 16, 18]}. + \item Avec \ci{range(a,b,pas)} on parcourt les éléments $a$, $a+\text{pas}$, $a + 2\text{pas}$\ldots{} Par exemple \ci{range(10,20,2)} correspond à la liste \ci{[10, 12, 14, 16, 18]}. \end{itemize} -\end{itemize} +\end{itemize} +\end{minipage} } \begin{itemize} \item \textbf{Imbrication de boucles.} @@ -500,7 +516,7 @@ \end{itemize} \item Cherche une valeur approchée que doit avoir - le rayon $R$ d'une boule afin que son volume soit $100$ ? + le rayon $R$ d'une boule afin que son volume soit $100$. \emph{Indications.} \begin{itemize} @@ -531,8 +547,9 @@ \emph{Indications.} Commence par définir une variable \ci{produit} initialisée à la valeur $1$. Utilise \ci{range(a,b,2)} pour obtenir un entier sur deux. - \item Affiche les tables de multiplication entre $1$ et $10$. Voici un exemple de ligne à afficher :\\ - \centerline{\ci{7 x 9 = 63}} + \item Affiche les tables de multiplication entre $1$ et $10$. Voici un exemple de ligne à afficher : + \mycenterline{\ci{7 x 9 = 63}} + Utilise une commande d'affichage du style : \ci{print(a,"x",b,"=",a*b)}. \end{enumerate} \end{activite} diff --git a/premiers_pas/premiers_pas_1.py b/premiers_pas/premiers_pas_1.py index 9aa3b12..0f5148f 100644 --- a/premiers_pas/premiers_pas_1.py +++ b/premiers_pas/premiers_pas_1.py @@ -56,7 +56,7 @@ # Q2 # A partir dans quand plus grand qu'un milliard print("--- Question 2 ---") -print((1+2)*(3+4)*(5+6)*(7+8)*(9+10)*(11+12)*(13+14)*(14+15)) +print((1+2)*(3+4)*(5+6)*(7+8)*(9+10)*(11+12)*(13+14)*(15+16)) # Q3 diff --git a/premiers_pas/premiers_pas_4.py b/premiers_pas/premiers_pas_4.py index a7361bb..336e87f 100644 --- a/premiers_pas/premiers_pas_4.py +++ b/premiers_pas/premiers_pas_4.py @@ -70,7 +70,7 @@ print("x =",x,"y =",y) # Q4 -# Aire d'un disque qui vaut 100 +# Volume d'une boule qui vaut 100 for i in range(50): R = i/10 V = 4/3 * 3.14 * R**3 diff --git a/premiers_pas/pres-premiers_pas.pdf b/premiers_pas/pres-premiers_pas.pdf new file mode 100644 index 0000000..e0e33c8 Binary files /dev/null and b/premiers_pas/pres-premiers_pas.pdf differ diff --git a/premiers_pas/pres-premiers_pas.tex b/premiers_pas/pres-premiers_pas.tex new file mode 100644 index 0000000..12af2f5 --- /dev/null +++ b/premiers_pas/pres-premiers_pas.tex @@ -0,0 +1,59 @@ +\documentclass[11pt,class=report,crop=false]{standalone} +\usepackage[screen]{../python} + +\pagestyle{empty} + +\begin{document} + + +%==================================================================== +\chapitre{Premiers pas} +%==================================================================== + + +\section*{Boucle \og{}pour\fg{}} + + +\bigskip + +La boucle \og{}pour\fg{} est la façon la plus simple de répéter des instructions. + +\bigskip + + + +\mybox{ +\myfigure{0.7}{ + \tikzinput{fig-premiers_pas-boucle-pour} +} } + +\newpage + +\section*{\ci{range()}} + + +\bigskip + + \begin{itemize} + \item avec \ci{range(n)} on parcourt les entiers de $0$ à $n-1$. + Par exemple \ci{range(10)} correspond à la liste \ci{[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}. + + \item Attention ! la liste s'arrête bien à $n-1$ et pas à $n$. Ce qu'il faut retenir + c'est que la liste contient bien $n$ éléments (car elle commence à $0$). + + \bigskip + + \item Si tu veux afficher la liste des éléments parcourus, il faut utiliser la commande :\\ + \centerline{\ci{list(range(10))}} + +\bigskip + + \item Avec \ci{range(a,b)} on parcourt les éléments de $a$ à $b-1$. + Par exemple \ci{range(10,20)} correspond à la liste \ci{[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]}. + +\bigskip + + \item Avec \ci{range(a,b,pas)} on parcourt les éléments $a$, $a+\text{pas}$, $a + 2\text{pas}$\ldots{} Par exemple \ci{range(10,20,2)} correspond à la liste \ci{[10, 12, 14, 16, 18]}. + + \end{itemize} +\end{document} diff --git a/proba/proba.pdf b/proba/proba.pdf index afb52f2..47febf7 100644 Binary files a/proba/proba.pdf and b/proba/proba.pdf differ diff --git a/proba/proba.tex b/proba/proba.tex index 8603df1..04c6abb 100644 --- a/proba/proba.tex +++ b/proba/proba.tex @@ -16,6 +16,10 @@ \objectifs{Tu vas programmer deux jeux simples. Lorsque tu joues à ces jeux, tu as plus de chances de perdre que de gagner. Pourtant lorsque tu joues aux deux jeux en même temps, tu as plus de chances de gagner que de perdre ! C'est une situation paradoxale.} + +\insertvideo{kBCFpEPAcoE}{Probabilités - Paradoxe de Parrondo} + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/python-common.sty b/python-common.sty index cadb53d..f664f05 100644 --- a/python-common.sty +++ b/python-common.sty @@ -19,7 +19,7 @@ \fi % ---------------------------------------------------------------------- % Pour la francisation du LaTeX -\usepackage[francais]{babel} +\usepackage[french]{babel} % Pour ne pas modifier les espacements standard dans les listes et les retraits %\frenchbsetup{StandardLayout=true} \frenchbsetup{ReduceListSpacing=true} @@ -202,8 +202,8 @@ % ---------------------------------------------------------------------- % Unités -\usepackage{siunitx} -\sisetup{locale = FR,detect-all,per-mode = symbol} +%\usepackage{siunitx} +%\sisetup{locale = FR,detect-all,per-mode = symbol} % ---------------------------------------------------------------------- % Commandes anti-beamer %\newcommand{\pause}{} % permet de mettre des \pause dans beamer pas dans poly diff --git a/python-minimal.sty b/python-minimal.sty index b080a6b..5bf2476 100644 --- a/python-minimal.sty +++ b/python-minimal.sty @@ -111,6 +111,4 @@ pdftitle={Exo7 - Cours de mathématiques}, pdfauthor={Exo7}} % ---------------------------------------------------------------------- % Constantes pour l'inclusion des figures -\newcommand{\scalebloc}{0.35} -\newcommand{\scalesolution}{0.27} -\newcommand{\scaleecran}{0.35} \ No newline at end of file +\newcommand{\myscale}{1} diff --git a/python-print.sty b/python-print.sty index 1b7c1aa..17b7bca 100644 --- a/python-print.sty +++ b/python-print.sty @@ -4,10 +4,13 @@ % ---------------------------------------------------------------------- % Format de la page \usepackage[ - papersize={8.5in,11in},%papersize={7.5in,9.25in} + papersize={7.5in,9.25in}, + % old Python/Scratch papersize={8.5in,11in}, + % algebre/analyse papersize={7.5in,9.25in}, nomarginpar, nofoot, - margin = 0.9in, - %top=0.5in, + margin = 0.7in, + %old margin = 0.9in, + %top=0.9in, %right=0.8in, left=0.8in, top=0.5in, bottom=0.7in, bindingoffset=0.5in, headsep=21pt, heightrounded, @@ -34,10 +37,10 @@ \ifXeTeX\else \tikzifexternalizing{}{ \pdfinfo{ - /Title (Cours de mathématiques - Première année) - /Author (exo7) - /Subject (cours de mathématiques) - /Keywords (cours, mathématiques, exercices) + /Title (Python au lycée - tome 1) + /Author (Arnaud Bodin) + /Subject (algorithmes et programmation) + /Keywords (informatique, mathématiques, algorithme, python) /GTS_PDFXVersion (PDF/X-3:2002) }% \pdfcatalog{ @@ -78,7 +81,7 @@ \fi -\usepackage[charter]{mathdesign} +\usepackage[charter,cal=cmcal]{mathdesign} % Police pour l'entete @@ -374,18 +377,24 @@ borderline west={#1}{0pt}{#2},left={#1*14/10+7pt},top=2.1ex, bottom=2.1ex } } -\tcolorboxenvironment{activite}{leftlined={5pt}{gray}} -\tcolorboxenvironment{enigme}{leftlined={5pt}{gray}} -\tcolorboxenvironment{solution}{leftlined={3pt}{lightgray}} -\tcolorboxenvironment{exemple}{leftlined={3pt}{lightgray,decorate,decoration={name=zigzag}}} +%\tcolorboxenvironment{activite}{leftlined={5pt}{gray}} +%\tcolorboxenvironment{enigme}{leftlined={5pt}{gray}} +%\tcolorboxenvironment{solution}{leftlined={3pt}{lightgray}} +%\tcolorboxenvironment{exemple}{leftlined={3pt}{lightgray,decorate,decoration={name=zigzag}}} +%\tcolorboxenvironment{cours}{leftlined={3pt}{lightgray}} +%\tcolorboxenvironment{algorithme}{leftlined={3pt}{lightgray}} +%% Code +%%\tcolorboxenvironment{moncode}{leftlined={5pt}{gray}} +% +%\tcolorboxenvironment{moncode}{fonttitle=\bfseries\upshape,fontupper=\itshape, +%colframe=red!50!black,colback=black!5!white,colbacktitle=green!20!white,coltitle=blue!75!black,titlerule=3mm} -\tcolorboxenvironment{cours}{leftlined={3pt}{lightgray}} +\tcolorboxenvironment{activite}{leftlined={5pt}{gray}} +\tcolorboxenvironment{algorithme}{leftlined={3pt}{lightgray}} +\tcolorboxenvironment{exemple}{leftlined={3pt}{lightgray}} +\tcolorboxenvironment{cours}{leftlined={3pt}{lightgray,decorate,decoration={name=zigzag}}} -% Code -%\tcolorboxenvironment{moncode}{leftlined={5pt}{gray}} -\tcolorboxenvironment{moncode}{fonttitle=\bfseries\upshape,fontupper=\itshape, -colframe=red!50!black,colback=black!5!white,colbacktitle=green!20!white,coltitle=blue!75!black,titlerule=3mm} % ---------------------------------------------------------------------- % Encadrement auteurs @@ -446,9 +455,8 @@ colframe=red!50!black,colback=black!5!white,colbacktitle=green!20!white,coltitle % ---------------------------------------------------------------------- % Constantes pour l'inclusion des figures -\newcommand{\scalebloc}{1.1} -\newcommand{\scaleecran}{0.27} -\newcommand{\scalesolution}{0.7} +\newcommand{\myscale}{0.8} + % Pour afficher/cacher les solutions @@ -473,7 +481,7 @@ colframe=red!50!black,colback=black!5!white,colbacktitle=green!20!white,coltitle % --- les figures avec échelle éventuel \renewcommand{\myfigure}[2]{% entrée : échelle, fichier(s) figure à inclure \begin{center}\small -\tikzstyle{every picture}=[scale=0.9*#1]% mise en échelle + 10% (automatiquement annulé à la fin du groupe) +\tikzstyle{every picture}=[scale=0.90*#1]% mise en échelle + 10% (automatiquement annulé à la fin du groupe) #2 \end{center}} @@ -556,7 +564,13 @@ colback=lightgray}] } % code en ligne (\codeinline) -\newcommand{\codeinline}[1]{\lstinline[showstringspaces=false]!#1!} +% \newcommand{\codeinline}[1]{\lstinline[showstringspaces=false]!#1!} +\newcommand{\codeinline}[1]{\lstinline[showstringspaces=false,breaklines=true,breakatwhitespace=true]!#1!} \newcommand{\ci}[1]{\codeinline{#1}} - +% Ligne bien centrée ()sans utiliser \centerline) +\newenvironment{nscenter} +{\parskip=0pt\par\nopagebreak\centering} +{\par\noindent\ignorespacesafterend} +\newcommand{\mycenterline}[1]{\begin{nscenter}#1\end{nscenter}} +%\renewcommand{\centerline}[1]{\erreur} % A commenter après débugage diff --git a/python-screen.sty b/python-screen.sty index 4c82db6..1fa6a0e 100644 --- a/python-screen.sty +++ b/python-screen.sty @@ -22,7 +22,7 @@ % ---------------------------------------------------------------------- % Police par defaut -\usepackage[charter]{mathdesign} +\usepackage[charter,cal=cmcal]{mathdesign} % Police pour l'entete @@ -384,12 +384,12 @@ colframe=red!50!black,colback=black!5!white,colbacktitle=green!20!white,coltitle \usepackage[hypertexnames=true,pdfencoding=auto]{hyperref} %\usepackage[hypertexnames=true,plainpages=false,pdfpagelabels,pagebackref]{hyperref} \hypersetup{colorlinks=true, linkcolor=blue, urlcolor=blue, -pdftitle={Exo7 - Cours de mathématiques}, pdfauthor={Exo7}} +pdftitle={Python au lycée - tome 1}, pdfauthor={Arnaud Bodin}} % --- Liens vers vidéo Youtube % variable myvideo : 0 pas de video, sinon la référence youtube \newcommand{\video}[1]{\def\myvideo{#1}} \newcommand{\insertvideo}[2]{\video{#1}% -{\small\texttt{\href{http://www.youtube.com/watch?v=\myvideo}{Vidéo $\blacksquare$ #2}}}} +{\hfill\small\texttt{\href{http://www.youtube.com/watch?v=\myvideo}{Vidéo $\blacksquare$ #2}}}} % --- Liens vers les fiches d'exercices \newcommand{\mafiche}[1]{\def\mymafiche{#1}} \newcommand{\insertfiche}[2]{\mafiche{#1}% @@ -402,10 +402,7 @@ pdftitle={Exo7 - Cours de mathématiques}, pdfauthor={Exo7}} % ---------------------------------------------------------------------- % Constantes pour l'inclusion des figures -\newcommand{\scalebloc}{1.2} -\newcommand{\scalesolution}{0.9} -\newcommand{\scaleecran}{0.35} - +\newcommand{\myscale}{1} % Pour afficher/cacher les solutions \usepackage{comment} @@ -501,7 +498,15 @@ colback=lightgray}] } % code en ligne (\codeinline) -\newcommand{\codeinline}[1]{\lstinline[showstringspaces=false]!#1!} +%\newcommand{\codeinline}[1]{\lstinline[showstringspaces=false]!#1!} +\newcommand{\codeinline}[1]{\lstinline[showstringspaces=false,breaklines=true,breakatwhitespace=true]!#1!} \newcommand{\ci}[1]{\codeinline{#1}} +% Ligne bien centrée ()sans utiliser \centerline) +\newenvironment{nscenter} +{\parskip=0pt\par\nopagebreak\centering} +{\par\noindent\ignorespacesafterend} +\newcommand{\mycenterline}[1]{\begin{nscenter}#1\end{nscenter}} +%\renewcommand{\centerline}[1]{\erreur} % A commenter après débugage + diff --git a/ramsey/fig-ramsey-0b.tikz b/ramsey/fig-ramsey-0b.tikz index 1fc2fef..f7f7b1c 100644 --- a/ramsey/fig-ramsey-0b.tikz +++ b/ramsey/fig-ramsey-0b.tikz @@ -12,9 +12,9 @@ \fill[black] (C) circle (2pt) node[below right]{$k$}; -\node at (1,-1.5) {\bf Trois amis}; +\node at (1.2,-1.5) {\bf Trois amis}; -\begin{scope}[xshift=5cm,rotate =30] +\begin{scope}[xshift=7cm,rotate =30] \coordinate (A) at (0:2.5); \coordinate (B) at (120:2); \coordinate (C) at (-120:1); @@ -25,7 +25,7 @@ \fill[black] (C) circle (2pt) node[below left]{$k'$}; -\node at (1.5,-1.5) {\bf Trois \'etrangers}; +\node at (1.6,-1.5) {\bf Trois \'etrangers}; \end{scope} diff --git a/ramsey/fig-ramsey-0c.tikz b/ramsey/fig-ramsey-0c.tikz index 6ad7551..6e5c85b 100644 --- a/ramsey/fig-ramsey-0c.tikz +++ b/ramsey/fig-ramsey-0c.tikz @@ -9,7 +9,7 @@ \draw[ultra thick,green!60!black] (C)--(A)--(E)--(D)--(C)--(B)--(E); -\draw[line width=3pt,red,dashed] (A)--(B)--(D)--cycle; +\draw[line width=2.5pt,red,dashed] (A)--(B)--(D)--cycle; \draw[ultra thick,red,dashed] (C)--(E); \fill[black] (A) circle (3pt) node[below right]{$0$}; diff --git a/ramsey/ramsey.pdf b/ramsey/ramsey.pdf index b96211a..dc92378 100644 Binary files a/ramsey/ramsey.pdf and b/ramsey/ramsey.pdf differ diff --git a/ramsey/ramsey.tex b/ramsey/ramsey.tex index a01a394..912cb07 100644 --- a/ramsey/ramsey.tex +++ b/ramsey/ramsey.tex @@ -11,11 +11,18 @@ \objectifs{Tu vas voir qu'un problème tout simple, qui concerne les relations entre seulement six personnes, va demander énormément de calculs pour être résolu.} \begin{center} -\includegraphics[scale=0.4]{ecran-ramsey-1d} +\includegraphics[scale=\myscale,scale=0.4]{ecran-ramsey-1d} \end{center} \index{graphe} + +\insertvideo{CsCSRszXYxI}{Graphe et combinatoire de Ramsey} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \begin{cours}[Le problème de Ramsey] \objectifs{Proposition. Dans un groupe de $6$ personnes, il y a toujours $3$ amis (les trois se connaissent deux à deux) ou $3$ étrangers (les trois sont tous des inconnus les uns pour les autres).} @@ -83,21 +90,22 @@ \begin{center} -\includegraphics[height=5cm]{ecran-ramsey-1a}\quad -\includegraphics[height=5cm]{ecran-ramsey-1b} +\includegraphics[scale=\myscale,height=5cm]{ecran-ramsey-1a}\quad +\includegraphics[scale=\myscale,height=5cm]{ecran-ramsey-1b} \end{center} \begin{center} -\includegraphics[height=5cm]{ecran-ramsey-1c}\quad -\includegraphics[height=5cm]{ecran-ramsey-1d} +\includegraphics[scale=\myscale,height=5cm]{ecran-ramsey-1c}\quad +\includegraphics[scale=\myscale,height=5cm]{ecran-ramsey-1d} \end{center} \begin{enumerate} \item Définis le tableau des graphes des quatre exemples ci-dessus. - Tu peux commencer par initialiser le tableau par \\ - \centerline{\ci{graphe = [[0 for j in range(n)] for i in range(n)]}} - Puis ajoute des commandes :\\ - \centerline{\ci{graphe[i][j] = 1} \quad et \quad \ci{graphe[j][i] = 1}} + Tu peux commencer par initialiser le tableau par + \mycenterline{\ci{graphe = [[0 for j in range(n)] for i in range(n)]}} + + Puis ajoute des commandes : + \mycenterline{\ci{graphe[i][j] = 1} \quad et \quad \ci{graphe[j][i] = 1}} N'oublie pas que si le sommet $i$ est relié au sommet $j$ par une arête, alors il faut mettre un $1$ en position $(i,j)$ mais aussi en position $(j,i)$. @@ -129,7 +137,7 @@ \objectifs{Objectifs : dessiner un graphe ! Activité facultative.} \begin{center} -\includegraphics[scale=0.4]{ecran-ramsey-2} +\includegraphics[scale=\myscale,scale=0.4]{ecran-ramsey-2} \end{center} Programme l'affichage graphique d'un graphe par une fonction \ci{afficher_graphe(graphe)}. @@ -228,13 +236,13 @@ \textbf{Sous-ensembles de cardinal fixé.} -On cherche seulement les sous-ensembles ayant un nombre $k$ fixés d'éléments. +On cherche seulement les sous-ensembles ayant un nombre $k$ fixé d'éléments. Exemples : \begin{itemize} \item Pour $n = 3$ et $k = 2$, les sous-ensembles à deux éléments contenus dans $E_3 = \{ 0,1,2 \}$ sont les trois paires : $\{0,1\}$, $\{0,2\}$, $\{1,2\}$. - \item Pour $n = 5$ et $k = 3$, les sous-ensembles à trois éléments contenu dans $E_5 = \{ 0,1,2,3,4 \}$ sont les $10$ triplets : + \item Pour $n = 5$ et $k = 3$, les sous-ensembles à trois éléments contenus dans $E_5 = \{ 0,1,2,3,4 \}$ sont les $10$ triplets : $\{0, 1, 2\}$, $\{0, 1, 3\}$, $\{0, 2, 3\}$, $\{1, 2, 3\}$, $\{0, 1, 4\}$, $\{0, 2, 4\}$, $\{1, 2, 4\}$, $\{0, 3, 4\}$, $\{1, 3, 4\}$, $\{2, 3, 4\}$. \end{itemize} @@ -294,8 +302,9 @@ \begin{enumerate} \item Programme la fonction \ci{sous_ensembles(n)} qui renvoie la liste de tous les sous-ensembles possibles de $E_n = \{0,1,2,\ldots,n-1\}$. - Par exemple, pour $n=3$, \ci{sous_ensembles(n)} renvoie la liste (qui contient elle-même des listes) :\\ -\centerline{\ci{[ [], [2], [1], [1, 2], [0], [0, 2], [0, 1], [0, 1, 2] ]}} + Par exemple, pour $n=3$, \ci{sous_ensembles(n)} renvoie la liste (qui contient elle-même des listes) : +\mycenterline{\ci{[ [], [2], [1], [1, 2], [0], [0, 2], [0, 1], [0, 1, 2] ]}} + C'est-à-dire les $8$ sous-ensembles (en commençant par l'ensemble vide) : $$\varnothing \quad \{2\}\quad \{1\}\quad \{1,2\}\quad \{0\}\quad \{0,2\}\quad \{0,1\}\quad \{0,1,2\}.$$ @@ -303,8 +312,8 @@ \item Déduis-en une fonction \ci{sous_ensembles_fixe(n,k)} qui renvoie seulement les sous-ensembles de $E_n$ ayant $k$ éléments. - Par exemple, pour $n=3$ et $k=2$, \ci{sous_ensembles_fixe(n,k)} renvoie la liste des paires :\\ -\centerline{\ci{[ [0, 1], [0, 2], [1, 2] ]}} + Par exemple, pour $n=3$ et $k=2$, \ci{sous_ensembles_fixe(n,k)} renvoie la liste des paires : +\mycenterline{\ci{[ [0, 1], [0, 2], [1, 2] ]}} Teste ton programme : \begin{itemize} @@ -350,7 +359,7 @@ \emph{Indications.} -Pour remplir un tableau à partir d'une écriture binaire \ci{b} donnée, tu peux utiliser une double boucle du type : +Pour remplir un tableau à partir d'une écriture binaire \ci{liste_binaire} donnée de $p$, tu peux utiliser une double boucle du type : \begin{lstlisting} for j in range(0,n): @@ -364,7 +373,7 @@ Cette boucle prend le dernier \emph{bit} de la liste et le place sur la première case libre au-dessus de la diagonale ; puis l'avant-dernier \emph{bit} est placé sur la seconde case libre\ldots ; le premier \emph{bit} de la liste remplit la dernière case libre. - \myfigure{0.7}{ + \myfigure{0.6}{ \tikzinput{fig-ramsey-5} } @@ -380,6 +389,7 @@ \end{activite} + \begin{activite}[Pour aller plus loin] \objectifs{Objectifs : améliorer ton programme et prouver d'autres conjectures. Activité facultative.} @@ -396,6 +406,7 @@ \item Tu peux seulement tester les graphes qui correspondent à $p$ entre $0$ et $2^{N}/2$ (car pour les $p$ suivants cela revient à échanger les segments verts en rouges et inversement). \end{itemize} +\medskip Avec ces conseils voici les temps de calcul auxquels tu peux t'attendre : \begin{center} diff --git a/sialors/pres-sialors.pdf b/sialors/pres-sialors.pdf new file mode 100644 index 0000000..f5fb5c2 Binary files /dev/null and b/sialors/pres-sialors.pdf differ diff --git a/sialors/pres-sialors.tex b/sialors/pres-sialors.tex new file mode 100644 index 0000000..1572e41 --- /dev/null +++ b/sialors/pres-sialors.tex @@ -0,0 +1,177 @@ +\documentclass[11pt,class=report,crop=false]{standalone} +\usepackage[screen]{../python} + +\pagestyle{empty} + +\begin{document} + + +%==================================================================== +\chapitre{Si ... alors ...} +%==================================================================== + + + +\mybox{ +\myfigure{0.7}{ + \tikzinput{fig-sialors-cours-1} +} } + +\newpage +\section*{Si ... alors ... sinon ...} + +\mybox{ +\myfigure{0.7}{ + \tikzinput{fig-sialors-cours-2} +} } + + +\newpage + + +\section*{Entrée au clavier} + + +\begin{itemize} + \item \ci{input()} met en pause l'exécution du programme et attend de l'utilisateur un texte + + \bigskip + + \item Cette commande renvoie une chaîne de caractères. + + \bigskip + + \item \ci{int}. Si on veut un entier, il faut convertir la chaîne. + + + Exemple. Si \ci{age_chaine} vaut \ci{"17"}, alors \ci{int(age_chaine)} vaut l'entier \ci{17}. + + + \bigskip + + \item \ci{float}. Si on veut un nombre flottant, il faut convertir la chaîne. + + + Exemple. Si \ci{pi_chaine} vaut \ci{"3.14"}, alors \ci{float(pi_chaine)} vaut le nombre flottant \ci{3.14}. + + \bigskip + + \item \ci{str} convertit un nombre en une chaîne. + + Exemple. \ci{str(17)} renvoie la chaîne \ci{"17"} ; si \ci{age = 17}, alors \ci{str(age)} renvoie également \ci{"17"}. +\end{itemize} + + +\newpage + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\section*{Le module \og{}random\fg{}} + +Le module \ci{random} génère des nombres comme s'ils étaient tirés au hasard. + + + \bigskip + +\begin{itemize} + \item En début du programme :\\ + \centerline{\ci{from random import *}} + + \bigskip + \item \ci{randint(a,b)}\index{randint@\ci{randint}} renvoie un entier au hasard compris entre $a$ et $b$. + + Exemple. \ci{n = randint(1,6)}, $n$ est un entier tiré au hasard avec $1 \le n \le 6$. + Si on recommence l'instruction \ci{n = randint(1,6)}, $n$ prend une nouvelle valeur. C'est comme si on effectuait le lancer d'un dé à $6$ faces. + + + \bigskip + \item \ci{random()} renvoie un nombre flottant compris entre $0$ et $1$. + + Exemple. Avec \ci{x = random()}, alors $x$ est un nombre flottant avec $0 \le x < 1$. +\end{itemize} + + + +\newpage + +\section*{Booléens} + + +\sauteligne +\begin{itemize} + \item Un \defi{booléen}\index{booleen@booléen} est une donnée qui vaut soit la valeur \og{}vrai\fg{}, soit la valeur \og{}faux\fg{}. En \Python{} les valeurs sont \ci{True}\index{true@\ci{True}} et \ci{False}\index{false@\ci{False}} (avec une majuscule). + + \bigskip + + \item On obtient un booléen par exemple comme résultat de la comparaison de deux nombres. + Par exemple \ci{7 < 4} vaut \ci{False} (car $7$ n'est pas plus petit que $4$). + Vérifie que \ci{print(7 < 4)} affiche \ci{False}. + +\end{itemize} + + \bigskip + \bigskip + + Voici les principales comparaisons : + \begin{itemize} + \item \textbf{Test d'égalité :}\quad \ci{a == b}\index{\ci{==}} + \item \textbf{Test inférieur strict :}\quad \ci{a < b} + \item \textbf{Test inférieur large :}\quad \ci{a <= b}\index{\ci{<=}} + \item \textbf{Test supérieur :}\quad \ci{a > b} \quad ou \quad \ci{a >= b}\index{\ci{>=}} + \item \textbf{Test non égalité :}\quad \ci{a != b}\index{\ci{"!}\ci{=}} + \end{itemize} + + Par exemple \ci{6*7 == 42} vaut \ci{True}. + + +\newpage + + \section*{Booléens} + + + + \mybox{ + \textbf{ATTENTION !} + L'erreur classique est de confondre \og{}\ci{a = b}\fg{} et \og{}\ci{a == b}\fg{}. + \begin{itemize} + \item \textbf{Affectation.} \ci{a = b} + met le contenu de la variable \ci{b} dans la variable \ci{a}. + \item \textbf{Test d'égalité.} \ci{a == b} teste si les contenus de \ci{a} et de \ci{b} sont égaux et vaut \ci{True} ou \ci{False}. + \end{itemize} + } + + +\newpage + + \section*{Booléens} + + \begin{itemize} + + \item On peut comparer autre chose que des nombres. Par exemple + \og{}\ci{car == "A"}\fg{} teste si la variable \ci{car} vaut \ci{"A"} ; \og{}\ci{il_pleut == True}\fg{} teste si la variable \ci{il_pleut} est vraie\ldots + + \bigskip + + \item Les booléens sont utiles dans le test \og{}si \ldots{} alors \ldots\fg{} et dans les boucles \og{}tant que \ldots{} alors \ldots\fg{}. + + \bigskip + + \item \textbf{Opérations entre les booléens.} + \index{operation logique@opération logique} + Si $P$ et $Q$ sont deux booléens, on peut définir de nouveaux booléens. + \begin{itemize} + \item \textbf{Et logique.}\index{et}\quad \og{}\ci{P and Q}\fg{}\index{and@\ci{and}} est vrai si et seulement si $P$ et $Q$ sont vrais. + \item \textbf{Ou logique.}\index{ou}\quad \og{}\ci{P or Q}\fg{}\index{or@\ci{or}} est vrai si et seulement si $P$ ou $Q$ est vrai. + \item \textbf{Négation.}\index{non}\quad \og{}\ci{not P}\fg{}\index{not@\ci{not}} est vrai si et seulement si $P$ est faux. + \end{itemize} + + \bigskip + + Exemple. \og{}\ci{(2+2 == 2*2) and (5 < 3)}\fg{} renvoie \ci{False}, car + même si on a bien $2+2 = 2 \times 2$, l'autre condition n'est pas remplie car $5 < 3$ est faux. + + +\end{itemize} + +\end{document} diff --git a/sialors/sialors.pdf b/sialors/sialors.pdf index e25220f..118a514 100644 Binary files a/sialors/sialors.pdf and b/sialors/sialors.pdf differ diff --git a/sialors/sialors.tex b/sialors/sialors.tex index 3ca5ca5..ca33d73 100644 --- a/sialors/sialors.tex +++ b/sialors/sialors.tex @@ -13,6 +13,15 @@ sinon il fait autre chose.} +\insertvideo{tjZQ64VjvaU}{Si ... alors ... - partie 1} + +\insertvideo{UlSmDST7zfk}{Si ... alors ... - partie 2 - entrée au clavier} + +\insertvideo{ll5RENiJZwU}{Hasard - Module random} + +\insertvideo{WNJRn4LbxXs}{Si ... alors ... - partie 3 - booléens} + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -29,7 +38,7 @@ Voici un exemple, qui avertit un conducteur si une variable \ci{vitesse} est trop grande. \begin{center} -\begin{minipage}{0.5\textwidth} +\begin{minipage}{0.7\textwidth} \begin{lstlisting} if vitesse > 110: print("Attention, tu roules trop vite.") @@ -74,7 +83,7 @@ Voici un petit programme qui demande le prénom et l'âge de l'utilisateur et affiche un message du style \og{}Bonjour Kevin\fg{} puis \og{}Tu es mineur/majeur !\fg{} selon l'âge. \begin{center} -\begin{minipage}{0.5\textwidth} +\begin{minipage}{0.6\textwidth} \begin{lstlisting} prenom = input("Comment t'appelles-tu ? ") print("Bonjour",prenom) @@ -116,8 +125,8 @@ Le module \ci{random} génère des nombres comme s'ils étaient tirés au hasard. \begin{itemize} - \item Voici la commande à placer au début du programme pour appeler ce module :\\ - \centerline{\ci{from random import *}} + \item Voici la commande à placer au début du programme pour appeler ce module : + \mycenterline{\ci{from random import *}} \item La commande \ci{randint(a,b)}\index{randint@\ci{randint}} renvoie un entier au hasard compris entre $a$ et $b$. @@ -151,17 +160,21 @@ \item Récupère la réponse de l'utilisateur et transforme-la en un entier. - \item Si la réponse est correcte affiche \og{}Bravo !\fg{}, sinon affiche \og{} Perdu ! La bonne réponse était \ldots\fg{}. + \item Si la réponse est correcte affiche \og{}Bravo !\fg{}, sinon affiche \og{}Perdu ! La bonne réponse était\ldots\fg{}. \end{itemize} \mybox{ -\textbf{Test d'égalité.} Pour tester si deux nombres $x$ et $y$ sont égaux, l'instruction est :\\ -\centerline{\ci{if x == y:}} +\begin{minipage}{0.95\textwidth} +\textbf{Test d'égalité.} Pour tester si deux nombres $x$ et $y$ sont égaux, l'instruction est : + +\mycenterline{\ci{if x == y:}} + Le test d'égalité s'écrit bien avec le double signe égal \og{}\ci{==}\fg{}. Par exemple \og{}\ci{x == 3}\fg{} renvoie \og{}vrai\fg{} si $x$ vaut $3$ et \og{}faux\fg{} sinon. Attention ! La commande \og{}\ci{x = 3}\fg{} n'a rien à voir, cette instruction stocke $3$ dans la variable $x$. +\end{minipage} } \end{activite} @@ -188,7 +201,7 @@ Voici le dessin que doit tracer la tortue lorsque \ci{mot} vaut \ci{"AagAgAdAgAAgaAA"}. \begin{center} -\includegraphics[scale=0.4]{ecran-sialors-2} +\includegraphics[scale=\myscale,scale=0.4]{ecran-sialors-2} \end{center} \emph{Indications.} @@ -236,6 +249,7 @@ \item ~\index{affectation}\index{=@\ci{=}} \mybox{ + \begin{minipage}{0.95\textwidth} \textbf{ATTENTION !} L'erreur classique est de confondre \og{}\ci{a = b}\fg{} et \og{}\ci{a == b}\fg{}. \begin{itemize} @@ -243,12 +257,13 @@ met le contenu de la variable \ci{b} dans la variable \ci{a}. \item \textbf{Test d'égalité.} \ci{a == b} teste si les contenus de \ci{a} et de \ci{b} sont égaux et vaut \ci{True} ou \ci{False}. \end{itemize} + \end{minipage} } \item On peut comparer autre chose que des nombres. Par exemple \og{}\ci{car == "A"}\fg{} teste si la variable \ci{car} vaut \ci{"A"} ; \og{}\ci{il_pleut == True}\fg{} teste si la variable \ci{il_pleut} est vraie\ldots - \item Les booléens sont utiles dans le test \og{}si \ldots alors \ldots\fg{} et dans les boucles \og{}tant que \ldots alors \ldots\fg{}. + \item Les booléens sont utiles dans le test \og{}si \ldots{} alors \ldots\fg{} et dans les boucles \og{}tant que \ldots{} alors \ldots\fg{}. \item \textbf{Opérations entre les booléens.} \index{operation logique@opération logique} @@ -322,7 +337,7 @@ On se donne trois longueurs $a$, $b$ et $c$. Tu vas déterminer les propriétés du triangle dont les longueurs seraient $a$, $b$, $c$. -\myfigure{1}{ +\myfigure{1.1}{ \tikzinput{fig-sialors-1} } @@ -350,7 +365,7 @@ \begin{itemize} \item La loi des cosinus permet de calculer un angle en fonction des longueurs : - \myfigure{1}{ + \myfigure{1.1}{ \tikzinput{fig-sialors-3} } @@ -368,10 +383,14 @@ \end{enumerate} + \smallskip + \objectifs{Trouve des exemples de longueurs $a,b,c$ pour illustrer les différentes propriétés.} \end{activite} +\bigskip +\bigskip %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Activité 5 @@ -390,7 +409,7 @@ \item L'ordinateur répond \og{}le nombre à trouver est plus grand\fg{} ou \og{}le nombre à trouver est plus petit\fg{} ou - \og{}bravo, c'est le bon nombre !\fg{} + \og{}bravo, c'est le bon nombre !\fg{}. \item Le joueur a sept tentatives pour trouver la bonne réponse. \end{itemize} diff --git a/sialors/sialors_5.py b/sialors/sialors_5.py index dd96004..1998527 100644 --- a/sialors/sialors_5.py +++ b/sialors/sialors_5.py @@ -24,9 +24,11 @@ if nb_mystere == reponse_int: print("Bravo !") break # Arrête la boucle - elif nb_mystere < reponse_int: + + if nb_mystere < reponse_int: print("Non, le nombre à trouver est plus petit !") - elif nb_mystere > reponse_int: + + if nb_mystere > reponse_int: print("Non, le nombre à trouver est plus grand !") # Lorsque c'est fini : @@ -55,12 +57,14 @@ # if nb_mystere == reponse_int: # print("Bravo !") # break # Arrête la boucle -# elif nb_mystere < reponse_int: +# +# if nb_mystere < reponse_int: # if verite == True: # print("Non, le nombre à trouver est plus petit !") # else: -# print("Non, le nombre à trouver est plus grand !") -# elif nb_mystere > reponse_int: +# print("Non, le nombre à trouver est plus grand !") +# +# if nb_mystere > reponse_int: # if verite == True: # print("Non, le nombre à trouver est plus grand !") # else: @@ -94,9 +98,9 @@ # if nb_mystere == reponse_int: # print("Bravo !") # break # Arrête la boucle -# elif nb_mystere < reponse_int: +# if nb_mystere < reponse_int: # print("Non, le nombre à trouver est plus petit !") -# elif nb_mystere > reponse_int: +# if nb_mystere > reponse_int: # print("Non, le nombre à trouver est plus grand !") # # Lorsque c'est fini : diff --git a/statistique/pres-statistique.pdf b/statistique/pres-statistique.pdf new file mode 100644 index 0000000..4aeb1a0 Binary files /dev/null and b/statistique/pres-statistique.pdf differ diff --git a/statistique/pres-statistique.tex b/statistique/pres-statistique.tex new file mode 100644 index 0000000..c66cb94 --- /dev/null +++ b/statistique/pres-statistique.tex @@ -0,0 +1,196 @@ +\documentclass[11pt,class=report,crop=false]{standalone} +\usepackage[screen]{../python} + +\pagestyle{empty} + +\begin{document} + +% Commande spécifique +\newcommand{\badletter}[1]{\underline{\textcolor{red}{#1}}} + + + +%==================================================================== +\chapitre{Statistique -- Visualisation de données} +%==================================================================== + +\newpage + + \section*{Somme} + + \begin{fonctionpython}[\ci{python : sum()}] + Usage : \ci{sum(liste)}\\ + Entrée : une liste de nombres\\ + Sortie : un nombre + + \medskip + + Exemple : \ci{sum([4,8,3])} renvoie \ci{15} + \end{fonctionpython} + +\newpage + \section*{Minimum/maximum} + + + \begin{fonctionpython}[\ci{python : min()}] + Usage : \ci{min(liste)} \ ou \ \ci{min(a,b)}\\ + Entrée : une liste de nombres ou bien deux nombres\\ + Sortie : un nombre + + \medskip + + Exemple : + \begin{itemize} + \item \ci{min(12,7)} renvoie \ci{7} + \item \ci{min([10,5,9,12])} renvoie \ci{5} + \end{itemize} + + \end{fonctionpython} + +\newpage + + \section*{Variance et écart-type} + + La \defi{variance}\index{variance} d'une série de données $(x_1,x_2,\ldots,x_n)$ est définie comme la moyenne des carrés des écarts à la moyenne. C'est-à-dire : + $$v = \frac{1}{n}\big((x_1-m)^2 + (x_2-m)^2 + \cdots + (x_n-m)^2\big)$$ + où $m$ est la moyenne de $(x_1,x_2,\ldots,x_n)$. + + \bigskip + + Par exemple, pour la série $(6,8,2,10)$, la moyenne est $m = 6.5$, la variance est + $$v = \frac{1}{4} \big((6-6.5)^2 + (8-6.5)^2 + (2-6.5)^2 + (10-6.5)^2\big) = 8.75$$ + + \bigskip + + \bigskip + + L'\defi{écart-type}\index{ecart-type@écart-type} d'une série $(x_1,x_2,\ldots,x_n)$ est la racine carrée de la variance : + $$e = \sqrt{v}$$ + où $v$ est la variance. + + \bigskip + Exemple : + $$e = \sqrt{v} = \sqrt{8.75} = 2.95\ldots $$ + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newpage + +\section*{Graphiques avec tkinter} + + +\myfigure{0.8}{ +\tikzinput{fig-stat-cours-intro} +} + + +\begin{itemize} + + \item \ci{create_rectangle(x1,y1,x2,y2)} + + \item \ci{create_oval(x1,y1,x2,y2)} + + \item \ci{create_text(x,y,text="Mon texte")} + +\end{itemize} + + +\newpage + +\section*{Tracer un arc} + +\centerline{\ci{create_arc(x1,y1,x2,y2,start=debut_angle,extent=mon_angle)}} + + +\myfigure{1}{ +\tikzinput{fig-stat-arc} +} + +L'option \ci{style=PIESLICE} affiche un secteur au lieu d'un arc. + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Activité 3 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +\newpage + +\section*{Diagramme en boîte} + + + + +\begin{center} +\includegraphics[scale=0.7]{ecran-stat-4} +\end{center} + +Un \defi{diagramme en boîte} (appelé aussi \defi{boîte à moustaches}) est un graphique qui représente les principales caractéristiques d'une série statistique : minimum, maximum, médiane et quartiles. Le schéma de principe est le suivant : + +\myfigure{0.45}{ + \tikzinput{fig-stat-boite} +} + +\newpage + + + +\section*{Médiane et quartiles} + + + Par définition, la moitié des valeurs est inférieure ou égale à la médiane, l'autre moitié est supérieure ou égale à la \defi{médiane}. + +\bigskip + + \emph{Rappels.} On note $n$ la longueur de la liste et on suppose que la liste est ordonnée (du plus petit au plus grand élément). + \begin{itemize} + \item \textbf{Cas $n$ impair.} La médiane est la valeur de la liste au rang $\frac{n-1}{2}$. + + Exemple avec \ci{liste = [12,12,14,15,19]} : + \begin{itemize} + \item la longueur de la liste est $n=5$ (les indices vont de $0$ à $4$), + \item l'indice du milieu est l'indice $2$, + \item la médiane est la valeur \ci{liste[2]}, c'est donc $14$. + \end{itemize} + + \item \textbf{Cas $n$ pair.} La médiane est la moyenne entre la valeur de la liste au rang $\frac{n}{2}-1$ et au rang $\frac{n}{2}$. + + Exemple avec \ci{liste = [13,14,19,20]} : + \begin{itemize} + \item la longueur de la liste est $n=4$ (les indices vont de $0$ à $3$), + \item les indices du milieu sont $1$ et $2$, + \item la médiane est la moyenne entre \ci{liste[1]} et \ci{liste[2]}, c'est donc $\frac{14+19}{2} = 16.5$. + \end{itemize} + \end{itemize} + + +\newpage + +\section*{Quartiles} + +Les quartiles\index{quartiles} répartissent les valeurs en : un quart en-dessous de $Q_1$, un quart entre $Q_1$ et $Q_2$, un quart entre $Q_2$ et $Q_3$, un quart au-dessus de $Q_3$. + Pour le calcul, on utilise que : + \begin{itemize} + \item $Q_2$ est simplement la médiane de la liste entière (supposée ordonnée), + \item $Q_1$ est la médiane de la sous-liste formée de la première moitié des valeurs, + \item $Q_3$ est la médiane de la sous-liste formée de la seconde moitié des valeurs. + \end{itemize} + + + +\newpage + +\section*{Effectifs} + +Les résultats d'une classe sont collectés sous la forme suivante d'un effectif par note : \\ + \centerline{\ci{effectif_notes = [0,0,0,0,0,1,0,2,0,1,5,1,2,3,2,4,1,2,0,1,0]}} + Le rang $i$ va de $0$ à $20$. Et la valeur au rang $i$ indique le nombre d'élèves ayant eu la note $i$. + + + Écris une fonction \ci{notes_vers_liste(effectif_notes)} qui prend en entrée un effectif de notes et renvoie la liste des notes. Pour notre exemple la fonction doit renvoyer \ci{[5,7,7,9,10,10,10,10,10,10,...]}. + + +\end{document} diff --git a/statistique/statistique.pdf b/statistique/statistique.pdf index f92f276..93d6038 100644 Binary files a/statistique/statistique.pdf and b/statistique/statistique.pdf differ diff --git a/statistique/statistique.tex b/statistique/statistique.tex index ad0ac3c..a6d3f03 100644 --- a/statistique/statistique.tex +++ b/statistique/statistique.tex @@ -17,6 +17,16 @@ \objectifs{C'est bien de savoir calculer le minimum, le maximum, la moyenne, les quartiles d'une série. C'est encore mieux de les visualiser tous sur un même graphique !} +\insertvideo{LfwCejyQrws}{Statistique - Visualisation de données - partie 1} + +\insertvideo{MB79YkqPpJc}{Statistique - Visualisation de données - partie 2} + +\insertvideo{xRJFmrD6G9o}{Statistique - Visualisation de données - partie 3} + +\insertvideo{sFqVEJFf8n4}{Graphiques avec tkinter} + +\insertvideo{DwQlqagVcyw}{Boutons avec tkinter} + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Activité 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -76,19 +86,23 @@ Écris une fonction \ci{variance(liste)} qui calcule la variance des éléments d'une liste. - Par exemple, pour la série $(6,8,2,10)$, la moyenne est $m = 8$, la variance est - $$v = \frac{1}{4} = \big((6-8)^2 + (8-8)^2 + (2-8)^2 + (10-8)^2\big) = 8.75.$$ + Par exemple, pour la série $(6,8,2,10)$, la moyenne est $m = 6.5$, la variance est + $$v = \frac{1}{4} \big((6-6.5)^2 + (8-6.5)^2 + (2-6.5)^2 + (10-6.5)^2\big) = 8.75.$$ \item L'\defi{écart-type}\index{ecart-type@écart-type} d'une série $(x_1,x_2,\ldots,x_n)$ est la racine carrée de la variance : $$e = \sqrt{v}$$ où $v$ est la variance. Programme une fonction \ci{ecart_type(liste)}. + Avec l'exemple ci-dessus on trouve $e = \sqrt{v} = \sqrt{8.75} = 2.95\ldots$ % La fonction racine carrée \ci{sqrt()} n'est pas disponible par défaut dans \Python. Pour l'utiliser, il faut appeler le module des fonctions mathématiques par la commande :\\ % \centerline{\ci{from math import *}} \item Voici les températures mensuelles moyennes à Brest et à Strasbourg. - \centerline{\ci{temp_brest = [6.4,6.5,8.5,9.7,11.9,14.6,15.9,16.3,15.1,12.2,9.2,7.1]}} - \centerline{\ci{temp_strasbourg = [0.9,2.4,6.1,9.7,13.8,17.2,19.2,18.6,15.7,10.7,5.3,2.1]}} + +{\small + \mycenterline{\ci{temp_brest = [6.4,6.5,8.5,9.7,11.9,14.6,15.9,16.3,15.1,12.2,9.2,7.1]}} + \mycenterline{\ci{temp_strasbourg = [0.9,2.4,6.1,9.7,13.8,17.2,19.2,18.6,15.7,10.7,5.3,2.1]}} +} Calcule la température moyenne sur l'année à Brest puis à Strasbourg. Calcule l'écart-type des températures à Brest puis à Strasbourg. Quelles conclusions en tires-tu ? @@ -111,7 +125,7 @@ Pour afficher ceci : \begin{center} -\includegraphics[scale=0.6]{ecran-stat-cours-intro} +\includegraphics[scale=\myscale,scale=0.6]{ecran-stat-cours-intro} \end{center} Le code est : \begin{lstlisting} @@ -156,7 +170,7 @@ \item Une ellipse est tracée par la commande \ci{create_oval(x1,y1,x2,y2)}, où $(x_1,y_1)$, $(x_2,y_2)$ sont les coordonnées de deux sommets opposés d'un rectangle encadrant l'ellipse voulue (voir la figure). On obtient un cercle lorsque le rectangle correspondant est un carré ! - \item Du texte est affiché par la commande \ci{canvas.create_text(x,y,text="Mon texte")} en précisant les coordonnées $(x,y)$ du point à partir duquel l'on souhaite afficher le texte. + \item Du texte est affiché par la commande \ci{canvas.create_text(x,y,text="Mon texte")} en précisant les coordonnées $(x,y)$ du point à partir duquel on souhaite afficher le texte. \end{itemize} @@ -176,16 +190,16 @@ \objectifs{Objectifs : visualiser des données par différents types de graphiques.} \begin{center} -\includegraphics[width=5cm]{ecran-stat-2a}\qquad\qquad -\includegraphics[height=5cm]{ecran-stat-2b} +\includegraphics[scale=\myscale,width=5cm]{ecran-stat-2a}\qquad\qquad +\includegraphics[scale=\myscale,height=5cm]{ecran-stat-2b} \qquad\qquad\textbf{Graphique en barres}\qquad\qquad\quad \textbf{Graphique cumulatif} \end{center} \begin{center} -\includegraphics[width=7cm]{ecran-stat-2c}\qquad\qquad -\includegraphics[width=4cm]{ecran-stat-2d} +\includegraphics[scale=\myscale,width=7cm]{ecran-stat-2c}\qquad\qquad +\includegraphics[scale=\myscale,width=4cm]{ecran-stat-2d} \qquad\qquad\textbf{Graphique en pourcentage}\qquad\qquad\qquad \textbf{Graphique en secteurs} @@ -221,8 +235,7 @@ La fonction \ci{create_arc()}, qui permet de dessiner des arcs de cercles, n'est pas très intuitive. Il faut penser que l'on dessine un cercle, en précisant les coordonnées des coins d'un carré qui l'entoure, puis en précisant l'angle de début et l'angle du secteur (en degrés). - -\centerline{\ci{canvas.create_arc(x1,y1,x2,y2,start=debut_angle,extent=mon_angle)}} +\mycenterline{\ci{canvas.create_arc(x1,y1,x2,y2,start=debut_angle,extent=mon_angle)}} \myfigure{1}{ @@ -234,7 +247,7 @@ \item \textbf{Bonus.} Rassemble ton travail en un programme qui laisse la possibilité à l'utilisateur de choisir le diagramme qu'il souhaite en cliquant sur des boutons, et aussi la possibilité d'obtenir une nouvelle série aléatoire de données. \emph{Pour afficher et gérer les boutons avec \ci{tkinter}, vois le cours ci-dessous.} \begin{center} -\includegraphics[scale=0.4]{ecran-stat-2e} +\includegraphics[scale=\myscale,scale=0.4]{ecran-stat-2e} \end{center} \end{enumerate} \end{activite} @@ -251,7 +264,7 @@ Voici la fenêtre d'un petit programme avec deux boutons. Le premier bouton change la couleur du rectangle, le second termine le programme. \begin{center} -\includegraphics[scale=0.6]{ecran-stat-cours-boutons} +\includegraphics[scale=\myscale,scale=0.6]{ecran-stat-cours-boutons} \end{center} Le code est : \begin{lstlisting} @@ -264,15 +277,15 @@ def action_bouton(): canvas.delete("all") # Efface tout - couleurs = ["red","orange","yellow","green","cyan","blue","violet","purple"] + couleurs = ["red","orange","yellow","green","cyan","blue","violet"] coul = choice(couleurs) # Couleur au hasard canvas.create_rectangle(100,50,300,150,width=5,fill=coul) return -bouton_couleur = Button(root,text="Afficher", width=20, command=action_bouton) +bouton_couleur=Button(root,text="Afficher",width=20,command=action_bouton) bouton_couleur.pack() -bouton_quitter = Button(root,text="Quitter", width=20, command=root.quit) +bouton_quitter=Button(root,text="Quitter",width=20,command=root.quit) bouton_quitter.pack() root.mainloop() @@ -283,7 +296,7 @@ \item On crée un bouton par la commande \ci{Button}. L'option \ci{text} personnalise le texte qui s'affiche sur le bouton. On ajoute le bouton créé à la fenêtre par la méthode \ci{pack}. \item Le plus important est l'action associée au bouton ! C'est l'option \ci{command} qui reçoit le nom de la fonction à exécuter lorsque le bouton est cliqué. Pour notre exemple \ci{command=action_bouton}, associe au clic sur le bouton un changement de couleur. - \item Attention ! il faut donner le nom de la fonction sans parenthèses : \ci{commande=ma_fonction} et pas \ci{command=ma_fonction()}. + \item Attention ! il faut donner le nom de la fonction sans parenthèses : \ci{command=ma_fonction} et pas \ci{command=ma_fonction()}. \item Pour associer au bouton \og{}Quitter\fg{} la fermeture du programme, l'argument est \ci{command=root.quit}. @@ -321,7 +334,7 @@ \end{itemize} \item \textbf{Cas $n$ pair.} La médiane est la moyenne entre la valeur de la liste au rang $\frac{n}{2}-1$ et au rang $\frac{n}{2}$. - Exemple avec \ci{liste = [13,14,19,20]} : + Exemple avec \ci{liste = [10,14,19,20]} : \begin{itemize} \item la longueur de la liste est $n=4$ (les indices vont de $0$ à $3$), \item les indices du milieu sont $1$ et $2$, @@ -332,8 +345,9 @@ - \item Les résultats d'une classe sont collectés sous la forme suivante d'un effectif par note : \\ - \centerline{\ci{effectif_notes = [0,0,0,0,0,1,0,2,0,1,5,1,2,3,2,4,1,2,0,1,0]}} + \item Les résultats d'une classe sont collectés sous la forme suivante d'un effectif par note : + \mycenterline{\ci{effectif_notes = [0,0,0,0,0,1,0,2,0,1,5,1,2,3,2,4,1,2,0,1,0]}} + Le rang $i$ va de $0$ à $20$. Et la valeur au rang $i$ indique le nombre d'élèves ayant eu la note $i$. Par exemple ici, $1$ élève a eu la note $5$, $2$ élèves ont eu la note $7$,\ldots , $5$ élèves ont obtenus $10$, \ldots{} Écris une fonction \ci{notes_vers_liste(effectif_notes)} qui prend en entrée un effectif de notes et renvoie la liste des notes. Pour notre exemple la fonction doit renvoyer \ci{[5,7,7,9,10,10,10,10,10,10,...]}. @@ -365,14 +379,15 @@ \objectifs{Objectifs : tracer des diagrammes en boîte.} Un \defi{diagramme en boîte} (appelé aussi \defi{boîte à moustaches}) est un graphique qui représente les principales caractéristiques d'une série statistique : minimum, maximum, médiane et quartiles. Le schéma de principe est le suivant : -\myfigure{0.5}{ + +\myfigure{0.45}{ \tikzinput{fig-stat-boite} } Écris une fonction \ci{diagramme_boite(effectif_notes)} qui trace le diagramme en boîte des notes d'une classe à partir d'un effectif par note (voir l'activité précédente). \begin{center} -\includegraphics[scale=0.9]{ecran-stat-4} +\includegraphics[scale=\myscale,scale=0.7]{ecran-stat-4} \end{center} \end{activite} @@ -391,18 +406,18 @@ \begin{enumerate} \item Simule le cours de la bourse de l'indice \emph{Top 40} sur 365 jours. - Au jour $j=0$, l'indice vaut $1000$. Ensuite l'indice d'un jour est déterminé en ajoutant une valeur au hasard (positive ou négative) à la valeur de l'indice de la veille :\\ - \centerline{indice du jour $j$ = indice du jour $(j-1)$ \ + \ valeur au hasard}. + Au jour $j=0$, l'indice vaut $1000$. Ensuite l'indice d'un jour est déterminé en ajoutant une valeur au hasard (positive ou négative) à la valeur de l'indice de la veille : + \mycenterline{indice du jour $j$ = indice du jour $(j-1)$ \ + \ valeur au hasard}. - Pour cette valeur au hasard, tu peux essayer une formule du style :\\ - \centerline{\ci{valeur = randint(-10,12)/3}} + Pour cette valeur au hasard, tu peux essayer une formule du style : + \mycenterline{\ci{valeur = randint(-10,12)/3}} Écris une fonction \ci{cours_bourse()}, sans paramètre, qui renvoie une liste de $365$ valeurs de l'indice \emph{Top 40} selon cette méthode. \item Trace point par point la courbe du cours sur une année. (Pour tracer un point, tu peux afficher un carré de taille $1$ pixel.) \begin{center} -\includegraphics[scale=0.8]{ecran-stat-5a} +\includegraphics[scale=\myscale,scale=0.7]{ecran-stat-5a} \end{center} \item \emph{Comme la courbe du cours journalier est très chaotique, nous souhaitons la lisser afin de la rendre plus lisible. Pour cela nous calculons des moyennes mobiles.} @@ -411,10 +426,10 @@ Écris une fonction \ci{moyenne_mobile(liste,duree)} qui renvoie la liste de toutes les moyennes mobiles d'une série de données, pour une durée fixée. - \item Trace point par point sur un même graphique : la courbe du cours sur une année (en rouge ci-dessous), la courbe de ses moyennes mobiles à $7$ jours (en bleu ci-dessous) et la courbe des ses moyennes mobiles à $30$ jours (en marron ci-dessous). Note que plus la durée est longue plus la courbe est \og{}lisse\fg{}. (Bien sûr la courbe des moyennes mobiles à $30$ jours ne commence qu'à partir du trentième jour.) + \item Trace point par point sur un même graphique : la courbe du cours sur une année\couleurnb{ (en rouge ci-dessous)}{}, la courbe de ses moyennes mobiles à $7$ jours\couleurnb{ (en bleu ci-dessous)}{} et la courbe des ses moyennes mobiles à $30$ jours\couleurnb{ (en marron ci-dessous)}{}. Note que plus la durée est longue plus la courbe est \og{}lisse\fg{}. (Bien sûr la courbe des moyennes mobiles à $30$ jours ne commence qu'à partir du trentième jour.) \begin{center} -\includegraphics[scale=0.8]{ecran-stat-5b} +\includegraphics[scale=\myscale,scale=0.7]{ecran-stat-5b} \end{center} \end{enumerate} diff --git a/tantque/pres-tantque-1.pdf b/tantque/pres-tantque-1.pdf new file mode 100644 index 0000000..09a2edd Binary files /dev/null and b/tantque/pres-tantque-1.pdf differ diff --git a/tantque/pres-tantque-1.tex b/tantque/pres-tantque-1.tex new file mode 100644 index 0000000..acca023 --- /dev/null +++ b/tantque/pres-tantque-1.tex @@ -0,0 +1,396 @@ +\documentclass[11pt,class=report,crop=false]{standalone} +\usepackage[screen]{../python} + +\pagestyle{empty} + +\begin{document} + + +%==================================================================== +\chapitre{Arithmétique -- Boucle tant que -- I} +%==================================================================== + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% \section*{Arithmétique} + +\index{division euclidienne} +\index{quotient} +\index{reste} +\index{modulo} +\index{\ci{//}} +\index{\ci{\%}} + +\vspace*{-1cm} + +\myfigure{1}{ +\tikzinput{fig-tantque} +} + +On a les deux propriétés fondamentales qui définissent $q$ et $r$ : +$$a = b \times q + r \qquad \text{ et } \qquad 0 \le r < b$$ + +\bigskip + +Exemple : division de $a=100$ par $b=7$ : on a le quotient $q=14$ et le reste $r=2$ qui vérifient bien $a = b \times q + r$ car $100 = 7 \times 14 + 2$ et aussi $r= 0: + print(n) + n = n - 1 +\end{lstlisting} +\end{minipage} + +On résume ceci sous la forme d'un tableau : + $$ + \begin{array}{l} + \text{Entrée : $n=10$} \\ + \begin{array}{|c|c|c|} + \hline + n & \text{\og $n\ge0$ \fg{} ?} & \text{nouvelle valeur de } n \\ + \hline\hline + 10 & \text{oui} & 9 \\ + 9 & \text{oui} & 8 \\ + \ldots & \ldots & \ldots \\ + 1 & \text{oui} & 0 \\ + 0 & \text{oui} & -1 \\ + -1 & \text{non} & \\ + \hline + \end{array} \\ + \text{Affichage : $10,9,8,7,6,5,4,3,2,1,0$} + \end{array} + $$ + +\end{exemple} + + +\begin{exemple} +\begin{minipage}{0.55\textwidth} +Ce bout de code cherche la première puissance de $2$ plus grande qu'un entier $n$ donné. +La boucle fait prendre à $p$ les valeurs $2$, $4$, $8$, $16$,\ldots{} Elle s'arrête dès que la puissance de $2$ est supérieure ou égale à $n$, donc ici ce programme affiche $128$. +\end{minipage}\qquad\qquad +\begin{minipage}{0.4\textwidth} +\begin{lstlisting} +n = 100 +p = 1 +while p < n: + p = 2 * p +print(p) +\end{lstlisting} +\end{minipage} + + $$ + \begin{array}{l} + \text{Entrées : $n=100$, $p=1$} \\ + \begin{array}{|c|c|c|} + \hline + p & \text{\og $p < n$ \fg{} ?} & \text{nouvelle valeur de } p \\ + \hline\hline + 1 & \text{oui} & 2 \\ + 2 & \text{oui} & 4 \\ + 4 & \text{oui} & 8 \\ + 8 & \text{oui} & 16 \\ + 16 & \text{oui} & 32 \\ + 32 & \text{oui} & 64 \\ + 64 & \text{oui} & 128 \\ + 128 & \text{non} & \\ + \hline + \end{array} \\ + \text{Affichage : $128$} + \end{array} + $$ + +\end{exemple} + + +\begin{exemple} +\begin{minipage}{0.55\textwidth} +Pour cette dernière boucle on a déjà programmé une fonction \ci{est_pair(n)} qui renvoie \ci{True} si l'entier $n$ est pair et \ci{False} sinon. La boucle fait donc ceci : tant que l'entier $n$ est pair, $n$ devient $n/2$. Cela revient à supprimer tous les facteurs $2$ de l'entier $n$. Comme ici $n = 56 = 2\times 2 \times 2 \times 7$, ce programme affiche $7$. +\end{minipage}\qquad\qquad +\begin{minipage}{0.4\textwidth} +\begin{lstlisting} +n = 56 +while est_pair(n) == True: + n = n // 2 +print(n) +\end{lstlisting} + + + +\end{minipage} + + $$ + \begin{array}{l} + \text{Entrée : $n=56$} \\ + \begin{array}{|c|c|c|} + \hline + n & \text{\og $n$ est pair \fg{} ?} & \text{nouvelle valeur de } n \\ + \hline\hline + 56 & \text{oui} & 28 \\ + 28 & \text{oui} & 14 \\ + 14 & \text{oui} & 7 \\ + 7 & \text{non} & \\ + \hline + \end{array} \\ + \text{Affichage : $7$} + \end{array} + $$ +\medskip + +Pour ce dernier exemple il est beaucoup plus naturel de démarrer la boucle par\\ +\centerline{\ci{while est_pair(n):}} +En effet \ci{est_pair(n)} est déjà une valeur \og{}vrai\fg{} ou \ci{}faux\fg{}. +On se rapproche d'une phrase \og{}tant que $n$ est pair...\fg{} + +\end{exemple} + + +\textbf{Opération \og{}\ci{+=}\fg{}.} +\index{+=@\ci{+=}} +Pour incrémenter un nombre tu peux utiliser ces deux méthodes :\\ +\centerline{\ci{nb = nb + 1} \qquad ou \qquad \ci{nb += 1}} +La seconde écriture est plus courte mais rend le programme moins lisible. +\end{cours} + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Activité 2 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +\begin{activite}[Nombres premiers] + +\objectifs{Objectifs : tester si un entier est (ou pas) un nombre premier.} + +\index{diviseur} +\index{nombre premier} + +\begin{enumerate} + \item \textbf{Plus petit diviseur.} + + Programme une fonction \ci{plus_petit_diviseur(n)} qui renvoie, le plus petit diviseur $d\ge2$ de l'entier $n\ge2$. + + Par exemple \ci{plus_petit_diviseur(91)} renvoie $7$, car $91 = 7 \times 13$. + + \textbf{Méthode.} + \begin{itemize} + \item On rappelle que $d$ divise $n$ si et seulement si \ci{n \% d} vaut $0$. + \item La mauvaise idée est d'utiliser une boucle \og{}pour $d$ variant de $2$ à $n$\fg{}. En effet, si par exemple on sait que $7$ est diviseur de $91$ cela ne sert à rien de tester si $8,9,10\ldots$ sont aussi des diviseurs car on a déjà trouvé le plus petit. + + \item La bonne idée est d'utiliser une boucle \og{}tant que\fg{} ! + Le principe est : \og{}tant que je n'ai pas obtenu mon diviseur, je continue de chercher\fg{}. (Et donc, dès que je l'ai trouvé, j'arrête de chercher.) + + \item En pratique voici les grandes lignes : + \begin{itemize} + \item Commence avec $d=2$. + \item Tant que $d$ ne divise pas $n$ alors, passe au candidat suivant ($d$ devient $d+1$). + \item À la fin $d$ est le plus petit diviseur de $n$ (dans le pire des cas $d=n$). + \end{itemize} + \end{itemize} + + + \item \textbf{Nombres premiers (1).} + + Modifie légèrement ta fonction \ci{plus_petit_diviseur(n)} pour écrire une première fonction \ci{est_premier_1(n)} qui renvoie \og{}vrai\fg{} (\ci{True}) si $n$ est un nombre premier et \og{}faux\fg{} (\ci{False}) sinon. + + Par exemple \ci{est_premier_1(13)} renvoie \ci{True}, \ci{est_premier_1(14)} renvoie \ci{False}. + + \item \textbf{Nombres de Fermat.} + + Pierre de Fermat ($\sim$1605--1665) pensait que tous les entiers $F_n = 2^{(2^n)}+1$ étaient des nombres premiers. Effectivement $F_0=3$, $F_1=5$ et $F_2=17$ + sont des nombres premiers. S'il avait connu \Python{} il aurait sûrement changé d'avis ! Trouve le plus petit entier $F_n$ qui n'est pas premier. + + \emph{Indication.} Avec \Python{} $b^c$ s'écrit \ci{b ** c} et donc + $a^{(b^c)}$ s'écrit \ci{a ** (b ** c)}. + + \medskip + + \emph{On va améliorer notre fonction qui teste si un nombre est premier ou pas, cela nous permettra de tester plus vite plein de nombres ou bien des nombres très grands.} + + \item \textbf{Nombres premiers (2).} + + Améliore ta fonction en une fonction \ci{est_premier_2(n)} qui ne teste pas tous les diviseurs $d$ jusqu'à $n$, mais seulement jusqu'à $\sqrt{n}$. + + \emph{Explications.} + \begin{itemize} + \item Par exemple pour tester si $101$ est un nombre premier, il suffit de voir s'il admet des diviseurs parmi $2,3,\ldots,10$. Le gain est appréciable ! + + \item Cette amélioration est due à la proposition suivante : si un entier n'est pas premier alors il admet un diviseurs $d$ qui vérifie $2 \le d \le \sqrt{n}$. + + \item Au lieu de tester si $d \le \sqrt{n}$, il est plus facile de tester $d^2 \le n$ ! + \end{itemize} + + + \item \textbf{Nombres premiers (3).} + + Améliore ta fonction en une fonction \ci{est_premier_3(n)} à l'aide de l'idée suivante. On teste si $d=2$ divise $n$, mais à partir de $d=3$, il suffit de tester les diviseurs impairs (on teste $d$, puis $d+2$\ldots). + + \begin{itemize} + \item Par exemple pour tester si $n = 419$ est un nombre premier, on teste d'abord si $d=2$ divise $n$, puis $d=3$ et ensuite $d=5$, $d=7$\ldots + \item Cela permet de faire environ deux fois moins de tests ! + \item Explications : si un nombre pair $d$ divise $n$, alors on sait déjà que $2$ divise $n$. + \end{itemize} + + + \item \textbf{Temps de calcul.} + + Compare les temps de calcul de tes différentes fonctions \ci{est_premier()} en répétant par exemple un million de fois l'appel \ci{est_premier(97)}. Voir le cours ci-dessous pour savoir comment faire. +\end{enumerate} + +\end{activite} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{cours}[Temps de calcul] + +Il existe deux façons de faire tourner plus rapidement des programmes : une bonne et une mauvaise. La mauvaise, c'est d'acheter un ordinateur plus puissant. +La bonne, c'est de trouver un algorithme plus efficace ! + +Avec \Python, c'est facile de mesurer le temps d'exécution d'une fonction afin de le comparer avec le temps d'exécution d'une autre. Il suffit d'utiliser le module \ci{timeit}. + +\index{module!timeit@\ci{timeit}} +\index{timeit@\ci{timeit}} +\index{temps de calcul} + +Voici un exemple : on mesure le temps de calcul de deux fonctions qui ont le même but, tester si un entier $n$ est divisible par $7$. + +\begin{lstlisting} +# Première fonction (pas très maligne) +def ma_fonction_1(n): + divis = False + for k in range(n): + if k*7 == n: + divis = True + return divis + +# Seconde fonction (plus rapide) +def ma_fonction_2(n): + if n % 7 == 0: + return True + else: + return False + +import timeit + +print(timeit.timeit("ma_fonction_1(1000)", + setup="from __main__ import ma_fonction_1", + number=100000)) +print(timeit.timeit("ma_fonction_2(1000)", + setup="from __main__ import ma_fonction_2", + number=100000)) +\end{lstlisting} + +\textbf{Résultats.} \\ +Le résultat dépend de l'ordinateur, mais permet la comparaison des temps d'exécution des deux fonctions. +\begin{itemize} + \item La mesure pour la première fonction renvoie $5$ secondes. L'algorithme n'est pas très malin. On teste + si $7\times 1 =n$, puis on teste $7\times 2 = n$, $7\times 3 = n$\ldots + + \item La mesure pour la seconde fonction renvoie $0.01$ seconde ! On teste si le reste de $n$ divisé par $7$ est $0$. La seconde méthode est donc $500$ fois plus rapide que la première. +\end{itemize} + +\textbf{Explications.} +\begin{itemize} + \item On appelle le module \ci{timeit}. + + \item La fonction \ci{timeit.timeit()} renvoie le temps d'exécution en seconde. +Elle prend comme paramètres : + \begin{itemize} + \item une chaîne pour l'appel de la fonction à tester (ici est-ce que $1000$ est divisible par $7$), + \item un argument \ci{setup="..."} qui indique où trouver cette fonction, + \item le nombre de fois qu'il faut répéter l'appel à la fonction (ici \ci{number=100000}). + \end{itemize} + \item Il faut que le nombre de répétitions soit assez grand pour éviter les incertitudes. +\end{itemize} + +\end{cours} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Activité 3 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\begin{activite}[Plus de nombres premiers] + +\objectifs{Objectifs : programmer davantage de boucles \og{}tant que\fg{} et étudier différentes sortes de nombres premiers à l'aide de ta fonction \ci{est_premier()}.} + +\begin{enumerate} + \item Écris une fonction \ci{nombre_premier_apres(n)} qui renvoie le premier nombre premier $p$ supérieur ou égal à $n$. + + Par exemple, le premier nombre premier après $n=60$ est $p=61$. + Quel est le premier nombre premier après $n=100\,000$ ? + + \item Deux nombres premiers $p$ et $p+2$ sont appelés \defi{nombres premiers jumeaux}. Écris une fonction \ci{nombres_jumeaux_apres(n)} qui renvoie le premier couple $p$, $p+2$ de nombres premiers jumeaux, avec $p \ge n$. + + Par exemple, le premier couple de nombres premiers jumeaux après $n=60$ est $p=71$ et $p+2=73$. + Quel est le premier couple de nombres premiers jumeaux après $n=100\,000$ ? + + \item Un entier $p$ est un \defi{nombre premier de Germain} si $p$ et $2p+1$ sont des nombres premiers. Écris une fonction \ci{nombre_germain_apres(n)} qui renvoie le couple $p$, $2p+1$ où $p$ est le premier nombre premier de Germain $p \ge n$. + + Par exemple, le premier nombre premier de Germain après $n=60$ est $p=83$ avec $2p+1=167$. + Quel est le premier nombre premier de Germain après $n=100\,000$ ? + +\end{enumerate} + +\end{activite} + + +\end{document} diff --git a/tantque/tantque-1.pdf b/tantque/tantque-1.pdf index 8775f54..7d5ceb7 100644 Binary files a/tantque/tantque-1.pdf and b/tantque/tantque-1.pdf differ diff --git a/tantque/tantque-1.tex b/tantque/tantque-1.tex index c475de8..0c3ec4f 100644 --- a/tantque/tantque-1.tex +++ b/tantque/tantque-1.tex @@ -10,6 +10,14 @@ \objectifs{Les activités de cette fiche sont centrées sur l'arithmétique : division euclidienne, nombres premiers\ldots{} C'est l'occasion d'utiliser intensivement la boucle \og{}tant que\fg{}.} +\insertvideo{Qa9eSV4wB_s}{Arithmétique - Quotient et reste} + +\insertvideo{2Xxty4oaHBs}{Boucle tant que I - partie 1} + +\insertvideo{NRvv1odnoIU}{Boucle tant que I - partie 2} + +\insertvideo{l5Pm1EdxWsQ}{Temps de calcul - Module timeit} + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -42,8 +50,8 @@ \end{itemize} } -Il est facile de vérifier que :\\ -\centerline{$b$ est un diviseur de $a$ si et seulement si $r=0$.} +Il est facile de vérifier que : +\mycenterline{$b$ est un diviseur de $a$ si et seulement si $r=0$.} \end{cours} @@ -72,7 +80,7 @@ Le quotient vaut q = 14 Le reste vaut r = 2 Vérification reste 0 <= r < b ? True -Vérification égalite a = bq + r ? True +Vérification égalité a = bq + r ? True \end{lstlisting} \emph{Remarque.} il faut que tu vérifies sans tricher que l'on a bien $0 \le r= n: + if i**2 > n: break print(i-1) \end{lstlisting} @@ -305,7 +314,7 @@ # Mieux n = 777 i = 0 -while (i**2 < n) and (i < 100): +while i**2 <= n: i = i + 1 print(i-1) \end{lstlisting} @@ -326,7 +335,7 @@ break print(sqrt(element)) \end{lstlisting} -\end{minipage}\qquad\qquad +\end{minipage}\qquad \begin{minipage}{0.4\textwidth} \begin{lstlisting} # Mieux avec try/except diff --git a/tantque/tantque_2.py b/tantque/tantque_2.py index cb77c29..8f57a70 100644 --- a/tantque/tantque_2.py +++ b/tantque/tantque_2.py @@ -118,7 +118,7 @@ def est_premier_3(n): ## Question 5 ## -# Calcul les temps d'éxécution moyens des différents fonction est_premier() +# Calcul les temps d'éxécution des différentes fonctions est_premier() import timeit print(timeit.timeit("est_premier_1(97)", setup="from __main__ import est_premier_1", number=10000)) diff --git a/tantque/tantque_cours_2.py b/tantque/tantque_cours_2.py index 6525915..1bc4375 100644 --- a/tantque/tantque_cours_2.py +++ b/tantque/tantque_cours_2.py @@ -42,7 +42,7 @@ # Racine carrée entière n = 777 for i in range(100): - if i**2 >= n: + if i**2 > n: break print(i-1) @@ -50,7 +50,7 @@ # Mieux n = 777 i = 0 -while (i**2 < n) and (i < 100): +while i**2 <= n: i = i + 1 print(i-1) @@ -82,4 +82,4 @@ - \ No newline at end of file + diff --git a/tantque/tantque_cours_timeit.py b/tantque/tantque_cours_timeit.py index f9f3e52..e333c8c 100644 --- a/tantque/tantque_cours_timeit.py +++ b/tantque/tantque_cours_timeit.py @@ -1,4 +1,4 @@ -# Premiere fonction (pas tres maligne) +# Première fonction (pas très maligne) def ma_fonction_1(n): divis = False for k in range(n): @@ -13,7 +13,7 @@ def ma_fonction_2(n): else: return False - +# Mesure des temps d'exécution import timeit print(timeit.timeit("ma_fonction_1(1000)", diff --git a/tortue/pres-tortue.pdf b/tortue/pres-tortue.pdf new file mode 100644 index 0000000..3fb72e6 Binary files /dev/null and b/tortue/pres-tortue.pdf differ diff --git a/tortue/pres-tortue.tex b/tortue/pres-tortue.tex new file mode 100644 index 0000000..f67cd88 --- /dev/null +++ b/tortue/pres-tortue.tex @@ -0,0 +1,52 @@ +\documentclass[12pt,class=report,crop=false]{standalone} +\usepackage[screen]{../python} + +\pagestyle{empty} +\begin{document} + + +%==================================================================== +\chapitre{Tortue (Scratch avec Python)} +%==================================================================== + + + +\centerline{\ci{from turtle import *}} + +\bigskip +\bigskip + +\begin{itemize} + \item \ci{forward(longueur)}\index{forward@\ci{forward}} avance d'un certain nombre de pas + \item \ci{backward(longueur)} recule + \item \ci{right(angle)}\index{right@\ci{right}} tourne vers la droite (sans avancer) selon un angle donné en degrés + \item \ci{left(angle)}\index{left@\ci{left}} tourne vers la gauche + \item \ci{setheading(direction)} s'oriente dans une direction ($0$ = droite, $90$ = haut, $-90$ = bas, $180$ = gauche) + \item \ci{goto(x,y)}\index{goto@\ci{goto}} se déplace jusqu'au point $(x,y)$ + \item \ci{setx(newx)} change la valeur de l'abscisse + \item \ci{sety(newy)} change la valeur de l'ordonnée + + + \item \ci{down()}\index{down@\ci{down}} abaisse le stylo + \item \ci{up()}\index{up@\ci{up}} relève le stylo + \item \ci{width(epaisseur)} change l'épaisseur du trait + \item \ci{color(couleur)} change la couleur : \ci{"red"}, \ci{"green"}, \ci{"blue"}, \ci{"orange"}, \ci{"purple"},\ldots + + \item \ci{position()} renvoie la position $(x,y)$ de la tortue + \item \ci{heading()} renvoie la direction \ci{angle} vers laquelle pointe la tortue + \item \ci{towards(x,y)} renvoie l'angle entre l'horizontale et le segment commençant à la tortue et finissant au point $(x,y)$ + \item \ci{exitonclick()} termine le programme dès que l'on clique +\end{itemize} + +\newpage + + +Les coordonnées de l'écran par défaut vont de $-475$ à $+475$ pour les $x$ et +de $-400$ à $+400$ pour les $y$ ; $(0,0)$ est au centre de l'écran. + +\myfigure{0.9}{ + \tikzinput{coord} +} + + +\end{document} diff --git a/tortue/tortue.pdf b/tortue/tortue.pdf index 3664cc2..aef51df 100644 Binary files a/tortue/tortue.pdf and b/tortue/tortue.pdf differ diff --git a/tortue/tortue.tex b/tortue/tortue.tex index 83f69f0..65ea90c 100644 --- a/tortue/tortue.tex +++ b/tortue/tortue.tex @@ -12,6 +12,11 @@ permet de tracer facilement des dessins en \Python{}. Il s'agit de commander une tortue à l'aide d'instructions simples comme \og{}avancer\fg{}, \og{}tourner\fg{}\ldots{} C'est le même principe qu'avec \emph{Scratch}, avec toutefois des différences : tu ne déplaces plus des blocs, mais tu écris les instructions ; et en plus les instructions sont en anglais !} +\insertvideo{OpJb6ur4JAk}{Tortue - partie 1} + +\insertvideo{7Fb_FOp5NGs}{Tortue - partie 2} + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -39,11 +44,11 @@ \end{lstlisting} \begin{center} -\includegraphics[scale=0.6]{ecran-tortue-0} +\includegraphics[scale=\myscale,scale=0.6]{ecran-tortue-0} \end{center} -Voici une liste des principales commandes, accessibles après avoir écrit :\\ -\centerline{\ci{from turtle import *}} +Voici une liste des principales commandes, accessibles après avoir écrit : +\mycenterline{\ci{from turtle import *}} \begin{itemize} \item \ci{forward(longueur)}\index{forward@\ci{forward}} avance d'un certain nombre de pas @@ -59,7 +64,7 @@ \item \ci{down()}\index{down@\ci{down}} abaisse le stylo \item \ci{up()}\index{up@\ci{up}} relève le stylo \item \ci{width(epaisseur)} change l'épaisseur du trait - \item \ci{color(couleur)} change la couleur : \ci{"red"}, \ci{"green"}, \ci{"blue"}, \ci{"orange"}, \ci{"purple"},\ldots + \item \ci{color(couleur)} change la couleur : \ci{"red"}, \ci{"green"}, \ci{"blue"}, \ci{"orange"}, \ci{"purple"}\ldots \item \ci{position()} renvoie la position $(x,y)$ de la tortue \item \ci{heading()} renvoie la direction \ci{angle} vers laquelle pointe la tortue @@ -88,7 +93,7 @@ Trace les premières lettres de \Python{}, par exemple comme ci-dessous. \begin{center} -\includegraphics[scale=0.4]{ecran-tortue-1} +\includegraphics[scale=\myscale,scale=0.4]{ecran-tortue-1} \end{center} \end{activite} @@ -105,17 +110,18 @@ \objectifs{Objectifs : tracer des figures géométriques.} \begin{center} -\includegraphics[scale=0.25]{ecran-tortue-2a} -\includegraphics[scale=0.25]{ecran-tortue-2b} -\includegraphics[scale=0.25]{ecran-tortue-2c} -\includegraphics[scale=0.2]{ecran-tortue-2d} +\includegraphics[scale=\myscale,scale=0.25]{ecran-tortue-2a} +\includegraphics[scale=\myscale,scale=0.25]{ecran-tortue-2b} +\includegraphics[scale=\myscale,scale=0.25]{ecran-tortue-2c} +\includegraphics[scale=\myscale,scale=0.2]{ecran-tortue-2d} \end{center} \begin{enumerate} \item \textbf{Pentagone.} Trace un premier pentagone (en bleu). Tu dois répéter $5$ fois : avancer de $100$ pas, tourner de $72$ degrés. - \emph{Indication.} Pour construire une boucle utilise \\ - \centerline{\ci{for i in range(5):}} + \emph{Indication.} Pour construire une boucle utilise + \mycenterline{\ci{for i in range(5):}} + (même si tu n'utilises pas ensuite la variable \ci{i}). \item \textbf{Pentagone (bis).} Définis une variable \ci{longueur} qui vaut $200$ et une variable \ci{angle} qui vaut $72$ degrés. Trace un second pentagone (en rouge) en avançant cette fois de \ci{longueur} et en tournant de \ci{angle}. @@ -143,8 +149,8 @@ \objectifs{Objectifs : tracer le graphe d'une fonction.} \begin{center} -\includegraphics[scale=0.4]{ecran-tortue-3a} -\includegraphics[scale=0.4]{ecran-tortue-3b} +\includegraphics[scale=\myscale,scale=0.4]{ecran-tortue-3a} +\includegraphics[scale=\myscale,scale=0.4]{ecran-tortue-3b} \end{center} Trace le graphe de la fonction carré et de la fonction sinus. @@ -158,8 +164,8 @@ Pour la sinuso\"ide, tu peux utiliser la formule $$y = 100\sin\left(\frac{1}{20}x\right).$$ -Par défaut \Python{} ne connaît pas la fonction sinus, pour utiliser \ci{sin()} il faut d'abord importer le module \ci{math} :\\ -\centerline{\ci{from math import *}} +Par défaut \Python{} ne connaît pas la fonction sinus, pour utiliser \ci{sin()} il faut d'abord importer le module \ci{math} : +\mycenterline{\ci{from math import *}} Pour que la tortue avance plus vite, tu peux utiliser la commande \ci{speed("fastest")}. \end{activite} @@ -177,10 +183,10 @@ \index{triangle de Sierpinski} \begin{center} -\includegraphics[scale=0.3]{ecran-tortue-4a} -\includegraphics[scale=0.3]{ecran-tortue-4b} -\includegraphics[scale=0.3]{ecran-tortue-4c} -\includegraphics[scale=0.3]{ecran-tortue-4d} +\includegraphics[scale=\myscale,scale=0.3]{ecran-tortue-4a} +\includegraphics[scale=\myscale,scale=0.3]{ecran-tortue-4b} +\includegraphics[scale=\myscale,scale=0.3]{ecran-tortue-4c} +\includegraphics[scale=\myscale,scale=0.3]{ecran-tortue-4d} \end{center} Voici comment tracer le second dessin. Analyse l'imbrication des boucles et trace les dessins suivants. @@ -211,7 +217,7 @@ \begin{activite}[Le c\oe ur des tables de multiplication] \objectifs{Objectifs : dessiner les tables de multiplication. Pour une introduction en vidéo voir -\href{https://youtu.be/-X49VQgi86E}{\emph{la face cachée des tables de multiplication}} sur \emph{Youtube} par Micmaths.} +\og{}\href{https://youtu.be/-X49VQgi86E}{\emph{la face cachée des tables de multiplication}}\fg{} sur \emph{Youtube} par Micmaths.} On fixe un entier $n$. On étudie la table de $2$, c'est-à-dire que l'on calcule $2 \times 0$, $2\times 1$, $2 \times 2$, jusqu'à $2 \times (n-1)$. En plus les calculs se feront modulo $n$. On calcule donc @@ -249,7 +255,7 @@ Voici ce que cela donne pour $n=100$. \begin{center} -\includegraphics[scale=0.5]{ecran-tortue-5b} +\includegraphics[scale=\myscale,scale=0.5]{ecran-tortue-5b} \end{center} \emph{Indications.} @@ -306,7 +312,7 @@ Programme quatre tortues qui courent les unes après les autres : \begin{center} -\includegraphics[scale=0.5]{ecran-tortue-6a} +\includegraphics[scale=\myscale,scale=0.5]{ecran-tortue-6a} \end{center} @@ -353,7 +359,7 @@ Améliore ton programme en traçant à chaque fois un segment entre la tortue poursuivante et la tortue poursuivie. \begin{center} -\includegraphics[scale=0.5]{ecran-tortue-6b} +\includegraphics[scale=\myscale,scale=0.5]{ecran-tortue-6b} \end{center} \end{activite} diff --git a/vie/fig-vie-0a.tikz b/vie/fig-vie-0a.tikz index a126c9a..94606c9 100644 --- a/vie/fig-vie-0a.tikz +++ b/vie/fig-vie-0a.tikz @@ -13,7 +13,7 @@ % Jeu de la vie - Voisin -\begin{scope}[xshift=8cm] +\begin{scope}[xshift=9cm] \fill[red] (2,1) rectangle ++(1,1); \fill[red] (2,2) rectangle ++(1,1); \fill[red] (1,2) rectangle ++(1,1); @@ -29,7 +29,7 @@ \end{scope} % Jeu de la vie - Evolution -\begin{scope}[xshift=16cm] +\begin{scope}[xshift=18cm] \fill[red] (2,1) rectangle ++(1,1); \fill[red] (2,2) rectangle ++(1,1); \fill[red] (1,2) rectangle ++(1,1); diff --git a/vie/fig-vie-0b.tikz b/vie/fig-vie-0b.tikz index 59a5943..c1a0446 100644 --- a/vie/fig-vie-0b.tikz +++ b/vie/fig-vie-0b.tikz @@ -19,7 +19,7 @@ % Jeu de la vie - Voisin -\begin{scope}[xshift=8.5cm] +\begin{scope}[xshift=9cm] \fill[red!40] (2,2) rectangle ++(1,1); \fill[red] (1,2) rectangle ++(1,1); @@ -32,7 +32,7 @@ \draw (0,0) grid ++(7,5); -\draw[<-,>=latex,ultra thick] (2.5,2.5) to[bend right] (3.5,6.2) node[left] {A $5$ voisins}; +\draw[<-,>=latex,ultra thick] (2.5,2.5) to[bend right] (3.5,6.2) node[left] {A $4$ voisins}; \draw[<-,>=latex,ultra thick] (2.5,3.5) to[bend right] (2.5,5.5) node[left] {A $4$ voisins}; \draw[<-,>=latex,ultra thick] (5.5,1.5) to[bend right] (7,5.5) node[left] {A $0$ voisin}; @@ -40,7 +40,7 @@ \end{scope} % Jeu de la vie - Evolution -\begin{scope}[xshift=17cm] +\begin{scope}[xshift=18cm] \fill[red] (2,1) rectangle ++(1,1); \fill[red] (1,3) rectangle ++(1,1); \fill[red] (3,3) rectangle ++(1,1); diff --git a/vie/vie.pdf b/vie/vie.pdf index 6d3bc54..bc63edf 100644 Binary files a/vie/vie.pdf and b/vie/vie.pdf differ diff --git a/vie/vie.tex b/vie/vie.tex index 8f5b19a..0578914 100644 --- a/vie/vie.tex +++ b/vie/vie.tex @@ -11,9 +11,16 @@ \objectifs{Le \emph{jeu de la vie} est un modèle simple de l'évolution d'une population de cellules qui naissent et meurent au cours du temps. Le \og{}jeu\fg{} consiste à trouver des configurations initiales qui donnent des évolutions intéressantes : certains groupes de cellules disparaissent, d'autres se stabilisent, certains se déplacent\ldots} \begin{center} -\includegraphics[scale=0.3]{ecran-vie-0} +\includegraphics[scale=\myscale,scale=0.3]{ecran-vie-0} \end{center} +\insertvideo{7SR5-sUnotY}{Jeu de la vie} + +\insertvideo{8d386Op5fsU}{Souris avec tkinter} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \begin{cours}[Règles du jeu de la vie] Le \emph{jeu de la vie}\index{jeu de la vie} se déroule sur une grille. Chaque case peut contenir une cellule. Partant d'une configuration initiale, chaque jour des cellules vont naître et d'autres mourir en fonction du nombre de ses voisins. @@ -28,10 +35,14 @@ \item Pour une case contenant une cellule au jour $j$, ayant soit $2$ ou soit $3$ cellules voisines : alors la cellule continue de vivre. Dans les autres cas la cellule meurt (avec $0$ ou $1$, elle meurt d'isolement, avec plus de $4$ voisins, elle meurt de surpopulation !). + \medskip + \myfigure{0.5}{ \tikzinput{fig-vie-0b} } - + + \medskip + \end{itemize} Voici un exemple simple, le \og{}clignotant\fg{} : @@ -67,8 +78,8 @@ \begin{itemize} \item Initialise deux variables \ci{n} (la hauteur du tableau) et \ci{p} (la largeur) (par exemple à $5$ et $8$). - \item Définis un tableau à deux dimensions rempli de zéros par la commande :\\ - \centerline{\ci{tableau = [[0 for j in range(p)] for i in range(n)]}} + \item Définis un tableau à deux dimensions rempli de zéros par la commande : + \mycenterline{\ci{tableau = [[0 for j in range(p)] for i in range(n)]}} \item Par des instructions du type \ci{tableau[i][j] = 1} remplis le tableau afin de définir la configuration du clignotant, de la bouche\ldots \end{itemize} @@ -101,7 +112,7 @@ \objectifs{Objectifs : réaliser l'affichage graphique d'une configuration de cellules.} \begin{center} -\includegraphics[scale=0.3]{ecran-vie-2} +\includegraphics[scale=\myscale,scale=0.3]{ecran-vie-2} \end{center} \begin{enumerate} @@ -162,7 +173,9 @@ \end{minipage} \end{center} - \emph{Indications.} Pour définir un nouveau tableau reprend la commande :\\ \centerline{\ci{nouveau_tableau = [[0 for j in range(p)] for i in range(n)]}} + \emph{Indications.} Pour définir un nouveau tableau reprend la commande : + \mycenterline{\ci{nouveau_tableau = [[0 for j in range(p)] for i in range(n)]}} + puis modifie le tableau comme voulu. \end{enumerate} @@ -187,7 +200,7 @@ \end{itemize} \begin{center} -\includegraphics[scale=0.3]{ecran-vie-4a} +\includegraphics[scale=\myscale,scale=0.3]{ecran-vie-4a} \end{center} \item Perfectionne ton programme afin que l'utilisateur dessine la configuration qu'il souhaite par des clics de la souris. Un clic sur une case éteinte l'allume, un clic sur une case allumée l'éteint. @@ -199,7 +212,7 @@ \end{itemize} \begin{center} -\includegraphics[scale=0.3]{ecran-vie-4b} +\includegraphics[scale=\myscale,scale=0.3]{ecran-vie-4b} \end{center} @@ -230,7 +243,7 @@ x = event.x y = event.y canvas.create_rectangle(x,y,x+10,y+10,fill="red") - print("Clic a x =",x,", y =",y) + print("Clic à x =",x,", y =",y) return # Association clic/action @@ -245,8 +258,9 @@ \begin{itemize} \item La création de la fenêtre est habituelle. Le programme se termine par le lancement avec la commande \ci{mainloop()}. - \item Le premier point clé est d'associer un clic de souris à une action, c'est ce que fait la ligne \\ -\centerline{\ci{canvas.bind("", action_clic_souris)}} + \item Le premier point clé est d'associer un clic de souris à une action, c'est ce que fait la ligne +\mycenterline{\ci{canvas.bind("", action_clic_souris)}} + Chaque fois que le bouton gauche de la souris est cliqué, \Python{} exécute la fonction \ci{action_clic_souris}. (Note qu'il n'y a pas de parenthèses pour l'appel à la fonction.) \item Second point clé : la fonction \ci{action_clic_souris} récupère les coordonnées du clic et ici ensuite fait deux choses : elle affiche un petit rectangle à l'endroit du clic et affiche dans la fenêtre du terminal les coordonnées $(x,y)$.