Aller au contenu

Sujet n°39

Sujet original

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

Exercice n°1

Écrire une fonction moyenne() prenant en paramètre un tableau non vide d’entiers et qui renvoie la moyenne des valeurs de ce tableau.

Exemples

>>> moyenne([10, 20, 30, 40, 60, 110])
45.0

>>> moyenne([])
AssertionError: tableau vide !
Commentaire sur l'énoncé initial

Aucune indication n'était donné pour un tableau vide.
On pouvait :

  1. soit décider que la moyenne renvoée est 0 ;
  2. soit décider de réaliser une erreur d'assertion.

C'est ce second choix qui a été ajouté dans l'exemple précédent par rapport à l'énoncé original.

Une solution
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
def moyenne(tab):
    """
    tab - list, tableau d'entiers
    Sortie: float, moyenne des éléments de tab si celui-ci n'est pas vide
    """
    assert len(tab) != 0, "tableau vide !"
    somme = 0
    for elt in tab:
        somme = somme + elt
    return somme/len(tab)


if __name__ == '__main__':
    print(moyenne([10, 20, 30, 40, 60, 110]) == 45.0)
    moyenne([])

Exercice n°2

On travaille sur des dessins en noir et blanc obtenu à 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 un tableau composée de sous-tableaux de même longueur. Chaque sous-tableau représentera donc une ligne du dessin.

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 le caractère "*" et les blancs (0 dans la grille) par un espace.

La fonction zoom_tab() prend en argument un tableau tab_depart et un entier k. Elle renvoie un tableau où chaque élément de tab_depart est dupliqué k fois.

La fonction zoom() prend en argument la grille dessin et renvoie une grille où toutes les lignes de dessin sont zoomées k fois et répétées k fois.

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

def affiche(dessin):
    ''' affichage d'une grille : les 1 sont représentés par 
        des " *" , les 0 par un espace " " '''
    for ligne in dessin:
        for col in ligne:
            if col == 1:
                print("*",end="")
            else:
                print(" ",end="")
            print()

def zoom_tab(tab_depart, k):
    '''renvoie un tableau contenant k fois chaque élément de tab_depart'''
    tab_zoom = ...
    for elt in ... :
        for i in range(k):
            ...
    return tab_zoom

def zoom(dessin, k):
    '''renvoie une grille où les lignes de dessin
        sont zoomées k fois ET répétées k fois'''
    grille_zoom = []
    for elt in dessin:
        tab_zoom = ...
        for i in range(k):
            ... .append(...)
    return grille_zoom
Commentaires sur le code original
  1. Pour télécharger l'original du fichier à compléter, cliquer ici.

  2. L'énoncé et le code orginal utilisaient le mot « liste » au lieu du mot « tableau ». Ce mot éatit à 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.

  3. Dans le code original de la fonction zoom(), le mot grille est employé pour désigner plusieurs éléments différents. On a utilisé le mot dessin pour désigner le paramètre afin d'éviter tout malentendu.

Exemples

>>> affiche(coeur)
   **   **   
  *  * *  *  
 *    *    * 
 *         * 
 *         * 
  *       *  
   *     *   
    *   *    
     * *     
      *   

>>> affiche(zoom(coeur, 3)) 
         ******         ******         
         ******         ******         
         ******         ******         
      ***      ***   ***      ***      
      ***      ***   ***      ***      
      ***      ***   ***      ***      
   ***            ***            ***   
   ***            ***            ***   
   ***            ***            ***   
   ***                           ***   
   ***                           ***   
   ***                           ***   
   ***                           ***   
   ***                           ***   
   ***                           ***   
      ***                     ***      
      ***                     ***      
      ***                     ***      
         ***               ***         
         ***               ***         
         ***               ***         
            ***         ***            
            ***         ***            
            ***         ***            
               ***   ***               
               ***   ***               
               ***   ***               
                  ***                  
                  ***                  
                  ***                  
Une solution
coeur = [[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]]

def affiche(dessin):
    ''' affichage d'une grille : les 1 sont représentés par 
        des " *" , les 0 par un espace " " '''
    for ligne in dessin:
        for col in ligne:
            if col == 1:
                print("*",end="")
            else:
                print(" ",end="")
        print()


def zoom_tab(tab_depart, k):
    '''renvoie un tableau contenant k fois chaque 
       élément de tab_depart'''
    tab_zoom = []
    for elt in tab_depart :
        for i in range(k):
            tab_zoom.append(elt)
    return tab_zoom

def zoom(dessin, k):
    '''renvoie une grille où les lignes de dessin
        sont zoomées k fois ET répétées k fois'''
    grille_zoom = []
    for elt in dessin:
        tab_zoom = zoom_tab(elt, k)
        for i in range(k):
            grille_zoom.append(tab_zoom)
    return grille_zoom



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