Aller au contenu

Sujet n°3

Sujet original

Pour télécharger l'énoncé original, cliquer ici.

Exercice n°1

Dans cet exercice, les nombres sont des entiers ou des flottants.

Écrire une fonction moyenne() renvoyant la moyenne pondérée d’une liste non vide, passée en paramètre, de tuples à deux éléments de la forme (valeur, coefficient)valeur et coefficient sont des nombres positifs ou nuls.

Commentaires

Ici, le mot « liste » est à comprendre dans le sens « liste Python » (c'est-à-dire tableau) plutôt que dans le sens du type abstrait de données liste étudié en Terminale.

Si la somme des coefficients est nulle, la fonction renvoie None, si la somme des coefficients est non nulle, la fonction renvoie, sous forme de flottant, la moyenne des valeurs affectées de leur coefficient.

Exemples

>>> moyenne([(8, 2), (12, 0), (13.5, 1), (5, 0.5)]) 
9.142857142857142

>>> moyenne([(3, 0), (5, 0)]) 
None
Dans le premier exemple la moyenne est calculée par la formule :
$$ \frac{8 \times 2 + 12 \times 0 + 13,5 \times 1 + 5 \times 0,5}{2+0+1+0,5} $$

Une solution
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
def moyenne(tab):
    """
    tab - list, tableau non vide de couples de nombres positifs ou nuls (valeur, coefficient)
    Sortie: float, moyenne pondérée des éléments de tab
    """
    somme_ponderee = 0
    somme_coeff = 0
    for couple in tab:
        somme_ponderee = somme_ponderee + couple[0]*couple[1]
        somme_coeff = somme_coeff + couple[1]
    if somme_coeff != 0:
        return somme_ponderee/somme_coeff


if __name__ == '__main__':
    # Exemples de l'énoncé
    print(moyenne([(8, 2), (12, 0), (13.5, 1), (5, 0.5)]) == 9.142857142857142)
    print(moyenne([(3, 0), (5, 0)]) is None)

    # Exemples supplémentaires
    print(moyenne([(1, 1), (2, 1), (3, 1), (4, 1)]) == 2.5)
    print(moyenne([(1, 1), (1, 1), (1, 1)]) == 1.0)

Exercice n°2

On travaille sur des dessins en noir et blanc obtenus à partir de pixels noirs et blancs.

coeur La figure « cœur » ci-contre va servir d’exemple.

On la représente par une grille de nombres, c’est-à-dire par une liste composée de sous-listes de mêmes longueurs.
Chaque sous-liste représentera donc une ligne du dessin.

Commentaires

Ici, le mot « liste » est à comprendre dans le sens « liste Python » (c'est-à-dire tableau) plutôt que dans le sens du type abstrait de données liste étudié en Terminale.

Dans le code ci-après, la fonction affiche permet d’afficher le dessin. Les pixels noirs (1 dans la grille) seront représentés par les caractères "*" et les blancs (0 dans la grille) par deux espaces.

La fonction zoomListe() prend en argument une liste liste_depart et un entier k. Elle renvoie une liste où chaque élément de liste_depart est dupliqué k fois.

La fonction zoomDessin() prend en argument la grille dessin et renvoie une grille où toutes les lignes de dessin sont zoomées k fois (c’est-à-dire, on applique à chaque ligne la fonction zoomListe avec comme second paramètre k) et répétées k fois.

Compléter le code ci-dessous :

 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
coeur = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
         [0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0],
         [0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0],
         [0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0],
         [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
         [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
         [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
         [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0],
         [0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

def affiche(dessin):
    ''' affichage d'une grille : les 1 sont représentés par
        des " *" , les 0 par deux espaces "  " 
        La valeur "" donnée au paramètre end permet 
        de ne pas avoir de  saut de ligne. '''
    for ligne in dessin:
        for col in ligne:
            if col == 1:
                print(" *", end="")
            else:
                print("  ", end="")
        print()


def zoomListe(liste_depart, k):
    '''renvoie une liste contenant k fois chaque
       élément de liste_depart'''
    liste_zoom = ...
    for elt in ... :
        for i in range(k):
            ...
    return liste_zoom

def zoomDessin(grille, k):
    '''renvoie une grille ou les lignes sont zoomées k fois
       ET répétées k fois'''
    grille_zoom=[]
    for elt in grille:
        liste_zoom = ...
        for i in range(k):
            ... .append(...)
    return grille_zoom
Commentaires sur le code original

Pour télécharger l'original du fichier à compléter, cliquer ici.

Exemples

>>> affiche(coeur)

       * *       * *      
     *     *   *     *    
   *         *         *  
   *                   *  
   *                   *  
     *               *    
       *           *      
         *       *        
           *   *          
             *        

>>> affiche(zoom(coeur, 3)) 


                   * * * * * *                   * * * * * *                  
                   * * * * * *                   * * * * * *                  
                   * * * * * *                   * * * * * *                  
             * * *             * * *       * * *             * * *            
             * * *             * * *       * * *             * * *            
             * * *             * * *       * * *             * * *            
       * * *                         * * *                         * * *      
       * * *                         * * *                         * * *      
       * * *                         * * *                         * * *      
       * * *                                                       * * *      
       * * *                                                       * * *      
       * * *                                                       * * *      
       * * *                                                       * * *      
       * * *                                                       * * *      
       * * *                                                       * * *      
             * * *                                           * * *            
             * * *                                           * * *            
             * * *                                           * * *            
                   * * *                               * * *                  
                   * * *                               * * *                  
                   * * *                               * * *                  
                         * * *                   * * *                        
                         * * *                   * * *                        
                         * * *                   * * *                        
                               * * *       * * *                              
                               * * *       * * *                              
                               * * *       * * *                              
                                     * * *                                    
                                     * * *                                    
                                     * * *                                                                             
Une solution
coeur = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
         [0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0],
         [0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0],
         [0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0],
         [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
         [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
         [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
         [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0],
         [0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

def affiche(dessin):
    ''' affichage d'une grille : les 1 sont représentés par
        des " *" , les 0 par deux espaces "  "
        La valeur "" donnée au paramètre end permet
        de ne pas avoir de  saut de ligne. '''
    for ligne in dessin:
        for col in ligne:
            if col == 1:
                print(" *", end="")
            else:
                print("  ", end="")
        print()


def zoomListe(liste_depart, k):
    '''renvoie une liste contenant k fois chaque
       élément de liste_depart'''
    liste_zoom = []
    for elt in liste_depart :
        for i in range(k):
            liste_zoom.append(elt)
    return liste_zoom

def zoomDessin(grille, k):
    '''renvoie une grille ou les lignes sont zoomées k fois
       ET répétées k fois'''
    grille_zoom=[]
    for elt in grille:
        liste_zoom = zoomListe(elt, k)
        for i in range(k):
            grille_zoom.append(liste_zoom)
    return grille_zoom


if __name__ == '__main__':
    affiche(coeur)
    affiche(zoomDessin(coeur, 3))