Консультация № 165263
18.04.2009, 10:00
0.00 руб.
0 1 1
Здравствуйте, уважаемые эксперты! Нужно написать алгоритм для Машины с Неограниченными Регистрами (МНР). Аналог на Pascal' в приложении. Т.е. нужно решить систему уравнений.

Приложение:
if x >= y then f := 2*x+1
else f := 2*y-x

Обсуждение

Неизвестный
18.04.2009, 23:05
общий
это ответ
Здравствуйте, Toxa!
У Машины с Неограниченными Регистрами всего 4 команды:
1. Z(n) - Обнулить регистр Rn (Pascal: R[n]:=0;)
2. S(n) - Увеличить регистр Rn на 1 (Pascal: inc(R[n]);)
3. T(m,n) - Присвоить регистру Rn значение регистра Rm (Pascal: R[n]:=R[m];)
4. J(m,n,q) - Условный переход. Если Rm=Rn, то перейти к q-й команде (Pascal: if R[m]=R[n] then goto q;)

Так будет выглядеть программа:
Начальное состояние: R2=X, R3=Y
Конечное состояние: R5=F
1 Z(0)
2 Z(1)
3 Z(2)
4 J(2,4,8)
5 J(2,3,16)
6 S(2)
7 J(0,1,4)
8 T(3,5)
9 Z(2)
10 J(2,3,14)
11 S(2)
12 S(5)
13 J(0,1,10)
14 S(5)
15 J(0,1,25)
16 T(4,5)
17 Z(2)
18 J(2,3,21)
19 S(2)
20 J(0,1,18)
21 J(2,4,25)
22 S(2)
23 S(5)
24 J(0,1,21)

В приложении программа на Паскале, где одна строка - одна комманда машины

Приложение:
program MNR;
{ алгоритм для Машины с Неограниченными Регистрами (МНР)
if x >= y then f := 2*x+1
else f := 2*y-x
}

label Uslovie, XgeY, XltY, DubleX, Plus1, PropuskX, AppendY, Stop; //Позиция комманды в памяти машины

var
i,j,a,x,y,f: integer; //Регистры машины, соответственно R0,R1,R2,R3,R4,R5

begin
i:=0;
j:=0;
Write('Enter X: ');
Readln(x);
Write('Enter Y: ');
Readln(y);

i:=0;
j:=0;
a:=0;
Uslovie:
if a=y then goto XgeY; //Если выполнилось условие, то первым достигся Y, значит Y<=X
if a=x then goto XltY; //Если выполнилось условие, то первым достигся X, значит X<X
inc(a);
if i=j then goto Uslovie; //Такая запись безусловного перехода
//--------------------------------
XgeY: //Условие x>=y; F=X+X+1
f:=x;
a:=0;
DubleX: //расчет f=2*x
if a=x then goto Plus1;
inc(a);
inc(f);
if i=j then goto DubleX;
Plus1: //f:=f+1;
inc(f);
if i=j then goto Stop;
//--------------------------------
XltY: //Условие x<y; F=Y+(Y-X)
f:=y;
a:=0;
PropuskX: //Тут догоняем до X без увеличения F
if a=x then goto AppendY;
inc(a);
if i=j then goto PropuskX;
AppendY: //Тут добираем оставшееся от X до Y
if a=y then goto Stop;
inc(a);
inc(f);
if i=j then goto AppendY;
Stop:
Writeln('F = ',f);
Writeln('Press Enter for Exit');
Readln;
end.
Форма ответа