Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2008, 10:43   #1
KnDmPetr
Пользователь
 
Регистрация: 02.03.2008
Сообщений: 20
Злость Помогите найти ошибку в программе

Условие: Дано число 0<R<1. Построить последовательность N окружностей так, чтобы: 1) Диаметр первой расположенной по центру экрана окружности составлял R от вертикальной длины экрана. 2) Диаметр каждой последующей окружности составлял 0<W<1 от диаметра предыдущей окружности. 3) Каждая последующая окружность должна внутренне касаться предыдущей окружности в случайной точке и иметь случайный цвет.
Программу написал, но есть глюк, который я не могу вычислить, помогите. При r=0.9, w=0.9, n=30 происходит смещение окружности. Помогите исправить ошибку!!!
Привожу код программы:

program mnogograf;
uses crt,graph;
var
grDriver:integer; grMode:integer;
ErrCode:integer; radius,centrX,centrY,x0,y0,n,i,k:in teger;
r,w:real;
Begin
clrscr; randomize;
write ('Enter 0<r<1 : '); readln (r);
if (r<0) or (r>1) then
begin
writeln ('Invalid value, press eny key'); readkey; exit;
end;
write ('Enter 0<w<1 : '); readln (w);
if (w<0) or (w>1) then
begin
writeln ('Invalid value, press eny key'); readkey; exit;
end;
write ('Enter n>1 : '); readln (n);
if (n<1) then
begin
writeln ('Invalid value, press eny key'); readkey; exit;
end;
begin
grDriver := Detect;
InitGraph(grDriver, grMode,'');
ErrCode := GraphResult;
if ErrCode = grOk then
begin { Do graphics }
setcolor(random(15));
centrX:=getmaxx div 2; centrY:=getmaxy div 2;
radius:=round((r*getmaxy)/2);
circle(centrX,centrY,radius);
for i:=1 to n-1 do
begin
readln; setcolor(random(15));
k:=random(360);
x0:=centrX+(round((radius)*sin(k))-round((radius*w)*sin(k)));
y0:=centrY+(round((radius)*cos(k))-round((radius*w)*cos(k)));
circle(x0,y0,round(radius*w));
radius:=round(radius*w);
centrX:=x0; centrY:=y0;
end;
Readln;
CloseGraph;
end
else
Writeln('Graphics error:', GraphErrorMsg(ErrCode));
end;
End.

Последний раз редактировалось KnDmPetr; 10.03.2008 в 10:59.
KnDmPetr вне форума Ответить с цитированием
Старый 10.03.2008, 11:12   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а у меня вроде всё нормально... что смещается?

ну, есть одно подозрение, попробуйте вместо Readln;
написать код:
Код:
      key:=readkey;
      if key=#0 then key:=readkey;
где key:char;

кстати не забывайте, пожалуйста, при публикации кода на форуме использовать обрамляющие тэги (CODE /CODE)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.03.2008, 12:16   #3
KnDmPetr
Пользователь
 
Регистрация: 02.03.2008
Сообщений: 20
По умолчанию

Рисуются окружности одна в другой, но иногда окружности (когда радиус уже не очень большой) вдруг начинают постепенно смещаться вниз за рамки экрана минуя все формулы по которым они строятся.
KnDmPetr вне форума Ответить с цитированием
Старый 10.03.2008, 13:06   #4
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

При том коде, который приведен изначально, действительно на 26-м пункте начинаются смещения. Просто заменил в строчке
readln; setcolor(random(15));
readln; на readkey и все нормально заработало, почему не знаю.
Кстати если и readln; и readkey убрать, то программа все сразу сама выдает.

Последний раз редактировалось puporev; 10.03.2008 в 13:15.
puporev вне форума Ответить с цитированием
Старый 10.03.2008, 14:12   #5
KnDmPetr
Пользователь
 
Регистрация: 02.03.2008
Сообщений: 20
По умолчанию

То что если и readln; и readkey убрать, то программа все сразу сама выдает это я знаю, я специально их поставил чтобы посмотреть как все получается в режиме отладки
KnDmPetr вне форума Ответить с цитированием
Старый 10.03.2008, 14:19   #6
KnDmPetr
Пользователь
 
Регистрация: 02.03.2008
Сообщений: 20
По умолчанию

Все заработало, спасибо за советы. Действительно, если заменить readln на readkey все нормально работает. Хотя почему не хочет с readln нормально работать до сих пор непонятно. Всем спасибо за помощь!!!
KnDmPetr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите найти ошибку Максим_Леонидович БД в Delphi 4 20.08.2008 23:23
Помогите найти ошибку Dmitriy Общие вопросы Delphi 4 01.08.2008 23:32
Помогите найти ошибку в программе Evgenii Помощь студентам 3 24.07.2008 09:06
Помогите найти ошибку NeiL Общие вопросы Delphi 7 04.03.2008 07:14
help!!! Помогите найти ошибку!!! linker13 Общие вопросы Delphi 2 07.07.2007 23:15