Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 21.10.2012, 20:46   #21 (permalink)
Гульназ.М.
Member
 
Регистрация: 01.02.2012
Сообщений: 75
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Код:
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
Гульназ.М. вне форума   Ответить с цитированием
Старый 21.10.2012, 21:22   #22 (permalink)
XELFAER
Member
 
Аватар для XELFAER
 
Регистрация: 22.07.2012
Сообщений: 393
Записей в дневнике: 2
Сказал(а) спасибо: 95
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 5501
По умолчанию

Цитата:
Сообщение от Гульназ.М. Посмотреть сообщение
почему то ошибка выходит,про деление на ноль.-Error 200: by zero
Для целых чисел операция деления на ноль не определена. Возможно что при расчете координата получилась равная нолю.
XELFAER вне форума   Ответить с цитированием
Старый 22.10.2012, 10:25   #23 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от XELFAER Посмотреть сообщение
Цитата:
Сообщение от Гульназ.М. Посмотреть сообщение
почему то ошибка выходит,про деление на ноль.-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.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 11:49.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.