Cours

Les transparents du sixième cours sont disponibles ici. top

Exercice 1 - Jeu des capitales

Le but de cet exercice est de programmer un jeu permettant de réviser ses connaissances sur les capitales du monde. Le fichier capitales.txt contient une liste associant les pays et les capitales sur une même ligne en les séparant d'une espace (les espace dans les noms de pays ont été remplacées par le caractère _ ; par exemple "Afrique du Sud" est remplaçé par "Afrique_du_Sud".
  1. Écrire un script qui entre les données du fichier capitales.txt dans un dictionnaire (le nom du pays servant de clé).

  2. Écrire un script qui crée le dictionnaire inverse (ou les noms des capitales sont les clés).

  3. Écrire un script qui affiche un menu du type

    Entrer votre choix :
    • 1 - Apprendre les pays

    • 2 - Apprendre les capitales

    • 3 - Quizz par capitales

    • 4 - Quizz par pays

    • 5 - Quitter

    et lorsque l'utilisateur entrera son choix, il pourra ensuite
    • entrer le nom d'une capitale et obtenir le nom du pays (choix 1),
    • entrer le nom d'un pays et obtenir le nom de la capitale (choix 2),
    • donner le nom du pays correspondant à la capitale choisie par le programme (choix 3),
    • donner le nom de la capitale correspondant au pays choisi par le programme (choix 3),
  4. Améliorer le programme pour que la réponse de l'utilisateur soit validée même si il a utilisé une majuscule au lieu d'une minuscule, une minuscule au lieu d'une majuscule, une espace au lieu d'un "_", ...

#!/usr/bin/python
# -*- coding: latin-1 -*-

from re import *
import random

def ApprendrePays():
	while True:
		pays = raw_input("Entrer le nom d'un pays : ")
		if pays == '':
			break
		pays = pays[0].upper()+pays[1:].lower()
		if dicoPC.has_key(pays):
			print "La capitale de :", pays, "est :", \
			 dicoPC[pays]
		else:
			print "Pays inconnu"

def ApprendreCapitale():
	while True:
		capitale = raw_input("Entrer la capitale : ")
		if capitale == '':
			break
		capitale = capitale[0].upper()+capitale[1:].lower()
		if dicoCP.has_key(capitale):
			print capitale, "est la capitale de :", \
			   dicoCP[capitale]
		else:
			print "Capitale inconnue"

def QuizzPays():
	ListePays = dicoPC.keys()
	while True:
		indice = random.randint(0,len(ListePays))
		print "Quelle est la capitale de :", \
		    ListePays[indice], "?"
		capitale = raw_input()
		if capitale == '':
			print dicoPC[ListePays[indice]], \
			"est la capitale  de :", ListePays[indice]
			break
		capitale = capitale[0].upper()+capitale[1:].lower()	
		if dicoPC[ListePays[indice]]==capitale:
			print "Bravo !"
		else:
			print "Non,", dicoPC[ListePays[indice]], \
			"est la capitale de :", ListePays[indice]

def QuizzCapitales():
	ListeCapitales = dicoCP.keys()
	while True:
		indice = random.randint(0,len(ListeCapitales))
		print "De quel pays", ListeCapitales[indice], \
		 "est-elle la capitale ?"
		pays = raw_input()
		if pays == '':
			print ListeCapitales[indice], \
                         "est la capitale de :",\
			 dicoCP[ListeCapitales[indice]]
			break
		pays = pays[0].upper()+pays[1:].lower()	
		if dicoCP[ListeCapitales[indice]]==pays:
			print "Bravo !"
		else:
			print "Non,", ListeCapitales[indice], \
                          "est la capitale\
			 de :", dicoCP[ListeCapitales[indice]]

############################################
############################################

filein = open('capitales.txt','r')

dicoPC  = {}
lignes = filein.readlines()
for ligne in lignes:
	dicoPC[sub('_',' ',split(' ',ligne,1)[0])]=sub('\n','',\
	split(' ',ligne,1)[1])

dicoCP = {}
for clef in dicoPC:
	dicoCP[dicoPC[clef]] = clef

filein.close()

while True:
	print """
     	 1 - Apprendre les pays
     	 2 - Apprendre les capitales
     	 3 - Quizz par capitales
     	 4 - Quizz par pays
     	 5 - Quitter
	"""
	while True:
		choix = raw_input("Entrer votre choix : ")
		if choix in ['1','2','3','4','5']:
			break
	if choix=='1':
		ApprendrePays()
	if choix=='2':
		ApprendreCapitale()
	if choix=='3':
		QuizzCapitales()
	if choix=='4':
		QuizzPays()
	elif choix=='5':
		break	
top

Exercice 2 - La roue de la fortune

  1. Écrire un script qui prend entrée une chaîne de caractères contenant uniquement des lettres, des espaces et des tirets "-" et affiche la liste des mots possibles formés de mots du dictionnaire français où les tirets sont remplacés par des lettres. Par exemple, pour l'entrée : LA R-UE -E LA --RTUNE, le programme devra afficher :

    Les solutions possibles pour LA R-UE -E LA -ORTU-E sont :
    
       1. LA
    
       1. ROUE
    
       1. CE
       2. DE
       3. JE
       4. LE
       5. ME
       6. NE
       7. SE
       8. TE
    
       1. LA
    
       1. FORTUNE
       2. TORTURE
    
  2. Modifier votre script pour qu'il prenne en entrée une liste des lettres déjà proposées et ne retourne que les solutions ne contenant pas ces lettres.

#!/usr/bin/python
# -*- coding: latin-1 -*-

from re import *

filein = open('/usr/share/dict/french','r')
mots = filein.read()
filein.close()

while True:
	chaine = raw_input('Entrer une chaîne de caractères : ')
	if not search('[^A-Za-z\- ]',chaine):
		break

while True:		
	listelettres = raw_input('Entrer la liste des \
	                   lettres utilisées :')
	if not search('[^A-Za-z]',listelettres):
		break

listelettres=listelettres.lower()+sub('[ \-]','',chaine).lower()
# Les lettres contenues dans la chaine ont aussi été proposées

print "Les solutions possibles pour :", chaine.upper(), "sont"
print
chaine=sub('-','.',chaine.lower())
liste=split(' ',chaine)
for mot in liste:
	Occurences = findall('\n'+mot+'\n',mots)
	i = 1	
	for motvalide in Occurences:
		motvalide = sub('\n','',motvalide)
		test = True		
		for j in range(len(mot)):
			if mot[j] == "." and \
			      motvalide[j] in listelettres:
				test = False
		if test:
			print i, motvalide.upper()
			i+=1
	if i==1:
		print "Pas de solution pour ce mot !"	
	
	print
top
top