Консультация № 161123
22.02.2009, 15:19
0.00 руб.
0 1 1
Здравствуйте уважаемые эксперты. Вот немогу решить задачу на паскале.
Требуется разработать программу управления лифтом для пятиэтажного здания в паскале.
Лифт будет двигаться вверх, если нажата кнопка этажа, находящегося выше кабины лифта.
Лифт будет двигаться вниз, если нажата кнопка этажа, находящегося ниже кабины лифта.
Две кнопки не могут быть нажаты одновременно.
Если при движении отпущена кнопка, то лифт остановится.
У меня есть решение этой задачи для трех этажного здания, а вот для пяти сообразить не могу. Заранее спасибо за все ответы.

Приложение:
Program Lift1;
uses crt;
var k1,k2,k3,d1,d2,d3,Yup,Ydown,Ydoor: boolean;
NewLY,OldLY: byte;
ch: char;
Procedure DrawHouse;
var x,y,z: byte;
begin
textcolor(7);
for z:=1 to 3 do
begin
for x:=1 to 20 do
begin
gotoxy(x+10,z*10); write('ю');
gotoxy(x+10,40); write('ю');
end;
for y:=1 to 10 do
begin
gotoxy(11,z*10+y); write('ю');
gotoxy(30,z*10+y); write('ю');
end;
end;
end;
Procedure DrawLift;
var y: byte;
begin
textcolor(15);
for y:=1 to 9 do
begin
gotoxy(13,y+OldLY);write(' ');
end;
for y:=1 to 9 do
begin
gotoxy(13,y+NewLY);write('юююююююю');
end;
end;

procedure YLift;
begin
if (NewLY>=10) and (NewLY<=19) then D3:=true else D3:=false;
if (NewLY>=11) and (NewLY<=29) then D2:=true else D2:=false;
if (NewLY>=21) and (NewLY<=30) then D1:=true else D1:=false;
if (D1 and not(D2) and not(D3) and not(K1) and K2 and not(K3)) or
(D1 and D2 and not(D3) and not(K1) and K2 and not(K3)) or
(D1 and not(D2) and not(D3) and not(K1) and not(K2) and K3) or
(D1 and D2 and not(D3) and not(K1) and not(K2) and K3) or
(not(D1) and D2 and not(D3) and not(K1) and not(K2) and K3) or
(not(D1) and D2 and D3 and not(K1) and not(K2) and K3) then Yup:=true else Yup:=false;

if (D1 and D2 and not(D3) and K1 and not(K2) and not(K3)) or
(not(D1) and D2 and not(D3) and K1 and not(K2) and not(K3)) or
(not(D1) and D2 and D3 and K1 and not(K2) and not(K3)) or
(not(D1) and not(D2) and D3 and K1 and not(K2) and not(K3)) or
(not(D1) and D2 and D3 and not(K1) and K2 and not(K3)) or
(not(D1) and not(D2) and D3 and not(K1) and K2 and not(K3)) then Ydown:=true else Ydown:=false;

if (D1 and not(D2) and not(D3) and K1 and not(K2) and not(K3)) or
(not(D1) and D2 and not(D3) and not(K1) and K2 and not(K3)) or
(not(D1) and not(D2) and D3 and not(K1) and not(K2) and K3) then Ydoor:=true else Ydoor:=false;
end;

begin
OldLY:=13;
NewLY:=13;
K1:=false; K2:=false; K3:=false;
clrscr;
Ylift;
DrawHouse;
DrawLift;
repeat
ch:=readkey;
OldLY:=NewLY;
if ch='1' then K1:=true else K1:=false;
if ch='2' then K2:=true else K2:=false;
if ch='3' then K3:=true else K3:=false;
Ylift;
if Yup then dec(NewLY);
if Ydown then inc(NewLY);
gotoxy(1,1);writeln(D1,' ',D2,' ',D3,' ',newly);
DrawHouse;
DrawLift;
until ch='0';

end.

Обсуждение

Неизвестный
22.02.2009, 18:02
общий
это ответ
Здравствуйте, Sam145!

Немного упростил Вашу программу - теперь при нажатии номера этажа она просто запоминает "высоту", на которую должен приехать лифт.
Если лифт ниже этой высоты - он перемещается вверх, если выше - вниз.

Чтобы корректно отображалось всё здание - надо на заголовке консоли при работе программы нажать правой кнопкой мыши, выбрать "Умолчания" - "Расположение" - "Размер окна" - "Высота" и поставить там не менее 53 и перезапустить программу.
Успехов!

С уважением, Дмитрий.

Приложение:
Program Lift1;
uses crt;
var NewLY,OldLY,NeedY: byte;
ch: char;
Procedure DrawHouse;
var x,y,z: byte;
begin
textcolor(7);
for z:=0 to 4 do{рисуем 5 этажей}
begin
for x:=1 to 20 do
begin
gotoxy(x+10,z*10+3); write('■');
gotoxy(x+10,(z+1)*10+3); write('■');{рисуем нижнюю грань этажа}
end;
for y:=1 to 10 do
begin
gotoxy(11,z*10+3+y); write('■');
gotoxy(30,z*10+3+y); write('■');
end;
end;
end;
Procedure DrawLift;
var y: byte;
begin
textcolor(15);
for y:=1 to 9 do
begin
gotoxy(13,y+OldLY);write(' ');
end;
for y:=1 to 9 do
begin
gotoxy(13,y+NewLY);write('■■■■■■■■');
end;
end;

begin
OldLY:=13;
NewLY:=13;
clrscr;
DrawHouse;
DrawLift;
repeat
ch:=readkey;
OldLY:=NewLY;
case ch of{в зависимости от нажатой клавиши запоминаем на какой высоте должен оказаться лифт}
'1': NeedY:=43;
'2': NeedY:=33;
'3': NeedY:=23;
'4': NeedY:=13;
'5': NeedY:=3;
Else NeedY:=OldLY;{если нажали не 1-5 - стоим на месте}
end;
IF OldLY < NeedY then{если он выше этой высоты - идём вниз}
inc(NewLY);
IF OldLY > NeedY then{если он ниже - вверх}
dec(NewLY);

DrawHouse;
DrawLift;
until (ch='0')or(ch = #27);{выходим при нажатии '0' или 'Esc'}
end.
Форма ответа