Tableau d`entiers et récursivité [rc05] - Exercice

Transcription

Tableau d`entiers et récursivité [rc05] - Exercice
Tableau d’entiers et récursivité [rc05] - Exercice
Karine Zampieri, Stéphane Rivière, Béatrice Amerein-Soltner
Unisciel
algoprog
Version 10 avril 2015
Table des matières
1 Tableau d’entiers et récursivité / pg-tbmanipA1
1.1 Saisie et affichage . . . . . . . . . . . . . . . . . .
1.2 Génération aléatoire d’entiers dans un fichier . . .
1.3 Chargement d’un tableau . . . . . . . . . . . . . .
1.4 Maximum d’un tableau . . . . . . . . . . . . . . .
1.5 Somme d’un tableau . . . . . . . . . . . . . . . .
1.6 Recherche dans un tableau . . . . . . . . . . . . .
1
(C++, TP)
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
3
4
4
5
6
Tableau d’entiers et récursivité / pg-tbmanipA1 (C++,
TP)
Cet exercice contient un ensemble d’utilitaires « Tableaux d’entiers » sous forme de
procédures et fonctions récursives. Attention, Toutes les procédures et fonctions considèrent que les indices des tableaux commencent à 1 et non pas 0. Dans le cas des langages
(C++, Java) la case d’indice 0 ne sera donc pas utilisée.
1.1
Saisie et affichage
Définissez la constante NMAX (nombre maximum d’éléments du tableau) de valeur 100 et
le type Tableau comme étant un tableau d’entiers de taille maximale NMAX.
Écrivez une procédure récursive saisirTabRec(t,n) qui demande et saisit n valeurs
entières dans un Tableau t. Affichez l’invite (où [x] désigne le contenu de x) :
t[[n]]?
Soit la procédure saisirEntier(n,a,b) qui demande et saisit un entier dans n jusqu’à
ce qu’il soit dans l’intervalle d’entiers [a..b]. Elle affiche l’invite :
Entier dans [[a]..[b]]?
1
Unisciel algoprog – Tableau d’entiers et récursivité / rc05
2
C++ @[saisirEntierA1.cpp]
Déduisez une procédure saisirTab(t,n) qui demande et saisit le nombre de valeurs dans
n (entier) compris entre 1 et NMAX (entier) puis appelle la procédure saisirTabRec(t,n)
pour saisir les valeurs dans un Tableau t. Affichez l’invite :
Nombre d’éléments
Écrivez une procédure récursive afficherTabRec(t,n) qui affiche récursivement les n
éléments d’un Tableau t.
Déduisez une procédure maı̂tre afficherTab(t,n) qui affiche les n éléments d’un Tableau t.
Affichez les valeurs entre crochets :
[ ... ]
Écrivez une procédure test_saisirAfficher qui :
– Déclare un entier nelems et un Tableau tab de taille maximale NMAX.
– Demande et effectue la saisie récursive de nelems entiers dans tab.
– Affiche récursivement les valeurs lues.
Testez. Exemple d’exécution.
Nombre d’éléments: Entier dans [1..100]? 8
t[1]? 1
t[2]? -6
t[3]? 6
t[4]? 12
Unisciel algoprog – Tableau d’entiers et récursivité / rc05
t[5]?
t[6]?
t[7]?
t[8]?
[1 -6
1.2
3
-8
4
6
20
6 12 -8 4 6 20 ]
Génération aléatoire d’entiers dans un fichier
Ce problème utilise la procédure saisirEntier fournie dans le problème [Saisie et affichage].
Soit la fonction aleaEntier(a,b) qui renvoie un entier pseudo-aléatoire compris dans
l’intervalle d’entiers [a..b]. Elle génère un entier de la longueur de l’intervalle [a..b]
(c.-à-d. b-a+1) puis ajoute a.
C++ @[aleaEntierA1.cpp]
Outil
C++ La fonction rand() est définie dans la bibliothèque <cstdlib>. Elle renvoie un
entier pseudo-aléatoire dans [0..RAND_MAX]. Le modulo projette l’entier dans l’intervalle [0..n-1].
Écrivez une procédure récursive ecrireAleaRec(n,os) qui écrit n entiers pseudo-aléatoires
dans un fichier. Le paramètre os désigne la variable fichier en écriture. Générez par
exemple des entiers dans [-20..20].
Écrivez une procédure test_ecritureAlea qui demande et saisit le nombre d’éléments
dans nelems (entier) compris entre [1..NMAX] et le nom de fichier dans fn (chaine de
caractères). Affichez les invites :
Nombre d’éléments:
Nom du fichier?
Ouvrez le fichier, effectuez l’écriture de nelems entiers pseudo-aléatoires dans le fichier,
puis fermez-le et affichez le message :
FIN fichier généré
Unisciel algoprog – Tableau d’entiers et récursivité / rc05
4
Testez. Exemple d’exécution.
Nombre d’éléments: Entier dans [1..100]? 100
Nom du fichier? dt-tbmanipA1.txt
FIN fichier généré
1.3
Chargement d’un tableau
Écrivez une procédure lireTabRec(t,n,is) qui effectue la lecture récursive de n entiers
dans un Tableau t depuis un flux d’entrée is (variable fichier en lecture). Supposez que
le fichier contient au moins n entiers.
Déduisez une procédure chargerTab(t,n,fn) qui effectue la lecture de n entiers dans
un Tableau t depuis le fichier de nom fn (chaı̂ne de caractères).
Copiez/collez la procédure test_ecritureAlea en la procédure test_chargement. Complétezla et modifiez-la de sorte qu’elle demande et saisit le nombre d’éléments dans nelems
et le nom de fichier dans fn puis effectue le chargement de nelems entiers dans un
Tableau tab depuis fn puis affiche les valeurs lues.
Testez avec votre fichier et/ou avec le fichier fourni en téléchargement.
Nombre d’éléments: Entier dans [1..100]? 15
Nom du fichier? dt-tbmanipA1.txt
[-17 -13 2 13 -2 -6 11 16 3 16 -1 -3 -7 0 1 ]
@[tbmanipA1.txt]
1.4
Maximum d’un tableau
Comment déterminer le maximum des n éléments d’un tableau t par récursivité ?
Unisciel algoprog – Tableau d’entiers et récursivité / rc05
5
Soit la fonction max2i(a,b) qui renvoie le maximum des entiers a et b.
C++ @[max2iA1.cpp]
Écrivez une fonction récursive maximumTab(t,n) qui calcule et renvoie le maximum des
n éléments d’un Tableau t.
Copiez/collez la procédure test_chargement en la procédure test_maxelement. Calculez et affichez :
==> Plus grand des [nelems] premiers elements = ...
Testez. Exemple d’exécution.
Nombre d’éléments: Entier dans [1..100]? 15
Nom du fichier? dt-tbmanipA1.txt
[-17 -13 2 13 -2 -6 11 16 3 16 -1 -3 -7 0 1 ]
==> Plus grand des 15 premiers éléments = 16
1.5
Somme d’un tableau
Écrivez une fonction récursive sommeTab(t,n) qui calcule et renvoie la somme des n
éléments d’un Tableau t.
Aide méthodologique Utilisez la récursivité terminale en écrivant une procédure
sommeTabRec(t,n,rs) qui cumule la somme des éléments du tableau dans son dernier
paramètre rs (entier).
Unisciel algoprog – Tableau d’entiers et récursivité / rc05
6
Copiez/collez la procédure test_maxelement en la procédure test_sommetab et remplacez le calcul du maximum par :
==> Somme des [nelems] premiers elements = ...
Testez. Exemple d’exécution.
Nombre d’éléments: Entier dans [1..100]? 15
Nom du fichier? dt-tbmanipA1.txt
[-17 -13 2 13 -2 -6 11 16 3 16 -1 -3 -7 0 1 ]
==> Somme des 10 premiers éléments = 13
1.6
Recherche dans un tableau
Comment chercher une valeur val dans les n éléments d’un tableau t de manière récursive ?
Écrivez une fonction récursive rechseq(t,n,val) qui calcule et renvoie l’indice le plus
à droite d’une valeur val (entier) dans les n éléments d’un Tableau t. Dans le cas d’une
recherche infructueuse, renvoyez -1.
Comment effectuer la recherche si l’on souhaite l’indice de l’occurrence la plus à gauche ?
Écrivez une fonction récursive rechlinRec(t,n,val,k) qui calcule et renvoie l’indice de
la première occurrence d’une valeur val (entier) dans le sous-tableau d’entiers t[k..n]
de taille maximale NMAX. Dans le cas d’une recherche infructueuse, renvoyez -1.
Écrivez une fonction maı̂tre rechlin(t,n,val) qui lance la fonction récursive.
Unisciel algoprog – Tableau d’entiers et récursivité / rc05
7
Copiez/collez la procédure test_sommetab en la procédure test_rechtab. Modifiez-la
afin de demander et saisir la valeur à chercher dans val. Affichez l’invite :
Valeur à chercher?
Remplacez le calcul de la somme par la recherche de val parmi les nelems de tab :
==> Indice le plus à droite = ....
==> Indice le plus à gauche = ....
Testez. Exemples d’exécution.
Nombre d’éléments: Entier dans [1..100]? 15
Nom du fichier? dt-tbmanipA1.txt
[-17 -13 2 13 -2 -6 11 16 3 16 -1 -3 -7 0 1 ]
Valeur à chercher? 16
==> Indice le plus à droite = 10
==> Indice le plus à gauche = 8
Nombre d’éléments: Entier dans [1..100]? 15
Nom du fichier? dt-tbmanipA1.txt
[-17 -13 2 13 -2 -6 11 16 3 16 -1 -3 -7 0 1 ]
Valeur à chercher? 4
==> Indice le plus à droite = -1
==> Indice le plus à gauche = -1