![]() |
Помогите с задачей /Pascal/
Собственно, задача:
Цитата:
|
Цитата:
В формуле получается сумма от 1 до n при условии R1<Ri<R2 . Для уменьшения кол-ва расчетов можно взять 1/8 круга, скорректировав конечный результат. |
Код:
program Park; |
Habetdin,
Цитата:
И тогда введя все нужные обозначения, у них не должно возникнуть вопроса, а "что писать"? Все это будет четко привязано к формулам. Только за абстракцией, к примеру, R=... будет стоять либо функция, либо простая арифметика, массив, и пр. Цитата:
" rez:=Ri(0, " - вот это надо переделать в отдельную функцию. И больше ничего подсказывать не буду :) P.S. Я как-то говорил, что не буду заниматься написанием программ. Мне больше интересен процесс понимания человеком того, что он пишет. Т.е. семантика языка это одно, внутренняя логика и структура программы - другое. Вот меня интересует то самое другое. :) |
Для экономии времени ещё можно ходить не по всему кругу, а только по его границе, потом вычести компоненту y "нижнего" круга из "верхнего". Получится имитация вычисления площади как интеграла (f2(x) - f1(x))dx
|
В школьные годы на олимпиаде была подобная задача, но с треугольником. По трем заданным точка рисуется треугольник и нужно проверить попадает ли четвертая точка в него или нет. Одноклассник очень оригинально ее решил, что мне сильно врезалось в память.
Он решил ее графически. Если сделать аналогию, то нужно нарисовать 2 окружности и залить внутреннее пространство каким-либо цветом. Ну а после нужно перебирать точки и считывать их цвет. Решение данной задачи было сделано на Бейсике, но ведь наверняка в Паскале есть подобные функции. |
Код:
program Park; |
Вот что имеется на данный момент:
Код:
program Park; |
Цитата:
Habetdin, Цитата:
y - определен как целое, а ему хотят назначить результат с плавающей запятой. результат работы функции sqrt. Цитата:
Цитата:
На будущее операцию возведения в квадрат проще и читабельнее писать как x*x Всем переменным либо дать более полные и нормальные названия, либо в var прокомментировать их и дать словесное обозначение. Что такое k - ? К циклу так же дать комментарии. Т.к. непонятно что делаешь, и что надо проверять. |
lxa85, r1,r2 - см. условие задачи; k - кол-во деревьев; x,y - оси абцисс, ординат
dack(y); - то же самое, что и y:=y-1 Код:
program Park; Цитата:
|
for x:=r1+1 to r2-1 do
Должен быть целочисленным Код:
var |
Цитата:
|
Код:
program Park; |
Habetdin,
Цитата:
Цитата:
readln; в конце программы поставь, чтобы вывод k посмотреть. переменными r1, r2 тоже можно для начала задаться в ручную. Отладчик что говорит по ходу выполнения программы? Какая вообще среда программирования? |
lxa85, Turbo Pascal
Вот что сейчас: Код:
program Park; |
Habetdin,
Цитата:
|
lxa85,
Цитата:
|
Цитата:
Конструкции Код:
if (x*x+y*y<r2) and (x*x+y*y>r1) then Код:
if (x*x+y*y<r2) and (x*x+y*y>r1) then k:=k+1; if <условие> then <оператор, действие> ; Ищи ошибку дальше. Если не найдешь, утром буду сильно ругаться. ( С приведением наглядного материала и разносом по всем статьям. ) Я предупредил. |
lxa85, э... я скобки лишние убрал :)
Цитата:
|
Цитата:
lxa85, Я думаю ты строг сильно, одно дело понимать что ищем, а другое дело, не знать и при этом искать ошибку. :) |
Drongo, Habetdin, Ошибка логическая, поэтому я так сильно ругаюсь. Мы до Паскаля еще не дошли.
Скобки в данном случае не причем. Ну причем конечно, но не в них дело. Кстати я бы их оставил, они погоды не сделают, но и не помешают. |
Сутки прошли.
Habetdin, вспоминаем теорему Пифагора. "Сумма квадратов катетов равна квадрату гипотенузы." Мы воспользовались ей для нахождения расстояния от центра до дерева. С математической точки зрения, операция извлечения квадратного корня - не представляет сложностей. С аппаратной точки зрения - это наказание. (медленное, не точное, просто брр) Поэтому от него пытаются уйти всем возможными способами. Чтобы вообще с плавающей запятой не работать. Из теоремы имеем: A^2+B^2=C^2; (1) sqrt(A^2+B^2) = C; (2) Что имеем : x*x+y*y < r2; -> X^2 + Y^2 = R2 (3) Проводим аналогию формулы 3 и 1, разницу видишь? Вот она ошибка. У тебя была правильная попытка ввести квадратный корень, но затем он потерялся. Самым элегантным, по моему, решением является возведение R2 в квадрат. if ((x*x+y*y< r2*r2 ) and (x*x+y*y> r1*r1)) then k:=k+1; В таком случае программа выдает верное решение. Неверное условие началось с 7ого сообщения от участника emTPy. Цитата:
Да, решение более удачно чем ввязываться в вычисление корня (хотя требует вдвое большую разрядную сетку), но ошибка была пропущена, и далее начался твой копи-паст. Habetdin, не в обиду, но на будущее. Внимательно смотри, что ты копируешь! Успехов! :) P.S. emTPy, простите, если задел. |
Вот что получилось, работает:
Код:
program Park; Upd: судя по незамеченному посту #23, оптимизация возможна.. :closed-to |
оптимизация возможно если рассмотреть одну четверть полученный результат умножить на 4
и положительные части осей умножив результат осей на 2 |
Время: 16:02. |
Время: 16:02.
© OSzone.net 2001-