Formation I.S.N.

Les fichiers - Exemple de mini-projets

Plus tard ! Les programmes ci-dessous ne sont pas à réaliser le jour de la formation (sauf s'il vous reste du temps bien évidemment). Ils sont là pour vous montrer un exemple de mini-projet que l'on peut donner à des élèves.

La production finale est constituée de trois programmes à intituler :

  • Noms_des_eleves_du_groupe_dico_sans_doublons.py
  • Noms_des_eleves_du_groupe_mot_dans_dico.py
  • Noms_des_eleves_du_groupe_anagrammes.py

Programme n°1

Le dictionnaire contenu dans le fichier dico.txt n'a aucun mot accentué. Cependant, il a été constitué à partir de mot avec accent. Dès lors, il contient des « doublons ». Par exemple, les mots former et reformer sont tous deux écrits sans accent : reformer.

Le programme à concevoir doit respecter les contraintes suivantes :

  • Lire le fichier dico.txt et créer le fichier dico_sans_doublon.txt.
  • Pour chaque mot lu dans le dictionnaire d'origine, le programme doit écrire ce mot dans le fichier dico_sans_doublon.txt à condition que ce mot ne soit pas déjà présent !
  • Une solution pour le prof

##----- Ouverture des fichiers -----##
f = open('dico.txt', 'r')               	# On accède au fichier (attention au chemin)
g = open('dico_sans_doublon.txt', 'w')      # On crée un nouveau fichier

##----- Programme principal -----##
mot = ""                                    # Sert à stocker le mot précédent

for ligne in f:
    new_mot = ligne.rstrip('\n')            # On supprime le passage à la ligne
    if new_mot != "" and new_mot != mot :   # mot non vide et nouveau mot
        g.write(new_mot + '\n')
        mot = new_mot                       # Sauvegarde du nouveau mot

##----- Fermeture des fichiers -----##
f.close()
g.close()

Programme n°2

Dans ce programme, on fait appel au fichier dico_sans_doublon.txt.

Le programme à concevoir doit respecter les contraintes suivantes :

  • L'utilisateur est invité à saisir un mot.
  • Définir une fonction pas_accent() qui prend pour paramètre un mot (une chaîne de caractères). Cette fonction doit supprimer les éventuels espaces et les éventuels chiffres. Elle doit aussi remplacer les voyelles accentuées par des voyelles non accentuées.
    Enfin, elle renvoie le mot « nettoyé ».
  • Définir une fonction dans_dico() qui prend pour paramètre une chaîne de caractères et qui indique par un booléen si ce mot appartient au fichier dico_sans_doublon.txt.
  • A l'aide de ces fonctions, le programme indique à l'utilisateur si le mot qu'il a entré est bien dans le dictionnaire.
  • Une solution pour le prof

##----- Définition des Fonctions -----##
def pas_accent(mot):
    """ Entrées : mot est une chaîne de caractères
		Sorties : le même mot dans lequel les éventuels espaces et chiffres ont été
			supprimés. Les voyelles accentuées sont remplacées par des non accentuées."""
    supprime = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' ']
    voyelles_a = ['à', 'á', 'â']
    voyelles_e = ['è', 'é', 'ê', 'ë']
    voyelles_i = ['î']
    voyelles_o = ['ô']
    voyelles_u = ['ù', 'ú', 'û']
    new_mot = ''
    for lettre in mot:
        if lettre in voyelles_a :
            new_mot += 'a'
        elif lettre in voyelles_e :
            new_mot += 'e'
        elif lettre in voyelles_i :
            new_mot += 'i'
        elif lettre in voyelles_o :
            new_mot += 'o'
        elif lettre in voyelles_u :
            new_mot += 'u'
        elif lettre not in supprime :
            new_mot += lettre
    return new_mot


def dans_dico(mot):
    """ Entrées : mot est une chaîne de caractères 'nettoyée'
		Sorties : un booléen qui indique si le mot appartient au dictionnaire."""
	rep = False 				# La réponse
    f = open('dico_sans_doublon.txt', 'r')
    if mot+'\n' in f:
        rep = True
    
	f.close()
    return rep


##----- Programme principal -----##
mot = input("Entrez un mot s'il vous plaît : ")
mot = pas_accent(mot)

if dans_dico(mot):
    print('Le mot est dans le dictionnaire.')
else:
    print('Ce mot n\'est pas dans le dictionnaire.')

Programme n°3

Le programme à concevoir doit renvoyer une liste d'anagrammes présentes dans la langue française :

  • L'utilisateur est invité à saisir un mot, on utilise la fonction pas_accent() du programme précédent pour « nettoyer » ce mot.
  • Définir une fonction anagrammes() qui prend pour paramètre une chaîne de caractères et qui renvoie une liste de toutes les anagrammes (permutations de lettres) possibles de cette chaîne. Par exemple, anagrammes('bla') renvoie la liste ['bla', 'bal', 'alb', 'abl', 'lab', 'lba'].
  • Si besoin, améliorer la fonction pour que les anagrammes soient écrites dans l'ordre alphabétique et qu'il n'y ait pas de doublons
  • En utilisant la fonction dans_dico(), afficher uniquement à l'écran les anagrammes présentes dans la langue française.
  • Une solution pour le prof

Il est possible de faire une version récursives de ce programme. Comme la récursivité n'a pas encore été abordée au cours de la formation, voici une version itérative :


##----- Définition des Fonctions -----##
def pas_accent(mot):
    """ Entrées : mot est une chaîne de caractères
		Sorties : le même mot dans lequel les éventuels espaces et chiffres ont été
			supprimés. Les voyelles accentuées sont remplacées par des non accentuées."""
    supprime = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' ']
    voyelles_a = ['à', 'á', 'â']
    voyelles_e = ['è', 'é', 'ê', 'ë']
    voyelles_i = ['î']
    voyelles_o = ['ô']
    voyelles_u = ['ù', 'ú', 'û']
    new_mot = ''
    for lettre in mot:
        if lettre in voyelles_a :
            new_mot += 'a'
        elif lettre in voyelles_e :
            new_mot += 'e'
        elif lettre in voyelles_i :
            new_mot += 'i'
        elif lettre in voyelles_o :
            new_mot += 'o'
        elif lettre in voyelles_u :
            new_mot += 'u'
        elif lettre not in supprime :
            new_mot += lettre
    return new_mot


def dans_dico(mot):
    """ Entrées : mot est une chaîne de caractères 'nettoyée'
		Sorties : un booléen qui indique si le mot appartient au dictionnaire."""
	rep = False 				# La réponse
    f = open('dico_sans_doublon.txt', 'r')
    if mot+'\n' in f:
        rep = True
    
	f.close()
    return rep


def inserer(mot, lettre, indice):
    """ Entrées : mot est une chaîne de caractères, lettre est un caractère, indice est un entier
		Sorties : Le mot dans lequel on a inséré la lettre à l'indice indiqué"""
	if indice <= len(mot):
        mot = mot[:indice]+lettre+mot[indice:]		# Tranche avant l'indice puis à partir de l'indice
    return mot


def permuter(mot, lettre):
    """ Entrées : mot est une chaîne de caractères, lettre est un caractère
		Sorties : Renvoie la liste des chaînes de caractères composées du mot
			dans lequel on a inséré la lettre à chacun des indices possibles"""
	liste = []
    for i in range(len(mot)+1):                  	# i parcourt tous les indices selon la longueur de texte
        liste.append(inserer(mot, lettre, i))
    return liste


def anagrammes(mot):
    """ Entrées : mot est une chaîne de caractères
		Sorties : Renvoie la liste de tous les anagrammes du mot"""
	mot = list(mot)                 				# Liste des lettres de la chaine de caractères
    liste_1 = [mot[0]]
    liste_2 = []									# Liste transitoire, obtenue avec la fonction permuter()
    for i in range(1, len(mot)):					# i parcourt toutes les lettres de mot
        for element in liste_1:
            liste_2 += permuter(element, mot[i])
        liste_1 = liste_2
        liste_2 = []
    return liste_1


def ana_sans_doublons(mot):
    """ Entrées : mot est une chaîne de caractères
		Sorties : Renvoie la liste des anagrammes de mot sans doublons et
			triée par ordre alphabétique"""
    liste=anagrammes(texte)
    sortie = [liste[0]]                             # La liste contient le 1er anagramme
    for i in range(1, len(liste)):
        if liste[i] not in sortie:                  # On teste chaque nouvel anagramme avant de l'accepter
            sortie.append(liste[i])
    return sorted(sortie)                           # Tri de la liste sans doublon



##----- Programme principal -----##
mot = input("Entrez un mot s'il vous plaît : ")
mot = pas_accent(mot)

liste = ana_sans_doublons(mot)
print('Les anagrammes de ce mot sont :')
print(liste)

liste_finale = []
for mot in liste:
    if dans_dico(mot):
        liste_finale.append(mot)

print('Les anagrammes présents dans le dictionnaire sont :')
print(liste_finale)