import java.util.*; /** * les variables sont : * i,j,t statiques (2 entiers, une référence) * le tableau de 10 entiers dans le tas (les 10 entiers, et la longueur) * i l'entier argument de la fonction affiche dans la pile * i, j les entiers arguments de la fonction f dans la pile * on oublie args du main et in... * * il nous faut donc * i, j, t, 10+1, max(1 arg,2 args), plus de quoi gérer les appels : * valeur de retour pour f et adresse de retour pour affiche et f * on doit avoir en tout au moins 18 entiers pour que ce * programme puisse fonctionner. */ public class Partiel13Ex2 { public static void main(String []args) { int ins=1; Scanner in = new Scanner(System.in); //i:0, j:1, t:2, t.length:3, t[0]...t[9]:4...13 int []mem = new int[18]; mem[2] = 4; // début tableau mem[mem[2]-1] = 10; // length = 10 int pile = 14; // statique:0..2; tas:3..13, pile:14..17 while (true) { switch(ins) { case 1: // i = nextInt(); mem[0] = in.nextInt(); ins++; break; case 2: // affiche(i); mem[pile++] = 3; // push AR mem[pile++] = mem[0]; // push i ins = 100; // call affiche() break; case 3: // for() mem[0] = 0; // i=0 ins++; break; case 4: // if (i<t.length) if (mem[0]<mem[mem[2]-1]) ins++; else ins = 9; break; case 5: // then pile++; // push VR mem[pile++] = 6; // push AR mem[pile++] = 2*mem[0]; // push 2*i mem[pile++] = 1; // push 1 ins = 200; // call f(); break; case 6: mem[1] = mem[pile-1]; // j = VR de f(); pile--; // pop VR ins++; break; case 7: // t[i] = j mem[mem[2]+mem[0]] = mem[1]; ins++; break; case 8: mem[0]++; // i++ ins = 4; // retour for break; case 9: // for() mem[0] = 0; // i = 0 ins++; break; case 10: // if (i<t.length) if (mem[0]<mem[mem[2]-1]) ins++; else ins = 13; break; case 11: // affiche(); mem[pile++] = 12; // push AR mem[pile++] = mem[mem[2]+mem[0]]; // push t[i] ins = 100; break; case 12: mem[0]++; // i++; ins = 10; // retour for() break; case 13: if (pile!=14) System.err.println("sortie avec pile non vide..."); System.exit(1); break; /** * la fonction affiche ne nécessite que deux entiers sur la pile * l'adresse de retour et l'argument */ case 100: // AR, param i System.out.println("J'affiche la valeur "+mem[pile-1]); ins++; break; case 101: pile--; // pop args ins = mem[pile-1]; // retrouve AR pile--; // pop AR break; /** * la fonction f nécessite quatre entiers sur la pile * la valeur de retour, l'adresse de retour et les deux arguments */ case 200: // VR, AR, param i, param j mem[pile-4] = mem[pile-2]+mem[pile-1]; ins++; break; case 201: pile -= 2; // pop args; ins = mem[pile-1]; // retrouve AR pile -= 1; // pop AR break; } } } }