Aller au contenu

Sélectionner des informations

Ces exercices doivent être utilisés pour vous entraîner à programmer. Ils sont généralement accompagnés d'aide et de leur solution pour vous permettre de progresser.

Avant de vous précipiter sur ces solutions dès la première difficulté, n'oubliez pas les conseils suivants :

  • Avez-vous bien fait un schéma au brouillon pour visualiser le problème posé ?
  • Avez-vous essayé de rédiger un algorithme en français, avec vos propres mots, avant de vous lancer dans la programmation sur machine ?
  • Avez-vous utilisé des affichages intermédiaires, des print(), pour visualiser au fur et à mesure le contenu des variables ?
  • Avez-vous testé le programme avec les propositions de tests donnés dans l'exercice ?
  • Avez-vous testé le programme avec de nouveaux tests, différents de ceux proposés ?

Rappels

  • Chaque programme Python doit être sauvegardé sous forme de fichier texte avec l'extension .py.
    Enregistrez ce fichier dans le dossier [F05-Les_Fichiers] avec le nom donné à l'exercice : ProgF05.61.py, ProgF05.62.py, etc...
  • Pour exécuter ce programme, il suffit de le sauvegarder puis d'appuyer sur la touche [F5].

ProgF05.61

  1. Dans un nouveau fichier, complétez la définition de la fonction couper() en respectant ses spécifications.

    1
    2
    3
    4
    5
    6
    7
    8
    def couper(texte):
        """
        texte – str
        Sortie: list – Tableau constitué des "mots" du texte. Chaque espace
                dans texte conduit à créer un nouvel élément dans le tableau
        >>> couper('Bonjour, comment ça va ?')
        ['Bonjour,', 'comment', 'ça', 'va', '?']
        """
    
    Une solution
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    def couper(texte):
        """
        texte – str
        Sortie: list – Liste constituée des "mots" du texte. Chaque espace
                dans texte conduit à créer un nouvel élément dans la liste
        >>> couper('Bonjour, comment ça va ?')
        ['Bonjour,', 'comment', 'ça', 'va', '?']
        """
        reponse = []
        chaine = ''
        for carac in texte:
            if carac != ' ':
                chaine = chaine + carac
            else:
                reponse.append(chaine)
                chaine = ''
        return reponse
    
  2. En cliquant ici (clic droit puis [enregistrer sous]), téléchargez le texte original et non accentué du Petit Chaperon Rouge écrit par Charles Perrault et libre de droit. Placez le fichier Petit_Chaperon_Rouge.txt dans votre répertoire courant.

  3. Copiez/collez les instructions ci-dessous dans votre programme.

    19
    20
    21
    22
    23
    24
    ##----- Programme principal -----##
    import os             # Importation du module
    rep = os.getcwd()     # Obtenir le chemin du répertoire courant
    os.chdir(rep)         # Changer de répertoire courant
    
    with ...
    
  4. Remplacez les pointillés par les instructions nécessaires pour créer le fichier Petit_Chaperon_Rouge_Seul_Mot.txt.
    Ce fichier doit contenir l'ensemble du texte du petit chaperon rouge, mais avec un seul mot par ligne :

    Début du fichier Petit_Chaperon_Rouge_Seul_Mot.txt

    Il
    etait
    une
    fois
    une
    adorable
    petite
    fille
    
    Une solution
    def couper(texte):
        """
        texte – str
        Sortie: list – Liste constituée des "mots" du texte. Chaque espace
                dans texte conduit à créer un nouvel élément dans la liste
        >>> espace('Bonjour, comment ça va ?')
        ['Bonjour,', 'comment', 'ça', 'va', '?']
        """
        reponse = []
        chaine = ''
        for carac in texte:
            if carac != ' ':
                chaine = chaine + carac
            else:
                reponse.append(chaine)
                chaine = ''
        return reponse
    
    ##----- Programme principal -----##
    import os             # Importation du module
    rep = os.getcwd()     # Obtenir le chemin du répertoire courant
    os.chdir(rep)         # Changer de répertoire courant
    
    with open('Petit_Chaperon_Rouge.txt', 'r', encoding='utf-8') as f_source:
        with open('Petit_Chaperon_Rouge_Seul_Mot.txt', 'w', encoding='utf-8') as f_result:
            for phrase in f_source:
                liste_mots = couper(phrase)
                for mot in liste_mots:
                    f_result.write(mot)
                    f_result.write('\n')
    

ProgF05.62*

  1. Dans la console Python, testez les instructions suivantes :

    >>> ['a', 'b', 'C', 'D'].index('C')
    
    >>> ['a', 'b', 'C', 'D'].index('a')
    
  2. Le fichier materiel.txt, téléchargeable en cliquant ici, a été établi par un responsable informatique qui a établi une liste des ordinateurs présents dans chaque salle. Chaque ligne du fichier est écrite uniquement en lettres minuscules sous la forme :

    constructeur année_d_achat quantité caractéristiques
    
    Chaque modèle d'ordinateur peut avoir plusieurs caractéristiques, séparées par un espace comme les autres informations de la ligne.
    Complétez le programme ci-dessous afin qu'il exporte, dans un fichier nommé nb_materiel.txt, le nombre de machines par constructeur. Si un constructeur est présent sur plusieurs lignes, il faudra donc additionner les quantités correspondantes.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    import os             # Importation du module
    rep = os.getcwd()     # Obtenir le chemin du répertoire courant
    os.chdir(rep)         # Changer de répertoire courant
    
    
    ##----- Définition des Fonctions -----##
    def compte_matos(n_fic1, n_fic2, ind_info, ind_qtte):
        """
        n_fic1 - str, nom du fichier source
        n_fic2 - str, nomdu fichier cible
        ind_info - int, donne l'indice de l'information à prendre en compte dans chaque ligne de n_fic1
        ind_qtte - int, donne l'indice de la quantité à évaluer dans chaque ligne de n_fic1
            Sortie: None - écrit dans n_fic2 les quantités correspondants aux informations identiques de n_fic1.
        """
        #- Variables et constantes -#
        liste_informations = []
        liste_quantite = []
    
        #- Lecture des informations -#
        with open(n_fic1, 'r', encoding='utf-8') as f_source:
            ...
    
        #- Ecriture des informations -#
        with open(n_fic2, 'w', encoding='utf-8') as f_result:
            ...
    
    
    ##----- Variables et constantes -----##
    nom_lire = 'materiel.txt'
    nom_ecrire = 'nb_materiel.txt'
    ind_constructeur = 0
    ind_quantite = 2
    
    ##----- Programme principal -----##
    compte_matos(nom_lire, nom_ecrire, ind_constructeur, ind_quantite)
    

    Contenu à obtenir dans nb_materiel.txt

    asus 155
    fujitsu 227
    hewlett-packard 122
    msi 205
    dell 148
    lenovo 180
    acer 214
    
    Une piste

    Pensez à utiliser la fonction couper() programmée dans l'exercice précédent.

    Une solution
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    import os             # Importation du module
    rep = os.getcwd()     # Obtenir le chemin du répertoire courant
    os.chdir(rep)         # Changer de répertoire courant
    
    
    ##----- Définition des Fonctions -----##
    def couper(texte):
        """
        texte – str
        Sortie: list – Liste constituée des "mots" du texte. Chaque espace
                dans texte conduit à créer un nouvel élément dans la liste
        >>> espace('Bonjour, comment ça va ?')
        ['Bonjour,', 'comment', 'ça', 'va', '?']
        """
        reponse = []
        chaine = ''
        for carac in texte:
            if carac != ' ':
                chaine = chaine + carac
            else:
                reponse.append(chaine)
                chaine = ''
        return reponse
    
    
    def compte_matos(n_fic1, n_fic2, ind_info, ind_qtte):
        """
        n_fic1 - str, nom du fichier source
        n_fic2 - str, nomdu fichier cible
        ind_info - int, donne l'indice de l'information à prendre en compte dans chaque ligne de n_fic1
        ind_qtte - int, donne l'indice de la quantité à évaluer dans chaque ligne de n_fic1
            Sortie: None - écrit dans n_fic2 les quantités correspondants aux informations identiques de n_fic1.
        """
        #- Variables et constantes -#
        liste_informations = []
        liste_quantite = []
    
        #- Lecture des informations -#
        with open(n_fic1, 'r', encoding='utf-8') as f_source:
            for ligne in f_source:
                liste_mots = couper(ligne)                               # Ligne transformée en liste de mots
                if liste_mots[ind_info] not in liste_informations:
                    liste_informations.append(liste_mots[ind_info])
                    liste_quantite.append(int(liste_mots[ind_qtte]))         # Quantité transformée en entier
                else:
                    indice = liste_informations.index(liste_mots[ind_info])  # Information déjà présente à l'indice indice
                    liste_quantite[indice] += int(liste_mots[ind_qtte])
    
        #- Ecriture des informations -#
        with open(n_fic2, 'w', encoding='utf-8') as f_result:
            for i in range(len(liste_informations)):
                f_result.write(f'{liste_informations[i]} {liste_quantite[i]}\n')
    
    
    ##----- Variables et constantes -----##
    nom_lire = 'materiel.txt'
    nom_ecrire = 'nb_materiel.txt'
    ind_constructeur = 0
    ind_quantite = 2
    
    ##----- Programme principal -----##
    compte_matos(nom_lire, nom_ecrire, ind_constructeur, ind_quantite)
    

ProgF05.63*

A partir du même fichier que dans l'exercice précédent, téléchargeable en cliquant ici, établir un programme qui exporte, dans un fichier nommé materiel_linux.txt, le nombre de machines par constructeur qui utilise le système d'exploitation Linux.

Contenu à obtenir dans materiel_linux.txt

asus 97
dell 61
fujitsu 32
hewlett-packard 21
msi 53
lenovo 112
acer 62
Une piste

Il suffit de renommer la fonction de l'exercice précédent (par exemple compte_matos_2()) et de lui ajouter un paramètre correspondant à la caractéristique recherchée (ici 'linux').

Une solution
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import os             # Importation du module
rep = os.getcwd()     # Obtenir le chemin du répertoire courant
os.chdir(rep)         # Changer de répertoire courant


##----- Définition des Fonctions -----##
def couper(texte):
    """
    texte – str
    Sortie: list – Liste constituée des "mots" du texte. Chaque espace
            dans texte conduit à créer un nouvel élément dans la liste
    >>> espace('Bonjour, comment ça va ?')
    ['Bonjour,', 'comment', 'ça', 'va', '?']
    """
    reponse = []
    chaine = ''
    for carac in texte:
        if carac != ' ':
            chaine = chaine + carac
        else:
            reponse.append(chaine)
            chaine = ''
    return reponse


def compte_matos_2(n_fic1, n_fic2, ind_info, ind_qtte, carac):
    """
    n_fic1 - str, nom du fichier source
    n_fic2 - str, nomdu fichier cible
    ind_info - int, donne l'indice de l'information à prendre en compte dans chaque ligne de n_fic1
    ind_qtte - int, donne l'indice de la quantité à évaluer dans chaque ligne de n_fic1
    carac - str, chaîne de caractère recherchée pour sélectionner la ligne
        Sortie: None - écrit dans n_fic2 les quantités correspondants aux informations identiques de n_fic1.
    """
    #- Variables et constantes -#
    liste_informations = []
    liste_quantite = []

    #- Lecture des informations -#
    with open(n_fic1, 'r', encoding='utf-8') as f_source:
        for ligne in f_source:
            liste_mots = couper(ligne)                               # Ligne transformée en liste de mots
            if carac in liste_mots:
                if liste_mots[ind_info] not in liste_informations:
                    liste_informations.append(liste_mots[ind_info])
                    liste_quantite.append(int(liste_mots[ind_qtte]))         # Quantité transformée en entier
                else:
                    indice = liste_informations.index(liste_mots[ind_info])  # Information déjà présente à l'indice indice
                    liste_quantite[indice] += int(liste_mots[ind_qtte])

    #- Ecriture des informations -#
    with open(n_fic2, 'w', encoding='utf-8') as f_result:
        for i in range(len(liste_informations)):
            f_result.write(f'{liste_informations[i]} {liste_quantite[i]}\n')


##----- Variables et constantes -----##
nom_lire = 'materiel.txt'
nom_ecrire = 'materiel_linux.txt'
ind_constructeur = 0
ind_quantite = 2
carac = 'linux'

##----- Programme principal -----##
compte_matos_2(nom_lire, nom_ecrire, ind_constructeur, ind_quantite, carac)