Site de la spécialité ISN du lycée Louis Marchal Programmer en Python Je vous recommande vivement de programmer sur le site : France-ioi.fr La démarche y est très progressive. Les éléments de cours qui suivent, sont très largement issus de deux manuels existant en librairie, mais aussi disponibles en ligne. Je me réfèrerai au premier par SWI : Apprendre à programer en Python3 de G. Swinnen Je me réfèrerai au second par SDZ (maintenant openclassrooms) : Apprenez à programmer en Python de V. Le Goff Il est souvent moins coûteux d'acheter les manuels que d'imprimer de nombreuses pages ! La page sur python au format PDF Voici les différents points abordés: Premiers pas 1. Premiers programmes 2. Les entrées et les types 3. Les instructions conditionnelles 4. Les boucles "for" 5. Les boucles "while" 6. Les fonctions 7. Le module "Turtle" 8. Les listes 9. Les chaînes de caractères 10. Utilisation de tableaux 11. Importer des modules 12. Lecture et écriture dans un fichier 13. 1) Premiers pas Retour au plan de cette page Les premières instructions seront écrites directement dans la console python qui se trouve Marchalisn file:///C:/Users/anne/Dropbox/ISN/html/pythonpdfbis.html 1 sur 33 28/09/2015 10:05
33
Embed
programmer En Python - Isn-marchalisn-marchal.com/site/python.pdf · Site de la spécialité ISN du lycée Louis Marchal Programmer en Python Je vous recommande vivement de programmer
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Site de la spécialité ISN du lycée Louis
Marchal
Programmer en Python
Je vous recommande vivement de programmer sur le site :
France-ioi.fr
La démarche y est très progressive.
Les éléments de cours qui suivent, sont très largement issus de deux manuels existant enlibrairie, mais aussi disponibles en ligne.
Je me réfèrerai au premier par SWI :Apprendre à programer en Python3 de G. SwinnenJe me réfèrerai au second par SDZ (maintenant openclassrooms) :Apprenez à programmer en Python de V. Le Goff
Il est souvent moins coûteux d'acheter les manuels que d'imprimer de nombreuses pages !
La page sur python au format PDF
Voici les différents points abordés:
Premiers pas1. Premiers programmes2. Les entrées et les types3. Les instructions conditionnelles4. Les boucles "for"5. Les boucles "while"6. Les fonctions7. Le module "Turtle"8. Les listes9. Les chaînes de caractères10. Utilisation de tableaux11. Importer des modules12. Lecture et écriture dans un fichier13.
1) Premiers pas
Retour au plan de cette page
Les premières instructions seront écrites directement dans la console python qui se trouve
les décimaux, "float"les chaînes de caractères, "string"les listes, "list"
De nombreux autres types existent, et on peut même construire ses propres types !.
Pour plus de détails consulter SWI : les types de données
On peut passer d'un type à un autre : pour transformer une chaîne de caractères en entier,
on écrit :
int ("32"), et pour transformer un nombre en une chaîne de caractères on écrit str(32) par
exemple.
Voici un exemple :
a=input("entrez un entier")
a=int(a) #on transforme la chaîne a en un entier
#pour pouvoir faire des opérations
b=a**2
print("le carré de", a , "est ",b)
Remarque : on peut composer les fonctions de Python. On peut par exemple écrire :
a= int (input("entrez un nombre")).
Exercices pour les futurs isn :
3.a) et 3.b) Reprendre les exercices 2b) et 2c), mais c'est l'utilisateur qui entre a et b
dans le premier et le nombre de minutes dans le second.
Exercice 3.1 : Ecrire un programme qui demande deux entiers, puis qui donne le quotient
entier et le reste de la division du premier par le deuxième.
4) Les instructions conditionnelles
Retour au plan de cette page
Il s'agit des instructions "if", "elif" et "else". Voici un exemple :
a=input("entrez un entier")
a=int(a)
b=a%2
if a==0:
print (a, " est nul et pair")
elif b==0:
print(a," est pair")
else:
print(a," est impair")
Vous remarquerez :
que l'opérateur de comparaison s'écrit "==", le "=" est réservé à l'affectationque le programme est décomposé en instructions simples et en blocs : le premier bloccommence à "if"chaque ligne d'entête d'un bloc se finit par ":"la suite du bloc est indentée (cela se fait automatiquement dans pyscripter)la fin du bloc est signalée par la fin de l'indentation (on tape sur shift et tab)
Ecrire un programme qui dessine un rectangle de n lignes et p colonnes (où n et p sont
entrés par l'utilisateur) du type:
XXXX
XXXX
XXXX
pour 3 lignes et 4 colonnes
On pourra imbriquer deux boucles "for".
5.d) Ecrire un programme qui dessine un triangle de n (entré par l'utilisateur) lignes du
type :
*
**
***
****
5.e) On définit la suite V par V1 = 2 et Vn+1=Vn+n−10.
Ecrire un programme qui détermine le minimum de cette suite quand n est entre 1 et 200,
et qui donne l'index correspondant.
A retenir : toujours vérifier que les valeurs extrêmes sont correctes (on regarde ce qui se
passe pour les premiers passages dans la boucle et pour le dernier).
Exercice 5.1 : Ecrire un programme qui donne les carrés de tous les nombres de 0 à 20.
Exercice 5.2 : Somme de tous les carrés des nombres de 5 à 25.
Prenez une variable S qui vaut 0 au départ, puis à l'aide d'une boucle "for" ajoutez
successivement à S, 5² quand i=5, puis 6² quand i=6, puis......, puis 25².
Notez bien cette méthode car elle est très classique pour calculer une somme d'un certain
nombre de termes de la même forme.
Exercice 5.3 (exercice supplémentaire) : Nombres de Armstrong
Un nombre est appelé nombre de Armstrong s'il est égal à la somme de ces chiffres au
cube.
Exemple : 153 = 1^3 + 5^3 + 3^3
1) Ecrire un programme dans lequel l'utilisateur entre un nombre, le programme donne le
nombre de centaines, de dizaines et d'unités.
2) Modifier le programme précédent pour que l'utilisateur entre un nombre (trois chiffres
au maximum) et le programme teste si c'est un nombre de Armstrong.
3) Modifier le programme précédent pour trouver tous les nombres de Armstrong inférieurs
à 999.
Mini-projet : travail sur la modification d'images.
Nous allons utiliser la bibliothèque PILLOW.Vous trouverez une documentation en anglais sur ce site : http://pillow.readthedocs.org/en/latest/reference/Image.htmlVotre programme devra commencer par : import PIL.Image as Image, cela permet d'écrire
simplement Image, au lieu de PIL.Image dans de nombreuses instructions.Voici les instructions dont vous aurez besoin :
pour ouvrir une image et l'appeler im : im=Image.open("nom_fichier.jpg") (attention lefichier doit être rangé dans le même dossier que votre programme)pour charger les valeurs des différents pixels : pix=im.load()pour récupérer la largeur l et la hauteur h de l'image : (l,h)=im.sizepour obtenir le pixel qui est à la ligne l et la colonne c on écrit alors: data=pix[l,c] et onobtient un triplet (R,G,B)pour obtenir la valeur du rouge, du vert et du bleu : data[0], data[1], data[2]pour changer la valeur d'un pixel : pix[l,c]=(R,G,B) avec les nouvelles valeurs de R, G etBpour enregistrer l'image im : im.save("nom_image.jpg") , attention si cette image existedéjà, elle sera écrasée...
Remarque : on peut utiliser divers formats d'images à la place des "jpg".1) Ecrire un programme transformant une image de couleur en niveau de gris.2) Ecrire un programme transformant une image de couleur en noir et blanc.3) Ecrire un programme réalisant le négatif d'une image en couleur.4) Réaliser une autre transformation de votre choix.
6) Les boucles "while"
Retour au plan de cette page
Ce type de boucle sert à itérer des instructions tant qu' une certaine condition est
satisfaite.
Syntaxe: "while a<100:" est la ligne d'entête du bloc et signifie "tant que a est inférieur à
100".
Exemple :
s=0 #initialisation de la somme à 0
i=0 #initialisation du nombre i
while s < 1000: #tant que la somme est inférieure à 1000
i=i+1 #i augmente de 1
s=s+i #on ajoute i à s
print("pour ",i, " et la somme dépasse 1000 et vaut ",s)
Etudiez attentivement ce programme pour déterminer ce qu'il fait et quels sont les
résultats.
Exercices pour les futurs ISN
6.a) Info : Pour choisir un nombre au hasard entre 1 et 6, écrire au tout début du
programme :
from random import randrange #ceci importe la fonction qui permet de choisir des entiers
aléatoires
puis au bon endroit dans le programme : n=randrange(1,7) #7 est le premier nombre non
atteint, comme dans "range"
Ecrire un programme qui simule le lancer d'un dé jusqu'à ce qu'on obtienne 6. Le
programme doit également compter combien de jets ont été nécessaires.
La structure est très souple : on peut n'avoir aucun paramètre, plusieurs paramètres (et
même un nombre indéterminé de paramètres, comme pour la fonction print dans laquelle
on peut mettre différents éléments à afficher, en les séparant par des virgules).
De même, la fonction peut ne rien retourner (on écrit alors simplement return, ou même
rien du tout), ou retourner plusieurs éléments (à séparer par des virgules).
La syntaxe générale est donc:
def nom_fonction(param1,param2,.....):
"""on met souvent ici des explications sur ce que fait la fonction et à quoi
correspondent les paramètres: ce sont les docstrings. On peut obtenir ces
explications en tapant help(nom_fonction) dans la console."""
# (éventuellement une parenthèse vide s'il n'y a pas de paramètres)
bloc d'instructions
return res1,res2,.....
# (éventuellement rien, si la fonction ne retourne aucun résultat)
Exercice 7.1 : valeur absolue
Ecrire une fonction qui retourne la valeur absolue d'un nombre et la tester dans un
programme
Exercice 7.2 : nombres au hasard
On veut créer un générateur de nombres au hasard. Dans ce type de problèmes on a
besoin d'un "germe" : un nombre de départ. On utilise souvent le temps en utilisant la
fonction time() (après avoir écrit "from time import time"). Ceci procure le nombre de
secondes écoulées depuis l'Epoch, c'est à dire depuis le 1/01/1970 à 0h.....
1) Ecrire une fonction g qui prend pour paramètre un nombre x et qui renvoie le reste de
la division de x*16807 par 2147483807 et la tester.
Note : de manière générale, on teste toutes les fonctions écrites et dans tous les cas
possibles.
2) Ecrire un programme qui calcule 60000 nombres ainsi obtenus et compte le nombre de
1, de 2 etc...
Cette méthode vous paraît-elle satisfaisante ?
3) (question supplémentaire) Note : on peut utiliser une fonction dans une fonction...Ecrire une fonction alea qui part du nombre obtenu avec time()
appliquer la fonction g à ce nombre, puis la fonction g au nombre obtenu etc... avec 78itérationsle nombre obtenu est entre 0 et 2147483806 : le diviser par 2147483807, on obtient unnombre dans [0 ; 1[le transformer pour obtenir un entier entre 1 et 6 : c'est ce que doit retourner votrefonction alea.
Cette méthode est-elle plus satisfaisante ? .Attention : les variables définies dans une fonction sont effacées de la mémoire quand leprogramme sort de la fonction. Dans la première fonction ci-dessus, a et b n'existent quependant que le pointeur du programme est dans la fonction f.
variable locale n, alors que en dehors il utilise la variable globale n.
Le troisième programme provoque une erreur, car il est interdit, sans instruction
supplémentaires, de modifier une variable globale dans une fonction. On peut contourner
ce problème de deux manières :
on peut passer n en paramètre et la fonction devient : def essai(a,n), la suite étant
identique.
on peut dire à la fonction que n est une variable globale en écrivant à la deuxième ligne :
global n.
Exercice 7.3 : vecteurs
1) Ecrire une fonction qui prend en paramètres quatre nombres correspondant aux
coordonnées de deux points A et B du plan. La fonction renvoie les coordonnées du
vecteur, vec(A,B).
2) Utiliser cette fonction pour déterminer si un quadrilatère est un parallélogramme.
Remarque : le "return" ferme la fonction : les instructions qui viendraient éventuellement
après ne sont pas exécutées.
Des compléments sur les fonctions :
SWI : les fonctions
SDZ : fonction dont le nombre de paramètres est inconnu
8) Le module "Turtle"
Retour au plan de cette page
Python possède de nombreuses bibliothèques regroupant des catégories de fonctions. Elles
sont appelées des modules, au même titre que les fichier ".py" que vous créez et qui
deviennent vos propres modules.
Pour utiliser le module "Turtle", écrivez au début de votre programme :
from turtle import * (sans oublier "*")
Des explications sur les modules seront données au chapitre 12.
Cette tortue est une interface graphique dans laquelle vous avez un traceur que l'on va
apprendre à commander.
Une documentation très complète est disponible sur : docs.python.org
Au départ la tortue (le traceur) est au centre de l'écran (de coordonnées (0,0)) et orienté
vers l'est.
Les déplacements :
fd(dist) : fait avancer la tortue de distbk(dist) : la même chose en reculantleft(angle) : change la direction du mouvement en la faisant tourner de angle vers lagauche(en degrés par défaut)right(angle) : de même vers la droitegoto(x,y) : déplace la tortue au point de coordonnées (x,y)
Le tracé du cercle commence à l'endroit où est la tortue, dans la direction de la tortue,
puis tourne vers la gauche. Si aucun angle n'est précisé, trace le cercle en entier, sinon
un arc de cercle.
undo() : annule la dernière action (peut être répété).reset() : remet la tortue à l'origine et efface le tracéhome() : remet la tortue à l'origine mais sans effacer le tracédot(r,"couleur") : trace un point de rayon r et de la couleur choisie (ex : "red", "blue"etc...)
Propriétés du traceur
On peut évidemment changer les paramètres du traceur :
pu() (ou penup()) : lève le "stylo" , la tortue se déplace, mais sans tracépd() (ou pendown()) : redescend le "stylo"pensize(nb) : fixe la largeur du "stylo" à nbcolor("coul") : fixe la couleur du stylo ("red", "blue" etc..)speed(n) : règle la vitesse. Si n = 0, le tracé est quasi instantané, si n = 10, il est rapide,si n = 1 il est très lent
La fenêtre
Les propriétés de la fenêtre peuvent également être modifiées :
setup(largeur,hauteur) : règle la largeur et la hauteur (en pixels) de la fenêtrebgcolor("coul") : fixe la couleur de l'arrière-planbye() : permet de fermer la fenêtre
S'il n'y a aucune boucle dans votre programme, aucune pause, vous n'aurez guère le
temps de voir votre tracé
mainloop() : permet d'entrer dans une boucle d'attente
ceci vous donne le temps de voir votre tracé, la fenêtre se ferme en cliquant sur la
croix
exitonclick() : permet de fermer la fenêtre avec un clicclear() : efface la fenêtre, sans bouger la tortue
Nous sommes prêts pour un exemple simple, avant les exercices
from turtle import*
import traceback
try : #permet d'éviter les problèmes avec la fenêtre graphique en cas d'erreur
#à associer avec le "except" plus bas et le "finally".
colormode(255)#pour utiliser les couleurs en mode RGB (sinon colormode(1)
pu()#on deplace le point de départ pour centrer la figure (stylo levé)
key peut prendre les valeurs 'a', 'b' etc... ou "Escape", "Left'" (pour la flèche gauche)
etc.., "Space"...
La fonction ne doit avoir aucun paramètre
onscreenclick(fction) : exécute la fonction suite à un clic dans la fenêtre
la fonction doit prendre deux paramètres (qui seront l'abscisse et l'ordonnée du clic)
Il faudra toujours ajouter" listen()" à la suite de ces deux instructions : cela permetd'attendre les évènements
Mini-projet : jeu du Rond vert
Voici le cahier des charges du jeu
Le jeu se passe dans une grille de 5*5 carrésLe programme choisit une des cases au hasard.L'utilisateur doit trouver la bonne case : pour cela il clique sur une case de son choix.
Si c'est la bonne, le programme affiche un rond vert et un message de félicitations etle jeu s'arrête.Sinon, le programme afiche un rond rouge et le jeu continue.
Dans un second temps, quand la partie est finie, on proposera à l'utilisateur de rejouerou de quitter.
Questions :
a) Sur un papier, dessiner un repère au centre de la feuille allant de -150 à 150 en abscisse
et de -200 à 200 en ordonnée.
Tracer une grille comportant 5*5 carrés de côté 40, dont le point en bas à gauche est
A(-100, -150).
Noter sur ce schéma les coordonnées des points du quadrillage qui sont sur les bords.
Déterminer les coordonnées du point au centre de la case qui est dans la ligne i et la
colonne j en fonction de i et j. (i et j varient de 0 à 4).
Si on a une abscisse x et une ordonnée y, comment retrouver la case où on se trouve, c'est
à dire, le numéro de la ligne et celui de la colonne ?
b) Ecrire une fonction "quad" qui ne prend aucun paramètre et ne renvoie rien, mais qui
trace un quadrillage similaire à celui de votre papier.
On utilisera la régularité du quadrillage pour optimiser le code.
Tester la fonction (évidemment).
c) Ecrire une fonction "but" qui ne prend aucun paramètre, mais qui renvoie la case choisie
par le programme (par exemple 1,3, ce qui correspond au carré de la ligne 1 et de la
colonne 3).
d) Ecrire une fonction "gagne" qui prend pour paramètre une abscisse et une ordonnée et
qui place un rond vert si on est dans la bonne case, et un rond rouge sinon. La tester.
e) Ecrire une fonction "partie" qui gère le déroulement d'une partie (on y utilisera les
fonctions précédentes, ainsi que l'instruction "onscreenclick" et la tester.
f) Ecrire le programme principal, en ajoutant des instructions avec "onkey", de telle sorte
(de type "str"). Nous les avons déjà rencontrées lorsque nous avons affiché des
commentaires (entre guillemets) avec la fonction print.
Une chaîne de caractères peut s'écrire de plusieurs manières, dont par exemple :
ma_chaine="bonjour".
Pour des détails sur la mise en forme des chaînes voir : SWI : les données alphanumériques
Accès aux caractères d'une chaîne
Il se fait exactement come dans les listes. Par exemple : ma_chaine[2]='n' (attention, le
premier caractère est d'indice 0), mais aussi ma_chaine[-1]='r'.
Si vous faites référence au caractère k, vous devez écrire 'k'....sinon python cherche la
variable k !
Attention, contrairement aux listes une chaîne n'est pas modifiable . Si vous écrivez :
ma_chaine[2]='k', cela provoque une erreur.
Il est souvent intéressant pour traiter une chaîne de caractères d'avoir accès à la liste de
tous les caractères. Il suffit pour cela d'écrire : liste=list(ma_chaine) et on aura :
liste=['b','o','n','j','o','u','r'].
Ceci peut servir, par exemple, pour entrer rapidement une liste en utilisant la fonction
"input".
Exercice 10.1 :voyelles et consomnes
1) Ecrire un programme dans lequel l'utilisateur entre une chaine, le programme retourne
la liste des caractères.
2) Modifier le programme pour qu'il retourne trois listes, l'une contenant les voyelles
entrées, l'autre les consomnes, la dernière le reste.
Longueur, index, comptage et concaténation
Ces opérations s'effectuent comme pour les listes.
len(ma_chaine) en donne la longueur,ma_chaine.index('j') donne l'index du premier 'j' (ici 3)ma_chaine.count('o') commpte le nombre de 'o'ma_chaine + " les gens" donne "bonjour les gens" (c'est la concaténation).
Attention on ne peut concaténer que des chaînes avec des chaînes !
Remarque : on peut créer une chaîne vide (chaine="").Une fonction qui peut être utile : eval("6*3") retourne 18. Evalue la valeur numérique de lachaîne.
Exercice 10.2 :
1) Ecrire une fonction qui prend en paramètre un entier positif et retourne le binaire
associé. On pourra retourner ce binaire sous forme d'une chaîne de caractères.
2) Ecrire une fonction qui prend en paramètre un binaire, passé sous forme de chaîne de
3) Ecrire une programme où l'utilisateur a le choix entre l'utilisation de ces deux fonctions.
Parcours d'une chaîne
Là encore, les méthodes sont identiques à celles des listes :
On peut écrire : for i in range(len(ma_chaine)):
mais aussi : for caractere in ma_chaine: .
Comme pour les listes on peut écrire aussi : "while c not in chaine" etc....
Méthodes particulières aux chaînes
Ces méthodes sont très nombreuses. Attention, contrairement aux méthodes de listes, ces
méthodes n'affectent pas la chaîne à laquelle elles sont appliquées.
En voici quelques unes.
ma_chaine.lower() met tout en minuscule et ma_chaine.upper() tout en majuscule
Exemple :
ma_chaine="Quitter"
chainebis=ma_chaine.lower()
print(ma_chaine,chainebis)
Ceci donnera : Quitter quitter (ma_chaine n'a donc pas été modifiée).
ma_chaine.strip() enlève les espaces au début et à la fin (on a aussi rstrip et lstrip pourles enlever à droite ou à gauche)ma_chaine.find("th") retourne la première position de la chaîne "th"ma_chaine.split(',') retourne une liste constituée des sous chaînes de ma_chaine quisont entre deux ','.ma_chaine.replace(c1,c2) remplace le caractère c1 par c2.
Remarque : pour obtenir de l'aide vous pouvez taper dans la console python : help("str")
par exemple, et vous trouverez toutes les méthodes sur les chaînes (en anglais et avec une
syntaxe difficile à saisir, mais c'est parfois utile).
Taper 'q' pour sortir de cette fenêtre.
Pour de l'aide plus accessible, voir SWI : les chaines ou SDZ : les chaînes
Exercice 10.3 :Dérivée d'un polynôme
Améliorer l'interface du programme de la dérivée d'un polynôme : l'utilisateur entre tous
les coefficients en une seule fois, en les séparant par des virgules.
La selection
On peut extraire une partie d'une chaîne ( par exmple chaine="bonjour") grâce aux
chaine[i:j] donne la chaîne extraite depuis juste avant le carcatère i à juste avant lecaractère j
chaine[1:3] donne "on" (le caractère 1 est pris, mais pas le caractère 3)
chaine[:3] donne la chaine extraite à partir du début et jusqu'à juste avant le caractère3 ("bon")chaine[3:] donne la chaîne extraite à partir du caractère 3 (inclus) : ici cela donne"jour".
Comparaison
On peut comparer deux chaînes : python utilise pour cela l'encodage des caractères (nous
utiliserons Utf-8). Il est donc important de n'utiliser que, soit des minuscules, soit des
majuscules et de ne pas mettre de caractères accentués ou spéciaux !
on aura "canard"<"cane"par exemple.
Comme pour les listes, on peut utiliser les fonction min(chaine) et max(chaine).
Exercice 10.4 :
1) Ecrire une fonction qui "nettoie" un mot, c'est à dire, qu'elle retire tous les accents,
cédilles, tirets et elle met le mot en minuscules.
2) Ecrire un programme qui classe par ordre alphabétique trois mots entrés par
l'utilisateur.
Formatage
Cette méthode peut sembler bizarre au début, mais se révèle indispensable assez
rapidement.
On peut vouloir inclure des variables (qui peuvent être des chaînes ou des nombres etc...)
dans une chaîne préformatée.
Par exemple on peut vouloir imprimer "mon nom est .......et mon prénom est ....." avec
tous les noms et prénoms d'une liste.
On va écrire chaine="mon nom est {} et j'ai {} ans".format(nom,age).
Si nom="Toto" et age =6, cette chaîne devient "mon nom est Toto et j'ai 6 ans".
Si on change le nom et l'âge, la chaîne change. Voici un exemple :
l=[["Toto",10],["Titi",2],["Tutu",6]]
#c'est une liste de listes...
for liste in l:
#au premier passage liste=["Toto",10]
chaine="je m'appelle {} et j'ai {} ans".format(liste[0],liste[1])
2) Quelles sont les coordonnées de la case au dessus de deb ? Cette case existe-t-elle
toujours ?
Il faut donc faire attention dans un tableau aux "effets de bord" .....
Exercice 11.2 : bataille navale
Cahier des charges.
Les questions de cet exercice sont situées après ce cahier des charges.
On veut modéliser une bataille navale, dans un tableau de 5*5 cases. Le programme place
les bateaux, l'utilisateur devine leurs emplacements.
Le programme placera 3 bateaux de deux cases (ayant un côté commun) qui serontmodélisés par des cases contenant 2 pour le premier bateau, 3 pour le second et 4 pourle dernier et 6 bateaux de 1 case, modélisés par des 1 dans un tableau appelé "tab"Le programme ne pourra pas mettre deux bateaux sur la même caseL'utilisateur pourra proposer un n° de ligne et un n° de colonneLe programme affichera un deuxième tableau (appelé "trouve") de 5*5 cases dans lequelapparaîtront des 9 pour les cases proposées ne contenant pas de bateaux, et le n° dubateau si la case correspondante de "tab" en contient un.L'utilisateur pourra proposer des cases tant que tous les bateaux n'auront pas ététrouvés.Le programme affichera un message lorsque tous les bateaux auront été trouvés.Prolongements possibles :ajouter un affichage "dans l'eau", "touché" ou "coulé" après chaque coup.modifier les dimensions pour avoir des tableaux 10*10 avec 4 bateaux de 2 cases et 10bateaux de 1 case.
Note : dans tout l'exercice, une case est libre si elle correspond à un "0" dans le tableau"tab".
Partie A : placement des bateaux
a) Créer un tableau "tab" de 5 lignes et 5 colonnes ne contenant que des zéros avec lafonction "zeros" de numpy.
b) Ecrire une fonction "place_bat1" qui ne prend aucun paramètre et qui place auhasard un "1" dans le tableau "tab" : on choisira au hasard le numéro de la ligne et lenuméro de la colonne.Modifier cette fonction pour quelle place 19 chiffres "1" dans le tableau "tab".Attention à ne pas mettre deux bateaux sur la même case. Ecrire un programme pourtester cette fonction, et le lancer 3 ou 4 fois (s'assurer que l'on a bien 19 bateaux àchaque fois !). Quand cela fonctionne, modifier votre fonction pour qu'elle ne crée plusque 6 bateaux de 1 case.
c) Ecrire une fonction "case_libre" qui prend pour paramètres un numéro de ligne x etun numéro de colonne y. Cette fonction retourne une liste l contenant les coordonnéesdes cases disponibles autour de la case de coordonnées (x,y) (c'est à dire les cases ayantun côté commun avec la case de coordonnées (x,y) et qui sont libres)Attention aux "effets de bord " !
Ecrire un programme qui utilise la fonction "place_bat1" puis qui teste la fonction"case_libre" en l'appliquant à différentes valeurs correspondant à des cases qui sont aubord, qui sont dans un coin ou qui sont au centre du tableau.
d) Ecrire une fonction "place_bato2" qui ne prend aucun paramètre. Cette fonction vachoisir une case au hasard : si cette case est libre, la fonction choisit une case auhasard dans la liste des cases libres retournée par la fonction "case_libre" et place unbateau sur les deux cases ainsi choisies (avec deux 2). Attention au cas où la liste descases libres est vide ! Sinon, elle recommence avec une autre case.
e) Modifier la fonction précédente pour qu'elle place les trois bateaux de deux cases(l'un en mettant des 2, le suivant avec des 3 et le dernier avec des 4) et la tester.
f) Compléter le programme précédent pour qu'il place aussi les 6 bateaux de une caseet tester ce programme.
Partie B : le jeu
a) Crée un tableau "trouve" de 5*5 cases avec des zéros dans chaque case.
b) Ecrire une fonction "touche" qui prend en paramètre un numéro de ligne et unnuméro de colonne et qui retourne 1 si la case correspondante du tableau "tab" contientun bateau et 0 sinon. Si un bateau a été atteint, cette fonction placera dans la casecorrespondante du tableau "trouve" le numéro du bateau atteint, et elle mettra un "9" siaucun bateau n'a été atteint. Attention au cas où la case avait déjà été proposée : dansce cas la fonction devra retourner 0.
c) Ecrire un programme où l'utilisateur peut proposer des cases tant que les 12 cases oùil y avait des bateaux n'ont pas été trouvées en affichant le tableau "trouve" aprèschaque coup. Et terminer en faisant afficher un message quand tous les bateaux ont ététrouvés.
Exercice 11.3 : sudoku (exercice difficile, à aborder seulement si la bataille navale ne
vous a causé aucun problème)
D'après une idée du HS n°30 de TANGENTE sur les algorithmes (page 63)
1) Pour représenter les nombres dans un sudoku, il faut un tableau t de 9 lignes et 9
colonnes, dans laquelle on ne met que des 0 au départ.
t[0,3]=6 met un 6 pour le quatrième nombre de la première ligne.
Notre sudoku sera terminé quand on n'aura plus aucun 0, c’est-à-dire quand le produit
de tous les éléments de t sera non nul.
2) a) On va créer un deuxième tableau de même dimension appelé "pos" qui contiendra
81 fois la liste [1,2,3,4,5,6,7,8,9] : ceci représentera pour chaque case du sudoku, la
liste des chiffres possibles. Au fur et à mesure de la résolution du sudoku on va retirer
des chiffres de ces listes.
Le module numpy est difficile à utiliser dans ce cadre, on va s'en passer.
Remarque : pos[5][6] sera la liste de tous les chiffres possibles pour la case qui est à la
ligne 5 et à la colonne 6 : au départ elle vaudra [1,2,3,4,5,6,7,8,9]
le module time : voir SDZ : le module timele module turtlele module sys : voir SDZ : programmation systèmele module os : voir Modules internes de pYthon
Et bien plus encore : Index des modules Python
13) Lecture et écriture dans un fichier
Retour au plan de cette page
Dans de nombreux programmes on aimerait garder les résultats obtenus ou utiliser des
informations déjà existantes.
On va donc apprendre à lire et à écrire dans des fichiers. Imaginons que vous ayez créé
un fichier appelé "fich.txt" (avec le bloc note par exemple).
Pour lire ce fichier, il faut d'abord l'ouvrir. Voici la syntaxe :
fichier=open("fich.txt","r") toujours accompagné après utilisation de : fichier.close()
Trois commentaires :
l'adresse du fichier est relative ou absolue. Si votre fichier est dans le même dossierque votre programme, le chemin donné ici est suffisant. Sinon, mettez le cheminabsolu, par exemple : "C:/toto/isn/fich.txt".le "r" signifie "read" : votre fichier n'est ouvert qu'à la lecture.on peut remplacer le "r" par "rb" qui lit le fichier en mode binaire, c'est à dire octetpar octet.
On peut ensuite lire le fichier de différentes manières :
chaine=fichier.read() : lit le fichier en intégralité et renvoie une chaîne decaractères.chaine=fichier.read(10) : lit dix octets à partir de la position courante (un caractèresimple est codé sur un octet).Si on répète l'opération, les 10 octets suivants seront lus. Retourne une chaîne videquand la fin du fichier est atteinte.chaine=fichier.readline() : lit une seule ligne à partir de la position courante ycompris le '/n' qui est le caractère de fin de ligneRetourne une chaîne vide quand la fin du fichier est atteinteAttention '/n' est généralement codé sur deux octets (un retour chariot + un passageà la ligne)liste=fichier.readlines() : retourne une liste de toutes les lignes du fichier.
Les deux méthodes suivantes sont utiles :
fichier.tell() : donne le nombre d'octets parcourus depuis le début du fichierfichier.seek(nombre,pt_depart) : amène la position courante à nombre (positif ounégatif) d'octets du point de départ.Ce point de départ est 0 si c'est le début du fichier, 1 si c'est la position courante et 2si c'est la fin du fichier).Pour un fichier texte, on ne peut appliquer seek qu'à partir du départ, oufichier.seek(0,2), qui place la position courante à la fin du fichier
Pour écrire dans un fichier, il faut également l'ouvrir : il faut toutefois savoir si on veut
écraser le fichier précédent ("w" comme "write") ou ajouter à la fin du fichier ("a"
comme "append").
Dans les deux cas, si le fichier n'existe pas il sera créé.
Ensuite il suffit d'appliquer la méthode suivante :
fichier=open("fich.txt","w")
fichier.write("mon texte ici")
Pensez à la méthode 'format' des chaînes de caractères pour écrire des chaînes
contenant des parties variables.
Exemple:
Enregistrez votre programme avant de le faire fonctionner : de cette manière le fichier
habit.txt se créera dans le même dossier.
fich=open("habit.txt","w")
l=["Strasbourg","Colmar","Mulhouse"]
n=[272955,68848,112260]
for i in range(3):
fich.write("la ville de {} compte {} habitants\n".format(l[i],n[i]))
#revoir la méthode format
fich.close()
fich=open("habit.txt","r")
print(fich.read())
print("nombre d'octets du fichier ",fich.tell())
fich.seek(0) #indispensable pour remettre la position courante au début du fichier
for i in range(3):
print(fich.readline())
fich.seek(0)
print(fich.readlines())
fich.close()
Allez voir à quoi ressemble ce fichier dans le dossier courant, puis notez bien les trois
manières de lire dans ce fichier.
Il existe d'autres manières d'enregistrer des données dans un fichier :
sous forme binaire (avec 'rb' , 'wb'...)en utilisant le module pickle (de l'anglais "conserver") qui enregistre les données enmême temps que leur type : ceci est utile pour enregistrer des données pluscomplexes que du texte !voir : SWI : module pickle
Exercice 13.1 : fichier de meilleurs scores
1) Ouvir le bloc-notes et dans un fichier nommé "score.txt" écrire :
Ali Marie Marc
1000 900 600
Ecrire un programme qui lit ce fichier
2) Ecrire un programme qui récupère dans une liste les trois noms, et dans une autre les