Série 07 - Jacques BAPST

Transcription

Série 07 - Jacques BAPST
Programmation Java / Travaux pratiques
S07- Programmation procédurale / Synthèse
Classes
I1 + T1
1 Analyser le code et décrire l'effet des deux méthodes suivantes :
public static void disp(int nL) {
char c = '*';
int nbl, nbe, j;
public static int np2(int k) {
int i, s, n=0;
while (k>1) {
k /= 2;
n++;
}
for (nbl=0 ; nbl<nL ; nbl++) {
nbe = nL - nbl - 1;
for (j=0; j<nbe; j++)
System.out.print(' ') ;
for (j=0; j<2*nbl+1; j++)
System.out.print(c) ;
System.out.println() ;
}
s=1;
for (i=0 ; i<=n ; i++) {
s *= 2;
}
return s;
}
}
2 Écrire une méthode qui retourne un tableau dont le contenu correspond à la somme (élément par
élément) de deux tableaux d'entiers t1 et t2 à deux dimensions, passés en paramètres.
On s'assurera que les tableaux t1 et t2 sont rectangulaires et de mêmes tailles. Si ce n'est pas le cas,
une référence nulle sera retournée.
2a VARIANTE Même problème que l'exercice précédent mais où la méthode fonctionne également pour
deux tableaux quelconques mais semblables (c'est-à-dire avec un même nombre de lignes et un même
nombre de colonnes pour chacune des lignes).
3 Écrire un programme qui résout le casse-tête
MARK
suivant, où chaque lettre correspond à un chiffre
+ ALLEN
------différent.
WEISS
Les solutions affichées sont données sur la droite.
Écrire deux versions, car il y a deux approches possibles
(parmi d'autres) :
- essayer toutes les possibilités d'associer les lettres aux
chiffres, et tester pour chacune si l'addition est correcte;
- essayer toutes les possibilités d'effectuer l'addition
correcte, et tester pour chacune si les contraintes sur
les lettres sont respectées.
Quelle méthode est la plus rapide ?
MARK=3146
MARK=3149
MARK=3571
MARK=3579
MARK=3815
MARK=3817
MARK=5217
MARK=5219
MARK=6105
MARK=6109
MARK=6174
MARK=6179
MARK=8291
MARK=8294
MARK=8431
MARK=8439
MARK=8572
MARK=8579
MARK=9143
MARK=9147
ALLEN=17709
ALLEN=17706
ALLEN=58829
ALLEN=58821
ALLEN=86607
ALLEN=86605
ALLEN=28849
ALLEN=28847
ALLEN=17739
ALLEN=17735
ALLEN=18859
ALLEN=18854
ALLEN=27764
ALLEN=27761
ALLEN=47769
ALLEN=47761
ALLEN=54439
ALLEN=54432
ALLEN=16657
ALLEN=16653
WEISS=20855
WEISS=20855
WEISS=62400
WEISS=62400
WEISS=90422
WEISS=90422
WEISS=34066
WEISS=34066
WEISS=23844
WEISS=23844
WEISS=25033
WEISS=25033
WEISS=36055
WEISS=36055
WEISS=56200
WEISS=56200
WEISS=63011
WEISS=63011
WEISS=25800
WEISS=25800
Exemples de solutions
ème
4 Écrire une méthode qui retourne la k
ligne (1ère dimension) d'un tableau à deux dimensions de booléens.
ème
Écrire une autre méthode qui retourne la k
colonne (2ème dimension) d'un tableau à deux dimensions
de booléens en s'assurant préalablement que le tableau est rectangulaire. Si ce n'est pas le cas, une
référence nulle sera retournée.
5 Décrire clairement l'effet de la méthode rk()
(avec n>0, k>0, n>k).
Que fait ce code si k=2 ?
Et si k est un nombre positif quelconque ?
6 Écrire deux méthodes équivalentes à la
méthode fA() en employant, à la place de
l'instruction for,
a) une instruction while
b) une instruction do… while
EIA-FR  PR1_S07.doc
public static int rk(int n, int k) {
int i, p=0;
for (i=1 ; p<=n ; i++) {
p=i;
for (int j=1; j<k ; j++) {
p = p * i;
}
}
return i-2;
}
public static int fA(int n, int k) {
int som = 0;
for (int i=k ; i>0 ; i--)
som += (n-i);
return som;
}
17.10.2013
1
7 Soit l'algorithme suivant :
Choisir un entier strictement positif n
Tant que n  1
Si n impair, n  3n + 1
Sinon,
nn/2
Il semble que cet algorithme se termine toujours après un nombre fini d'étapes ( conjecture de Syracuse).
Écrire une méthode qui calcule, pour un nombre n donné, le nombre d'étapes pour arriver à 1 ainsi que
la valeur maximale atteinte par n (entier maximal par lequel on passe).
Écrire une autre méthode qui comptabilise dans un tableau, le nombre d'étapes ainsi que la valeur
maximale pour tous les nombres de 1 à p.
Écrire une méthode qui affiche le contenu du tableau sous la forme :
Nb : 1
Nb : 2
Nb : 3
Tester le fonctionnement sur machine.
Nb étapes : 0
Nb étapes : 1
Nb étapes : 7
Val max : 1
Val max : 2
Val max : 16
7a VARIANTE Compléter le code de l'exercice précédent pour rechercher et afficher également le nombre
maximal d'étapes consécutives durant lesquelles la valeur de n est supérieure à la valeur de départ.
Nb : 25
Nb : 26
Nb : 27
Nb étapes : 23
Nb étapes : 10
Nb étapes : 111
Val max : 88
Val max : 40
Val max : 9232
Étapes>n : 4
Étapes>n : 1
Étapes>n : 95
8 Écrire une méthode qui affiche toutes les manières possibles d'obtenir N francs avec des pièces de ka,
kb et kc francs. Le nombre de possibilités sera également affiché.
Exemple d'affichage pour 6 Fr et des pièces de 5, 2 et 1 Fr :
6
6
6
6
6
Fr
Fr
Fr
Fr
Fr
=
=
=
=
=
6
4
2
3
1
x
x
x
x
x
1
1
1
2
1
Fr
Fr
Fr
Fr
Fr
+
+
1 x 2 Fr
2 x 2 Fr
+
1 x 5 Fr
Il y a 5 possibilités de faire 6 Fr
9 Décrire le plus clairement possible l'effet de la
méthode myst().
Cette méthode fonctionne-t-elle pour n'importe
quel tableau d'entiers ?
Quel est le contenu du tableau retourné par
chacune des invocations suivantes :
int[] a = {3, 2, 1, 4, 2, 3, 1, 3};
int[] b = {3, 2, 1, 3, 2, 1, 3, 2};
r = myst(a, 2);
r = myst(a, 3);
r = myst(b, 1);
EIA-FR  PR1_S07.doc
public static int[] myst(int[] v, int n) {
int[] r = new int[v.length];
int m=v[0];
for (int i=0; i<v.length; i++) {
if (v[i]>m) m= v[i];
r[i] = -1;
}
int[] t = new int[m+1];
m=t[0];
for (int i=0; i<v.length; i++) {
t[v[i]]++;
if (t[v[i]]>m) m=t[v[i]];
}
int p=0;
for (int i=m; i>=n; i--) {
for (int j=0; j<t.length; j++) {
if (t[j] == i) {
r[p] = j;
p++;
}
}
}
return r;
}
17.10.2013
2