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, nn/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