Exercice — dans l'esprit des sujets du bac
Soit T = [4, 7, 2, 7, 9, 3, 7, 1] (N=8).
- Écrire une fonction
Maximum(T, N)qui retourne la valeur maximale et l'indice de sa première occurrence.- Appliquer cette fonction à T. Quel est le résultat ?
- Modifier la fonction pour retourner l'indice de la dernière occurrence du maximum.
- Écrire une fonction
NbOccurrences(T, N, val)qui retourne le nombre d'occurrences devaldans T. Combien de fois7apparaît-il ? - Écrire une procédure
DecalageGauche(T, N)qui effectue un décalage circulaire vers la gauche (le premier élément va en dernière position).- Donner le contenu de T après un appel à cette procédure.
- Comment effectuer un décalage de k positions ?
Voir la correction commentéeAprès avoir posé votre démarche
1. Maximum et première occurrence. Idée : initialiser max ← T[1], indMax ← 1, puis parcourir et mettre à jour si T[i] > max.
TDOL — objets locaux :
i,max,indMax: entier — compteur, valeur maximale, indice de la première occurrenceT: tableau d'entiers ;N: entier — paramètres (Type/Nature)
DEF PROC Maximum(T : tableau ; N : entier ; var max, indMax : entier)
Variables i : entier
Début
max ← T[1] ; indMax ← 1
Pour i de 2 à N faire
Si T[i] > max alors
max ← T[i] ; indMax ← i
FinSi
FinPour
Fin
{ la procédure rend les deux résultats par ses paramètres var : max et indMax }
Application sur T = [4, 7, 2, 7, 9, 3, 7, 1] (N=8) : max=9, indMax=5. On obtient la valeur 9 et l'indice 5 (deux résultats, d'où une procédure à deux paramètres var plutôt qu'une fonction). Pour la dernière occurrence du maximum, remplacer > par ≥ : à égalité, l'indice est écrasé par le plus récent.
2. Nombre d'occurrences de val.
DEF FN NbOccurrences(T : tableau ; N, val : entier) : entier
Variables i, c : entier
Début
c ← 0
Pour i de 1 à N faire
Si T[i] = val alors c ← c + 1 FinSi
FinPour
Retourner c
Fin
Pour val = 7 : On retourne 3.
3. Décalage circulaire gauche.
DEF PROC DecalageGauche(var T : tableau ; N : entier)
Variables i, sauv : entier
Début
sauv ← T[1]
Pour i de 1 à N-1 faire
T[i] ← T[i+1]
FinPour
T[N] ← sauv
Fin
Après un décalage : [7, 2, 7, 9, 3, 7, 1, 4]. Contrainte : indices i dans [1..N] ; sauvegarder T[1] avant d'écraser.
3.(b) Décalage de k positions. Deux méthodes : appeler DecalageGauche k fois (k ← k mod N d'abord, un décalage de N positions ne changeant rien) ; ou recopier en une passe dans un tableau auxiliaire U[i] ← T[((i-1+k) mod N)+1] puis T ← U. La première est en O(kN), la seconde en O(N).
Équivalent Python (extrait).def maximum(T, N):
m, ind = T[0], 0
for i in range(1, N):
if T[i] > m:
m, ind = T[i], i
return m, ind + 1 # indices Python à partir de 0 : +1 pour retrouver l'indice 5 de l'énoncé
print(maximum([4,7,2,7,9,3,7,1], 8))