TP carnet d’adresses v3 – suite … et fin ?

Question « flash » :

  1. Comprendre ce code.
  2. Le modifier pour que ça « rebondisse » sur tous les murs.
import pygame
from pygame.locals import *
pygame.init()

fenetre=pygame.display.set_mode((640, 480))
pygame.display.set_caption("Une balle ?")

clock = pygame.time.Clock()

continuer=True

# un rectangle que nous déplacerons ...
hitbox = pygame.Rect(80, 120, 40, 40)
# ... à l'aide de ce vecteur
vecteur = [10, 10]

while continuer :
    # déplcement du rectangle
    hitbox.move_ip(vecteur)

    # collision avec un mur ?
    if hitbox.right > 640:
        vecteur[0] *= -1
    if hitbox.bottom > 480:
        vecteur[1] *= -1

    # le fond
    fenetre.fill((0, 160, 160))

    # dessiner le cercle
    x, y = hitbox.centerx, hitbox.centery
    pygame.draw.circle(fenetre, (255, 255, 255), (x, y), 20, 1)

    #mettre à jour l'affichage
    pygame.display.flip()    

    #30 images par seconde
    clock.tick(30)

    #gestion des événements
    for event in pygame.event.get():

        if event.type==QUIT: #la croix en haut à gauche
            continuer=False

        elif event.type==MOUSEBUTTONUP : # clic de souris
            hitbox.centerx, hitbox.centery = event.pos

pygame.quit()

TP carnet d’adresses v3 – fin

On reprend là où on s’est arrêté lundi et on propose les deux fonctions suivantes :

def recherche(chaine):
    reponse = []
    for truc in repertoire :
        if truc == chaine :
            reponse.append(truc)
        else :
            for machin in repertoire[truc].values():
                if chaine in str(machin):
                    reponse.append(truc)
    return reponse
def sauvegarde() :
    # ouverture du fichier en ecriture : 'w'
    with open("contacts.csv", 'w') as fichier:
        for nom in repertoire:
            # conversion de l'age en chaine de caractere
            ligne = nom
            ligne += ';' + str(repertoire[nom]['age'])
            ligne += ';' + repertoire[nom]['tel']
            ligne += ';' + repertoire[nom]['adresse']
            fichier.write(ligne + '\n')
        fichier.close()

Travail :

  • Tester et commenter chacune de ces lignes
  • Commencer les exercices pour lundi :
    • créer ces listes en compréhension (oublié ? Voir exemple 3 de ce cours) :
      • [10, 8, 6, 4, 2, 0, -2, -4, -6, -8]
      • ['a', 'c', 'e', ... , 'y']
    • créer ce dictionnaire : {'A' : 0, 'B' : 1, ... , 'Z' : 25}
      • avec une boucle for i in range(26):,
      • en compréhension.
    • créer une fonction mot_de_passe(a, b, c) qui renvoie un mot de passe aléatoire constitué de
      • a lettres minuscules,
      • b lettres majuscules,
      • c chiffres.

Deuxième heure : ProjetLaby

Pour tous les groupes, m’envoyer à

marchantchristophe arobase gmail point com

votre code en l’état actuel avec des questions éventuelles d’ici demain !

TP carnet d’adresses v3 – partie 1

Il fallait faire pour ce lundi de la rentrée, depuis le TP du 10 février dernier  :

  • implémenter la fonction d’affichage d’un contact dont on connaît le nom,
  • implémenter la fonction d’affichage de tout le répertoire,
  • implémenter la fonction d’ajout d’un contact,

Personne ou presque n’avait travaillé, IL FAUT BOSSER pour réussir en NSI comme dans les autres spécialités !

On corrige :

def affiche_fiche(nom):
    if nom in repertoire.keys():
        dico = repertoire[nom]
        #print(dico)
        print(nom,"{} ans, tel : {}\n{}".format(dico['age'],dico['tel'], dico['adresse']))
    else :
        print("Pas d'entrée :", nom)

def affiche_tout():
    for cle in repertoire:
        affiche_fiche(cle)

def creer_nouveau(): # comme en classe avec un test en plus 😉
    nom = input("Quel est ton nom ?")
    age = int(input("Quel est l'age ?"))
    num = input("Quel est ton 06 ?")
    adr = input("Quelle est ton adresse ?")
    if nom in repertoire:
        print("Le contact", nom, "existe déjà")
    else :
        repertoire[nom] = {'age' : age, 'tel' : num, 'adresse' : adr}

def affiche_menu():
    print("\nMenu :\n")
    print("N\t\tNouvelle fiche")
    print("A\t\tAffiche tout le répertoire")
    print("A\tnom\tAffiche la fiche du contact avec ce nom")
    print("R\tcible\tRecherche la cible dans le répertoire")

def charge() :
    # initialisation : liste vide
    rep = {}
    # ouverture du fichier en lecture -> 'r'
    with open("contacts.csv", 'r') as fichier:
        # on récupère le contenu
        texte = fichier.read()
        # on le separe en lignes
        lignes = texte.split(sep = '\n')
        # print(lignes)
        # on parcourt les lignes
        for phrase in lignes:
            #print(phrase)
            contact = phrase.split(sep = ";")
            # contact valable ? contact est une liste
            if len(contact) == 4:
                new = {}
                new['adresse'] = contact[3]
                new['tel'] = contact[2]
                # conversion de l'age en entier
                new['age'] = int(contact[1])
                # ajout du contact au repertoire avec comme clé le nom
                nom = contact[0]
                rep[nom] = new
        fichier.close()
        #print(rep)
    return rep
        
       
def menu():
    
    reponse = "Truc" # pour rentrer dans while

    while reponse != 'q' and reponse != 'Q':
        affiche_menu()    
        reponse = input("Votre commande : ")
        if reponse == 'N':
            creer_nouveau()
        elif reponse == 'A':
            affiche_tout()
        elif reponse[:2] == 'A ':
            affiche_fiche(reponse[2:])
        elif reponse[:2] == 'R ':
            resultat = recherche(reponse[2:])
            if len(resultat) > 0:
                for truc in resultat :
                    affiche_fiche(truc)
            else :
                print("Pas trouvé", reponse[2:])
            
            
    print("Sortie du programme")
    
repertoire = charge()
print(repertoire)
print(repertoire.keys())

menu()
#sauvegarde()

Un exemple de fichier contacts.csv pour que ce code fonctionne :

Pierre;42;06.07.08.09.10;3 allee des bois LILLE
Marie;37;06.10.09.08.07;42 rue des fraises STRASBOURG
John Malkovich;65;01.02.03.04.05;HOLLYWOOD
Marchant;46;06.36.80.93.99;RUDLOFF
Nathan;17;06.07.08.02.05;La-bas si j'y suis.

A CHERCHER POUR MERCREDI :

  • implémenter la fonction de sauvegarde du fichier contacts.csv
  • implémenter une fonction de recherche globale.

 

Dictionnaires. TP carnet d’adresses v3

Cours :

On se base sur le document distribué la semaine dernière, document national publié sur le site d’accompagnement pour les nouveaux programmes de NSI :

Ce qu’en dit le programme :

Dictionnaires par clés et valeurs.
Construire une entrée de dictionnaire. Itérer sur les éléments d’un dictionnaire.
Il est possible de présenter les données EXIF d’une image sous la forme d’un enregistrement. En Python, les p-uplets nommés sont implémentés par des dictionnaires. Utiliser les méthodes
keys(), values() et items().

Application :

Ce nouveau « type construit » est idéal pour reprendre et finir notre TP « Carnet d’adresses »

On change de structure de données. On avait :

repertoire = [["Pierre", 42, " 06.07.08.09.10 ", "3 allée des bois LILLE"],
["Marie", 37, " 06.10.09.08.07 ", "42 rue des fraises STRASBOURG"],
["John Malkovich", 65, " 01.02.03.04.05 ", "HOLLYWOOD"]]

On va transformer notre répertoire en dictionnaire.
En effet, c’est une excellente structure de données pour une première base de données.

On reprend notre fonction de lecture du fichier contacts.csv de notre TP « Carnet d’adresses » et on la réécrit ainsi :

def charge() :
    # initialisation : liste vide
    rep = {}
    # ouverture du fichier en lecture -> 'r'
    with open("contacts.csv", 'r') as fichier:
        # on récupère le contenu
        texte = fichier.read()
        # on le separe en lignes
        lignes = texte.split(sep = '\n')
        # print(lignes)
        # on parcourt les lignes
        for phrase in lignes:
            contact = phrase.split(sep = ";")
            # contact valable ? contact est une liste
            if len(contact) == 4:
                new = {}
                new['adresse'] = contact[3]
                new['tel'] = contact[2]
                # conversion de l'age en entier
                new['age'] = int(contact[1])
                # ajout du contact au repertoire avec comme clé le nom
                nom = contact[0]
                rep[nom] = new
        fichier.close()
        #print(rep)
    return rep

Ainsi, la succession d’instructions

repertoire = charge()
# menu()
print(repertoire)

affiche :

{'Pierre': {'adresse': '3 allee des bois LILLE',
                'tel': '06.07.08.09.10', 
                'age': 42},
 'Marie': {'adresse': '42 rue des fraises STRASBOURG', 
               'tel': '06.10.09.08.07', 
               'age': 37},
 'John Malkovich': {'adresse': 'HOLLYWOOD', 
                        'tel': '01.02.03.04.05', 
                        'age': 65},
 'Marchant': {'adresse': 'RUDLOFF', 
                  'tel': '06.36.80.93.99', 
                  'age': 46}, 
 'Nathan': {'adresse': "La-bas si j'y suis.", 
                'tel': '06.07.08.02.05', 
                'age': 17}}
>>>

(J’ai rajouté quelques retours à la ligne pour plus de lisibilité 😉 )
Ainsi, avec un tél dictionnaire repertoire :

>>> repertoire['Pierre']
>>> {'adresse': '3 allee des bois LILLE',
                'tel': '06.07.08.09.10', 
                'age': 42}
>>> repertoire['Marie']['age']
>>> 37
>>>

Pour lundi de la rentrée :

  • implémenter la fonction d’affichage d’un contact dont on connaît le nom,
  • implémenter la fonction d’affichage de tout le répertoire,
  • implémenter la fonction d’ajout d’un contact,
  • implémenter la fonction de sauvegarde du fichier contacts.csv

À venir lundi à la rentrée :

  • implémenter une fonction de recherche globale.

TP – Carnet d’adresses (version 1)

Flash : un peu de conversions binaire décimal

  • 1010011 en décimal :
    • avec les puissances de 2,
    • avec un algorithme « je pars de zéro, et pour tous les chiffres je fais fois deux plus le chiffre suivant».
  • 156 en binaire :
    • avec les puissances de 2,
    • avec un algorithme « tant que le nombre n’est pas nul, je note le reste dans la division par 2 et le quotient devient le nouveau nombre».

Corrections :

  • Correction du TP « parcourir une liste »
  • Correction du convertisseur « intelligent » :
    def binaire_vers_decimal(liste):
    
        """ conversion de binaire (liste) vers base 10"""
        
        # initialisation
        decimal = 0
    
        # pour tous les chiffres je fais *2 plus le chiffre
        for chiffre in liste :
            decimal *= 2
            decimal += chiffre
    
        return decimal
    
    
    def decimal_vers_binaire(nombre):
    
        """ conversion de base 10 (int) vers binaire (liste)
        nombre est un entier naturel non nul"""
        
        # initialisation
        liste = []
        
        # tant que le nombre ne fait pas zéro, je continue
        while nombre > 0 :
            # je note le reste
            liste.append(nombre % 2)
    
            # je remplace le nombre par le quotient
            nombre = nombre // 2
    
        # On lit dans l'autre sens les chiffres
        liste.reverse()
    
        return liste
    
    def est_binaire(liste) :
        """dit si une liste d'entiers positifs ne contient que dez zéros et des 1"""
    
        for chiffre in liste :
            if chiffre > 1: # pas binaire
                return False
    
        # binaire ok
        return True
    
    
    def nombre_vers_liste(n):
        """ renvoie la liste des chiffres de n entier naturel"""
    
         # initialisation
        liste = []
        
        # tant que le nombre ne fait pas zéro, je continue
        while n > 0 :
            # je note le reste
            liste.append(n % 10)
    
            # je remplace le nombre par le quotient
            n = n // 10
    
        # On lit dans l'autre sens les chiffres
        liste.reverse()
    
        return liste
    
    
    def convertisseur(nombre) :
        """Convertit en binaire le nombre considéré en décimal
        S'il peut être vu comme binaire, conversion inverse aussi
    
        Exemples :
        >>> convertisseur(101010)
        Lu en binaire, 101010 donne 42 en décimal.
        Lu en décimal, 101010 donne 11000101010010010 en binaire.
        >>> convertisseur(200)
        200 ne peut pas être lu en binaire.
        Lu en décimal, 200 donne 11001000 en binaire.
        >>>
        """
    
        # liste des chiffres
        liste = nombre_vers_liste(nombre)
    
        # test binaire
        if est_binaire(liste):
            print("Lu en binaire,", nombre, "donne", end = ' ')
            print(binaire_vers_decimal(liste), "en décimal.")
        else :
            print(nombre,"ne peut pas être lu en binaire.")
    
        # conversion en binaire
        chiffres_binaires = decimal_vers_binaire(nombre)
    
        # concaténation
        binaire = ""
        for c in chiffres_binaires:
            binaire += str(c)
    
        # affichage final
        print("Lu en décimal,", nombre, "donne", end = ' ')
        print(binaire, "en binaire.")
            
    def tests():
        print()
        convertisseur(101010)
        print()
        convertisseur(200)
        print()
    
    tests()
  • TP : carnet d’adresses

Le tableau du jour :

Retravailler et refaire la fonction doublons présentée sur ce tableau cette semaine !!!