![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
Vardes |
![]()
Сообщение
#21
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 131 Пол: Мужской Репутация: ![]() ![]() ![]() |
Блин,точно...
Просто у меня уже голова кипит от этой задачи,но цель уже поставлена,поэтому и пытаюсь всякими извращёнными способами достигнуть её.НУ всё же остаётся поставленный вопрос про генерирование точки в посте №18. Сообщение отредактировано: Vardes - |
volvo |
![]()
Сообщение
#22
|
Гость ![]() |
Значит, у тебя прямоугольник ограничен -5 <= x <= 6 и -7 <= y <= 4?
randomize;
point_x := random(12) - 5;
point_y := random(12) - 7
Общий случай: чтобы сгенерировать случайное число в интервале [a .. b]: X := random(b - a + 1) + a; |
Vardes |
![]()
Сообщение
#23
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 131 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вот реализация части програмного кода,до нахождения max и min значения x и y.
Код const pi=3.14159; var n,i:integer; miny,maxy,minx,maxx,r,x,y:real; mas:array[1..50] of real; begin Writeln('‚Введите кол-во окружнростей-'); readln(n); Writeln('‚Введите радиус окружностей-'); minx:=0;maxx:=0; miny:=0;maxy:=0; for i:=1 to n do readln(mas[i]); for i:=1 to n do begin x:=mas[i]*(cos(2*pi/n*(i-1)));{нахождение декартовых координат} y:=mas[i]*(sin(2*pi/n*(i-1))); writeln(x:2:2,' ',y:2:2); {нахождение min и max значения x и y} if x-mas[i]<=minx then minx:=x-mas[i]; if x+mas[i]>=maxx then maxx:=x+mas[i]; if y-mas[i]<=miny then miny:=y-mas[i]; if y+mas[i]>=maxy then maxy:=y+mas[i]; end; writeln(minx:2:2,' ',maxx:2:2,' ',miny:2:2,' ',maxy:2:2) end. |
volvo |
![]()
Сообщение
#24
|
Гость ![]() |
To: Vardes
Ну, и что нам делать с этим кодом? Если уж выкладываешь, то или выкладывай полный код (когда закончишь), или задавай вопросы (если что-то не получается...) |
Vardes |
![]()
Сообщение
#25
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 131 Пол: Мужской Репутация: ![]() ![]() ![]() |
Правилен ли будет код для генерации случайных точек и их проверки(ссылаясь на код выше),так как у меня идёт зацикливание.
Код var found:boolean; point_x,point_y:integer; begin randomize; point_x:=random(round((maxx-minx+1)+minx)); point_y:=random(round((maxy-miny+1)+miny)); Sum:=0; For i:=1 to n do While not found do begin If Sqrt(sqr(point_x-x)+sqr(point_y-y))<=mas[i] then found:=true; Inc(Sum); end; Сообщение отредактировано: Vardes - |
volvo |
![]()
Сообщение
#26
|
Гость ![]() |
point_x:=random(round(maxx-minx+1))+minx;
point_y:=random(round(maxy-miny+1))+miny;
|
Vardes |
![]()
Сообщение
#27
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 131 Пол: Мужской Репутация: ![]() ![]() ![]() |
Всё исправил,но всё равно идёт зацикливание. не пойму в чём дело.
Код const pi=3.14159; var found:boolean; sum,n,i:integer; point_x,point_y,miny,maxy,minx,maxx,r,x,y:real; mas:array[1..50] of real; begin Writeln('‚Введите кол-во окружнростей-'); readln(n); Writeln('‚Введите радиус окружностей-'); minx:=0;maxx:=0; miny:=0;maxy:=0; for i:=1 to n do readln(mas[i]); for i:=1 to n do begin x:=mas[i]*(cos(2*pi/n*(i-1)));{нахождение декартовых координат} y:=mas[i]*(sin(2*pi/n*(i-1))); writeln(x:2:2,' ',y:2:2); {нахождение min и max значения x и y} if x-mas[i]<=minx then minx:=x-mas[i]; if x+mas[i]>=maxx then maxx:=x+mas[i]; if y-mas[i]<=miny then miny:=y-mas[i]; if y+mas[i]>=maxy then maxy:=y+mas[i]; end; writeln(minx:2:2,' ',maxx:2:2,' ',miny:2:2,' ',maxy:2:2) begin randomize; point_x:=random(round(maxx-minx+1))+minx; point_y:=random(round(maxy-miny+1))+miny; Sum:=0; For i:=1 to n do While not found do begin If Sqrt(sqr(point_x-x)+sqr(point_y-y))<=mas[i] then found:=true; Inc(Sum); end; writeln(sum); end. |
volvo |
![]()
Сообщение
#28
|
Гость ![]() |
Данные, которые вводишь, приведи... И объясни, что значит "зацикливание"...
Ну, я же тебе не так говорил делать !!! Внимательно читай пост №20. Условие под последним While может и не закончиться. Вот так перепиши его (нужно же ограничивать перебор числом окружностей): While (i <= n) and (not found) do begin
Кстати, а с каким именно X и Y ты производишь операции? Ты их сохранил куда-то (в массив), когда преобразовал из полярной СК? Я у тебя в коде этого не увидел... Более того, у тебя даже массива для этого не описано... |
Vardes |
![]()
Сообщение
#29
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 131 Пол: Мужской Репутация: ![]() ![]() ![]() |
Провожу такой ввод данных:
n- кол-во окружностей и ввожу радиус окружности,переводя его в массив mas[1..n].Вот и все данные. Проблема в том,что постоянно работает цикл while как взял i=1,так постоянно и гоняет себя не переходя на др. значения i.Переделал и всё равно гоняет. |
volvo |
![]()
Сообщение
#30
|
Гость ![]() |
Я тебе уже написал почему... Вот НЕзацикливающийся вариант. Я не проверял все формулы, если там все правильно, то тебе осталось только зациклить генерацию точки, сделать это несколько сот тысяч раз (не меньше 200000-250000, лучше - несколько миллионов), посчитать количество попаданий, и вычислить площадь (как - см. пост №8)...
Прикрепленные файлы ![]() |
Vardes |
![]()
Сообщение
#31
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 131 Пол: Мужской Репутация: ![]() ![]() ![]() |
значит генерация происходит по одной точке,если я правильно понимаю.Как же тогда можно генерировать несколько тысяч раз,если у нас промежуток по x[-4:5],а по у [-3;9].Принцип не могу понять.
|
volvo |
![]()
Сообщение
#32
|
Гость ![]() |
var amount: longint;
...
for amount := 1 to 200000 do begin
randomize;
point_x:=random(round(maxx-minx+1))+minx;
point_y:=random(round(maxy-miny+1))+miny;
i := 1; found := False;
While (i <= n) and not found do begin
If Sqrt(sqr(point_x-x[i])+sqr(point_y-y[i]))<=mas[i] then found:=true
else inc(i);
end;
write(point_x:3:3, ', ', point_y:3:3);
if found then writeln(' is inside circle #', i)
else writeln(' is outside');
end;
у тебя сгенерируется 200000 точек и каждая проверится на попадание в фигуру. Только надо организовать подсчет (вместо Writeln) |
Vardes |
![]()
Сообщение
#33
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 131 Пол: Мужской Репутация: ![]() ![]() ![]() |
так это всё понятно,я про принцип спрашивал,откуда берётся такое большое кол-во точек,если у нас промежуток маленький.
|
volvo |
![]()
Сообщение
#34
|
Гость ![]() |
To: Vardes
А тебе все равно, какой у тебя промежуток. Если у тебя прямоугольник (граничные точки) размером 5*5, а сама фигура - размером 3*3, я что, не могу сгенерировать 5 миллионов точек, КАЖДАЯ из которых будет находиться в прямоугольнике? И проверить, сколько попадет в фигуру? Пускай из них будет по полмиллиона точек повторяться, это НЕ твоя проблема. Это и есть Monte-Carlo (Метод Рулетки) |
Vardes |
![]()
Сообщение
#35
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 131 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ну ведь каждая сгенерированная точка имеет свои координаты,для вещественного типа их можно сколько угодно сгенерировать,а если у нас генерирование идёт целых чисел, да и промежуток небольшой,то как тогда поступать.
|
volvo |
![]()
Сообщение
#36
|
Гость ![]() |
Ну, так генерируй с точностью до сотых:
randomize;
point_x:=(random(100*round(maxx-minx))+100*minx)/100;
point_y:=(random(100*round(maxy-miny))+100*miny)/100;
![]() |
Altair |
![]()
Сообщение
#37
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Vardes, итоговую программу, выложи пожалуйста здесь. Спасибо. (думаю как метериал для FAQ использовать )
-------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Vardes |
![]()
Сообщение
#38
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 131 Пол: Мужской Репутация: ![]() ![]() ![]() |
А почему тогда одно и то же значение он по 100 раз просматривает.
И ещё вопрос,идёт генерация точек,анализируется например 2 пересекаемые окружности,тогда точки попавшие в область пересечения окружностей будут суммироваться относительно первой и второй,или только относительно одной из них(в которую они попадут первыми).Что предусматривает метод Монте-Карло? |
volvo |
![]()
Сообщение
#39
|
Гость ![]() |
To: Vardes
Ты ответы мои ВНИМАТЕЛЬНО читал? Я кому это все пишу? Цитата(Пост №10) Как только точка попала в какую-то окружность, вся дальнейшая работа с этой точкой прекращается, ведь она УЖЕ внутри фигуры, и ты переходишь к следующей точке... Цитата А почему тогда одно и то же значение он по 100 раз просматривает. Это ты к чему? КАКОЕ значение "он" (кстати, кто это ОН?) просматривает по 100 раз. Можно более четко выражать свои мысли? |
Vardes |
![]()
Сообщение
#40
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 131 Пол: Мужской Репутация: ![]() ![]() ![]() |
Код write(point_x:3:3, ', ', point_y:3:3); Если приостановить процесс,то увидишь,что значения сгенерированных точек повторяются.Это как объяснить? |
![]() ![]() |
![]() |
Текстовая версия | 12.04.2025 2:17 |