diff --git a/python/fonctions/__pycache__/little_test_fw.cpython-39.pyc b/python/fonctions/__pycache__/little_test_fw.cpython-39.pyc new file mode 100644 index 0000000..3432705 Binary files /dev/null and b/python/fonctions/__pycache__/little_test_fw.cpython-39.pyc differ diff --git a/python/fonctions/__pycache__/main.cpython-39.pyc b/python/fonctions/__pycache__/main.cpython-39.pyc new file mode 100644 index 0000000..c23387a Binary files /dev/null and b/python/fonctions/__pycache__/main.cpython-39.pyc differ diff --git a/python/fonctions/__pycache__/rendu.cpython-39.pyc b/python/fonctions/__pycache__/rendu.cpython-39.pyc new file mode 100644 index 0000000..7c5f807 Binary files /dev/null and b/python/fonctions/__pycache__/rendu.cpython-39.pyc differ diff --git a/python/fonctions/__pycache__/tp fonctions python.cpython-39.pyc b/python/fonctions/__pycache__/tp fonctions python.cpython-39.pyc new file mode 100644 index 0000000..a4ebc96 Binary files /dev/null and b/python/fonctions/__pycache__/tp fonctions python.cpython-39.pyc differ diff --git a/python/fonctions/main.py b/python/fonctions/main.py new file mode 100644 index 0000000..9e5dbef --- /dev/null +++ b/python/fonctions/main.py @@ -0,0 +1,34 @@ + +def bonjour (): + """ Cette fonction affiche le texte « Bonjour à tous » """ + print('Bonjour à tous') + +def somme (a, b): + """ Cette fonction retourne la somme de a et b """ + return a+b + +# Exercice 1 — Écrivez une fonction nommée « trois » qui retourne la valeur 3 +# Exercice 2 — Écrivez une fonction nommée « double » qui prend un nombre en paramètre et retourne le double de sa valeur +# Exercice 3 — Écrivez une fonction nommée « triple » qui prend un nombre en paramètre et retourne le triple de sa valeur +# Exercice 4 — Écrivez une fonction nommée « carre » qui prend un nombre en paramètre et retourne le carré de sa valeur +# Exercice 5 — Écrivez une fonction nommée « est_majeur » qui prend un âge en paramètre et retourne True si cet âge est plus grand que 18, False sinon +# Exercice 6 — Écrivez une fonction nommée « est_grand » qui prend une taille en centimètres en paramètre et retourne True si elle est plus grande que 160, False sinon +# Exercice 7 — En vous aidant des fonctions est_majeur et est_grand, écrivez une fonction nommée « peut_faire_le_manege » qui prend un âge et une taille en paramètre et renvoie true si la taille est plus grande que 160 et que l’âge est plus grand que 18 + + + +if __name__ == '__main__': + def get_function (name): + try: + return getattr(m, 'sommet') + except AttributeError: + print('************************* ERREUR *************************') + print('La fonction « {} » n’a pas été trouvée'.format(name)) + def test (function_name, test_function): + f = get_function(function_name) + + import importlib, os + m = importlib.import_module(os.path.basename(__file__)[0:-3]) + + + diff --git a/python/fonctions/tp fonctions python.py b/python/fonctions/tp fonctions python.py new file mode 100644 index 0000000..f2ab60d --- /dev/null +++ b/python/fonctions/tp fonctions python.py @@ -0,0 +1,160 @@ +# Voici Deux exemples de fonctions + +def bonjour (): + """ Cette fonction affiche le texte « Bonjour à tous » """ + print('Bonjour à tous') + +def somme (a, b): + """ Cette fonction retourne la somme de a et b """ + return a+b + + +# Exercice 1 — Écrivez une fonction nommée « trois » qui retourne la valeur 3 + +# Exercice 2 — Écrivez une fonction nommée « double » qui prend un nombre en paramètre et retourne le double de sa valeur + +# Exercice 3 — Écrivez une fonction nommée « triple » qui prend un nombre en paramètre et retourne le triple de sa valeur + +# Exercice 4 — Écrivez une fonction nommée « carre » qui prend un nombre en paramètre et retourne le carré de sa valeur + +# Exercice 5 — Écrivez une fonction nommée « est_majeur » qui prend un âge en paramètre et retourne True si cet âge est plus grand que 18, False sinon + +# Exercice 6 — Écrivez une fonction nommée « est_grand » qui prend une taille en centimètres en paramètre et retourne True si elle est plus grande que 140, False sinon + +# Exercice 7 - En vous aidant de la fonction « est_majeur », écrivez une fonction nommée « est_mineur » qui prend un âge en paramètre et renvoie True si l’âge est strictement inférieur à 18 + +# Exercice 8 — En vous aidant des fonctions est_majeur et est_grand, écrivez une fonction nommée « peut_faire_le_manege » qui prend un âge et une taille en paramètre et renvoie true si la taille est plus grande que 140 et que l’âge est plus grand que 18 + +# Exercice 9 — En vous aidant des fonctions est_majeur et est_grand, écrivez une fonction nommée « est_un_enfant » qui prend un âge et une taille en paramètre et renvoie true si la taille est plus petite que 140 et que l’âge est plus petit que 18 + +# Exercice 10 — En vous aidant des fonctions double et est_grand, écrivez une fonction nommée « agrandir » qui prend une taille en paramètre et renvoie la taille doublée si elle est plus petite que 140 mais la renvoie non modifiée sinon + + + + + + +################################################################################################## +# Le code python suivant permet de faire les tests, n’écrivez rien en dessous de cette ligne # +################################################################################################## + +if __name__ == '__main__': + import importlib, os + tests = [ + { + 'function_name': 'trois', + 'tests': [ + {'params': [], 'result': 3}, + ], + }, + { + 'function_name': 'double', + 'tests': [ + {'params': [2], 'result': 4}, + {'params': [0], 'result': 0}, + {'params': [-12], 'result': -24}, + ] + }, + { + 'function_name': 'triple', + 'tests': [ + {'params': [2], 'result': 6}, + {'params': [0], 'result': 0}, + {'params': [-12], 'result': -36}, + ] + }, + { + 'function_name': 'carre', + 'tests': [ + {'params': [4], 'result': 16}, + {'params': [0], 'result': 0}, + {'params': [-12], 'result': 144}, + ] + }, + { + 'function_name': 'est_majeur', + 'tests': [ + {'params': [4], 'result': False}, + {'params': [18], 'result': True}, + {'params': [76], 'result': True}, + {'params': [-12], 'result': False}, + ] + }, + { + 'function_name': 'est_grand', + 'tests': [ + {'params': [4], 'result': False}, + {'params': [140], 'result': True}, + {'params': [200], 'result': True}, + {'params': [-12], 'result': False}, + ], + }, + { + 'function_name':'peut_faire_le_manege', + 'tests': [ + {'params': [18, 140], 'result': True}, + {'params': [2, 140], 'result': False}, + {'params': [18, 100], 'result': False}, + {'params': [-2, -1], 'result': False}, + ] + }, + { + 'function_name':'est_un_enfant', + 'tests': [ + {'params': [18, 140], 'result': False}, + {'params': [2, 140], 'result': False}, + {'params': [18, 100], 'result': False}, + {'params': [-2, -1], 'result': True}, + ] + }, + { + 'function_name':'agrandir', + 'tests': [ + {'params': [4], 'result': 8}, + {'params': [-8], 'result': -16}, + {'params': [140], 'result': 140}, + {'params': [150], 'result': 150}, + ] + }, + ] + print('\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n') + print('------------------------------- Restart --------------------------------') + print('\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n') + nb_tests = sum(len(item['tests']) for item in tests) + nb_ok = 0 + num_exercice = 0 + try: # Import the module + m = importlib.import_module(os.path.basename(__file__)[0:-3]) + except ModuleNotFoundError: + print('Le fichier module n’a pas été trouvé.') + exit(1) + + for item in tests: + num_exercice += 1 + print('\n---------------------------- Exercice {} ---------------------------- \n'.format(num_exercice)) + # Les dictionnaires ne sont pas ordonnés sur certaines versions de python + #print('\n---------------------------------------------------------------------- \n') + try: + f = getattr(m,item['function_name']) + except AttributeError: + print('************************* ATTENTION *************************') + print('La fonction « {} » n’a pas été trouvée'.format(item['function_name'])) + continue + + print('On va tester la fonction {}'.format(item['function_name'])) + for jeu in item.tests[item['function_name']]: + print('On exécute {}({})'.format(item['function_name'],', '.join((str(i) for i in jeu['params'])))) + try: + result = f(*jeu['params']) + print('-> Résultat : ' + str(result)) + if result == jeu['result']: + print('OK') + nb_ok += 1 + else: + print('************************* RÉSULTAT INATTENDU *************************') + print('On attendait le résultat suivant : ' + str(jeu['result'])) + except TypeError: + print('************************* PROBLÈME DE PARAMÈTRES *************************') + print('TypeError : Le nombre de paramètres de la fonction « {} » est-il bon ?'.format(function_name)) + break + print('\nTotal des tests : {}/{}'.format(nb_ok, nb_tests)) diff --git a/python/fonctions/unittest_test.py b/python/fonctions/unittest_test.py new file mode 100644 index 0000000..a3a806c --- /dev/null +++ b/python/fonctions/unittest_test.py @@ -0,0 +1,48 @@ + +def bonjour (): + """ Cette fonction affiche le texte « Bonjour à tous » """ + print('Bonjour à tous') + +def somme (a, b): + """ Cette fonction retourne la somme de a et b """ + return a+b + +# Exercice 1 — Écrivez une fonction nommée « trois » qui retourne la valeur 3 +# Exercice 2 — Écrivez une fonction nommée « double » qui prend un nombre en paramètre et retourne le double de sa valeur +# Exercice 3 — Écrivez une fonction nommée « triple » qui prend un nombre en paramètre et retourne le double de sa valeur +# Exercice 4 — Écrivez une fonction nommée « carre » qui prend un nombre en paramètre et retourne le carré de sa valeur +# Exercice 5 — Écrivez une fonction nommée « est_majeur » qui prend un âge en paramètre et retourne True si cet âge est plus grand que 18, False sinon +# Exercice 6 — Écrivez une fonction nommée « est_grand » qui prend une taille en centimètres en paramètre et retourne True si elle est plus grande que 160, False sinon +# Exercice 7 — En vous aidant des fonctions est_majeur et est_grand, écrivez une fonction nommée « peut_faire_le_manege » qui prend un âge et une taille en paramètre et renvoie true si la taille est plus grande que 160 et que l’âge est plus grand que 18 + + +if __name__ == '__main__': + import unittest + class MyTests(unittest.TestCase): + # return True or False + def test_trois (self): + self.assertEqual(trois(), 3) + def test_double (self): + self.assertEqual(double(0), 0) + self.assertEqual(double(-11), -22) + self.assertEqual(double(7), 14) + def test_carre (self): + self.assertEqual(carre(0), 0) + self.assertEqual(carre(-11), 121) + self.assertEqual(carre(7), 49) + def test_est_majeur (self): + self.assertFalse(est_majeur(0)) + self.assertFalse(est_majeur(-11)) + self.assertTrue(est_majeur(18)) + self.assertTrue(est_majeur(30)) + def test_est_grand (self): + self.assertFalse(est_grand(0)) + self.assertFalse(est_grand(-11)) + self.assertTrue(est_grand(180)) + self.assertTrue(est_grand(160)) + def test_peut_faire_le_manege (self): + self.assertFalse(peut_faire_le_manege(0, 0)) + self.assertFalse(peut_faire_le_manege(30, 150)) + self.assertFalse(peut_faire_le_manege(17, 180)) + self.assertTrue(peut_faire_le_manege(20, 180)) + unittest.main() diff --git a/python/tp_plus_moins/main.py b/python/tp_plus_moins/main.py new file mode 100644 index 0000000..2d0250f --- /dev/null +++ b/python/tp_plus_moins/main.py @@ -0,0 +1,6 @@ +from random import randint +number = randint(0,100) + +essai = int(input('Essai :')) + +print(type(essai)) diff --git a/python/tp_plus_moins/sujet.pdf b/python/tp_plus_moins/sujet.pdf new file mode 100644 index 0000000..391cca4 Binary files /dev/null and b/python/tp_plus_moins/sujet.pdf differ diff --git a/python/tp_plus_moins/sujet.tex b/python/tp_plus_moins/sujet.tex new file mode 100644 index 0000000..b8fd387 --- /dev/null +++ b/python/tp_plus_moins/sujet.tex @@ -0,0 +1,167 @@ +\documentclass[11pt,a4paper]{../../template_cours} + +\usepackage{minted} + +\title{Introduction à Python — Le jeu « Plus ou moins »} +\author{Adrian Amaglio} +\def\thesequence{Programmation} + +\begin{document} +Durée : 1h\\ + +% --- +\section{Les règles du jeu} +Le jeu « Plus ou moins » a des règles assez simples. +Voici comment le jeu se joue sur ordinateur : +\begin{itemize} + \item Le programme choisit un nombre entier au hasard entre 0 et 100 (par exemple 42). Le joueur doit le deviner. + \item Le joueur propose un nombre (par exemple 55). + \item Le programme répond « plus grand, si la proposition est inférieure au nombre à deviner, « plus petit » si la proposition est supérieur et « Gagné » si la proposition est égale. (Dans notre exemple, l’ordinateur répondra « plus petit ». + \item Le joueur propose un nouveau nombre, jusqu’à ce qu’il ait le bon. +\end{itemize} + + +% --- +\section{Un nombre aléatoire} +En python, pour générer un nombre aléatoire entre 0 et 100 on a besoin des deux lignes suivantes. +\begin{minted}{python} +from random import randint +secret = randint(0,100) +\end{minted} +La variable $secret$ a maintenant pour valeur un nombre entier aléatoire ! + +\begin{exercice} + Pour vérifier l’effet de la fonction d’aléatoire, exécutez ce programme Python et vérifiez qu’il affiche bien un nombre différent à chaque exécution. + \begin{minted}{python} +from random import randint +secret = randint(0,100) # Python choisit un nombre aléatoire +print(secret) # Python va afficher le contenu de la variable "secret" + \end{minted} +\end{exercice} + + +% --- +\section{Les propositions du joueur} +Pour que le joueur propose un nombre, nous allons devoir dire à notre programme d’attendre une saisie de sa part.\\ +On utilise pour cela la fonction $input$. +\begin{example} + \begin{minted}{python} +essai = int(input('Essai :')) +print(essai) + \end{minted} +\end{example} + +\begin{exercice} + Exécutez un programme contenant les deux lignes de l’exemple précédent.\\ + Lorsqu’il vous demandera d’entrer votre essai, entrez le chiffre 9, appuyez sur la touche « entrer » et vérifier que votre chiffre s’affiche bien une seconde fois à l’écran. +\end{exercice} + + +% --- +\section{Afficher des messages personnalisés} +Nous allons ajouter des \textbf{conditions}. +Une condition permet d’exécuter des instructions python uniquement dans certains cas. +\begin{example} + Par exemple, le programme suivant sert à tester si une personne est majeure : + \begin{minted}{python} +age = 17 +if age < 18: + print('Vous êtes mineur') +elif age == 18: + print('Vous êtes tout juste majeur') +else: + print('Vous êtes majeur') + \end{minted} +\end{example} +\begin{exercice} + Exécutez le programme de l’exemple précédent. Et changez l’âge pour voir dans quels cas chaque message est affiché. +\end{exercice} + + +% --- +\section{Version à un essai} +\begin{exercice} + À partir des deux exemples précédents, écrivez un programme qui : + \begin{itemize} + \item Tire un nombre aléatoire et le stock dans la variable $secret$. + \item Demande à l’utilisateur d’entrer un essai. + \item Affiche le nombre secret, pour que le joueur puisse voir s’il correspond à son essai. + \end{itemize} + \textbf{Faites vérifier par le professeur} +\end{exercice} + + +% --- +\section{Version à un essai, avec un message personnalisé} +\begin{exercice} + Complétez votre programme pour qu’il affiche un message, comme définit dans les règles, en fonction de l’essai du joueur. +\end{exercice} + + +% --- +\section{Version avec trop d’essais !} +Pour que l’utilisateur puisse entrer plusieurs essais, il faudrait répéter certaines étapes du programme.\\ +Pour répéter indéfiniment des instructions, on utilise une boucle infinie ! +\begin{example} + \begin{minted}{python} +while True: + print('Bonjour') + \end{minted} + Le programme ci-dessus, affichera « bonjour » en continu, tant que l’on ne l’arrête pas. +\end{example} +\begin{exercice} + Modifiez votre programme python pour que l’utilisateur puisse faire plusieurs propositions. +\end{exercice} + + +% On espère que les élèves arriveront là au moins +% --- +\section{Version avec tout juste ce qu’il faut d’essais} +On a maintenant un problème, le programme précédent ne s’arrête pas, même lorsque le nombre a été deviné ! +La boucle infinie, est réellement infinie…\\ +Il existe cependant un moyen de la stopper. Il suffit d’ajouter l’instruction « break » dans le programme. +Lorsque python exécute l’instruction « break », il arrête immédiatement la boucle ! +\begin{exercice} + Placez l’instruction « break » dans votre programme pour qu’il s’arrête en cas de victoire du joueur.\\ + Testez plusieurs fois votre programme. +\end{exercice} + + +% --- +\section{Afficher le nombre d’essais} +\begin{example} + En python, on peut utiliser un compteur. C’est une variable qui contient un entier.\\ + On l’initialise à 0, c’est à dire qu’on lui donne cette valeur au début du programme, puis on augmente sa valeur de 1 dès que l’on veut compter. + \begin{minted}{python} +compteur = 0 +print(compteur) # <- affiche 0 +compteur = compteur + 1 +print(compteur) # <- affiche 1 + \end{minted} +\end{example} +\begin{exercice} + Modifiez votre programme pour qu’il affiche le nombre de tentatives faites par le joueur pour deviner le nombre secret. +\end{exercice} + + +% --- +\section{Proposer de rejouer} +\begin{exercice} + Modifiez votre programme pour qu’il propose de rejouer à la fin de la partie. +\end{exercice} + + +% --- +\section{Nombre d’essai maximal} +\begin{exercice} + Modifiez votre programme pour qu’il fixe un nombre d’essai maximal au joueur et qu’il termine la partie lorsque celui-ci est atteint.\\ + Il peut être agréable pour le joueur que le nombre d’essais restants soit affiché à chaque tour. +\end{exercice} + +% --- +\section{Difficulté réglable} +\begin{exercice} + Modifiez votre programme pour qu’il permette au joueur de changer la valeur maximale du nombre secret et le nombre d’essais possibles. +\end{exercice} + +\end{document} diff --git a/python/tp_variables/main.py b/python/tp_variables/main.py new file mode 100644 index 0000000..a26b1b9 --- /dev/null +++ b/python/tp_variables/main.py @@ -0,0 +1,35 @@ +from turtle import * +from random import random + +# L’idée est ici de faire une fonction que les élève pourraient comprendre +def carre(longueur, angle=0): + """Cette fonction trace un carré de centre 0,0 de longueure et d’inclinaison variables""" + up() # Ces 3 lignes placent la tortue au centre du dessin + goto(0,0) + setheading(angle) + forward(longueur/2) # Ces 3 lignes placent la tortue dans un angle de notre futur carré + left(90) + forward(longueur/2) + down() + for i in range(4): # Ces 3 lignes tracent un carré + left(90) + forward(longueur) + +def partie1(): + nombre_fleurs = 10 + for f in range(nombre_fleurs): + for i in range(10): + carre(100 + 50*f, i*10) + +def partie2(): + while True: + for i in range(50): + pencolor(random(), random(), random()) + carre(50 + i*10, i*10) + for i in range(50,0,-1): + pencolor(random(), random(), random()) + carre(50 + i*10, i*10) + +speed(0) +hideturtle() +partie2()