Chacun d'entre vous possède une expérience qui lui est propre en ce qui concerne l'utilisation d'outils informatiques. Certains ont déjà écrit des programmes sur un ordinateur, tandis que d'autres ont à peine effleuré un clavier...
Pour pouvoir commencer à travailler en groupe pour ce cours d'informatique, il est nécessaire de combler quelque peu ce fossé et de vous mettre plus sur un pied d'égalité. Autrement, ce sont ceux qui ont le plus d'expérience qui mèneront les groupes et les plus novices auront moins l'occasion de participer, donc d'apprendre - ce qu'il faut absolument éviter. Nous avons donc organisé une mission de mise en route, que chacun de vous devra accomplir individuellement.
Deux principes importants
Conditions à remplir pour pouvoir résoudre le problème :
Si certains d'entre vous ont des difficultés avec un ou plusieurs de ces pré-requis, il est indispensable que le groupe les résolve avant de commencer à travailler.
Chaque mission vise à atteindre des objectifs individuels liés à la compréhension de la matière et des objectifs collectifs liés au fonctionnement du groupe. Pour cette mission de mise en route, les objectifs sont les suivants :
A l'issue de cette mise en route, chacun d'entre vous :
sera en mesure de dire quelques mots (sensés !) sur certains concepts sous-jacents à un programme Python simple (après une première prise de connaissance) :
- langage de programmation, programme
- fichier contenant un programme Python
- commentaires
- exécution d'un programme
- variables
- boucles, conditions
sera en mesure d'utiliser l'environnement de travail Thonny pour écrire et exécuter des programmes en Python
aura une première idée des différentes ressources mises à votre disposition
A l'issue de ce problème, le groupe tout entier :
La matière relative à cette mission porte sur les sections suivantes du syllabus. Vous devez lire et comprendre ces parties du syllabus pour pouvoir mener à bien cette mission.
Durant chaque mission, vous devrez répondre à deux types de questions individuelles :
Binding Inginious
Si c'est la première fois que vous vous connectez, vous voyez pour le moment 'Please log in to see this exercise' à la place du premier exercice. Vous devez d'abord vous logger avec votre identifiant global en cliquant sur 'Log In' en haut à droite. Ensuite, suivez la marche à suivre pour lier votre compte Inginious à ce compte et complétez les exercices.
Des questions à choix multiples.
Ces questions sont accessibles depuis un serveur Internet. Ce serveur vous génère automatiquement un ensemble de réponses différent à chaque fois que vous vous y connectez. Cela vous permet de tester vos connaissances lors de la première lecture du livre, mais aussi plus tard lorsque vous préparez l’interrogation ou l’examen. Vous devez préparer ces questions à choix multiples individuellement avant la réunion de bilan intermédiaire.
Les questions à choix multiples de cette semaine sont également accessibles en ligne depuis https://inginious.info.ucl.ac.be/course/LSINF1101-PYTHON/Session1_QCM
Des questions ouvertes. Ces questions seront discutées oralement durant la réunion de bilan intermédiaire. Votre tuteur choisira plusieurs étudiants et ceux-ci devront présenter au tableau leur réponse à l’une de ces questions ouvertes. Préparez ces questions avant cette réunion:
a, b et c sont des variables contenant des nombres entiers quelconques. Comment feriez-vous pour déterminer la médiane de ces trois nombres ? Pour rappel, la médiane d’un ensemble de nombres est la valeur m telle qu’il y a dans l’ensemble autant de valeurs qui sont supérieures ou égales à m que de valeurs inférieures ou égales à m.
Etapes d'une instruction conditionnelle:
Identifier les différent cas possible
Déterminer dans quel ordre les traiter
Ecrire une condition if
if condition_1 : # Instructions pour le cas 1 (considérez que la condition_1 est vraie)
Ecrire une condition elif pour chaque autre cas que vous voulez traiter
elif condition_x : # Instructions pour le cas x
Ecrire une condition else, pour tous les cas non traités précédemment
else : # Instructions pour tous les autres cas
Pour plus de détails sur les étapes, allez voir le catalogue : Instruction Conditionnelle .
Sachant que print(x) permet d’afficher à l’écran la valeur stockée dans la variable x, comment feriez-vous pour afficher à l’écran la table de multiplication par 123 ?
Etapes d'une boucle while:
Pour plus de détails sur les étapes, allez voir le catalogue : Boucle While .
Que se passe-t-il lors de l'exécution de la boucle suivante :
n = 1 i = 0 while n > 0: i=i+n print(i)
Sachant que les expressions a // b et a % b calculent respectivement la division et le reste de la division de l’entier stocké dans la variable a par l’entier stocké dans la variable b, pouvez-vous écrire un boucle qui affiche à l’écran en utilisant la commande print() les diviseurs entiers du nombre entier positif stocké dans la variable n.
Une des premières applications des ordinateurs (et même des calculateurs mécaniques, comme la machine de Babbage) a été de générer, de manière automatique et fiable, des tables numériques de fonctions mathématiques, comme les logarithmes ou les fonctions trigonométriques.
Dans cette mission initiale, vous allez produire une table des carrés et des sommes des carrés :
1 1 1 2 4 5 3 9 14 4 16 30 5 25 55 6 36 91 7 49 140 8 64 204 9 81 285 10 100 385
Démarrez une session de travail à l'ordinateur avec votre nom d'utilisateur et votre mot de passe. Créez, si ce n'est déjà fait, un répertoire (dossier) info1 où vous placerez tout ce qui se rapporte à l'informatique pour BAC1.
Si vous ne voyez pas comment faire, faites-vous aider. Vous pouvez, entre autres, utiliser un navigateur Web ("Web browser") pour consulter les documents accessibles sur le site Moodle du cours.
Inscrivez vous au site web du cours. Vous y trouverez, entre autres, un lien vers des ressources qui sont mises à votre disposition. Parmi ces ressources, il y a des modes d'emploi qui expliquent comment utiliser les logiciels mis à votre disposition sur vos postes de travail.
Inscrivez vous au cours sur INGINious (https://inginious.info.ucl.ac.be). Pour cela, allez sur INGInious, connectez-vous à l'aide de votre identifiant global UCL et inscrivez-vous au cours INFO1.
Faites démarrer l'environnement de développement Thonny, qui permet d'introduire, de modifier et d'exécuter des programmes Python.
Thonny est installé sur toutes les machines de l'EPL. Nous ne supportons pas d'autre éditeur de programmes en Python. Si vous souhaitez installer Thonny sur votre ordinateur personnel, téléchargez-le sur https://thonny.org/.
Créez un nouveau fichier que vous baptiserez mise_en_route.py.
L'instruction print(a, "\t", b) permet d'afficher à l'écran la valeur des variables a et b, séparées par une tabulation (le caractère spécial "\t"). Ecrivez un programme qui affiche à l'écran les nombres, les carrés et la somme des carrés pour les nombres entiers de 1 à 10, comme dans l'exemple ci-dessus. Utilisez la fonction print(), une boucle while et une variable pour calculer la somme au fur et à mesure.
Testez votre programme pour en vérifier le bon fonctionnement. Pour cela, cliquez sur le bouton Run (triangle blanc). Les résultats s'affichent dans le panneau Shell en bas de la fenêtre.
Exécutez votre programme pas à pas pour observer son fonctionnement. Pour cela, affichez d'abord le panneau des variables (menu View > Variables). Ensuite cliquez sur le bouton Debug (scarabée) et progressez avec les trois boutons Step into, Step over et Step out (flèches jaunes). Familarisez-vous avec leur fonctionnement et observez les valeurs des variables.
La somme des carrés des nombres de 1 à n peut aussi se calculer par la formule n(n + 1)(2n + 1) ⁄ 6. Modifiez votre programme pour qu'il affiche les nombres calculés par cette formule dans une quatrième colonne. Si votre programme est correct, les troisième et quatrième colonnes doivent être identiques !
A l'issue de cette mission préparatoire vous devez soumettre votre programme au serveur de soumissions de programmes du cours. Ce serveur de test sera utilisé pour toutes les missions et également pour des exercices complémentaires. Il est important que chacun d'entre vous sache l'utiliser.
Si vous n'avez pas réussi à terminer l'écriture du programme, expliquez vos problèmes dans un fichier README.TXT mais soumettez quand même votre programme au serveur car c'est via le serveur que votre tuteur recevra les programmes qu'il corrigera pour la séance de retour. Si vous avez réussi à terminer le programme correctement, le fichier README.txt doit contenir une documentation destinée aux utilisateurs de votre programme.
La soumission automatique des projets se déroule comme suit :
Si vous remarquez une erreur après la soumission, vous pouvez resoumettre pour la corriger. Vous recevrez un feedback global de votre tuteur durant la réunion de bilan final. En cas de problème de soumission via le serveur, utilisez le forum Helpdesk sur le site du cours.
Les étudiants qui ont résolu rapidement cette mission de mise en route sont invités à écrire un programme permettant de résoudre le problème suivant.
Considérons un programme utilisant cinq variables entières : a, b, c, d et e. Comment feriez-vous, en utilisant uniquement des if ...: ... else: ... pour calculer la médiane de ces cinq valeurs. Pour rappel, la médiane est la valeur qui est telle qu'il y a exactement deux valeurs inférieures à elle et deux valeurs supérieures à elle.
The method sum(list) returns the sum of the elements contained in list.
Example: the sum of [1,2,3] is 6
Note that your algorithm should be able to compute the sum even when the list list contains malicious elements (not numbers).
You want to use your computer to easily compute a polynomial with the following form: y = ax6 + bx2 + c. We give you the coefficients (stored in a, b and c) and the variable x and ask you to put the value of the polynomial at abscissa x inside a variable named y.
Note: there is a way to make this shortly in only one line of code.
En mathématiques, la factorielle d'un entier strictement positif x, noté x!`estleproduitdetouslesentiersstrictementpositifspluspetitsouégauxà``x`. La factorielle de 0 est 1. Calculez la factorielle d'un entier x et enregistrez la valeur calculée dans la variable result.
Exemples:
Depuis son apparition durant la seconde guerre mondiale, l'informatique n'a cessé de transformer profondément la société. La science et les différents domaines de l'ingénieur sont aujourd'hui de plus en plus dépendants de l'informatique pour des besoins de calcul ou de simulation notamment. Dans un rapport récent [1], plusieurs scientifiques ont mis en avant les liens de plus en plus forts entre l'informatique et les différentes disciplines scientifiques. Ils vont même jusqu'à prévoir l'émergence de nouvelles formes de "sciences" qui feront la synthèse entre les sciences ou les métiers traditionnels de l'ingénieur et l'informatique. Dès aujourd'hui, cette synthèse a créé de nouveaux domaines comme la bioinformatique qui fait le lien entre la biologie moléculaire et l'informatique, la climatologie dont les prédictions dépendent d'ordinateurs de plus en plus puissants, mais aussi les nanotechologies où les modélisations informatiques sont essentielles pour comprendre les interactions entre atomes et molécules ou la physique des particules où des équipements tels que le Large Hadron Collider (LHC) installé récemment au CERN à Genève produisent des quantités de mesure tellement gigantesques qu'il faut utiliser des milliers d'ordinateurs pour les traiter.
Si les ordinateurs sont tellement utiles pour résoudre des problèmes scientifiques ou d'ingénierie c'est grâce à leur puissance de calcul. Cette puissance de calcul est à deux niveaux : matériel et logiciel. Au niveau matériel, les processeurs utilisés dans les ordinateurs actuels sont capables d'effectuer très rapidement des additions, multiplications, divisions, soustractions et comparaisons de nombres réels.
Pour cette mission, vous devez écrire un programme Python qui permet de trouver les solutions entières à des équations du style :
Vous constaterez que l'énoncé de cette mission est plutôt directif. Dans les problèmes suivants, la mission sera bien moins explicite et une partie du travail de préparation consistera à la préciser.
[1] | Towards 2020 Science, disponible depuis http://research.microsoft.com/towards2020science/ |
Conditions à remplir pour pouvoir résoudre le problème :
A l'issue de cette mission, chacun d'entre vous :
sera en mesure de dire quelques mots sur certains concepts sous-jacents à un programme Python simple :
- types de données
- chaînes de caractères
- opérations arithmétiques
- opérations booléennes
- appel de fonction
- boucles for
sera en mesure d'utiliser l'environnement de travail Thonny pour traiter des programmes écrits en Python et de soumettre son travail au serveur de correction.
Vous devez lire et comprendre ces parties du syllabus pour pouvoir mener à bien cette mission :
Rappelez-vous qu'il est impossible d'atteindre les objectifs visés par ce problème sans effectuer préalablement le travail d'étude individuel en consultant les sections du livre de référence.
Les questions qui figurent ci-dessous sont des exemples de questions que vous pourriez vous poser à la lecture de l'énoncé et des ressources qui s'y rapportent. Si vous avez convenablement fait ce qui était attendu de vous pendant la phase d'étude et d'apprentissage, vous devriez être en mesure de répondre sans difficulté à ces questions. Si ce n'est pas le cas, il est encore temps de rattraper votre retard (mais ne tardez pas trop !). Il ne faut en aucun cas commencer la phase de réalisation avant d'être en mesure de répondre à ce questionnaire.
Pour chaque question, indiquez toujours où vous avez trouvé les éléments de réponse (livre page ..., documents fournis, manuels en ligne, ...). Travaillez en deux temps:
Visez à fournir des réponses complètes, motivées et qui prouvent votre compréhension de la matière. Ne vous contentez pas de réponses superficielles.
Pour vous aider dans la réalisations de ces exercices, certains d'entre eux sont disponibles sur Inginious avec une correction automatisée. Il a été fait en sorte que cette correction automatique soit utile à votre compréhension de la matière, cependant cela ne doit pas vous empêcher de discuter de vos réponses, correctes ou non, avec votre tuteur et les membres de votre groupe.
Définissez les concepts suivants :
Dans l'extrait de programme ci-dessous, indiquez après chaque ligne les valeurs contenues dans les variables a, b, c.
a = 0 b = 1 c = 2 a = b # ligne 1 a = a*2 # ligne 2 b = 17 # ligne 3 c = a+b # ligne 4 a = b-c # ligne 5 c = a+b+c+a # ligne 6
Expliquez, avec vos propres mots, ce que représente la notation
i = i + 1
et ce qu'elle a comme effet. Pourrait-on la remplacer par une autre notation ?
Quelle est la relation entre une instruction et une expression ? Donnez des exemples.
Expliquez ce que produisent les instructions suivantes :
Que se passe-t-il si on exécute ce programme ? Comment peut-on le corriger ?
n = input("n = ? ") print("n^2 =", n ** 2)
Expliquez ce que produisent les instructions suivantes :
Que fait le programme suivant ?
for n in [0, 1, 2, 3, 4]: print(10 ** n)
Comment pourrait-on écrire autrement la boucle for ?
Complétez le fragment de code suivant:
# Place dans sum la somme des n premiers entiers pairs strictement positifs n = some_value sum = 0 for ___ in ___________: ______________
Etape d'une boucle for :
Pour plus de détails sur les étapes, allez voir le catalogue .
Un nombre premier est un nombre naturel plus grand que 1 et qui n'a pas d'autres diviseurs positifis à part 1 et lui-même.
Stockez dans is_prime True si le n est un nombre premier et False sinon. is_prime est initialisé à True par défaut.
Les variables ont été initialisées. Ils vous restent à déterminer la séquence, écrire la condition de traitement si nécéssaire, le corps de la boucle et vérifier les cas particulier. Pour plus de détails sur les étapes, allez voir le catalogue .
is_prime = True n = ... #Un entier supérieur à 1
Remarques importantes
On ne commence ce travail de réalisation qu'après la réunion du bilan intermédiaire et en ayant déjà fait un premier travail d'étude dans le livre de référence.
Chaque étudiant dispose, sur le système informatique de l'EPL, d'un espace de travail qui lui est propre et auquel il accède en démarrant une session par un login sur n'importe lequel des postes de travail (en salles Candix/IAO/DAO). Les fichiers créés ou modifiés par un étudiant ne sont donc pas directement accessibles à un autre étudiant (il n'y a pas de partage de fichiers entre étudiants). Une manière simple d'échanger des fichiers entre étudiants d'un sous-groupe consiste à se les envoyer en annexe ("attachment") à un courrier électronique.
Durant cette partie de la mission vous allez écrire un petit programme Python permettant de rechercher les racines entières d'une équation diophantienne :
Cette recherche se fera en énumérant toutes les valeurs possibles de x, y et z et en vérifiant pour chacun triplet de valeurs si l'équation diophantienne est vérifiée (attention, vous ne pouvez pas utiliser les fonctions du package math dans cette mission). Cette technique d'énumération est parfois utilisée dans le domaine de la sécurité informatique pour décoder des messages cryptés sans connaître la clé de cryptage qui a été utilisée. Elle s'appelle attaque par force brute ou recherche exhaustive.
Groupes : A partir de cette deuxième mission, vous travaillerez en binômes de deux étudiants. Associez-vous en binômes au sein de votre groupe ou de votre local. Si vous êtes en nombre impair dans votre local, un étudiant devra travailler seul. Vous devrez travailler avec un étudiant différent chaque semaine; organisez une tournante des binômes.
Organisation : Décidez comment vous allez faire, dans votre sous-groupe, pour travailler à deux : est-ce toujours le même qui travaille à l'ordinateur ou allez-vous alterner au milieu de la mission ? Que fait celui qui n'est pas à l'ordinateur pour aider celui qui l'est ? A quel moment faut-il aller consulter le livre de référence ? Faut-il avoir lu toutes les sections du livre indiquées dans la rubrique Ressources avant de faire le travail ?
Analyse : Considérez le programme ci-dessous :
# Recherche des racines d'une équation a x + b y = c # Charles Pecheur, septembre 2018 solutions = 0 a = int(input("Entrez la valeur du coefficient a : ")) b = int(input("Entrez la valeur du coefficient b : ")) c = int(input("Entrez la valeur du coefficient c : ")) max = int(input("Entrez la valeur maximale pour x et y : ")) for x in range(1, max+1): for y in range(1, max+1): if a*x + b*y == c: print("x =", x, " y =", y) solutions += 1 if solutions == 0: print("Aucune solution trouvee") else: print(solutions, "solutions trouvees")
Ce programme recherche les racines entières de l'équation diophantienne simple ax + by = c. Essayez de le lire et de bien comprendre comment il fonctionne. Dans Thonny, recopiez le programme dans un fichier equation_simple.py (copiez-collez à partir du syllabus) et testez-le en l'exécutant avec différentes valeurs de a, b et c. Vérifiez notamment que l'équation 8 x + 4 y = 1 n'admet aucune solution alors que l'équation 2 x + y = 3 en admet une infinité.
Vous pouvez inspecter les valeurs des différentes variables en affichant le panneau des variables (menu View > Variables) et en exécutant le programme pas à pas (bouton Debug). Attention, vous devez interrompre votre programme en cours d'exécution (bouton Stop) avant de pouvoir lancer une nouvelle exécution.
Vous pouvez maintenant créer un nouveau programme equation.py permettant de trouver des solutions à des équations diophantiennes du type xa + yb = zc.
Si vous n'obtenez pas le bon résultat, analysez ce qui se passe et corrigez jusqu'à obtention du résultat désiré. Cette phase de test est essentielle dans le développement d'un programme. Indiquez dans le fichier README.TXT que vous renverrez à votre tuteur les tests que vous avez réalisés pour le convaincre du bon fonctionnement de votre programme.
N'oubliez pas de bien documenter votre programme en utilisant des commentaires.
Si vous avancez vite, modifiez votre programme de façon à ce qu'il n'affiche que les racines qui n'ont aucun diviseur commun à l'exception de 1. Pour cela, vous devrez écrire un programme permettant de vérifier si trois nombres ont un diviseur commun. En Python, l'expression a % b calcule le reste de la division euclidienne de a par b. Cela pourrait vous aider dans cette extension.
Soumettez votre travail au serveur de soumission. Indiquez dans le fichier README.TXT les tests que vous avez effectués et les problèmes éventuels que vous avez eu. Votre tuteur pourra les lire afin de préparer la réunion de bilan final.
[1] | Voir notamment http://www.alpertron.com.ar/SUMPOWER.HTM |
Pour cette mission, vous devez soumettre votre programme equation.py et votre fichier README.txt au serveur de soumissions de programmes du cours.
Les étudiants qui ont résolu rapidement ce problème sont invités à écrire un programme permettant de résoudre le problème suivant.
En mathématiques, depuis les travaux de Fermat, on sait qu'il n'existe pas de quadruplet de nombres entiers positifs distincts a, b, c et n tels que an + bn = cn lorsque n > 2. Le théorème correspondant a d'ailleurs été démontré il y a seulement quelques années. Par contre, il existe de nombreux quadruplets de nombres entiers positifs distincts a, b, c et d tels que a3 + b3 = c3 + d3. En utilisant un programme qui teste intelligemment tous les quadruplets possibles en utilisant des boucles for, pourriez-vous déterminer quel est le quadruplet pour lequel la somme a3 + b3 = c3 + d3 est minimale ?
Supposez que les variables a, b et x contiennent un nombre naturel. Ecrivez un fragment de code qui assignerait la valeur booléenne True à une variable nommée interval si x appartient à [a, b]. Assignez la valeur False sinon.
Supposez que les variables a, b et c contiennent un nombre naturel.
Ecrire un fragment de code qui assigne à la variable min le plus petit de ces nombres.
Ecrivez un programme qui permet de jouer au jeu fizzbuzz. Vous recevez un nombre (stocké dans la variable i). Nous allons implémenter une version simplifiée du jeu. Pour un entier i donné, le jeu va :
Supposez que les variables a et b contiennent un nombre naturel.
Ecrivez un fragment de code qui assigne le reste de leur division à la variable rest.
Pour implémenter votre solution, utilisez uniquement une boucle while et des soustractions (la solution la plus simple rest = a % b n'est pas acceptée; nous voulons tester si vous êtes capable d'implémenter une telle opération par vous-même).
Notez que vous ne devez pas permettre la division par 0 et vous devez assigner la la valeur None à rest dans un tel cas.
Le service Presse et Communication de l'Université fait appel aux étudiants de l'EPL pour étoffer ses ressources graphiques. Vous êtes chargés de produire des images de drapeaux et logos qui seront utilisés dans les médias de l'université. Pour produire ces dessins de nature géométrique, vous allez utiliser la programmation en Python en utilisant les graphiques tortue.
A l'issue de cette mission, chacun d'entre vous :
Vous devez lire et comprendre ces parties du syllabus pour pouvoir mener à bien cette mission :
Note
Pour vous aider dans la réalisation de ces exercices, certains d'entre eux sont disponibles sur Inginious avec une correction automatisée. Il a été fait en sorte que cette correction automatique soit utile à votre compréhension de la matière, cependant cela ne doit pas vous empêcher de discuter de vos réponses, correctes ou non, avec votre tuteur et les membres de votre groupe.
Les questions à choix multiples de cette mission sont également accessibles en ligne depuis https://inginious.info.ucl.ac.be/course/LSINF1101-PYTHON/Session3_QCM
Définissez les concepts suivants et donnez un exemple :
Ecrivez l'en-tête et le corps d'une fonction baptisée afficheMax qui prend deux nombres entiers comme arguments et affiche le plus grand de ces nombres. La spécification de cette fonction est :
pre: -- post: affiche le maximum entre les nombres entiers a et b
Que faut-il changer pour faire une fonction calculeMax qui retourne le plus grand nombre au lieu de l'afficher ?
Un étudiant montre à son tuteur le programme suivant :
hauteur = int(input("Hauteur de la croix: ")) print() croix('X', hauteur)
Lors de son exécution, il affiche les caractères suivants à l'écran :
Hauteur de la croix: 9 X X X X XXXXXXXXX X X X X
Réécrivez l'en-tête, la spécification et le corps de la fonction croix utilisée par cet étudiant. (Pour rappel, print(x, end="") imprime x sans aller à la ligne ensuite.)
Ecrivez l'en-tête, la spécification et le corps d'une fonction fact(n) qui calcule et retourne la factorielle de n : n! = n.(n − 1).(n − 2)…1. Veillez à ce que la méthode que vous écrivez respecte bien les spécifications que vous définissez vous-même.
Le module math définit les constantes et fonctions mathématiques usuelles, telles que sqrt(x) (racine carrée), sin(x), cos(x), log(x) (logarithme), pi, etc. Ecrivez un programme qui imprime les valeurs de sin π/n pour n allant de 1 à 10.
Quelle est la différence entre les trois instructions import suivantes ? Après ces instructions, comment réfère-t-on à la constante math.pi ?
import math .
import math as m .
from math import * .
Dans le programme suivant :
import turtle t = turtle.Turtle() t.color("blue") print(t.heading())
Quelle est la nature (module, objet, fonction, méthode, …) des différents identifiants : turtle, Turtle, t, color, print, heading ?
Quelle est la signification de turtle.Turtle ? t.color ?
Ecrivez un programme qui crée une tortue et trace en bleu un escalier de 3 marches de 20 unités descendant vers la droite.
Dans cette mission, vous allez devoir utiliser la tortue pour dessiner le drapeau européen :
Pour écrire un programme qui réalise ce dessin, il n'est pas souhaitable de commencer directement à écrire le code Python correspondant. Il faut d'abord décomposer ce problème complexe en sous-problèmes plus simples. On pourra ensuite écrire des fonctions pour résoudre chacun de ces sous-problèmes, et utiliser ces fonctions dans la fonction principale.
Expliquez en français quels sous-problèmes vous pouvez identifier dans ce problème. Discutez-en avec votre tuteur durant la séance intermédiaire afin d'identifier les fonctions que vous allez réaliser. Pour répondre à cette question, vous devez avoir une idée de la spécification et des paramètres de vos fonctions, il n'est pas nécessaire d'avoir déjà leur réalisation.
L'objectif final de cette mission est de produire à l'écran un dessin du drapeau de l'Union Européenne :
Pour y parvenir, vous allez devoir décomposer votre problème en une combinaison de sous-problèmes plus simples, et correctement et précisément spécifier ces sous-problèmes, les résoudre sous forme de fonctions Python, que vous utiliserez ensuite pour résoudre votre problème principal.
Vous allez travailler avec les graphiques tortue de Python, en utilisant le module turtle. Vous allez procéder par étapes.
Organisation : vous travaillerez à nouveau en binômes de deux étudiants. Associez-vous à un étudiant différent de la semaine dernière; faites une tournante au sein de votre groupe.
Considérez le programme suivant :
import turtle # module des graphiques tortue tortue = turtle.Turtle() # créer une nouvelle tortue tortue.speed("fastest") # tracé rapide def square(size, color): """Trace un carré plein de taille `size` et de couleur `color`. pre: `color` spécifie une couleur. La tortue `tortue` est initialisée. La tortue est placée à un sommet et orientée en direction d'un côté du carré. post: Le carré a été tracé sur la droite du premier côté. La tortue est à la même position et orientation qu'au départ. """ tortue.color(color) tortue.pendown() tortue.begin_fill() for i in range(4): tortue.forward(size) tortue.right(90) tortue.end_fill() tortue.penup()
Ce programme définit une fonction square qui trace un carré avec la tortue. Essayez de lire et de comprendre ce programme. Sur base de la spécification en tête de la définition de square, pouvez-vous prédire précisément le résultat de l'exécution de square(200, "red") ?
Créez un nouveau fichier flags.py qui contiendra votre programme pour cette mission, et recopiez-y le programme ci-dessus. Exécutez-le dans Thonny, puis exécutez l'instruction square(200, "red") et observez son comportement. Le résultat est-il conforme à votre prédiction ? Testez les différentes couleurs disponibles :
["black", "blue", "green", "red", "magenta", "cyan", "yellow", "white"]
Exécutez help(square) dans l'interpréteur pour afficher la documentation de square [1].
Dans votre fichier, écrivez une fonction rectangle(width, height, color) qui trace un rectangle de dimensions width x height et de couleur color. Ecrivez d'abord la spécification, développez ensuite le code qui réalise cette spécification. Exécutez et testez votre programme.
Ecrivez (et spécifiez) une fonction belgian_flag(width) qui dessine un drapeau belge de largeur width et de proportions 3/2. Utilisez bien sûr la fonction rectangle que vous venez de construire.
Ecrivez (et spécifiez) une fonction plus générale three_color_flag(width, color1, color2, color3) qui dessine un drapeau tricolore de couleurs données. belgian_flag peut maintenant être re-défini comme three_color_flag(100, "black", "yellow", "red"). Ecrivez de même des fonctions dutch_flag, german_flag, luxemburg_flag et french_flag qui dessinent les drapeaux des pays voisins de la Belgique. Sur quelle fonction plus générale allez-vous vous baser ?
Considérez maintenant le problème de dessiner le drapeau européen, comme représenté ci-dessus. Réfléchissez à comment décomposer ce problème en sous-problèmes, et spécifiez les différents sous-problèmes. Ecrivez ensuite les différentes fonctions réalisant ce problème, avec une fonction european_flag(width) qui dessine le drapeau.
Pour parachever votre travail, écrivez un programme (en fin de votre fichier flags.py) qui affiche tous vos drapeaux dans une disposition de votre choix, par exemple :
[1] | Selon la version de Thonny que vous utilisez, il se peut que les caractères accentués ne s'affichent pas correctement dans la fonction help. |
Pour cette mission, vous devez soumettre votre programme flags.py et votre fichier README.txt au serveur de soumissions de programmes du cours. Votre fichier flags.py doit au moins contenir les fonctions :
square(size, color) rectangle(width, height, color) belgian_flag(width) three_color_flag(width, color1, color2, color3) european_flag(width)
Pour aller plus loin, vous pouvez créer des fonctions pour dessiner d'autres drapeaux plus complexes, par exemple :
The Greatest Divisor of a number a is the biggest number ( except a itself) such that the division of a by this natural is an entire division.
Since \(0\) is divisible by any natural this may cause some problems if you will look for the bigger one, so we expect you to return None.
Recall that the operator % returns the remainder of the Euclidian division.
Suppose you now have base € on your savings account.
If you leave it x years on that account at a fixed cummulative interest rate of y %, what will be the balance on your account after these x years?
Return that amount.
The Greatest Common Divisor of two natural numbers a and b is the biggest natural number k such that the division of a and b by this natural k is an entire division.
Euclid found a very simple recursive algorithm to find the GCD of two numbers: $$\text{gcd}(a,0) = a$$ $$\text{gcd}(a,b) = \text{gcd}(b,a\%b)$$
Recall that the operator % returns the remainder of the euclidian division.
In mathematics, the Fibonacci series are the numbers in the following sequence of integers, which is characterized by the fact that every number after the first two is the sum of the two preceding ones:
/Example: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...
A very simple algorithm would be: $$\text{F}_0 = 0$$ $$\text{F}_1 = 1$$ $$\text{F}_n = \text{F}_{n-1} + \text{F}_{n-2}$$
Create a function fibonacci(n) that prints the nth element of the Fibonacci sequence.
The Body mass index (BMI) or Quetelet index, used by dieticians, is indicative of the condition of a person.
A normal person should have an index between 20 and 25. Below 20, she is considered thin, above 25 overweight. Beyond 30, the person is obese!
This index is calculated as the ratio between a person's weight, expressed in kg, and the square of the person's height, expressed in meters.
Create a function quetelet(height, weight) to calculate a person's Quetelet index and return thin string for a person with an index strictly less than 20, normal for a person whose index is between 20 and 25, overweight if the index is strictly greater than 25 and less than or equal to 30 and obese when it is strictly greater than 30.
The police is hiring you to develop a program to calculate the fine that a car driver will have to pay in the event of a violation. The law stipulates that the driver will have to pay 5 euros per km/h above the maximum authorized speed, with a minimum fine of 12.5€.
For any speeding of more than 10 km/h above the authorized speed, the fine is DOUBLED!
Your program takes as input the maximum allowed speed and the actual speed of the car. It calculates the possible fine.
Example:
Les équations du second degré sont des équations de la forme suivante:
avec a ≠ 0
Pour déterminer si l'équation dispose d'une solution, on calcule le nombre ρ = b2 − 4ac. Si ρ est strictement positif, l'équation a exactement deux solutions. La première solution s'obtient via la formule suivante :
Et la seconde racine s'obtient via la formule suivante :
Si ρ est nul, l'équation a exactement une solution, dont la valeur est égale à − b ⁄ (2a). Si ρ est négatif, l'équation n'a aucune solution.
Pour montrer que vous maîtrisez la décomposition en sous-problèmes, vous devrez définir trois fonctions. Chacune d'entre elles prendra uniquement comme paramètres les valeurs de a, b et c. Tout d'abord, définissez et implémentez la fonction rho, qui retourne la valeur du nombre ρ.
Ensuite, définissez et implémentez la fonction n_solutions, qui retourne le nombre de solutions de l'équation définie par a, b et c.
Finalement, définissez et implémentez la fonction solution, qui retourne la solution d'une équation qui n'a qu'une seule solution et la plus petite solution d'une équation qui a deux solutions. La fonction ne sera jamais appelée pour une équation qui ne dispose pas de solution.
Les fonctions n_solutions et solution doivent impérativement faire appel à la fonction rho .
Pour résoudre l'exercice, vous aurez besoin de la fonction racine_carree, décrite ci-dessous. Cette fonction est déjà implémentée, vous ne devez donc pas l'écrire vous-même.
def racine_carree(n): """ Calcule une racine carree pre: n est un nombre réel n >= 0 post: retourne la racine carrée réelle de n """
Voici un exemple d'utilisation des fonctions que vous devez implémenter, avec l'équation x2 + 2x + 1 = 0 :
rho(1, 2, 1) >>> 0 n_solutions(1, 2, 1) >>> 1 solution(1, 2, 1) >>> -1.0