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;
}
}
}
}