NAV

Introduction

Bienvenue sur le site dédié à votre examen final de Python. Il devrait contenir toutes les ressources nécessaires à la réalisation de votre projet de groupe. Si vous avez des questions, n’hésitez pas à m’envoyer un mail.

Si vous êtes perdus, ou ne savez pas par où commencer, regardez bien les ressources mises à votre disposition. De plus, je vous recommande d’effectuer vos propres recherches sur internet (comme vous le feriez en entreprise). En informatique, les tutoriels/documentations/aide sur les erreurs sont majoritairement en anglais. Pensez donc à faire vos recherches dans cette langue si cela ne donne rien en français.

Pensez également à faire un tour sur les ressources des autres projets, vous pourriez éventuellement tomber sur des choses intéressantes.

La procédure est la suivante :

Vous devrez présenter votre travail lors d’une soutenance. Chacun devra expliquer une partie du code. 10 min environ par groupe (vous ne serez pas notés sur le temps)

Point sur la triche et objectif du projet

Le but de ce projet est que vous puissiez manipuler du Python à travers une activité qui se veut la plus ludique et utile possible. Je ne m’attends pas à ce que le code soit parfait, et je préfère un groupe qui a passé du temps à rendre un projet fonctionnel à 70% qu’un groupe qui a sous-traité pour présenter un projet “fini”.

D’expérience, ce sont les projets sous-traité qui obtiennent les moins bonnes notes, puisque les développeurs expérimentés ont pour habitude de faire comme ils l’entendent sans respecter les consignes : on se retrouve alors avec un code qui fait plein de chose, mais ne répond pas aux instructions demandées.

Comme en entreprise, je vous autorise à récupérer des morceaux de code disponibles sur internet, d’utiliser ChatGPT… Cependant, merci de ne pas récupérer un projet existant tel quel… (je n’ai aucun intérêt à passer du temps sur un code écrit par d’autres)

Fonctionnement du site

Chaque groupe va travailler sur un sujet qui lui est propre. La liste des sujets (et des groupes associés) est accessible via le menu latéral.

Pour chaque groupe, deux sections sont accessibles :


Base de données décès

L’objectif de ce projet est de pouvoir rechercher des individus dans la base de données de décès de l’INSEE. Aucune API n’étant mise à disposition pour effectuer directement les recherches, nous allons utiliser celle mise à disposition par matchid.io.

Membres du groupe :

Sujet

Palier 1

Le premier palier consiste à récupérer les informations relatives à une personne d’après différents champs :

Pour savoir comment utiliser l’API, utiliser la documentation : https://deces.matchid.io/deces/api/v1/docs

Via un formulaire, demander à l’utilisateur de remplir les champs. Certains d’entre eux peuvent être laissés vides.

Palier 2

Le palier 2 doit permettre de récupérer des informations par lot. Pour cela, il faut utiliser l’endpoint /agg. Bien penser à renseigner les colonnes sur lesquelles aggréger via le paramètre obligatoire aggs.

Palier 3

Générer des documents exportés, des stats…

Bataille navale

Le but du projet est de réaliser une bataille navale. Pour rappel, les membres du groupe sont :

Sujet

Pour vous aider, une partie du code vous a été fourni.

Palier 1

Code à copier en haut de votre fichier

from IPython.display import display
from functools import reduce
import pandas as pd

def generate_grid(col_count, line_count, boat_count):
    return Grid(col_count, line_count, boat_count)

def check_case(grid, num_col, num_line):
    return grid._check_case(num_col, num_line)

def set_boat(grid, num_col, num_line):
    return grid._set_boat(num_col, num_line)

def set_bombed(grid, num_col, num_line):
    return grid._set_bombed(num_col, num_line)

def set_water(grid, num_col, num_line):
    return grid._set_water(num_col, num_line)

def boat_remains(grid):
    return grid._boat_remains()

def print_grid(grid):
    grid._print_grid()
    
class Grid:
    def __init__(self, col_count, line_count, boat_count):
        self.col_count = col_count
        self.line_count = line_count
        
        self.board = [["" for i in range(col_count)] for j in range(line_count)]
        self.boat_count = boat_count

    def _check_case(self, num_col, num_line):
        return num_line < self.line_count and num_col < self.col_count and not self.board[num_line][num_col] 
    
    def _set_boat(self, num_col, num_line):
        self.board[num_line][num_col] = "⛵"
        
    def _set_bombed(self, num_col, num_line):
        self.board[num_line][num_col] = "💥"
        
    def _set_water(self, num_col, num_line):
        self.board[num_line][num_col] = "🌊"
    
    def _print_grid(self):
        display(pd.DataFrame(self.board, columns=[chr(i) for i in range(ord("A"), ord("A") + self.col_count)]))
        
    def _boat_remains(self):
        return reduce(lambda x, y: ("⛵" in y) or x, self.board, False)

Dans ce palier, il va falloir réaliser deux choses :

  1. Demander à l’utilisateur les paramètres du jeu

    1. La longueur de la grille
    2. La largeur de la grille
    3. Le nombre de bateaux à placer
  2. Demander aux deux joueurs leur pseudo

Une fois ces informations obtenues, utiliser la fonction generate_grid(col_count, line_count, boat_count) pour générer la grille.

Les utilisateurs devront maintenant placer les bateaux sur la gille à l’aide de leurs coordonnées. Pour simplifier, tous les bateaux sont identiques et ont une taille de 3. Ils peuvent être orientés à la verticale ou à l’horizontale.

Pour permettre aux joueurs de placer leurs bateaux, vous procèderez de la manière suivante :

Tant qu’il lui reste des bateaux à placer au joueur :

  1. Demander à l’utilisateur d’entrer les coordonnées sous la forme de lettre, ligne (ex: A3, B7…) suivi de la lettre V ou H. Le point indiqué par l’utilisateur correspond au point le plus en haut en gauche du bateau. Il vous faut donc calculer la liste des 3 points sur lesquels placer le bateau

    • Note : A1 est la case tout en haut à gauche
    • B3V : On place le bateau à la verticale, avec son point le plus haut/gauche en B3. Le bateau occupe donc les cases B3, B4, B5
    • C5H : On place le bateau à l’horizontable, avec son point le plus haut/gauche en C5. Le bateau occupe donc les cases C5, C6, C7
  2. Vérifier pour chaque case déterminée à l’étape 1 et à l’aide de la fonction check_case(num_col, num_ligne, grid), si elles sont toutes libres (la fonction renvoie True si elle existe et qu’elle est libre. Ici grid est l’objet renvoyé par la fonction generate_grid utilisée dans le 1. Les deux premiers arguments sont des nombres, veillez à bien transformer vos lettre en nombre (A = 1, B = 2, etc).

  3. Plusieurs cas :

    1. Pas d’erreur lors des checks : alors on peut passer point 4.
    2. Au moins une erreur lors des checks : demander à l’utilisateur de fournir un autre point pour son bateau (retour point 1)
  4. La fonction set_boat(num_col, num_ligne, grid) permet de “mettre un bateau” sur la grille donnée en paramètre aux coordonnées indiqués. Il faut donc l’utiliser avec tous les points calculés en 1 et vérifiés en 2.

Faites de même pour le second joueur

Utiliser la fonction print_grid(grid) pour afficher les deux grilles l’une après l’autre.

Palier 2

Vient maintenant le temps du jeu !

Voilà comment se déroule une partie. Chaque joueur dispose de deux grilles : l’une sur laquelle sont positionnés ses bateaux, et l’autre lui permettant de se remémorer ses précédents coups, en mettant en avant les bateaux ennemis déjà touchés. Il vous fadra_donc générer deux nouvelles grilles de même taille que les deux premières.

Ensuite, chaque joueur joue son tour.

  1. Demander au joueur la case qu’il souhaite bombarder

  2. Vérifier que la case est valide via la fonction check_case : pour rappelle, elle envoie True si la case est vide ou en dehors des limites. Pensez bien à ce dernier cas ! De plus, pensez que cette vérification se fait sur la grille adverse. Imaginons que nous sommes au tour du Joueur 1 (J1). On note J1(1) le board personnel de J1 (avec ses bateaux) et J1(2) celui qui contient tous ses tirs précédents :

    1. Si la case adverse (J2(1)) contient un bateau :
      1. Passer la case J2(1) à “💥” (via set_bombed(grid, num_col, num_line))
      2. Passer la case du board J1(2) “💥” (via set_bombed(grid, num_col, num_line))
    2. Si c’est de l’eau :
      1. Passer la case J2(1) à “🌊” (via set_water(grid, num_col, num_line))
      2. Passer la case du board J1(2) à “🌊” (via set_water(grid, num_col, num_line))

Faire cela pour chaque joueur, à tour de role, et tant qu’aucun des deux n’a perdu tous ses bateaux. Il vous est possible de vérifier la présence de bateaux sur une grille via la fonction boat_remains(grid) qui renvoie True s’il reste au moins une case bateau ou False s’ils sont tous coulés.

Palier 3

Pour ce palier, l’objectif est de pouvoir sauvegarder, pour chaque joueur, le nombre de coups tirés et le nombre de cibles touchés. Pour cela, vous utiliserez un fichier YAML. Des exemples vous sont donnés plus loin dans le sujet.

Fonctions fournies

Ressources

Fonctions pour lire/écrire dans un fichier Yaml un dictionnaire d

import yaml
from yaml import Loader, Dumper


def load_from_file(filename):
    with open(filename, "r") as f:
        return yaml.load(f, Loader=Loader)


def save_to_file(filename, d):
    with open(filename, "w") as f:
        f.write(yaml.dump(d, Dumper=Dumper))

Liens utiles

Exemples de code


Décompte votes

Le site de l’Assemblée Nationale permet de suivre les travaux parlementaires en mettant à dispositions des informations telles que :

L’objectif de ce projet est de pouvoir automatiser la collecte des données relatives aux votes des députés lors des scrutins.

Membres du groupe :

Sujet

Palier 1

La première étape consiste à utiliser l’API pour récupérer les informations liées à un vote. Le numéro du scrutin devra être demandé de manière interactive à l’utilisateur.

Cinématique attendue :

  1. Le programme demande à l’utilisateur de rentrer le numéro d’un scrutin
  2. Le programme détermine l’URL à requêter
  3. Une requête est effectuée sur l’URL pour récupérer les informations relatives au scrutin
  4. Le programme affiche à l’écran les informations suivantes :
    • Nombre de votants
    • Nombre de suffrages exprimés
    • Majorité absolue
    • Pour l’adoption
    • Contre
    • Part de députés, en pourcentage, ayant pris part au vote (sur le 577), à calculer

Récupération de la page pour le vote 1693, localisation de la balise du titre, et affichage des balises soeurs (il vous faudra comprendre ce que le code fait pour l’adapter légèrement) :

from bs4 import BeautifulSoup
import requests
# URL de la page à récupérer
url = "https://www2.assemblee-nationale.fr/scrutins/detail/(legislature)/16/(num)/1693"

# On récupère la page
content = requests.get(url)

if content.status_code != 200:
  print("Error")
  
# On transforme le contenu html récupéré sous la forme d'une chaine de caractères en un contenu que l'on peut manipuler en Python
page = BeautifulSoup(content.content, 'html.parser')

# Nous avons vu via le navigateur que le tag HTML du titre "Synthèse du vote" avait une classe synthese
class_ = "synthese"

# On récupère le bloc ayant la classe synthèse
bloc = page.find('h2', class_=class_)
# On affiche les "frères" du bloc en question
print(bloc.find_next_siblings('p'))

Pour récupérer les informations dans la page, on retrouve un élément marquant proche : le titre “Synthèse du vote”. On remarque que les éléments intéressants sont juste à la suite dans le code HTML : ils ne sont pas contenus dans la balise du titre, mais bien à la suite (si vous êtes perdus, envoyez-moi un mail on fera un appel, ou je ferai un tuto vidéo).

Palier 2

En utilisant la méthode précédente, extraire la liste des députés ayant pris par au vote, et l’afficher

ex :

Palier 3

Exemple d’un menu :

>>> print_menu()
1 - Titre du Menu 1
Description
2 - Titre du Menu 2
Description

>>> menu_nb = input()
2

>>> if menu == '1':
...  # Action
... if menu == '2':
...  # Autre action

Pour ce dernier palier, il vous faudra enregistrer les éléments des paliers 1 & 2 dans un document Word. L’utilisateur devra pouvoir avoir le choix entre afficher ou enregistrer le résultat.

La cinématique devra être :

  1. Demande à l’utilsiateur du numéro de scrutin
  2. Demande à l’utilisateur, via un menu, s’il souhaite :
    1. Afficher le résultat
    2. L’enregistrer dans un fichier word
  3. Dans le cas où l’utilisateur choisit d’enregistrer le fichier, un input doit lui demander le nom du fichier
  4. Récupération des informations à partir du scrapping
  5. Enregistrement du fichier ou affichage des données

Eclatez-vous !

Crypto

Le but du projet est de réaliser un outil pour chiffrer et déchiffrer des messages avec des algorithmes historiques. Pour rappel, les membres du groupe sont :

Sujet

En cryptographie, le chiffrement par décalage, aussi connu comme le chiffre de César ou le code de César (voir les différents noms), est une méthode de chiffrement très simple utilisée par Jules César dans ses correspondances secrètes (ce qui explique le nom « chiffre de César ») . Wikipédia

Le chiffre de Vigenère est un système de chiffrement par substitution polyalphabétique dans lequel une même lettre du message clair peut, suivant sa position dans celui-ci, être remplacée par des lettres différentes, contrairement à un système de chiffrement monoalphabétique comme le chiffre de César (qu’il utilise cependant comme composant)

Palier 1

Le palier 1 se concentrera sur l’implémentation du chiffre de César :

  1. Le programme demande à l’utilisateur s’il souhaite chiffrer ou déchiffrer
  2. Le programme demande à l’utilisateur le décalage (nombre >= 0)
  3. Le programme demande à l’utilisateur le message à transformer
  4. Le programme affiche le message

Palier 2

  1. Un menu doit permettre de sélectionner l’algorithme à utiliser :
    • César
    • Vigenère
  2. Implémenter Vigenere

Palier 3

  1. Ajouter une option dans le menu pour lire le message
    • Depuis un fichier texte : l’utilisateur doit rentrer le nom du fichier
    • Depuis un input classique
  2. Ajouter une option dans le menu pour enregistrer le message
    • Dans un fichier texte : l’utilisateur doit rentrer le nom du fichier
    • Avec un print classique

Ressources

Implémenter César

Prenons l’exemple d’une fonction qui permet de réaliser un décalage (shift)

>> > num = ord('y')
121
>> > num + 13  # Décalage
134
>> > chr(134)
'\x86'  # Ce n'est pas un caractère affichable ! On a dépassé le z


def apply_shift(letter, shift):
    pos_a_in_ascii_table = ord("a")
    letter_as_nb = ord(letter)
    pos_in_alphabet = letter_as_nb - pos_a_in_ascii_table
    # On applique un modulo 26. [1]
    count = shift % 26
    # new_letter_code contient la position de la lettre dans l'alphabet [2]
    new_letter_code = (pos_in_alphabet + count) % 26
    letter = chr(pos_in_alphabet + new_letter_code)
    return letter

Cette fonction n’est valide que pour les lettres minuscules et pour un décalage positif.

Le principe de l’algorithme est le suivant :

[1] Le modulo va permettre de garder le reste de la division par 26.

Exemple : Si on applique une rotation de 26 à la lettre A, on retombe sur la lettre A. De la même manière, si on applique 11856 rotations à une lettre, on retombera sur cette même lettre (11 856 = 26 * 456). D’un autre côté, si on applique 27 rotations à la lettre A, on tombe sur la lettre B. En effet, on fait un tour complet plus un décalage. On remarque alors qu’il suffit seulement d’utiliser comme décalage le décalage donné, modulo 26 !

[2] Les ordinateurs utilisent une table de correspondance entre les nombres et les caractères. Il s’agit de la table ASCII. Sur le lien, on voit que les premiers caractères… ne sont pas imprimable. Le premier caractère visible est le ‘?’, dont la valeur est 32. La difficulté avec l’algorithme est justement que les lettres minuscules sont comprises entre 97 et 122, et les majuscules entre 65 et 90. Pour faciliter les choses, il vaut mieux se ramener entre 0 et 25, faire les calculs, puis repasser dans l’intervalle voulu.

Implémenter Vigenère

L’implémentation de Vigenère repose sur celle de César : il s’agit de faire un décalage de caractère sur chaque caractère. Ce qui change, c’est qu’au lieu d’avoir un décalage unique, celui-ci change en fonction d’une clef.

Exemple :

Clef m a n d a r i n e m a n d a r i n e m a n
Décalage 12 0 13 3 0 17 8 13 4 12 0 13 3 0 17 8 13 4 12 0 13
Texte clair B o n j o u r m o n n o m e s t J a m e s
Texte chiffré N o a m o l z z s z n b p e j b w e y e f

Structure de l’algo :

Liens utiles

Créer un menu en Python

Exemple d’un menu :

>>> print_menu()
1 - Titre du Menu 1
Description
2 - Titre du Menu 2
Description

>>> menu_nb = input()
2

>>> if menu == '1':
...  # Action
... if menu == '2':
...  # Autre action

Pour plus d’informations, voir les liens utiles

Pour créer un menu, le plus simple est d’afficher des propositions numérotées et de demander à l’utilisateur le numéro du menu auquel il souhaite accéder.

Exemples de code

Ouvrir un fichier

Pour ouvrir un fichier texte nommé my_message.txt

with open('my_message.txt', 'r') as f:
    content = f.read()

Geoguessr

Pour rappel, les membres du groupe sont :

Sujet

Le but de ce sujet est de pouvoir intéroger une base de données CSV locale pour récupérer des informations utile sur certains pays, ou bien de pouvoir retrouver le ou les pays respectant certains critères

Format de la base de données

Pour la base de données, je vous conseille de respecter le format suivant :

Pays Langue Monnaie
France Français Euro
Royaume-Unis Anglais Livre Sterling

De cette manière, votre données sera correctement structurée.

Comment gérer le nom des pays

Les fonction utiles

a = "Bienvenue au cours de PyThOn"
print(a.upper())
>>> BIENVENUE AU COURS DE PYTHON
print(a.lower())
>>> bienvenue au cours de python
print(a.title())
>>> Bienvenue Au Cours De Python

Lorsque l’on doit faire une recherche dans une base de données à partir d’une entrée utilisateur, c’est souvent un challenge. En effet, il faut être capable de faire correspondre “FRANCE” avec “France” ou avec “france”, selon le format dans lequel votre nom de pays est stocké.

Une technique généralement utilisée consiste à toujours traiter des données en minuscule. Ansi, même si l’utilisateur décide de taper “FrAnCe”, une fois converti en minuscule, la recherche sera sur “france”. Ci-dessous quelques fonctions utiles (avec à droite des exemples d’utilisation):

Palier 1

Exemple d’utilisation

Voici la liste des champs disponibles :
- Langue
- Monnaie
...
Sélectionner le champ souhaité :
>>> Langue
Entrez le nom d'un pays :
>>> Totoland
Désolé, mais ce pays n'est pas dans notre base 
Entrez le nom d'un pays :
>>> France
Le champ Langue pour le pays France vaut Euro

A partir de votre base de données :

  1. Afficher tous les champs disponibles (dans l’exemple ci-dessus, il s’agit du nom des colonnes)
  2. Demander à l’utilisateur d’entrer le nom d’un champ
  3. Demander à l’utilisateur d’entrer le nom d’un pays
  4. Afficher la valeur du champ demandé en (2) pour le pays entré en (3)

Palier 2

Exemple d’utilisation

Menu
1. Obtenir une information sur un pays
2. Obtenir la liste de pays respectant un critère donné
>>> 2

Voici la liste des champs disponibles :
- Langue
- Monnaie
...
Sélectionner le champ souhaité :
>>> Langue
Sélectionner la valeur à recherche :
>>> Anglais
Les pays pour lesquels le champ Langue vaut Français sont : France
  1. Demander à l’utilisateur de sélectionner un champ d’intérêt (par exemple la monnaie)
  2. Demander à l’utilisateur d’entrer une valeur (ex: Euro)
  3. Afficher le ou les pays correspondant à la valeur entrée

Palier 3

Exemple d’utilisation

Menu
1. Obtenir une information sur un pays
2. Obtenir la liste de pays respectant un critère donné
3. Exporter une fichier Pays
>>> 3
Entrez le nom du pays à exporter :
>>> France
Sélectionner le nom du fichier :
>>> France.txt
Le fichier a été correctement exporté

Contenu du fichier

France
======

Langue : Français
Monnaie : Euro

Dans ce palier, il vous faudra ajouter une troisième possibilité au menu : exporter toutes les informations disponibles sur un pays. Le fichier respectera la forme :

Nom du pays

===========

Nom du champ : Valeur du champ

Nom du champ : Valeur du champ …

Pays limitrophes

Le but du projet est de réaliser un outil permettant d’afficher les pays limitrophes d’un pays particulier. Pour rappel, les membres du groupe sont :

Sujet

Pour ce sujet, vous allez être contraint, dès le premier palier, de manipuler des fichiers. Rançon du talent. Par ailleurs, il vous faudra créer une base de données sur les pays (à voir s’il en existe une).

Palier 1

>> De quel pays souhaitez vous connaître les voisins ?
France

Les voisins de la France sont :
- Belgique
- Luxembourg
- Allemagne
- Suisse
- Italie
- Espagne
-...

Ce premier palier sera dédié aux ‘pays limitrophes’ à proprement parler. Il vous faut créer un fichier CSV de la forme suivante :

France Belgique
Belgique Luxembourg
Luxembourg France
Allemagne France
Suisse Italie
  1. Lire le fichier
  2. Créer un dictionnaire associant chaque pays à ses pays voisins
  3. Demander à l’utilisateur le pays pour lequel il souhaite avoir la liste des voisins
  4. Afficher la liste

Palier 2

Exemple d’un fichier YAML file.yaml

France:
  population: 67
  capitale: Paris 
Royaume-Uni:
  population: 67
  capitale: Londres 
...

En python, en utilisant la fonction fournie dans les ressources

>> d = load_from_yaml("file.yaml")
>> d['France']
{'population': 67, 'capitale': 'Paris'}
>> d['Royaume-Uni']
{'population': 67, 'capitale': 'Londres'}

Ajoutons un peu d’informations. Vous aurez besoin pour cela d’un second fichier qui comprendra la liste des informations sur le pays (monnaie, population, superficie… à vous de voir). Je vous conseille d’utiliser un fichier YAML. Ce format est très simple et permet, comme avec un dictionnaire, d’associer des clefs à des valeurs (voir ci-contre). L’avantage d’utiliser ce type de fichier, c’est qu’il existe une bibliothèque permettant de faire la transformation dict python <=> fichier YAML.

Dans les ressources, vous trouverez un code permettant de lire un fichier YAML, et un autre permettant d’en écrire un.

Palier 3

Code à copier/coller

!pip install cartopy
import cartopy.crs as ccrs
import cartopy.feature as cf
from matplotlib import pyplot as plt
import cartopy.io.shapereader as shpreader
from cartopy.feature import ShapelyFeature

class Carto:
    def __init__(self):
        self.shpfilename = shpreader.natural_earth(resolution='110m',
                                      category='cultural',
                                      name='admin_0_countries')
        self.reader = shpreader.Reader(shpfilename)
        self.proj = ccrs.Miller()
        self.ax = plt.axes(projection=self.proj)
        self.ax.set_extent([-13, 45, 30, 70])
        self.ax.add_feature(cf.COASTLINE, lw=1)
        self.ax.add_feature(cf.BORDERS)
        self.ax.add_feature(cf.OCEAN,facecolor=(0.5,0.5,0.5))

    def color_country(self, country_name, color='lime'):
        country = [country for country in self.reader.records() if country.attributes["NAME_LONG"] == country_name][0]
        shape_feature = ShapelyFeature([country.geometry], ccrs.PlateCarree(), facecolor=color, edgecolor='black', lw=1)
        self.ax.add_feature(shape_feature)

    def show(self):
        plt.show()

Exemple d’utilisation (essayez pour voir le résultat)

c = Carto()
c.color_country("Germany")
c.color_country("Spain")
c.color_country("Italy")
c.color_country("Luxembourg")
c.color_country("Belgium")
c.color_country("Switzerland")
c.color_country("United Kingdom")
c.color_country("France", 'red')
c.show()

Dans ce palier, vous allez pouvoir afficher les pays limitrophes au pays recherché sur une carte !

  1. Vous devez copier/coller le code ci-contre dans votre playbook, tout en haut.
  2. A partir des exemples, vous devriez pouvoir générer les cartes dont vous avez besoin

L’idée étant que lorsque je tape le nom d’un pays européen, ce pays soit colorié en rouge et les pauys voisins en vert

Ressources

Fonctions pour lire/écrire dans un fichier Yaml un dictionnaire d

import yaml
from yaml import Loader, Dumper
def load_from_file(filename):
    with open(filename, "r") as f:
        return yaml.load(f, Loader=Loader)
    
def save_to_file(filename, d):
    with open(filename, "w") as f:
        f.write(yaml.dump(d, Dumper=Dumper))

Liens utiles

Exemples de code

Alertes marché

Le but du projet est de réaliser une application d’analyse sur les indices boursiers. Pour rappel, les membres du groupe sont :

Sujet

Pour pouvoir réaliser ce projet, je vous conseille d’utiliser le site Alphavantage. Avant tout, il vous faudra créer une clé API

Palier 1

  1. Demander à un utilisateur :
    1. Quel indice il souhaite récupérer
    2. De sélectionner parmi les temporalités proposées
    3. De sélectionner une date de début : vous devrez afficher tous les résultats à votre disposition après cette date. Exemple : si vous avez les données à partir du 1er mai :
      • Si on demande le 15 avril, vous afficherez toutes les valeurs dont vous disposez, c’est-à-dire depuis le 1er mai
      • Si on demande le 3 mai, vous afficherez les valeurs à partir du 3 mai inclus. Ainsi, vous “supprimerez” les valeurs en trop
  2. Si pas d’erreur (pas de Error Message) : afficher tous les résultats. Sinon, afficher une erreur.

Palier 2

Palier 3

Ressources

Si l contient les séries temporelles sous la forme dont elle est renvoyée par l’api

l = {
    'Meta Data': {...}, 
    'Time Series (5min)': 
        {'2022-05-06 20:00:00': {'1. open': '137.6700', '2. high': '137.6700', '3. low': '137.6700', '4. close': '137.6700', '5. volume': '103'}, 
         '2022-05-06 19:55:00': {'1. open': '137.6500', '2. high': '137.6700', '3. low': '137.6500', '4. close': '137.6700', '5. volume': '1689'},
         ...
    }
}
l = l["Time Series (5 min)"]
dates = [k for k in l.keys()]
dates.sort()
val = []
for date in dates:
    val.append(l[date]['1. open'])

A l’issue du script, dates contient la liste des dates et val la liste des valeurs. Ces deux listes sont ordonnées et les valeurs correspondent bien aux dates à la même position. Pour afficher un graphique

import matplotlib.pyplot as plt
plt.plot(dates, val)

Vous aurez un premier graphique. A vous de l’embellir à l’aide de la documentation et de vos recherches

Liens utiles

Exemples de code


Mots clé media

Le but du projet est de réaliser un outil capable de récupérer les articles de presse à partir d’une date. Pour rappel, les membres du groupe sont :

Sujet

Sur internet, tous les sites sont tenus de mettre à disposition de leurs visiteurs un sitemap. Ce document liste l’ensemble des pages présentes sur le site. En théorie, ces documents doivent suivre un format particulier, le xml. En pratique, c’est un peu plus compliqué, et certains d’entre eux s’affranchissent des règles pour proposer leur propre format (Le Figaro par exemple).

Le sitemap est un bon moyen d’automatiser la collecte d’information sur les sites d’actualités : en effet, il ne contient que le strict nécessaire et classent généralement les articles par date.

Palier 1

Exemple avec le site lefigaro.fr

Entrer l'année:
> 2022
Entrer le mois:
> 12
Entrer le jour:
> 31
Les articles publiés le 31/12/2022 sont les suivants :
  - Les 46 soldats ivoiriens condamnés au Mali rentreront «bientôt», selon le président Ouattara
  - Covid-19 : l'UE veut une attitude commune face aux voyageurs de Chine
  - La Corée du Nord tire un missile balistique de courte portée
  - Quatre croisiéristes condamnés à payer plus de 450 millions de dollars pour leurs escales à Cuba
  - La situation dans l'est de la RDC est «pire que jamais», estime Kagame
  - Feu d'artifice du Nouvel an annulé à Rennes en raison de la météo
  - Réforme des retraites, coupures d'électricité, prix de l'énergie... Ce qu'il faut retenir des premiers «vœux aux Français» de «Macron 2»
  [...]

Le premier palier vise à récupérer la liste des articles pour un jour donné sur le figaro. Il s’agit donc de demander à l’utilisateur trois informations (sous la forme de trois nombres) :

  1. L’année
  2. Le mois
  3. Le jour

A partir de ces trois données, il devient possible de déterminer l’URL de la page web contenant les articles qui nous intéressent.

Palier 2

Les jours de la semaine en Python

import datetime

year = 2022
month = 12
day = 31

date = datetime.datetime(year, month, day)
day_of_the_week = date.weekday()
monday_date = date - datetime.timedelta(days=day_of_the_week)
print(monday_date.date())
> 2022-12-26

Parsing d’une chaine de caractères xml

import xml.etree.ElementTree as ET
# La variable response contient la réponse à la requête HTTP (cf exemple)
content = response.content

tree = ET.fromstring(content)
root = tree.getroot()

Contrairement au Figaro, Le Monde utilise le format XML pour classer les données, et proposer plus de contexte au lecteur.

Palier 3

Le but est de pouvoir récupérer, pour un jour donné, les mots les plus utilisés. Le mieux serait de croiser les données entre les deux sites supportés : est-ce que les mêmes mots sont présents ?

Ressources

Liens utiles

Exemples de code

Récupération d’une page HTML à partir de l’URL

import requests

response = requests.get("https://articles.lefigaro.fr/202212/29/")
if response.status_code != 200:
  print("Error")
else:
  # On affiche le contenu de la page
  print(response.content)

Parsing d’une page web

# Récupération du module de parsing
from bs4 import BeautifulSoup

# Cf exemple précédent
page = response.content

# On parse le contenu de la page téléchargée et on stocke le résultat dans la variable parsed
parsed = BeautifulSoup(page, parser="html.parser")
# On stocke dans l l'ensemble des éléments de la page dont la classe est list-group
l = parsed.find_all(class_="list-group")

Morpion

Pour rappel, les membres du groupe sont :

Sujet

L’objectif de ce projet est de vous faire réaliser un jeu du Morpion interactif.

Code à copier dans le projet. Il est à utiliser tel quel

import pandas as pd


class Grid:
    def __init__(self, col_count=3, line_count=3):
        self.col_count = col_count
        self.line_count = line_count

        self.board = [["" for i in range(col_count)] for j in range(line_count)]

    def _check_case(self, num_col, num_line):
        return num_line < self.line_count and num_col < self.col_count and not self.board[num_line][num_col]

    def _set_X(self, num_col, num_line):
        self.board[num_line][num_col] = "X"

    def _set_O(self, num_col, num_line):
        self.board[num_line][num_col] = "O"

    def _print_grid(self):
        display(pd.DataFrame(self.board, columns=[chr(i) for i in range(ord("A"), ord("A") + self.col_count)]))


def generate_grid(col_count, line_count):
    return Grid(col_count, line_count)


def check_case(grid, num_col, num_line):
    return grid._check_case(num_col, num_line)


def set_X(grid, num_col, num_line):
    return grid._set_X(num_col, num_line)


def set_O(grid, num_col, num_line):
    return grid._set_O(num_col, num_line)


def print_grid(grid):
    grid._print_grid()

Palier 1

Vous allez faire s’affronter deux joueurs

  1. Demander à l’utilisateur 1 son nom
  2. Demander à l’utilisateur 2 son nom
  3. Tant que la grille n’est pas pleine ou qu’il n’y a pas de gagnant
    1. Demander à chaque utilisateur les coordonnées sous la forme “A1” et placer le X ou le O correspondant
  4. Afficher le ou les vainqueurs (partie nulle)

Palier 2

Les joueurs doivent pouvoir entrer un nombre de manches. Chaque victoire rapporte 1 point, un match nul rapporte 0.5 et une défaite ne rapporte pas de point.

A la fin des manches, un message doit désigner le vainqueur et afficher son nombre de points

Palier 3

Les scores de chaque joueur doivent être sauvegardés dans un fichier YAML. Si un utilisateur entre le nom d’un joueur déjà en base, son score doit être chargé depuis le fichier.

Pendu

Le but du projet est de réaliser un jeu du pendu interactif. Pour rappel, les membres du groupe sont :

Sujet

Palier 1

Une structure qui pourrait être intéressante (pas obligatoire):


def get_word_from_user_input():
    # Cette fonction récupère l'entrée utilisateur, vérifie qu'elle est correcte et la renvoie
    # Si elle n'est pas correcte, alors elle affiche un message d'erreur et redemande à l'utilisateur
    

def get_letter_from_user_input():
    # Cette fonction récupère l'entrée utilisateur, vérifie qu'elle est correcte et la renvoie
    # Si elle n'est pas correcte, alors elle affiche un message d'erreur et redemande à l'utilisateur

[...] # Potentiellement autre chose (Mise à jour du mot, de l'affichage, des messages... à vous de voir !)

def game_loop():
    # Récupère le mot à partir de get_word_from_user_input
    # Répète les appels à get_letter_from_user_input tant que le joueur n'a pas trouvé le mot ou qu'il
    # n'est pas à court de points
    # Affiche le score !

Pour valider ce premier palier, le programme doit exécuter les tâches suivantes :

  1. Un premier champ demande au joueur d’entrer un mot : ce mot sera celui à faire deviner
  2. Un second champ permet de savoir combien d’erreur peut faire le joueur
  3. Le programme affiche autant de traits _ que de lettres à faire deviner
  4. Un champ permet au joueur de saisir une lettre
  5. On affiche le mot en remplaçant les _ par les lettres découvertes et le nombre de vie restantes

Palier 2

Pour valider ce palier, vous devez :

Palier 3

Exemple d’un fichier YAML file.yaml

mot:
  score: 1
  player: Joel
vital:
  score: 5
  player: Louis
...

En python, en utilisant la fonction fournie dans les ressources

>> d = load_from_yaml("file.yaml")
>> d['mot']
{'score': 1, 'player': 'Joel'}
>> d['vital']
{'score': 5, 'player': 'Louis'}

Pour valider ce dernier palier, vous devez :

Pour le tableau des scores, un conseil est d’utiliser le format YAML. Ce format est très simple et permet, comme avec un dictionnaire, d’associer des clefs à des valeurs (voir ci-contre). L’avantage d’utiliser ce type de fichier, c’est qu’il existe une bibliothèque permettant de faire la transformation dict python <=> fichier YAML.

Dans les ressources, vous trouverez un code permettant de lire un fichier YAML, et un autre permettant d’en écrire un. Le fonctionnement de votre programme doit être le suivant :

Ressources

Créer une liste à partir d’une chaine de caractère

def split_str_newline(text):
    return text.split('\n')

Ici \n est un retour à la ligne : on coupe le texte à chaque saut de ligne, et chaque ligne est donc un élément de la liste

Implémentation

Afin de faciliter les opérations, voici une méthode d’implémentation du jeu. Il faut maintenir, en plus de la chaine de caractères contenant la solution, une liste de booléens (True ou False) de la taille du mot.

Exemple:

Exemple associé au tableau ci-contre

solution = "harbulot"
liste = [False] * len(solution) # On génère une liste de la même taille que celle du mot, dont toutes les valeurs sont à False
liste[0] = True # On dévoile le H
liste[-1] = True # On dévole le T. Pour rappel, l'indice -1 est celui du dernier élément
H A R B U L O T
True False False False False False False True

De cette manière, une lettre n’est affichée que si la valeur qui lui est associée est à True. Pour dévoiler une lettre, il suffit alors de passer le booléen qui lui est associé à True

Liens utiles

Pour récupérer le contenu du fichier toto.txt dans la variable text :

Exemples de code

try:
    filename = "toto.txt"
    with open(filename, 'r', encoding='utf-8') as my_file:
        text = my_file.read()
except FileNotFoundError:
    print(f"Could not open file : not found. Check that {filename} exists")

Penser à remplacer toto.txt par le nom du fichier. Fonctions pour lire/écrire dans un fichier Yaml un dictionnaire d

import yaml
from yaml import Loader, Dumper
def load_from_file(filename):
    with open(filename, "r") as f:
        return yaml.load(f, Loader=Loader)
    
def save_to_file(filename, d):
    with open(filename, "w") as f:
        f.write(yaml.dump(d, Dumper=Dumper))

Pile ou face

Le but du projet est de réaliser un pile ou face. Pour rappel, les membres du groupe sont :

Sujet

Palier 1

Exemple d’interaction

>>> Combien de manches ?
4
>>> Choix ?
PPFF

Manche 1 : Pile. C'est gagné !
Manche 2 : Face. Perdu
Manche 3 : Face. C'est gagné !
Manche 4 ! Face. C'est gagné !
Score : 3 points

Pour réaliser ce palier:

  1. Demander à l’utilisateur un nombre de manches
  2. Demander à l’utilisateur de rentrer une chaine de caractère représentant ses choix:
    • P ou p pour pile (les deux doivent fonctionner)
    • F ou f pour face
    • Exemples:
      • Manche en 4 avec Pile, Pile, Face, Face : ppff ou PpFf ou ppFF…
      • Manche en 2 avec Pile, Face : pf ou PF ou pF…
  3. Pour chaque manche, tirer un nombre aléatoire (0 ou 1, cf Ressources)
    • 0 = Pile
    • 1 = Face
    • Afficher pour le joueur le score manche par manche

Palier 2

>>> Combien de manches ?
4
>>> Choix ?
PPFF
>>> Montant joué
10.50

Manche 1 : Pile. C'est gagné ! Vous avez 21.00€
Manche 2 : Face. Perdu. Il vous reste 7€
Manche 3 : Face. C'est gagné ! Vous avez 14.00€
Manche 4 ! Face. C'est gagné !Vous avez 28.00€
Score : 3 points. Vous avez gagné 18€ par rapport à votre mise initiale, bravo !

Ajoutons un peu d’enjeu à ce pile ou face.

Palier 3

John: 120.52
Loic: 3.00
Etienne: 8.00
>> d = load_from_file("balance.yaml")
>> d["John"]
120.52
>> "Ben" in d
False
>> d["Ben"] = 100.00
>> save_to_file(d)

Dans ce palier, vous allez devoir tenir à jour les comptes des joueurs dans un fichier.

Pour le fichier de suivi des comptes, un conseil est d’utiliser le format YAML. Ce format est très simple et permet, comme avec un dictionnaire, d’associer des clefs à des valeurs (voir ci-contre). L’avantage d’utiliser ce type de fichier, c’est qu’il existe une bibliothèque permettant de faire la transformation dict python <=> fichier YAML.

Dans les ressources, vous trouverez un code permettant de lire un fichier YAML, et un autre permettant d’en écrire un. Le fonctionnement de votre programme doit être le suivant :

Ressources

Fonctions pour lire/écrire dans un fichier Yaml un dictionnaire d

import yaml
from yaml import Loader, Dumper


def load_from_file(filename):
    with open(filename, "r") as f:
        return yaml.load(f, Loader=Loader)


def save_to_file(filename, d):
    with open(filename, "w") as f:
        f.write(yaml.dump(d, Dumper=Dumper))

Liens utiles

Exemples de code

Scraping brevet INPI

Pour rappel, les membres du groupe sont :

Sujet

L’objectif de ce projet est de vous faire récupérer des informations relatives à des brevets publiés sur le site de l’INPI

Palier 1

Demander à l’utilisateur d’entrer le numéro d’un brevet et trouver les informations relatives à celui-ci :

Palier 2

A partir d’un numéro de SIREN, récupérer les informations relatives à une entreprise :

Palier 3

A partir d’un SIREN d’entreprise, afficher les informations relatives à cette entreprise, ainsi que la liste des brevets (limitée à 100) qu’elle a déposés. Enregistrer cette liste dans un CSV suivant le format :

Numéro Titre Date de publication de la demande Date de dépôt Date de priorité Abrégé Liste des inventeurs
FR3100683 PROCEDE DE TRANSFERTS INTERCELLULAIRES 12/03/2021 05/09/2019 05/09/2019 L’invention concerne un procédé pour gérer le changement de cellule d’un utilisateur mobile au sein d’un système de communication dans lequel on utilise une boucle de prédiction - lorsque la condition de sortie de l’utilisateur mobile n’est pas vérifiée (26b), l’utilisateur mobile détermine (31) la valeur de puissance du signal estimée à partir d’une valeur prédite à l’instant futur t+Δt, l’utilisateur mobile compare la valeur de puissance prédite du signal émis par la station de base de desserte et la valeur de puissance prédite du signal émis par une station de base voisine, - l’utilisateur mobile vérifie si la condition de sortie est vérifiée, et si elle est vérifiée (32a), l’utilisateur mobile reste connecté à la station de base de desserte, - si la condition de sortie n’est pas vérifiée, (32b), l’utilisateur mobile compare l’instant t mes de mesure de la puissance à une valeur seuil t seuil et - retourne (27a) à la mesure de puissance des signaux (25) si l’instant de mesure est inférieur à la valeur du seuil - transmet la valeur de puissance mesurée pour le signal émis par la station de base de desserte et/ou par la station de base voisine, (28), afin que la station de base de desserte déclenche un changement de cellule, (29). Figure pour l’abrégé : Fig. 3 PANAITOPOL Dorin - 92622 GENNEVILLIERS CEDEX - FR, PIPON François - 92622 GENNEVILLIERS CEDEX - FR, VIJAYANDRAN Luxmiram - 92622 GENNEVILLIERS CEDEX - FR, HAZIZA Nathalie - 92622 GENNEVILLIERS CEDEX - FR, PAINCHAULT Rémi - 92130 ISSY LES MOULINEAUX - FR
FR3105895 Dispositif radiofréquence 02/07/2021 26/12/2019 26/12/2019 L’invention concerne un dispositif radiofréquence comprenant au moins les éléments suivants : - Une antenne (30), - Un groupe de filtres (32) connecté entre l’antenne (30) et un émetteur/récepteur (33) comprenant une partie convertisseur (CAN, CNA) caractérisé en ce que : - Le groupe de filtres (32) comprend N filtres ayant des bandes de fréquences BN distinctes dans une largeur de bande donnée BT, le groupe de filtres (32) est relié à un gestionnaire (35) sélectionnant au moins un des filtres Fj du groupe de filtres afin d’atténuer un premier type de signaux perturbateurs P1, au voisinage de la fréquence centrale du canal à recevoir, - L’émetteur/récepteur (33) comprend un étage comprenant un filtre variable (333, 335, 341, 342), le filtre variable est configuré afin d’éliminer un deuxième type de signaux perturbateurs P2, ledit étage est connecté entre le groupe de filtres (32) et l’ensemble de conversion analogique-numérique et numérique-analogique, - Le nombre N de filtres du groupe de filtres est choisi en tenant compte de la valeur de bande de fréquences de fonctionnement de l’antenne, de la valeur d’une largeur de canal Bc choisie et d’un coefficient δ tenant compte des effets de recouvrement. Figure pour l’abrégé : Fig. 3. MAILLOUX Pierre-Yves - 49309 CHOLET - FR, DEMENITROUX Wilfried - 49309 CHOLET - FR, BERTHOU Nicolas - 49300 CHOLET - FR

Scraping WW1

Pour rappel, les membres du groupe sont :

Sujet

En cours de rédactions

Palier 1

A partir du site de la mairie de paris, afficher les informations relatives à une ou des personnes dont le nom correspond à celui entré par l’utilisateur.

Palier 2

A partir d’une date, afficher toutes les personnes décédées ce jour-là

Palier 3

Proposer à l’utilisateur de sauvegarder les résultats dans un fichier

Scrapping Instagram

Pour rappel, les membres du groupe sont :

Sujet

L’objectif de ce sujet est de pouvoir récupérer automatiquement des informations sur des profils instagram. Pour cela, il vous faudra utiliser l’API instagram.

Méthodologie

Passer du code Postman au code Python

# Le code généré par Postman se termine de la manière suivantes
...
print(response.text)

# Pour extraire le dictionnaire et l'enregistrer dans une variable, remplacer la ligne par 
a = respone.json()
# a contient maintenant le dictionnaire contenu dans la réponse de l'API

Lorsque vous vous connectez sur instagram, que ce soit par l’application mobile ou le site internet, votre navigateur réalise des requêtes auprès de l’API pour récupérer les éléments à afficher dans l’interface graphique.

Le principe de cet exercice est donc d’identifier ces requêtes pour les reproduire programmatiquement et ainsi récupérer les données désirées.

L’utilisation de Postman est fortement encouragée pour vous permettre de reproduire les requêtes réalisées par votre navigateur, et également pour les “traduire” en Python.

La méthodologie de recherche et de copie des requête a été montrée en cours. Dans le cas où vous ne sauriez plus comment faire, n’hésitez pas à m’envoyer un email afin de prévoir une présentation en visio de la technique.

Palier 1

Exemple

Entrez le pseudo de l'utilisateur :
>>> barackobama
Nom d'utilisateur : barackobama
Nom complet : Barack Obama
Biographie : Dad, husband, President, citizen.
Nombre de followers : 36596311
Nombre de followings : 9
Compte vérifié : oui
---
Entrez le pseudo de l'utilisateur :
>>> toto_le_dozo
Ce compte n'existe pas
---

Savoir si un utilisateur n’existe pas

import requests

response = requests.get("https://www.instagram.com/toto_le_dozo/")
if response.status_code != 200:
    print("Erreur")
else:
    print("OK")
    ...

Lors du lancement du script, celui-ci doit :

  1. Demander un nom d’utilisateur instagram (via la fonction input())

  2. Récupérer les informations suivantes sur l’utilisateur :

Palier 2

Télécharger une photo depuis une URL

import requests
# Mettre ici les headers fournis pas Postman
headers = {}
url = "https://scontent-cdg4-3.cdninstagram.com/v/t51.2885-19/328293226_3430201983859375_8373421132276327740_n.jpg?stp=dst-jpg_s320x320&_nc_ht=scontent-cdg4-3.cdninstagram.com&_nc_cat=1&_nc_ohc=VUuB2D3wZicAX89XCBE&edm=AOQ1c0wBAAAA&ccb=7-5&oh=00_AfDxoxnK5UDsUQH8bdb-HNngCo3yfNkzgdWMh9VYitLgCw&oe=65551338&_nc_sid=8b3546"
rep = requests.get(url, headers=headers)
if rep.status_code != 200:
    print("Error while downloading picture")
else:
    picture = rep.content
    # Picture contient l'image. Il n'est pas possible de la print, mais on peut l'enregistrer

Enregistrer une photo dans un fichier

# my_picture contient la photo (par exemple suite à un téléchargement comme dans l'exemple précédent
my_picture = ...
# Nous utilisons 'w' pour écriture, mais nous ajoutons le 'b' pour indiquer que nous n'allons pas écrire du texte
# dans ce fichier, mais de la donnée *brute*
with open('ma_photo.jpg', 'wb') as file:
    file.write(my_picture)

Dans ce palier, il vous faudra récupérer la photo de profil de l’utilisateur, et la sauvegarder. Pour cela, identifiez l’URL de la photo de profil, et utilisez la pour la télécharger (à l’aide des exemples de code proposés)

Palier 3

Exemple de fonctionnement du script:

Entrez les noms des utilisateurs :
>>> barackobama,emmanuelmacron
Nom d'utilisateur : barackobama
Nom complet : Barack Obama
Biographie : Dad, husband, President, citizen.
Nombre de followers : 36596311
Nombre de followings : 9
Compte vérifié : oui
---
Nom d'utilisateur : emmanuelmacron
Nom complet : Emmanuel Macron
Biographie : Président de la République française.
Nombre de followers : 3318519
Nombre de followings : 130
Compte vérifié : oui
---

Souhaitez-vous exporter les résultats dans un fichier CSV ? [oui/non]
>>> ouii
Réponse incorrecte
Souhaitez-vous exporter les résultats dans un fichier CSV ? [oui/non]
>>> oui
Entrez le nom du fichier
>>> export.csv
Le fichier a été exporté !

Base de donneés médicaments

L’objectif de ce sujet est de pouvoir travailler sur les médicaments et leurs principes actifs. Différentes bases de données vous seront nécessaire pour cet exercice. Elles sont disponibles en téléchargement sur le site de la BASE DE DONNÉES PUBLIQUE DES MÉDICAMENTS. La lecture de ce document explicatif est vivement recommandée.

Palier 1

Ouvrir un CSV avec un séparateur tabulation pour afficher toutes les lignes

import csv

# Etonnament, les français n'utilisent pas l'encodage UTF-8 standard, mais le 'ansi'
with open('C:\\Users\\Paul\\Downloads\\CIS_bdpm.txt', 'r', encoding='ansi', newline='') as csv_file:
    # Utilisation de la tabulation comme séparateur #French #PasCommeToutLeMonde
    reader = csv.reader(csv_file, delimiter='\t')
    for line in reader:
        print(line)

Dans ce premier palier, vous devrez, à partir des informations recueillies au sein des bases de données des médicaments, permettre à l’utilisateur d’interroger la base de données de la manière suivante :

  1. Demander à l’utilisateur le nom d’un médicament
  2. Afficher les éléments détaillés dans la liste ci-dessous :

Palier 2

Exemple d’exécution

== Menu principal ==
  1. Lister les informations à partir du nom d'un médicament
  1. Lister les informations à partir du code CIS
  3. Quitter
Que souhaitez-vous faire ? > 4
Mauvais choix

== Menu principal ==
  1. Lister les informations à partir du nom d'un médicament
  1. Lister les informations à partir du code CIS
  3. Quitter
Que souhaitez-vous faire ? > 1
Entrer le nom d'un médicament > EBERTHINUM BOIRON, degré de dilution compris entre 4CH et 30CH ou entre 8DH et 60DH
Nom : EBERTHINUM BOIRON, degré de dilution compris entre 4CH et 30CH ou entre 8DH et 60DH
Code CIS : 62962232
Forme pharmaceutique :  comprimé et solution(s) et granules et poudre et pommade
Liste de voies d'administration :
  - cutanée
  - orale
  - sublinguale
Statut administratif de l’autorisation de mise sur le marché (AMM) : Autorisation active
Type de procédure d'autorisation de mise sur le marché (AMM) : Enreg homéo (Proc. Nat.)
Etat de commercialisation : Commercialisée
Date d’AMM (format JJ/MM/AAAA) : 14/05/2020
Numéro de l’autorisation européenne : 

== Menu principal ==
  1. Lister les informations à partir du nom d'un médicament
  1. Lister les informations à partir du code CIS
  3. Quitter
Que souhaitez-vous faire ? > 2
Entrer le code CIS d'un médicament > 62962232
Code CIS : 62962232
  - Désignation de l'élément pharmaceutique : comprimé
  - Code de la substance : 64892
  - Dénomination de la substance : EBERTHINUM POUR PRÉPARATIONS HOMÉOPATHIQUES
  - Dosage de la substance : 4CH à 30CH et 8DH à 60DH
  - Référence de ce dosage (exemple : '[pour] un comprimé') : un comprimé
  - Nature du composant (principe actif : « SA » ou fraction thérapeutique : « ST ») : SA
  - Numéro permettant de lier, le cas échéant, substances actives et fractions thérapeutiques : 18


Code CIS : 62962232
  - Désignation de l'élément pharmaceutique : granules
  - Code de la substance : 64892
  - Dénomination de la substance : EBERTHINUM POUR PRÉPARATIONS HOMÉOPATHIQUES
  - Dosage de la substance : 4CH à 30CH et 8DH à 60DH
  - Référence de ce dosage (exemple : '[pour] un comprimé') : un comprimé
  - Nature du composant (principe actif : « SA » ou fraction thérapeutique : « ST ») : SA
  - Numéro permettant de lier, le cas échéant, substances actives et fractions thérapeutiques : 17


Code CIS : 62962232
  - Désignation de l'élément pharmaceutique : pommade
  - Code de la substance : 64892
  - Dénomination de la substance : EBERTHINUM POUR PRÉPARATIONS HOMÉOPATHIQUES
  - Dosage de la substance : 4CH à 30CH et 8DH à 60DH (pommade à 4 %)
  - Référence de ce dosage (exemple : '[pour] un comprimé') : un comprimé
  - Nature du composant (principe actif : « SA » ou fraction thérapeutique : « ST ») : SA
  - Numéro permettant de lier, le cas échéant, substances actives et fractions thérapeutiques : 24


Code CIS : 62962232
  - Désignation de l'élément pharmaceutique : poudre orale
  - Code de la substance : 64892
  - Dénomination de la substance : EBERTHINUM POUR PRÉPARATIONS HOMÉOPATHIQUES
  - Dosage de la substance : 4CH à 30CH et 8DH à 60DH
  - Référence de ce dosage (exemple : '[pour] un comprimé') : un comprimé
  - Nature du composant (principe actif : « SA » ou fraction thérapeutique : « ST ») : SA
  - Numéro permettant de lier, le cas échéant, substances actives et fractions thérapeutiques : 23


Code CIS : 62962232
  - Désignation de l'élément pharmaceutique : solution buvable en ampoules
  - Code de la substance : 64892
  - Dénomination de la substance : EBERTHINUM POUR PRÉPARATIONS HOMÉOPATHIQUES
  - Dosage de la substance : 4CH à 30CH et 8DH à 60DH
  - Référence de ce dosage (exemple : '[pour] un comprimé') : un comprimé
  - Nature du composant (principe actif : « SA » ou fraction thérapeutique : « ST ») : SA
  - Numéro permettant de lier, le cas échéant, substances actives et fractions thérapeutiques : 25


Code CIS : 62962232
  - Désignation de l'élément pharmaceutique : solution buvable en gouttes
  - Code de la substance : 64892
  - Dénomination de la substance : EBERTHINUM POUR PRÉPARATIONS HOMÉOPATHIQUES
  - Dosage de la substance : 4CH à 30CH et 8DH à 60DH
  - Référence de ce dosage (exemple : '[pour] un comprimé') : un comprimé
  - Nature du composant (principe actif : « SA » ou fraction thérapeutique : « ST ») : SA
  - Numéro permettant de lier, le cas échéant, substances actives et fractions thérapeutiques : 19



== Menu principal ==
  1. Lister les informations à partir du nom d'un médicament
  1. Lister les informations à partir du code CIS
  3. Quitter
Que souhaitez-vous faire ? > 3

Dans ce palier, nous voulons afficher tous les composants associés à un code CIS entré par l’utilisateur

  1. Créer un menu qui demande à l’utilisateur ce qu’il souhaite rechercher
    1. Le nom d’un médicament (taper 1)
    2. Un code CIS (taper 2)
    3. Quitter (taper 3)
  2. Si l’utilisateur tape 1, il doit pouvoir retrouver les éléments du palier 1
  3. Si l’utilisateur tape 2, il doit :
    • Entrer un code CIS
      • Si le code CIS n’existe pas, le programme affiche une erreur
      • Sinon, il doit afficher, pour toutes les lignes qui ont le bon code CIS :
        • Code CIS
        • Désignation de l’élément pharmaceutique
        • Code de la substance
        • Dénomination de la substance
        • Dosage de la substance
        • Référence de ce dosage (exemple : “[pour] un comprimé”)
        • Nature du composant (principe actif : « SA » ou fraction thérapeutique : « ST »)
        • Numéro permettant de lier, le cas échéant, substances actives et fractions thérapeutiques

Palier 3

Dans ce palier, nous voulons exporter les informations obtenues dans un fichier.

  1. Créer un menu qui demande à l’utilisateur ce qu’il souhaite rechercher
    1. Le nom d’un médicament (taper 1)
    2. Un code CIS (taper 2)
    3. Quitter (taper 3)
  2. Demander à l’utilisateur s’il souhaite afficher les résultats, ou les enregistrer dans un fichier
  3. Si l’utilisateur tape 1, il doit retrouver les éléments du palier 1
  4. Si l’utilisateur tape 2, il doit retrouver les éléments du palier 2

Répertoire national des élus

A partir des fichier RNE, vous allez devoir permettre à un utilisateur d’effectuer des recherches sur les élus français.

Vous allez devoir télécharger plusieurs fichiers :

Palier 1

Ce palier se concentre uniquement sur le répertoire des maires. Dans ce palier, l’utilisateur doit entrer le nom de famille d’un maire. Vous devrez en retour afficher :

Palier 2

Dans ce palier, l’utilisateur doit pouvoir sélectionner la base sur laquelle il souhaite faire la recherche (Maire, Sénateur, Député ou parlementaire européen). Vous pourrez pour cela recourir à un menu permettant à l’utilisateur de choisir la base de recherche.

Palier 3

Dans ce palier, vous devrez proposer à l’utilisateur d’exporter le résultat de la recherche qu’il vient d’effectuer dans un fichier. Le format du fichier est laissé libre, mais un fichier texte semble le plus approprié