Vous trouverez ci-dessous l’ensemble des algorithmes susceptibles de tomber
le jour de l’épreuve pratique en tant qu’exerice 1. Ces algorithmes, que j’ai
choisis pour leur niveau de difficulté modéré, concernent le parcours de
tableaux (ou de chaînes de caractères).
Dans chaque rubrique, certains exercices très simples figurent dans en premier
à titre d’aide à la révision dans le but de vous préparer aux exercices
suivants plus complexes.
Consignes pour s’entrainer
Mettez vous dans les conditions de l’examen. Pour cela, positionner
côte à côte sur l’écran de votre ordinateur :
à gauche cette page Web ;
à droite Visual Studio Code ;
Sur votre ordinateur, créez vous un dossier de travail par exemple
revision_epreuve_pratique et ouvrez ce dossier dans Visual Studio Code
Dans ce dossier, créez un fichier de programme Python pour chaque
exercice par exemple exo01.py, exo02.py etc.
Commencez par essayer d’écrire la fonction sans aide.
En cas de difficulté, consulter le diaporama proposé qui rappelle le
principe de l’algorithme.
Si nécessaire, entrainez-vous d’abord sur les codes à trous proposés.
Attention, à terme, vous devrez être capable d’écrire ces fonctions sans
l’aide du code à trous.
Pensez à toujours tester en intégralité le jeu de test fourni.
Lorsque votre fonction passe tous les tests, préparer la documentation
du code en faisant des phrases complètes. Une correction avec
documentation est aussi fournie.
Entraînez-vous à présenter le programme à l’oral à un camarade.
La check list le jour de l’examen pour l’exercice 1.
Je prends le temps de lire attentivement l’énoncé de l’exercice 1.
J’étudie en particulier les exemples du jeu de test qui permettent de
comprendre exactement ce que doit faire la fonction.
J’écris le prototype de la fonction :
J’écris le mot clé def
def
Je le fais suivre du nom exact de la fonction proposé dans
l’énonce. J’ouvre la parenthèse et ajoute le :.
defnom_fonction():
J’ajoute les paramètres dans le bon ordre. Pour cela, je m’appuie
sur les exemples du jeu de test pour vérifier que l’odre que j’ai
choisi est correct.
defnom_fonction(par1,par2):
Si les noms des paramètres sont proposés dans l’énoncé, je les
respecte scrupuleusement sinon je choisis des noms selon les
conventions habituelles :
tab pour un tableau
val pour une valeur recherchée
etc.
Je prépare le jeu de test. Pour cela :
J’ajoute le mot-clé pass provisoirement pour que la syntaxe soit
correcte avant de compléter la fonction.
defnom_fonction(par1,par2):pass
Je saute deux lignes et écris tous les appels du jeu de test fourni
dans l’énoncé.
J’exécute régulièrement le programme pour vérifier au fur et à mesure
que la fonction passe tous les tests et qu’aucune erreur n’est déclenchée.
En cas d’erreur déclenchée, j’analyse le message d’erreur pour
identifier le problème.
En cas d’erreur ou de test non passé, je peux copier-coller le programme
de Visual Studio Code vers Thonny et utiliser le débogueur pour identifier
le problème.
En cas de blocage sévère je peux demander un coup de pouce à
l’examinateur-ice. Un échange fructueux est valorisé et retire peu de
points.
Lorsque la fonction est correcte, si je juge le temps restant suffisant,
je prépare les commentaires du code.
J’écris des phrases sans abbréviation et vérifie l’orthographe.
Je vais au plus court sans paraphraser inutilement le code.
J’appelle l’examinateur-ice pour lui présenter le programme.
Je commence toujours par lire l’énoncé en sélectionant la phrase
(ou les deux phrases) pertinente(s) qui indique(nt) ce que la fonction
prend en paramètre et renvoie.
J’explique à l’aide des commentaires ce que fait la fonction.
Je parle distinctement en articulant correctement avec un débit
modéré.
Occurrences d’une valeur
Exercice 1. Présence d’une valeur
Écrire un fonction presence qui prend en paramètre une valeur numérique
val et un tableau de nombres tab. Cette fonction renvoie
True si la valeur est présente dans le tableau et
False sinon.
La fonction presence prend en paramètre une valeur numérique
val et un tableau de nombres tab. Cette fonction renvoie
True si la valeur est présente dans le tableau et
False sinon.
defpresence(val,tab):# On parcourt le tableau.foreltintab:# Dès que l'élément courant est égal à la valeur recherchée,ifelt==val:# on renvoie True ce qui met fin au parcours.returnTrue# Si tout le tableau a été parcouru sans renvoi, cela signifie# que la valeur recherchée n'a pas été trouvée. On renvoie donc# False.returnFalseprint(presence(8,[4,5,8,2]))print(presence(3,[4,5,8,2]))print(presence(3,[2]))print(presence(3,[3]))print(presence(3,[]))
Exercice 2. Nombre d’occurrences d’une valeur
Écrire une fonction nbre_occurrences qui prend en paramètre une valeur
numérique val et un tableau de nombres tab. Cette fonction renvoie
le nombre d’occurrences de val dans tab.
Cette instruction d’incrémentation est
équivalente à cpt = cpt + 1
La fonction nbre_occurrences prend en paramètre une valeur
numérique val et un tableau de nombres tab. Cette fonction
renvoie le nombre d’occurrences de val dans tab.
defnbre_occurrences(val,tab):# On initialise à zéro une variable compteur.cpt=0# On parcourt le tableau.foreltintab:# Si l'élélement courant est égal à la valeur recherchée,ifelt==val:# on incrémente la variable compteur.cpt+=1#(1)!# En fin de parcours, la variable compteur contient le nombre# d'occurrences de la valeur recherchée.returncptprint(nbre_occurrences(2,[5,9,3,5,7,5]))print(nbre_occurrences(5,[5,9,3,5,7,5]))print(nbre_occurrences(5,[5]))print(nbre_occurrences(5,[]))
Cette instruction d’incrémentation est
équivalente à cpt = cpt + 1
Exercice 3. Indice de la première occurrence
Écrire un fonction premiere_occurrence qui prend en paramètre une
valeur numérique val et un tableau de nombres tab. Cette fonction
renvoie l’indice de la première occurrence de val dans tab si val
est présente dans tab. Sinon renvoie None.
defpremiere_occurrence(val,tab):# On parcourt le tableau.foriinrange(len(tab)):# Dès que l'élément courant est égal à la valeur recherchée,iftab[i]==val:# On renvoie l'indice courant qui correspond donc à# l'indice de la première occurrence de la valeur# recherchée ce qui met fin au parcours.returni# Si tout le tableau a été parcouru sans renvoi, cela signifie# que la valeur recherchée n'a pas été trouvée. On renvoie donc# None.returnNoneprint(premiere_occurrence(2,[7,9,5,1,2,2,8,2,7]))print(premiere_occurrence(6,[7,9,5,1,2,2,8,2,7]))print(premiere_occurrence(6,[7]))print(premiere_occurrence(6,[6]))print(premiere_occurrence(6,[]))
Exercice 4. Indice de la dernière occurrence
Écrire une fonction derniere_occurrence qui prend en paramètre une
valeur numérique val et un tableau de nombres tab. Cette fonction
renvoie l’indice de la dernière occurrence de val dans tab si val
est présente dans tab. Sinon renvoie None.
La fonction derniere_occurrence prend en paramètre une
valeur numérique val et un tableau de nombres tab. Cette
fonction renvoie l’indice de la dernière occurrence de val
dans tab si val est présente dans tab. Sinon renvoie
None.
Il faut parcourir tout le tableau pour être sûr de reprérer la
dernière occurrence. Il faut donc utiliser un algorithme en temps
constant.
defderniere_occurrence(val,tab):# On initialise une variable résultat à None. Ainsi, en fin# de parcours, si la valeur recherchée n'a pas été trouvée# None sera renvoyée. res=None# On parcourt le tableau.foriinrange(len(tab)):# Si l'élément courant est égal à la valeur recherchée,iftab[i]==val:# La variable résultat prend comme valeur le rang# courant.res=i# En fin de parcours, il y a deux possibilités :# - la valeur recherchée n'a pas été trouvée et res a# conservé sa valeur initiale de None ;# - la valeur recherchée a été trouvée au moins une fois# et res contient l'indice de la dernière occurrence.returnresprint(derniere_occurrence(2,[7,9,5,1,2,2,8,2,9]))print(derniere_occurrence(6,[7,9,5,1,2,2,8,2,9]))print(derniere_occurrence(6,[7]))print(derniere_occurrence(6,[6]))print(derniere_occurrence(6,[]))
Exercice 5. Liste des indices des occurrences
Écrire une fonction indices_occurrences qui prend en paramètre une
valeur numérique val et un tableau de nombres tab. Cette fonction
renvoie dans un tableau la liste des indices des occurrences de val dans
tab.
La fonction indices_occurrences prend en paramètre une
valeur numérique val et un tableau de nombres tab. Cette
fonction renvoie dans un tableau la liste des indices des
occurrences de val dans tab.
defindices_occurrences(val,tab):# On initalise le tableau résultat en tant que tableau vide.res=[]# On parcourt le tableau.foriinrange(len(tab)):# Si l'élément courant est égal à la valeur recherchée,iftab[i]==val:# on ajoute le rang courant au tableau résultat.res.append(i)returnresprint(indices_occurrences(2,[7,9,5,1,2,2,8,2,9]))print(indices_occurrences(6,[7,9,5,1,2,2,8,2,9]))print(indices_occurrences(6,[7]))print(indices_occurrences(6,[6]))print(indices_occurrences(6,[]))
Minimum et maximum
Dans cette partie, on choisit comme exemple de traiter le cas du maximum. Des
notes sur les programmes indiquent ce qu’il faudrait modifier pour traiter le
cas du minimum.
Exercice 6. Valeur du maximum
Écrire une fonction maximum qui renvoie la valeur maximum d’un tableau
non-vide (1) contenant des nombres positifs et/ou négatifs.
Le fait que la mention non-vide
apparaisse dans l’énoncé indique que le cas du tableau vide n’a pas à être
pris en charge par la fonction maximum.
defmaximum(tab):# On choisit comme maximum provisoire le premier élément du# tableau. Choisir à la place la valeur 0 serait une erreur car# cela ne prendrait pas en charge le cas où le tableau ne# contient que des nombres strictement négatifs.maxi=tab[0]# On parcourt le tableau.foreltintab:# Si l'élément courant est strictement plus grand que le# maximum rencontré jusqu'à présent,ifelt>maxi:#(1)!# On met à jour le maximum.maxi=elt# En fin de parcours, le dernier maximum provisoire est le# maximum du tableau.returnmaxiprint(maximum([4,7,3,11,12,23,5,2,16]))print(maximum([-4,-7,-3,-11,-12,-23,-5,-2,-16]))print(maximum([-4,-7,-3,-11,-12,23,5,2,16]))print(maximum([4]))print(maximum([-4]))
Pour trouver le minimum, il suffirait de
remplacer maxi par mini et de remplacer
ifelt>maxi: par ifelt<mini:.
Exercice 7. Indice du premier maximum
Écrire une fonction premier_maximum qui prend en paramètre un tableau
non-vide de nombre et renvoie l’indice de la première occurrence du
maximum de ce tableau.
defpremier_maximum(tab):# L'indice du maximum prend provisoirement la valeur# zéro (indice de la première case du tableau).i_maxi=0# On parcourt le tableau.foriinrange(len(tab)):# Si l'élément courant est strictement supérieur au# au maximum provisoire, (l'égalité stricte permet de # ne prendre en compte que la première occurrence).iftab[i]>tab[i_maxi]:#(1)!# On met à jour l'indice du maximumi_maxi=i# En fin de parcours i_maxi contient l'indice de la# prmeière cocurrence du maximum.returni_maxiprint(premier_maximum([4,7,23,11,3,23,5,3,16]))print(premier_maximum([-4,-7,-23,-11,-3,-23,-5,-3,-16]))print(premier_maximum([-4,-7,23,-11,-3,23,23,2,16]))print(premier_maximum([4]))print(premier_maximum([-4]))
Pour trouver l’indice du premier minimum,
il suffirait de remplacer i_maxi par i_mini et de remplacer
iftab[i]>tab[i_maxi]: par
iftab[i]<tab[i_mini]:.
Exercice 8. Indice du dernier maximum
Écrire une fonction dernier_maximum qui prend en paramètre un tableau
non-vide de nombre et renvoie l’indice de la dernière occurrence du
maximum de ce tableau.
Pour trouver l’indice du dernier minimum,
il suffirait de remplacer i_maxi par i_mini et de remplacer
iftab[i]>=tab[i_maxi]: par
iftab[i]<=tab[i_mini]:.
defdernier_maximum(tab):# L'indice du maximum prend provisoirement la valeur# zéro (indice de la première case du tableau).i_maxi=0# On parcourt le tableau.foriinrange(len(tab)):# Si l'élément courant est supérieur ou égal au# maximum provisoire, (l'égalité large permet de # prendre en compte toutes les occurrences et donc# la dernière en fin de parcours).iftab[i]>=tab[i_maxi]:#(1)!# On met à jour l'indice du maximumi_maxi=i# En fin de parcours i_maxi contient l'indice de la# dernière occurrence du maximum.returni_maxiprint(dernier_maximum([4,7,23,11,3,23,6,3,16]))print(dernier_maximum([-4,-7,-23,-11,-3,-23,-5,-3,-16]))print(dernier_maximum([-4,-7,23,-11,-3,23,23,2,16]))print(dernier_maximum([4]))print(dernier_maximum([-4]))
Pour trouver l’indice du dernier minimum,
il suffirait de remplacer i_maxi par i_mini et de remplacer
iftab[i]>=tab[i_maxi]: par
iftab[i]<=tab[i_mini]:.
Moyenne pondérée
Exercice 9. Moyenne pondérée
Dans cet exercice on cherche à calculer la moyenne pondérée d’un élève
dans une matière donnée. Chaque note est associée à un coefficient qui la
pondère.
Par exemple, si ses notes sont : 14 avec coefficient 3, 12 avec coefficient
1 et 16 avec coefficient 2, sa moyenne pondérée sera donnée par
Rappel. Dans la console, un appel exécuté qui
renvoie None ne donne aucun résultat. En mode programme, on
insère l’appel dans un print(...). On exécutera donc ici
print(moyenne([(3,0),(5,0)])) ce qui donnera pour affichage
None.
Attention, dans ce branchement
conditionnel, il faut placer d’abord l’aternative
somme_coeffs==0. Si on tente d’abord le calcul
avec une somme de coefficients nulle, une erreur ZeroDivisionError se déclenchera avec le premier appel.
La fonction moyenne :
prend en paramètre une liste notes non vide de tuples à
deux éléments entiers de la forme (note, coefficient)
(int ou float) positifs ou nuls ;
et renvoie la moyenne pondérée des notes de la liste sous
forme flottant si la somme des coefficients est non nulle,
None sinon.
defmoyenne(notes):# On initialise deux variables d'accumulation qui vont accumuler# respectivement les points obtenus par l'ensemble des élèves et# les coefficients des notes.somme_points=0somme_coeffs=0# On parcourt le tableau des notes en déballant chaque tuple du# tableau en deux variables stockant respectivement les note et# coefficient courants.fornote,coeffinnotes:# On incrémente les deux variables d'accumulation.somme_points+=note*coeffsomme_coeffs+=coeff# Si la somme des coefficients est zéro,ifsomme_coeffs==0:#(1)!# on renvoie None.returnNone# Sinon,else:# on renvoie le quotient des deux sommes calculées.returnsomme_points/somme_coeffsprint(moyenne([(8,2),(12,0),(13.5,1),(5,0.5)]))print(moyenne([(3,0),(5,0)]))
Attention, dans ce branchement
conditionnel, il faut placer d’abord l’aternative
somme_coeffs==0. Si on tente d’abord le calcul
avec une somme de coefficients nulle, une erreur ZeroDivisionError se déclenchera avec le premier appel.
Comparaisons d’éléments consécutifs
Exercice 10. Doublons dans un tableau trié
Écrire une fonction a_doublon qui prend en paramètre un tableau trié de
nombres dans l’ordre croissant et renvoie True si ce tableau
contient au moins deux nombres identiques, False sinon.
La fonction a_doublon prend en paramètre un tableau trié de
nombres dans l’ordre croissant et renvoie True si
ce tableau contient au moins deux nombres identiques,
False sinon.
Comme le tableau passé en paramètre est trié dans l’ordre
croissant, deux éléments identiques sont forcément côte à côte.
On va donc vérifier s’il existe dans le tableau au moins une
paire d’éléments consécutifs de même valeur.
defa_doublon(tab):# Si le tableau est vide ou comprend un seul élément.iflen(tab)<2:# Le tableau ne peut pas contenir de doublon. On renvoie donc# False.returnFalse# Sinon, on parcourt le tableau en comparant deux à deux les# éléments consécutifs du tableau. On prend soin de choisir comme# dernier indice len(tab) - 2 pour éviter un dépassement d'indice# dans tab[i + 1].foriinrange(len(tab)-1):# Si l'élément courant est identique à l'élément suivant,iftab[i]==tab[i+1]:# il y a un doublon donc on renvoie TruereturnTrue# En fin de parcours, si aucun doublon n'a été détectée, cela# indique que le tableau ne possède pas de doublon et on renvoie# False.returnFalseprint(a_doublon([]))print(a_doublon([1]))print(a_doublon([1,2,4,6,6]))print(a_doublon([2,5,7,7,7,9]))print(a_doublon([0,2,3]))
Exercice 11. Vérification du tri d’un tableau
Écrire une fonction verifie qui prend en paramètre un tableau de valeurs
numériques et qui renvoie True si ce tableau est trié dans
l’ordre croissant, False sinon. Un tableau vide est considéré comme trié.
La fonction verifie prend en paramètre un tableau de valeurs
numériques et renvoie True si ce tableau est trié
dans l’ordre croissant, False sinon. Un tableau
vide est considéré comme trié.
defverifie(tab):# Si le tableau est vide ou comprend un seul élément.iflen(tab)<2:# Le tableau est considéré comme trié donc on renvoie TruereturnTrue# Sinon, on parcourt le tableau en comparant deux à deux les# éléments consécutifs du tableau. On prend soin de choisir comme# dernier indice len(tab) - 2 pour éviter un dépassement d'indice# dans tab[i + 1].foriinrange(len(tab)-1):# Si l'élément courant est strictement supérieur à l'élément# suivant,iftab[i]>tab[i+1]:# cela indique que le tableau est mal trié donc on# renvoie False.returnFalse# En fin de parcours, si aucune anomalie n'a été détectée, cela# indique que le tableau est bien trié et on renvoie True.returnTrueprint(verifie([0,5,8,8,9]))print(verifie([8,12,4]))print(verifie([-1,4]))print(verifie([]))print(verifie([5]))
Exercice 12. Codage par différence
Le codage par différence (delta encoding en anglais) permet de compresser
un tableau de données en indiquant pour chaque donnée, sa différence avec
la précédente (plutôt que la donnée elle-même). On se retrouve alors avec
un tableau de données plus petit, nécessitant moins de place en mémoire.
Cette méthode se révèle efficace lorsque les valeurs consécutives sont
proches.
Programmer la fonction delta(tab) qui prend en paramètre un tableau de
nombres entiers et qui renvoie un tableau contenant les valeurs entières
compressées à l’aide cette technique.
Le codage par différence (delta encoding en anglais) permet de
compresser un tableau de données en indiquant pour chaque
donnée, sa différence avec la précédente (plutôt que la donnée
elle-même).
La fonction delta(tab) prend en paramètre un tableau de
nombres entiers et renvoie un tableau contenant les valeurs
entières compressées à l’aide cette technique.
defdelta(tab):# Si le tableau est vide ou comprend un seul élément.iflen(tab)<2:# on renvoie simplement le tableau.returntab# Sinon, on initialise le tableau résultat comme un tableau à une# case contenant le premier élément du tableau passé en paramètre.res=[tab[0]]# On parcourt le tableau passé en paramètre à l'exception de son# dernier élément. On construit progressivement le tableau# résultat en lui ajoutant à chaque étape la différence entre# l'élément suivant et l'élément courant.foriinrange(len(tab)-1):res.append(tab[i+1]-tab[i])returnresprint(delta([1000,800,802,1000,1003]))print(delta([42]))print(delta([]))