• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Вопрос по старой теме и не только...

  • Автор темы Автор темы Dram
  • Дата начала Дата начала

Dram

Экономичный вид памяти
Регистрация
19 Фев 2008
Сообщения
2,632
Реакции
34
Баллы
0
Вопрос по старой теме и не только...

По просьбе 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).
 
Последнее редактирование:
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. Между прочим, это можно было и в старой теме. Я просил не создавать постов с НОВЫМИ задачками. А тему потому и не закрываю, что еще могут возникнуть вопросы по старым. Но, впрочем, новая так новая.
 
А тему потому и не закрываю, что еще могут возникнуть вопросы по старым. Но, впрочем, новая так новая.
В первом Мне не очень понятно что выполняет эта функция "X2np"(т.е какие значения ты ей присвоил?)
Но, впрочем, новая так новая.
Зато моя тема будет :D А то в той уже действительно сложно искать становится.

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

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

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

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

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

Насчет второй задачи - подскажу. Считаем, что нижняя сторона большого квадрата расположена на оси "х" обычной декартовой сетки координат, а левая боковая - на оси "у", причем левый нижний угол соответствует началу координат. Тогда все точки с 0 < x <1000 и 0 < y <1000 находятся внутри большого квадрата. Дальше нужно нарисовать (для себя) все возможные ситуации, когда во-первых, малые квадраты вылезают за указанные рамки и во-вторых, когда они накладываются друг на друга. Дальше сообразить, каким комбинациям координат вершин малых квадратов это соответствует, и предусмотреть в программе оповещение при возникновении таких ситуаций. В принципе совсем не сложно, только долго и малость муторно.
 
А если размер малых квадратов сделать рандомными и ограничить диапозон площадью б квадрата. И после только прописать условие что если они пересекутся.
Мне только не понятно как представить квадраты? Если можно было бы вводить 4 точки квадрата то было бы проще. Проверялась бы только вхожесть в диапозон. НО как сделать с 2 точками?
 
А если размер малых квадратов сделать рандомными и ограничить диапозон площадью б квадрата. И после только прописать условие что если они пересекутся.
Мне только не понятно как представить квадраты? Если можно было бы вводить 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), т.е. не произвольная. В то же время, если бы это были не квадраты, а прямоугольники, то таких ограничений бы не было.
 
И все таки наверное в программировании я полный дундук. Да будут не квадраты а прямоугольники. Мне непонятно то в чем выразится в паскале сама полошадь 1000х1000. как она представится в паскале(в виде чего)?
 
И все таки наверное в программировании я полный дундук. Да будут не квадраты а прямоугольники. Мне непонятно то в чем выразится в паскале сама полошадь 1000х1000. как она представится в паскале(в виде чего)?

А площадь, как таковая, и не нужна вовсе.
Хорошо, временно упростим задачу. Пусть надо вырезать не 2, а всего один малый квадрат или прямоугольник. Всё, что для этого нужно - чтобы х-координата ЛЮБОЙ точки м.к., равно как и у-координата, удовлетворяли условиям
0 < x,y < 1000. Тогда не вылезут за рамки б.к., а это всё, что требуется.
В исходной задаче с двумя фигурами еще накладывается условие отсутствия наложений.
 
выразить б.квадрат можно через массив 1000х1000, элементы которого - значения булевского типа. Если этот участок квадрата вырезан, то элементам из участка надо присвоить true. если при вырезке второго участка мы натыкаемся на элементы со значением true, то выводим ошибку.
это первое, что пришло в голову
 
выразить б.квадрат можно через массив 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
Если какое-либо из двух условий выполнено, то - порядок, а если результат отрицательный, то следует выдать сообщение об ошибке (наложение).
Всё!
 
Ну этот вариант конечно тоже имеет право на жизнь :) всю жизнь было, сколько людей - столько мнений. ну а твой вариант проверки расположения м.прямоугольников относительно б.квадрата не имеет конкурентов :)
 
Да ну, зачем так сложно? Всё гораздо проще! Ладно, попробую расписать алгоритм. Координаты большого квадрата - 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
Если какое-либо из двух условий выполнено, то - порядок, а если результат отрицательный, то следует выдать сообщение об ошибке (наложение).
Всё!
Vladimir_S
Похоже это решение не подойдет т.к условия нам дали эмм не то что бы не понятные. Но походу и не правльные. Воощем есть еще чило N это количество запросов т.е сколько раз нам надо вырезать квадрат. Но тогда я не вижу смысла делать проверку пересечения сторон..или..?
 
Vladimir_S
Похоже это решение не подойдет т.к условия нам дали эмм не то что бы не понятные. Но походу и не правльные. Воощем есть еще чило N это количество запросов т.е сколько раз нам надо вырезать квадрат. Но тогда я не вижу смысла делать проверку пересечения сторон..или..?
Dram, я, конечно, могу по мере сил помочь с РЕШЕНИЕМ задачи... Но вот догадываться о правильной ФОРМУЛИРОВКЕ - это уже явно вне моей компетенции. Вы уж попробуйте уточнить условие, а дальше, я думаю, разберемся.
 
да я сам. толком условия не понял.А пытаюсь спросить все молчат как портизаны. Ну тогда будем продолжать по старым условиям. Владимир можете написать в паскале как пропишутся условия того что прямоугольники не выходят за пределы большого?
 
да я сам. толком условия не понял.А пытаюсь спросить все молчат как портизаны. Ну тогда будем продолжать по старым условиям. Владимир можете написать в паскале как пропишутся условия того что прямоугольники не выходят за пределы большого?

Конечно. Пусть введены переменные x1a, x2a, y1a, y2a, x1b, x2b, y1b и y2b, как расписано выше. Введем еще переменную b типа BOOLEAN. Пусть значение переменной b=TRUE означает, что малые фигуры не выходят за рамки большой, а значение b=FALSE наоборот, что выходят. Тогда:

IF
(x1a <= 1000) AND (x2a >= 0) AND (y1a <= 1000) AND (y2a >= 0) AND
(x1b <= 1000) AND (x2b >= 0) AND (y1b <= 1000) AND (y2b >= 0)
THEN b:=TRUE ELSE b:=FALSE;
 
вот кажись узнал полностью условия. дан квадрат 1000на1000 в нем. нужно вырезать прямоугольники определенного размера определенное количество раз. размер прямоугольников(лев нижний и правый верхний угол) и их количество задается с клавиатуры. и прога должна выдавать, получится вырезать или нет. А можно сразу прогу? а то уже сроки поджимают.

А если писать без ошибок и попробовать самостоятельно подумать? Все же это вы учитесь, а не мы. Ваш модератор.
 
вот кажись узнал полностью условия. дан квадрат 1000на1000 в нем. нужно вырезать прямоугольники. определенного размера,определенное количество раз. размер прямоугольников(лев нижний и правый верхний угол) и их количество задается с клафиатуры. и прога далжна выдовать пелучится вырезать или нет. А можно сразу прогу? а то уже сроки поджимают.

Можно. Хотя, по-моему, проще самому написать, чем в чужой разбираться. Ну как угодно:

Код:
CONST
 Nmax=10; {Max number of rectangles}
VAR
 i,j,N:INTEGER;
 b:BOOLEAN;
 X1,Y1,X2,Y2:ARRAY[1..Nmax] of INTEGER;
BEGIN
 Write('Number of rectangles = ');
 ReadLn(N);
 b:=TRUE;
 i:=0;
 REPEAT
  INC(i);
  REPEAT
   Write('Right Top X of rectangle N',i,' = ');
   ReadLn(X1[i]);
   Write('Right Top Y of rectangle N',i,' = ');
   ReadLn(Y1[i]);
   Write('Left Bottom X of rectangle N',i,' = ');
   ReadLn(X2[i]);
   Write('Left Bottom Y of rectangle N',i,' = ');
   ReadLn(Y2[i]);
   IF (X1[i]<=X2[i]) OR (Y1[i]<=Y2[i]) THEN
    Writeln ('Wrong values!');
  UNTIL (X1[i]>X2[i]) AND (Y1[i]>Y2[i]);
  IF (X1[i]>1000) OR (Y1[i]>1000) OR (X2[i]<0) OR (Y2[i]<0)
   THEN
    BEGIN
     b:=FALSE;
     WriteLn('Figure N',i,' is out of range!');
    END;
  IF b THEN
   BEGIN
    FOR j:=1 TO i-1 DO
     IF ((X1[i]>X2[j]) AND (X2[i]<X1[j]))
        AND
        (((Y1[i]>Y2[j]) AND (Y2[i]<Y1[j])) OR
         ((Y2[i]<Y1[j]) AND (Y1[i]>Y2[j]))) THEN
      BEGIN
       b:=FALSE;
       WriteLn('Figure N',i,' overlaps figure N',j);
      END;
   END;
 UNTIL (b=FALSE) OR (i=N);
 IF b AND (i=N) THEN WriteLn('Everything is OK!');
 ReadLn;
END.
 
Можно. Хотя, по-моему, проще самому написать, чем в чужой разбираться. Ну как угодно:

Мдя..действительно лучше самому написать(просто уровень знаний у меня еще не тот,на котором прога написанна). Но все равно спасибо. А можно еще спросить по первой проге . что мы сделали вот этой записию
BEGIN
IF n=0 THEN X2np:=1 ELSE
IF n=1 THEN X2np:=X ELSE

Код:
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.
И вот снова вопрос:
Вычислить бесконечную сумму (-1)**n * x**(n)/n! где
n=1,2,3... с точностью e =0.001 . Значение x ввести с клавиатуры.
(X=4.5, S=-0.989)

Как в условии задачи прочитается сама запись (-1)**n * x**(n)/n! И ! это факториал?
И что в теле проги означает INC
Код:
CONST
e=0.001;

VAR
i:INTEGER;
S,a,x:REAL;

BEGIN
 Write('x= ');
 ReadLn(x);
 S:=0;
 i:=0;
 a:=1;
[B] REPEAT
  INC(i);
  a:=-a*x/i;
  S:=S+a;
 UNTIL ABS(a)<e;[/B]
 WriteLn('S= ',S:6:3);
 ReadLn;
END.
 
Последнее редактирование:
inc(a,b) - функция, увеличивающая значение переменной a на указанную величину b. Если b не указано, то считается, что b=1.

Значение функции высчитывается в цикле с постусловием, а, именно, этими командами:
Код:
a:=-a*x/i;  S:=S+a;
Цикл повторяется, пока не будет превышена заданная точность вычисления.

! - да, это знак факториала.
 
А по первому вопросу - так: как я уже отвечал, функция X2np(x,n) возводит действительное число x в степень n. Отсюда и надо исходить. Указанные строки обозначают, что x в степени 0 есть единица, а x в степени 1 есть x. Если показатель степени превышает 1, то запускается цикл умножений числа x само на себя нужное количество раз.
 
Назад
Сверху