Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Вопрос по старой теме и не только... (http://www.tehnari.ru/f41/t30493/)

Dram 23.11.2009 21:29

Вопрос по старой теме и не только...
 
По просьбе Vladimir_S создаю новую тему . Как он предупредил меня в прошлой теме “ Если чего непонятно - спрашивай, объясню”. Так вот и спрашиваю собственно вот по этой задаче
1. Вычислить приближенно значение суммы с точностью до
e=0.0001, S= 1 - 1/(2*3) + 1/(3*4)**2 - 1/(4*5)**3...
(S= 0,84015)

Код:
CONST
e=0.0001;

VAR
i:INTEGER;
S,a:REAL;

function X2np(X:Extended; n:WORD):Extended;
Var i:INTEGER;
Y:Extended;
BEGIN
IF n=0 THEN X2np:=1 ELSE
IF n=1 THEN X2np:=X ELSE
BEGIN
Y:=X;
FOR i:=2 TO n DO Y:=Y*X;
X2np:=Y;
END;
END;

BEGIN
S:=1;
i:=0;
REPEAT
INC(i);
a:=X2np(-1,i)/X2np((i+1)*(i+2),i);
S:=S+a;
UNTIL ABS(a)<e;
WriteLn('S= ',S:7:5);
ReadLn;
END.

function X2np(X:Extended; n:WORD):Extended; что мы сделали вот этой строчкой,
WriteLn('S= ',S:7:5); и что в этой строке означает вот это S:7:5 я так понимаю это сокрашение результата. Но как это работает я что то не очень понемаю.

И еще вот дали задачку : Создать программу типа лазерного резака. Т.е нам дан квадрат 1000х1000. В нем нужно вырезать два квадрата, но так чтобы они не соприкасались друг стругом и не выходили за пределы б.квадрата(в противном случаее программа нам сообщала что чтото не так). Координаты малых квадратов задаются 2 точками левой нижней и правой верхней.
Язык паскаль
без графики только вычесления.
Подскажите хотя бы в какаю сторону начинать думать. И как реализовать в прграмме Поле(те. Б.квадрат 1000х1000).

Vladimir_S 23.11.2009 21:58

Цитата:

Сообщение от Dram (Сообщение 263957)
function X2np(X:Extended; n:WORD):Extended; что мы сделали вот этой строчкой,
WriteLn('S= ',S:7:5); и что в этой строке означает вот это S:7:5 я так понимаю это сокрашение результата. Но как это работает я что то не очень понемаю.

И еще вот дали задачку : Создать программу типа лазерного резака. Т.е нам дан квадрат 1000х1000. В нем нужно вырезать два квадрата, но так чтобы они не соприкасались друг стругом и не выходили за пределы б.квадрата(в противном случаее программа нам сообщала что чтото не так). Координаты малых квадратов задаются 2 точками левой нижней и правой верхней.
Язык паскаль
без графики только вычесления.
Подскажите хотя бы в какаю сторону начинать думать. И как реализовать в прграмме Поле(те. Б.квадрат 1000х1000).

Отвечаю.
1. Зачем в вопросе приведен заголовок функции - не понял.
2. Насчет WriteLn('S= ',S:7:5);. Этой строчкой мы вывели на экран значение числа S в заданном формате. Пара слов о формате вывода ВЕЩЕСТВЕННЫХ чисел. Пусть, для примера, S=0.1543799876544376578. Если формат не указать и применить оператор WriteLn('S= ',S);, то на экране появится:
S= 1.543799876544376578E-0001
Некрасиво. Если задать формат в виде одного числа, то это число будет воспринято, как полное количество значащих цифр в выводе результата. Т.е. в результате команды WriteLn('S= ',S:12); на экране будет:
S= 1.5438E-0001
А вот если задать формат, как сделано в программе, т.е. с двумя числами, то тогда это будет так: результат отобразится в виде десятичной дроби (без всяких Е-0001), причем первое число - это полное количество значащих цифр, а второе - количество цифр после десятичной точки. Т.е. в данном случае WriteLn('S= ',S:7:5); приведет к:
S= 0.15438 .
3. А о размерах малых квадратов ничего не говорится? Они одинаковые или могут быть разные?

P.S. Между прочим, это можно было и в старой теме. Я просил не создавать постов с НОВЫМИ задачками. А тему потому и не закрываю, что еще могут возникнуть вопросы по старым. Но, впрочем, новая так новая.

Dram 23.11.2009 22:17

Цитата:

Сообщение от Vladimir_S (Сообщение 263962)
А тему потому и не закрываю, что еще могут возникнуть вопросы по старым. Но, впрочем, новая так новая.

В первом Мне не очень понятно что выполняет эта функция "X2np"(т.е какие значения ты ей присвоил?)
Цитата:

Но, впрочем, новая так новая.
Зато моя тема будет :D А то в той уже действительно сложно искать становится.

А по второй задаче что ни будь подскажешь?

Vladimir_S 23.11.2009 22:47

Цитата:

Сообщение от Dram (Сообщение 263966)
В первом Мне не очень понятно что выполняет эта функция "X2np"(т.е какие значения ты ей присвоил?)

Зато моя тема будет :D А то в той уже действительно сложно искать становится.

А по второй задаче что ни будь подскажешь?

Функция X2np выполняет возведение действительного числа Х в целую положительную степень n.

Насчет второй задачи - подскажу. Считаем, что нижняя сторона большого квадрата расположена на оси "х" обычной декартовой сетки координат, а левая боковая - на оси "у", причем левый нижний угол соответствует началу координат. Тогда все точки с 0 < x <1000 и 0 < y <1000 находятся внутри большого квадрата. Дальше нужно нарисовать (для себя) все возможные ситуации, когда во-первых, малые квадраты вылезают за указанные рамки и во-вторых, когда они накладываются друг на друга. Дальше сообразить, каким комбинациям координат вершин малых квадратов это соответствует, и предусмотреть в программе оповещение при возникновении таких ситуаций. В принципе совсем не сложно, только долго и малость муторно.

Функция X2np выполняет возведение действительного числа Х в целую положительную степень n.

Насчет второй задачи - подскажу. Считаем, что нижняя сторона большого квадрата расположена на оси "х" обычной декартовой сетки координат, а левая боковая - на оси "у", причем левый нижний угол соответствует началу координат. Тогда все точки с 0 < x <1000 и 0 < y <1000 находятся внутри большого квадрата. Дальше нужно нарисовать (для себя) все возможные ситуации, когда во-первых, малые квадраты вылезают за указанные рамки и во-вторых, когда они накладываются друг на друга. Дальше сообразить, каким комбинациям координат вершин малых квадратов это соответствует, и предусмотреть в программе оповещение при возникновении таких ситуаций. В принципе совсем не сложно, только долго и малость муторно.

Dram 23.11.2009 23:28

А если размер малых квадратов сделать рандомными и ограничить диапозон площадью б квадрата. И после только прописать условие что если они пересекутся.
Мне только не понятно как представить квадраты? Если можно было бы вводить 4 точки квадрата то было бы проще. Проверялась бы только вхожесть в диапозон. НО как сделать с 2 точками?

Vladimir_S 24.11.2009 08:52

Цитата:

Сообщение от Dram (Сообщение 263987)
А если размер малых квадратов сделать рандомными и ограничить диапозон площадью б квадрата. И после только прописать условие что если они пересекутся.
Мне только не понятно как представить квадраты? Если можно было бы вводить 4 точки квадрата то было бы проще. Проверялась бы только вхожесть в диапозон. НО как сделать с 2 точками?

Элементарно! Пусть координаты правого верхнего угла х1, у1, а левого нижнего - х2, у2. Тогда левый верхний угол будет иметь координаты х2, у1, а правый нижний - х1, у2. Вот Вам 4 точки.
А вообще-то непонятно, ну на кой ляд эти остальные две точки сдались? Если квадрат вылезает за левую границу б.к., то это означает, что x2<0, если за правую, то x1>1000, если за нижнюю, то y2<0 и, наконец, если за верхнюю, то y1>1000. Осталось только написать условия взаимного наложения двух малых квадратов.
Есть вопрос. Точно ли малые фигуры - КВАДРАТЫ? Может быть, ПРЯМОУГОЛЬНИКИ? Дело в том, что для квадратов нет произвола выбора всех четырех координат двух углов. Поясню. Допустим, мы задали координаты верхнего правого угла х1, у1. Теперь задаем х-координату нижнего левого, х2. Таким образом, сторона квадрата есть а=х1-х2. Y-координата нижнего левого угла будет у2=у1-а=у1-(х1-х2), т.е. не произвольная. В то же время, если бы это были не квадраты, а прямоугольники, то таких ограничений бы не было.

Dram 26.11.2009 22:07

И все таки наверное в программировании я полный дундук. Да будут не квадраты а прямоугольники. Мне непонятно то в чем выразится в паскале сама полошадь 1000х1000. как она представится в паскале(в виде чего)?

Vladimir_S 26.11.2009 22:18

Цитата:

Сообщение от Dram (Сообщение 264811)
И все таки наверное в программировании я полный дундук. Да будут не квадраты а прямоугольники. Мне непонятно то в чем выразится в паскале сама полошадь 1000х1000. как она представится в паскале(в виде чего)?

А площадь, как таковая, и не нужна вовсе.
Хорошо, временно упростим задачу. Пусть надо вырезать не 2, а всего один малый квадрат или прямоугольник. Всё, что для этого нужно - чтобы х-координата ЛЮБОЙ точки м.к., равно как и у-координата, удовлетворяли условиям
0 < x,y < 1000. Тогда не вылезут за рамки б.к., а это всё, что требуется.
В исходной задаче с двумя фигурами еще накладывается условие отсутствия наложений.

MrSTEP 26.11.2009 22:25

выразить б.квадрат можно через массив 1000х1000, элементы которого - значения булевского типа. Если этот участок квадрата вырезан, то элементам из участка надо присвоить true. если при вырезке второго участка мы натыкаемся на элементы со значением true, то выводим ошибку.
это первое, что пришло в голову

Vladimir_S 27.11.2009 09:59

Цитата:

Сообщение от MrSTEP (Сообщение 264816)
выразить б.квадрат можно через массив 1000х1000, элементы которого - значения булевского типа. Если этот участок квадрата вырезан, то элементам из участка надо присвоить true. если при вырезке второго участка мы натыкаемся на элементы со значением true, то выводим ошибку.
это первое, что пришло в голову

Да ну, зачем так сложно? Всё гораздо проще! Ладно, попробую расписать алгоритм. Координаты большого квадрата - 0, 0 (левый нижний угол), 1000, 1000 (правый верхний угол). Пусть есть два малых прямоугольника a и b. Будем, для определенности, подразумевать, что фигура a находится в общем случае левее фигуры b. Обозначим координаты правых верхних углов x1a, y1a, x1b, y1b. Для левых нижних углов будет, соответственно, x2a, y2a, x2b, y2b. Далее, считаем, что все 8 чисел как-то заданы, надо лишь проверить, что малые фигуры во-первых, не вылезают за рамки большого квадрата и во-вторых, не накладываются. Выполнению первого условия соответствует:
x1a <= 1000
x2a >= 0
y1a <= 1000
y2a >= 0

x1b <= 1000
x2b >= 0
y1b <= 1000
y2b >= 0


Для начала должны быть проверены все 8 указанных соотношений - если хоть одно нарушено, то нужно выдать сообщение об ошибке (пересечение границ б.к.).

Теперь о наложениях. Будем считать, что предыдущие 8 условий выполнены, т.е. выхода за рамки б.к. нет. Тогда если выполняется условие
x1a <= x2b
т.е. правая вертикальная сторона фигуры a находится левее левой вертикальной стороны фигуры b, то всё в порядке - наложений нет.
Если же указанное условие не выполнено, т.е.
x1a > x2b
то наложений не будет только если малые фигуры "разведены" по вертикали, т.е. либо
y2a >= y1b
либо
y2b >= y1a
Если какое-либо из двух условий выполнено, то - порядок, а если результат отрицательный, то следует выдать сообщение об ошибке (наложение).
Всё!


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

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.