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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2009, 11:28   #1
Asira
Пользователь
 
Регистрация: 12.12.2009
Сообщений: 84
По умолчанию Паскаль графика

Нарисовать круг, касающийся границы экрана, разделенный на n равных секторов, каждый из которых закрашен случайным цветом; два соседних сектора не должны иметь одинаковый цвет; центр круга - точка (x,y);

Код:
uses graph;
var c,e,d,m,n,a,b,w:integer;
begin
randomize;
d:=detect;
initgraph(d,m,'');
writeln('Vvedute_chislo_sektorov');
readln(n);
a:=0;
b:=0;
w:=n;
e:=0;
while w>0 do
begin
c:=random(16);
if (c=e) and (c=16) then c:=c-1;
if (c=e) and (c<>16) then c:=c+1;
b:=b+round(360/n);
setfillstyle(1,c);
sector(320,240,a,b,240,240);
a:=a+(360 div n);
w:=w-1;
e:=c;
end;
circle(320,240,240);
readln;
closegraph;
end.
ПОмогите убрать погрешность чтоб для нечётных n программа тоже работала
Asira вне форума Ответить с цитированием
Старый 27.12.2009, 22:40   #2
Alex_FF
Удален
Форумчанин
 
Регистрация: 02.12.2009
Сообщений: 309
По умолчанию

это из-за погрешности при переходе от вещественных чисел к целым...

Код:
uses
    Crt, Graph;

var
   C, E, D, M, N, A, B, W: Integer;
begin
     Randomize;
     D := Detect;
     WriteLn('Enter number of sectors');
     ReadLn(N);
     InitGraph(D, M, '');
     if GraphResult <> GrOK then Exit;
     A := 0;
     B := 0;
     W := N;
     E := 0;
     while W > 0 do
     begin
          C := Random(16);
          if (C = E) and (C = 16) then Dec(C);
          if (C = E) and (C <> 16) then Inc(C);
          if W = 1 then B := 360 else B := B + 360 div N;
          SetFillStyle(1, C);
          Sector(320, 240, A, B, 240, 240);
          A := A + (360 div N);
          Dec(W);
          E := C;
     end;
     Circle(320, 240, 240);
     ReadKey;
     CloseGraph;
end.

Последний раз редактировалось Alex_FF; 27.12.2009 в 22:42.
Alex_FF вне форума Ответить с цитированием
Старый 27.12.2009, 22:42   #3
Asira
Пользователь
 
Регистрация: 12.12.2009
Сообщений: 84
По умолчанию

Спасибо но ошибка не пропала............всё равно погрешность остаётся......
ошибка накапливается из-за этих вычислений B := B + 360 div N;
A + (360 div N)
я хотел заменить их произведением но ничего не вышло

Последний раз редактировалось Asira; 28.12.2009 в 21:35.
Asira вне форума Ответить с цитированием
Старый 27.12.2009, 23:01   #4
Alex_FF
Удален
Форумчанин
 
Регистрация: 02.12.2009
Сообщений: 309
По умолчанию

а в чём собственно ошибка?
Alex_FF вне форума Ответить с цитированием
Старый 27.12.2009, 23:05   #5
Asira
Пользователь
 
Регистрация: 12.12.2009
Сообщений: 84
По умолчанию

когда нечётное число секторов то в конце накапливается маленький сектор которого не должно быть............
Asira вне форума Ответить с цитированием
Старый 27.12.2009, 23:09   #6
Alex_FF
Удален
Форумчанин
 
Регистрация: 02.12.2009
Сообщений: 309
По умолчанию

вот введите 11 и посмотрите... нету там никакого маленького сектора...
Это, конечно, в моем решении нету

И чтобы поточнее было, замените B := B + 360 div N на B := B + Round(360 / N)
и A := A + 360 div N на A := A + Round(360 / N)

вот так будет

Код:
uses
    Crt, Graph;

var
   C, E, D, M, N, A, B, W: Integer;
begin
     Randomize;
     D := Detect;
     WriteLn('Enter number of sectors');
     ReadLn(N);
     InitGraph(D, M, '');
     if GraphResult <> GrOK then Exit;
     A := 0;
     B := 0;
     W := N;
     E := 0;
     while W > 0 do
     begin
          C := Random(16);
          if (C = E) and (C = 16) then Dec(C);
          if (C = E) and (C <> 16) then Inc(C);
          if W = 1 then B := 360 else B := B + Round(360 / N);
          SetFillStyle(1, C);
          Sector(320, 240, A, B, 240, 240);
          A := A + Round(360 / N);
          Dec(W);
          E := C;
     end;
     Circle(320, 240, 240);
     ReadKey;
     CloseGraph;
end.
Alex_FF вне форума Ответить с цитированием
Старый 27.12.2009, 23:18   #7
Asira
Пользователь
 
Регистрация: 12.12.2009
Сообщений: 84
По умолчанию

вот как раз так у меня сделано как у вас во втором варианте но сектор пустой остаётся точнее он не пустой он чёрный и не равный всем остальным........ только что в паскале запускал
погрешность в цикле всё равно остаётся........так как тут сумма....


Надо как то произведением заменить............а то получается что если n =7 то по циклу погрешность увеличивается в 7 раз ...я хотел сделать так чтобы он один сектор определял а так как остальные все равны то умножить на их количество , но я не знаю как при этом ещё учесть что сектора каждый раз должны быть разные по цвету


Надо как то произведением заменить............а то получается что если n =7 то по циклу погрешность увеличивается в 7 раз ...я хотел сделать так чтобы он один сектор определял а так как остальные все равны то умножить на их количество , но я не знаю как при этом ещё учесть что сектора каждый раз должны быть разные по цвету

Последний раз редактировалось Asira; 28.12.2009 в 21:36.
Asira вне форума Ответить с цитированием
Старый 27.12.2009, 23:31   #8
Alex_FF
Удален
Форумчанин
 
Регистрация: 02.12.2009
Сообщений: 309
По умолчанию

сейчас, 5 сек., с другой задачей разберусь...
Alex_FF вне форума Ответить с цитированием
Старый 28.12.2009, 00:45   #9
Alex_FF
Удален
Форумчанин
 
Регистрация: 02.12.2009
Сообщений: 309
По умолчанию

у черного цвета номер 0. Random(16) генерирует числа от 0 до 15. Когда выпадает 0, то тот сектор закрашивается черным... Напишите вместо Random(16) вот так: 1 + Random(15)
Alex_FF вне форума Ответить с цитированием
Старый 28.12.2009, 00:46   #10
Asira
Пользователь
 
Регистрация: 12.12.2009
Сообщений: 84
По умолчанию

ДАК ВЫПАДАЕТ СЕКТОР НЕ РАВНЫЙ ОСТАЛЬНЫМ СЕКТОРАМ........ОНИ ВСЕ ДОЛЖНЫ БЫТЬ МЕЖДУ СОБОЙ =

Последний раз редактировалось Asira; 28.12.2009 в 21:05.
Asira вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль графика Asira Помощь студентам 2 27.12.2009 22:34
паскаль. графика deu4er Помощь студентам 2 18.05.2009 21:30
Паскаль графика BuTeK1 Паскаль, Turbo Pascal, PascalABC.NET 0 08.01.2009 11:01
ПАСКАЛЬ ГРАФИКА glasian Помощь студентам 19 17.06.2008 04:26