NSI: tp python sur les dictionnaires

1. Créer un fichier python tp_dictionnaire et copier le code ci-dessous.
Le fichier est à me transmettre via l’ENT à la fin de la séance.

# TP NSI à renvoyer à la fin des 2 heures via l'ENT
# Nom et Prénom :

###################################
##       Exercice 1  : QCM       ##
###################################

## Compléter le dictionnaire en indiquant vos réponses
mes_reponses_au_qcm={
    "question 1": "Votre réponse",
    "question 2": "Votre réponse",
    "question 3": "Votre réponse",
    "question 4": "Votre réponse",
    "question 5": "Votre réponse",
    "question 6": "Votre réponse",
    "question 7": "Votre réponse",
    "question 8": "Votre réponse",
    "question 9": "Votre réponse",
    "question 10": "Votre réponse",
    }

################################################################
##     Exercice 2  : frequence caracteres dans un texte       ##
################################################################

bio_Turing="Alan Mathison Turing, né le 23 juin 1912 à Londres et mort le 7 juin 1954 à Wilmslow, est un mathématicien et cryptologue britannique, auteur de travaux qui fondent scientifiquement l'informatique.Pour résoudre le problème fondamental de la décidabilité en arithmétique, il présente en 1936 une expérience de pensée que l'on nommera ensuite machine de Turing et des concepts de programme et de programmation, qui prendront tout leur sens avec la diffusion des ordinateurs, dans la seconde moitié du xxe siècle. Son modèle a contribué à établir la thèse de Church, qui définit le concept mathématique intuitif de fonction calculable."


def frequence_caracteres(mon_texte):
    '''
    retourne la fréquence des caractères dans un texte donné sous la forme d'un dictionnaire
    les clés sont les caractères
    les valeurs sont les fréquences associées
    un espace est considéré comme un caractère
    On transformera les majuscules en minuscules
    : mon_texte : str
    : return : dict()
    >>> mon_texte="Alan Turing"
    >>> print(frequence_caracteres(mon_texte))
    {'a': 0.18181818181818182, 'l': 0.09090909090909091, 'n': 0.18181818181818182, ' ': 0.09090909090909091, 't': 0.09090909090909091, 'u': 0.09090909090909091, 'r': 0.09090909090909091, 'i': 0.09090909090909091, 'g': 0.09090909090909091}
    '''
    # on transforme toutes les majuscules en minuscules
    # grâce à la méthode lower() des str
    mon_texte=mon_texte.lower() 
    

def frequence_la_plus_grande(mon_texte):
    '''
    retourne la fréquence du caractère,autre que l'espace, le plus fréquent dans un texte
    on ne distinguera pas majuscules et minuscules
    : mon_texte : str
    : retour : float
    >>>print(frequence_la_plus_grande(bio_Turing))
    0.10126582278481013
    '''
    


      
def caracteres_plus_frequents(mon_texte):
    '''
    retourne sous la forme d'un tuple les caractères
    les plus fréquents d'un texte autre que l'espace
    : mon_texte : str
    : return : tuple
    >>>mon_texte="Alan Turing"
    >>>print(caracteres_plus_frequents(mon_texte))
    ('a', 'n')
    >>>print(caracteres_plus_frequents(bio_Turing))
    ('e',)
    '''
    


##################################################
##     Exercice 3  : gestion de commandes       ##
##################################################

commandes={'0': {'numero': 'EMA70495', 'nom': 'Ada Lovelace', 'adresse': '64 rue Jocelyne Troccaz', 'ville': 'Tours', 'etat': 'En cours'},
           '1': {'numero': 'VWD74550', 'nom': 'Dorothy Vaughan', 'adresse': '33 rue Al-Kindi', 'ville': 'Bordeaux', 'etat': 'En cours'},
           '2': {'numero': 'SWK65993', 'nom': 'Gilles Kahn', 'adresse': '53 rue Ingrid Daubechies', 'ville': 'Lille', 'etat': 'En cours'},
           '3': {'numero': 'NKR34542', 'nom': 'Ada Lovelace', 'adresse': '98 rue Jules César', 'ville': 'Bordeaux', 'etat': 'Livrée'},
           '4': {'numero': 'GEG58414', 'nom': 'Jacques-Louis Lions', 'adresse': '84 rue Al-Kindi', 'ville': 'Rennes', 'etat': 'Retour'},
           '5': {'numero': 'FZA36963', 'nom': 'Al-Khwarizmi', 'adresse': '73 rue Adi Shamir', 'ville': 'Marseille', 'etat': 'En cours'},
           '6': {'numero': 'QWE58690', 'nom': 'Alonzo Church', 'adresse': '47 rue Jules César', 'ville': 'Paris', 'etat': 'Retour'},
           '7': {'numero': 'NLY90647', 'nom': 'Hypatie d’Alexandrie', 'adresse': '51 rue Whitfield Diffie', 'ville': 'Bordeaux', 'etat': 'En cours'},
           '8': {'numero': 'VVL26047', 'nom': 'Alonzo Church', 'adresse': '6: rue Adi Shamir', 'ville': 'Montpellier', 'etat': 'En cours'},
           '9': {'numero': 'CXO07384', 'nom': 'Jacques-Louis Lions', 'adresse': '30 rue Whitfield Diffie', 'ville': 'Paris', 'etat': 'Livrée'}
           }

def afficher_commande_numero(numero_commande):
    '''
    affiche la commande correspondant au numero
    : numero : str
    : return : print
    >>>afficher_commande_numero('NLY90647')
    commande :NLY90647
    Nom :Hypatie d’Alexandrie
    Adresse :51 rue Whitfield Diffie
    Ville :Bordeaux
    Etat :En cours
    >>>afficher_commande_numero('NLY90687')
    NLY90687: numero commande non enregistré
    '''
    global commandes
    
    
def recherche_par_nom(nom):
    '''
    recherche les commandes correspondantes au nom
    : nom : str
    : return : un tuple contenant les commandes
    >>> print(recherche_par_nom("Ada Lovelace"))
    ({'numero': 'EMA70495', 'nom': 'Ada Lovelace', 'adresse': '64 rue Jocelyne Troccaz', 'ville': 'Tours', 'etat': 'En cours'},
    {'numero': 'NKR34542', 'nom': 'Ada Lovelace', 'adresse': '98 rue Jules César', 'ville': 'Bordeaux', 'etat': 'Livrée'})
    >>>print(recherche_par_nom("Alan Turing"))
    ()
    '''
    global commandes
    

def ajouter_commande(numero,nom,adresse,ville,etat):
    '''
    ajoute une commande
    : numero,nom,adresse,ville,etat : str
    : return : le dict commande modifié
    >>>commandes={'0': {'numero': 'EMA70495', 'nom': 'Ada Lovelace', 'adresse': '64 rue Jocelyne Troccaz', 'ville': 'Tours', 'etat': 'En cours'},
           '1': {'numero': 'VWD74550', 'nom': 'Dorothy Vaughan', 'adresse': '33 rue Al-Kindi', 'ville': 'Bordeaux', 'etat': 'En cours'},
           '2': {'numero': 'SWK65993', 'nom': 'Gilles Kahn', 'adresse': '53 rue Ingrid Daubechies', 'ville': 'Lille', 'etat': 'En cours'},
           '3': {'numero': 'NKR34542', 'nom': 'Ada Lovelace', 'adresse': '98 rue Jules César', 'ville': 'Bordeaux', 'etat': 'Livrée'},
           '4': {'numero': 'GEG58414', 'nom': 'Jacques-Louis Lions', 'adresse': '84 rue Al-Kindi', 'ville': 'Rennes', 'etat': 'Retour'},
           '5': {'numero': 'FZA36963', 'nom': 'Al-Khwarizmi', 'adresse': '73 rue Adi Shamir', 'ville': 'Marseille', 'etat': 'En cours'},
           '6': {'numero': 'QWE58690', 'nom': 'Alonzo Church', 'adresse': '47 rue Jules César', 'ville': 'Paris', 'etat': 'Retour'},
           '7': {'numero': 'NLY90647', 'nom': 'Hypatie d’Alexandrie', 'adresse': '51 rue Whitfield Diffie', 'ville': 'Bordeaux', 'etat': 'En cours'},
           '8': {'numero': 'VVL26047', 'nom': 'Alonzo Church', 'adresse': '6: rue Adi Shamir', 'ville': 'Montpellier', 'etat': 'En cours'},
           '9': {'numero': 'CXO07384', 'nom': 'Jacques-Louis Lions', 'adresse': '30 rue Whitfield Diffie', 'ville': 'Paris', 'etat': 'Livrée'}
           }
    >>>ajouter_commande("AZE1029","Alan Turin","314 rue d'Enigma","Londres","En cours")
    >>>print(commandes)
    {'0': {'numero': 'EMA70495', 'nom': 'Ada Lovelace', 'adresse': '64 rue Jocelyne Troccaz', 'ville': 'Tours', 'etat': 'En cours'},
           '1': {'numero': 'VWD74550', 'nom': 'Dorothy Vaughan', 'adresse': '33 rue Al-Kindi', 'ville': 'Bordeaux', 'etat': 'En cours'},
           '2': {'numero': 'SWK65993', 'nom': 'Gilles Kahn', 'adresse': '53 rue Ingrid Daubechies', 'ville': 'Lille', 'etat': 'En cours'},
           '3': {'numero': 'NKR34542', 'nom': 'Ada Lovelace', 'adresse': '98 rue Jules César', 'ville': 'Bordeaux', 'etat': 'Livrée'},
           '4': {'numero': 'GEG58414', 'nom': 'Jacques-Louis Lions', 'adresse': '84 rue Al-Kindi', 'ville': 'Rennes', 'etat': 'Retour'},
           '5': {'numero': 'FZA36963', 'nom': 'Al-Khwarizmi', 'adresse': '73 rue Adi Shamir', 'ville': 'Marseille', 'etat': 'En cours'},
           '6': {'numero': 'QWE58690', 'nom': 'Alonzo Church', 'adresse': '47 rue Jules César', 'ville': 'Paris', 'etat': 'Retour'},
           '7': {'numero': 'NLY90647', 'nom': 'Hypatie d’Alexandrie', 'adresse': '51 rue Whitfield Diffie', 'ville': 'Bordeaux', 'etat': 'En cours'},
           '8': {'numero': 'VVL26047', 'nom': 'Alonzo Church', 'adresse': '6: rue Adi Shamir', 'ville': 'Montpellier', 'etat': 'En cours'},
           '9': {'numero': 'CXO07384', 'nom': 'Jacques-Louis Lions', 'adresse': '30 rue Whitfield Diffie', 'ville': 'Paris', 'etat': 'Livrée'}
            '11': {'numero': 'AZE1029', 'nom': 'Alan Turin', 'adresse': "314 rue d'Enigma", 'ville': 'Londres', 'etat': 'En cours'}
            }
    '''
    global commandes
    

def supprimer_commande(numero):
    '''
    supprime la commande correspondant au n°
    : numero : str
    : return : le dict commandes
    >>>supprimer_commande('EMA70495')
    >>>print(commandes)
    {'1': {'numero': 'VWD74550', 'nom': 'Dorothy Vaughan', 'adresse': '33 rue Al-Kindi', 'ville': 'Bordeaux', 'etat': 'En cours'},
    '2': {'numero': 'SWK65993', 'nom': 'Gilles Kahn', 'adresse': '53 rue Ingrid Daubechies', 'ville': 'Lille', 'etat': 'En cours'},
    '3': {'numero': 'NKR34542', 'nom': 'Ada Lovelace', 'adresse': '98 rue Jules César', 'ville': 'Bordeaux', 'etat': 'Livrée'},
    '4': {'numero': 'GEG58414', 'nom': 'Jacques-Louis Lions', 'adresse': '84 rue Al-Kindi', 'ville': 'Rennes', 'etat': 'Retour'},
    '5': {'numero': 'FZA36963', 'nom': 'Al-Khwarizmi', 'adresse': '73 rue Adi Shamir', 'ville': 'Marseille', 'etat': 'En cours'},
    '6': {'numero': 'QWE58690', 'nom': 'Alonzo Church', 'adresse': '47 rue Jules César', 'ville': 'Paris', 'etat': 'Retour'},
    '7': {'numero': 'NLY90647', 'nom': 'Hypatie d’Alexandrie', 'adresse': '51 rue Whitfield Diffie', 'ville': 'Bordeaux', 'etat': 'En cours'},
    '8': {'numero': 'VVL26047', 'nom': 'Alonzo Church', 'adresse': '6: rue Adi Shamir', 'ville': 'Montpellier', 'etat': 'En cours'},
    '9': {'numero': 'CXO07384', 'nom': 'Jacques-Louis Lions', 'adresse': '30 rue Whitfield Diffie', 'ville': 'Paris', 'etat': 'Livrée'}}
    >>> supprimer_commande('EMA70895')
    numero de commande non existant
    '''
    global commandes
    





###################################
##     Exercice 4  : MORSE       ##
###################################

# compléter les fonctions pour qu'elles
# répondent à leur docstring

dict_morse={
    'A':'- ---',
    'B':'--- - - -',
    'C':'--- - --- -',
    'D':'--- - -',
    'E':'-',
    'F':'- - --- -',
    'G':'--- --- -',
    'H':'- - - -',
    'I':'- -',
    'J':'- --- --- ---',
    'K':'--- - ---',
    'L':'- --- - -',
    'M':'--- ---',
    'N':'--- -',
    'O':'--- --- ---',
    'P':'- --- --- -',
    'Q':'--- --- - ---',
    'R':'- --- -',
    'S':'- - -',
    'T':'---',
    'U':'- - ---',
    'V':'- - - ---',
    'W':'- --- ---',
    'X':'--- - - ---',
    'Y':'--- - --- ---',
    'Z':'--- --- - -',
    }

def traduction_en_morse(texte):
    '''
    traduit un texte en majuscules en morse
    avec un espace entre chaque lettre
    et 7 espaces entre chaque mot
    texte : str
    return : str
    >>>mon_texte="LE MORSE EST UN LANGAGE CODE"
    >>>traduction_en_morse(mon_texte)=="- --- - -   -       --- ---   --- --- ---   - --- -   - - -   -       -   - - -   ---       - - ---   --- -       - --- - -   - ---   --- -   --- --- -   - ---   --- --- -   -       --- - --- -   --- --- ---   --- - -   -"
    True
    '''
    

def dictionnaire_morse_caractere(mon_dict):
    '''
    retourne un dictionnaire dont les clés
    sont des caractères morses et les valeurs
    les lettres associées
    : mon_dict : un dictionnaire qui traduit des
    caractères en morse
    : return : dict()
    >>> mon_morse_dico=dictionnaire_morse_caractere(dict_morse)
    >>> mon_morse_dico['--- --- -']='G'
    '''
    

def traduction_morse_francais(mon_code):
    '''
    traduit un code en morse en texte en français
    : mon_code: str
    : return : str
    >>>mon_texte="LE MORSE EST UN LANGAGE CODE"
    >>>code_a_decoder=traduction_en_morse(mon_texte)
    >>>traduction_morse_francais(code_a_decoder))=="LE MORSE EST UN LANGAGE CODE"
    True
    '''
    global dict_morse
    

Exercice 1 ( 5 pts )

QCM : il peut y avoir plusieurs bonnes réponses par question
Choisir la bonne réponse pour chacune des questions.
La reporter dans votre fichier python en remplaçant votre réponse par la bonne réponse.

Question 1 : Pour déclarer un dictionnaire, on peut utiliser les commandes :
A) mon_dict=()
B) mon_dict={}
C) mon_dict=dict()
D) mon_dict=[]

Question 2 : Pour le dictionnaire mon_dic={1:’A’,2:’B’}
A) 1 représente une valeur
B) 1 représente un indice
C) 1 représente une clé
D) 1 est un numéro de ligne

Question 3 : Pour le dictionnaire mon_dic={1:’A’,2:’B’}
A) ‘A’ représente une valeur
B) ‘A’ représente un indice
C) ‘A’ représente une clé
D) ‘A’ est un numéro de ligne

Question 4 : Dans un dictionnaire
A) les clés sont uniques
B) les clés et les valeurs sont uniques
C) les valeurs sont uniques
D) les clés et les valeurs ne sont pas uniques

Question 5 : Pour savoir si un élément est une clé d’un dictionnaire, on peut utiliser la méthode
A) cle in mon_dic.values()
B) cle in mon_dic.keys()
C) cle in values(mon_dic)
D) cle in keys(mon_dic)

Question 6 : Pour savoir si un élément est une valeur d’un dictionnaire, on peut utiliser la méthode
A) val in mon_dic.values()
B) val in mon_dic.keys()
C) val in values(mon_dic)
D) val in keys(mon_dic)

Question 7 : Pour affecter une valeur à une clé dans un dictionnaire, on utilise la méthode
A) mon_dict[cle] = valeur
B) mon_dict(cle) = valeur
C) mon_dict[valeur] = cle
D) mon_dict.append(cle,valeur)

Question 8 : Pour effacer une clé et sa valeur, on utilise
A) del(mon_dic[cle])
B) mon_dic.del(valeur)
C) del(mon_dic,valeur)
D) del(mon_dic[valeur])

Question 9 : Pour parcourir les clés d’un dictionnaire, on utilise
A) for cle in mon_dic.keys()
B) for cle in range(len(mon_dic))
C) for cle in mon_dic.values()
D) for val in mon_dic.values()

Question 10 : Pour parcourir les valeurs d’un dictionnaire, on utilise
A) for val in mon_dic.keys()
B) for cle in range(len(mon_dic))
C) for cle in mon_dic.values()
D) for val in mon_dic.values()

Exercice 2 : Il s’agit d’écrire trois fonctions permettant d’étudier la fréquence d’apparition des caractères dans un texte ( méthode préalable pour crypter ou décrypter un texte ).
La fonction frequence_la_plus_grande fera appel au dictionnaire crée par la fonction frequence_caracteres.
La fonction caracteres_plus_frequents fera appel aux deux fonctions précédentes.
3 pts par fonction répondant à sa docstring

Exercice 3 : Il s’agit d’écrire quatre fonctions permettant de gérer les commandes d’un fournisseur.
Pour simplifier l’écriture, on considère que le dictionnaire représentant les commandes est une variable globale.
2 pts par fonction répondant à sa docstring

Exercice 4 : Exercice bonus ou à faire pendant les vacances.
L’exercice permet de coder ou de décoder un texte en morse selon les règles ci-dessous :