• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Алгоритмы, анимация

Код:
uses crt,graph;
var xc,yc,x,y,d1,d2,r1,r2,d:integer;
    k:char;
procedure Fig(x,y,c:integer);
begin
setcolor(c);
r1:=10;r2:=20;d1:=r2+r1;
d2:=r2+2*r1;
circle(x,y,r2);
circle(x-r2-r1,y,r1);
circle(x,y-r2-r1,r1);
circle(x+r2+r1,y,r1);
circle(x,y+r2+r1,r1);
rectangle(x-d1,y-d1,x+d1,y+d1);
rectangle(x-d2,y-d2,x+d2,y+d2);
line(x-d2,y+d2,x+d2,y-d2);
line(x-d2,y-d2,x+d2,y+d2);
end;
begin
initgraph(xc,yc,'');
xc:=getmaxX div 2;
yc:=getmaxY div 2;
outtextXY(xc-80,20,'Upravlenie - Strelki');
outtextXY(xc-50,40,'Exit - Esc');
x:=xc;y:=yc;
Fig(x,y,12);
repeat
if keypressed then
  begin
    k:=readkey;
    if k=#80 then
      begin
        delay(100);
        Fig(x,y,0);
        if y>getmaxY-d2-10 then d:=0
        else d:=10;
        y:=y+d;
        Fig(x,y,12);
       end;
    if k=#72 then
      begin
        delay(100);
        Fig(x,y,0);
        if y<2*d2+10 then d:=0
        else d:=10;
        y:=y-d;
        Fig(x,y,12);
      end;
    if k=#77 then
      begin
        delay(100);
        Fig(x,y,0);
        if x>getmaxX-d2-10 then d:=0
        else d:=10;
        x:=x+d;
        Fig(x,y,12);
       end;
    if k=#75 then
      begin
        delay(100);
        Fig(x,y,0);
        if x<d2+10 then d:=0
        else d:=10;
        x:=x-d;
        Fig(x,y,12);
      end;
    if k=#27 then exit;
  end;
until k=#27;
end.

а эта как вам?правилна ли?почему то ошибка выходит,про деление на ноль.-Error 200: by zero
 
почему то ошибка выходит,про деление на ноль.-Error 200: by zero

Для целых чисел операция деления на ноль не определена. Возможно что при расчете координата получилась равная нолю.
Для нецелых чисел - тоже. Гульназ, я гонял Вашу программу - никаких ошибок деления на ноль там не возникает. Да и откуда бы им взяться? Единственная операция деления во всём листинге - это вычисление координат центра экрана путем деления максимальных значений пополам, что, конечно, к ошибке привести не может. Потому мой вердикт: лажа транслятора. Впрочем, возможно, появление ошибки связано с тем, что Вы не присвоили никаких значений параметрам процедуры InitGraph(...) (я, когда тестирую программы, в любом случае это дело комментарю и временно подключаю свой модуль, так что за запуск графики не отвечаю).

Теперь по программе. В принципе, всё правильно, и, по сути этот код почти, за исключением обозначений, не отличается от моего, вот только зачем-то напихано много явно лишнего. А именно:

1. Ну на кой пёс Вы там ставите задержки после нажатия клавиш? С ними только хуже. Убрать.

2. Условный оператор
If KeyPressed then
begin
...
end;
абсолютно не нужен. Ничего он не добавляет и не убавляет, поэтому - убрать.

3. Отдельная обработка кода клавиши Esc
if k=#27 then exit;
также не нужна: вполне достаточно ее иметь, как параметр Until k=#27. Убрать.

4. Не обязательно, но так, на будущее, в качестве строгости и общей дисциплины программирования: если Вы используете графический режим, то в конце программы (или фрагмента с графикой) желательно предусмотреть выход из него, т.е. поставить CloseGraph. Но это, повторяю, не обязательно.

С учетом перечисленных поправок:
Код:
uses crt,graph;
var xc,yc,x,y,d1,d2,r1,r2,d:integer;
    k:char;
procedure Fig(x,y,c:integer);
begin
setcolor(c);
r1:=10;r2:=20;d1:=r2+r1;
d2:=r2+2*r1;
circle(x,y,r2);
circle(x-r2-r1,y,r1);
circle(x,y-r2-r1,r1);
circle(x+r2+r1,y,r1);
circle(x,y+r2+r1,r1);
rectangle(x-d1,y-d1,x+d1,y+d1);
rectangle(x-d2,y-d2,x+d2,y+d2);
line(x-d2,y+d2,x+d2,y-d2);
line(x-d2,y-d2,x+d2,y+d2);
end;
begin
initgraph(xc,yc,'');
xc:=getmaxX div 2;
yc:=getmaxY div 2;
outtextXY(xc-80,20,'Upravlenie - Strelki');
outtextXY(xc-50,40,'Exit - Esc');
x:=xc;y:=yc;
Fig(x,y,12);
repeat
 k:=readkey;
 if k=#80 then
   begin
     Fig(x,y,0);
     if y>getmaxY-d2-10 then d:=0
     else d:=10;
     y:=y+d;
     Fig(x,y,12);
    end;
 if k=#72 then
   begin
     Fig(x,y,0);
     if y<2*d2+10 then d:=0
     else d:=10;
     y:=y-d;
     Fig(x,y,12);
   end;
 if k=#77 then
   begin
     Fig(x,y,0);
     if x>getmaxX-d2-10 then d:=0
     else d:=10;
     x:=x+d;
     Fig(x,y,12);
    end;
 if k=#75 then
   begin
     Fig(x,y,0);
     if x<d2+10 then d:=0
     else d:=10;
     x:=x-d;
     Fig(x,y,12);
   end;
until k=#27;
CloseGraph;
end.
 
Назад
Сверху