Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Матрицы, многочлены, последовательности

Автор: MSDDV 2.06.2005 9:18

Из данных 40 задач остался один десяток "мозги высохли" ,
собсно вот они:
приму любые предложения

1.Даны действительное число x, натуральное число
q (0 ≤ x < 1, q ≥ 2). Получить пять цифр q-ичного представления числа х, т. е. получить последовательность целых неотрицательных a(-1), ..., а(-5) такую, что х = a(-1)q^(-1)+…a(-5)q^(-5)+r, 0 ≤ a(-i) ≤ q^(-1), r < q^(-5)

2.Даны действительные числа х(1),…,х(15), y(1),…,y(15), r(1),… r(15). Выяснить, есть ли на плоскости точка, принадлежащая всем кругам c(1),…,c(15), где c(i) имеет центр c координатами х(i) > y(i); и радиус ri (i=1,…,15).

3.Даны действительные числа s,t многочлен Р(х) степени n. Получить многочлен (sх^2 + t) Р(х) + Р'(х), где Р'(х) — производная многочлена Р(х).

4.Даны квадратная матрица A порядка n, векторы x и y с n элементами. Получить вектор A(x+y).

5.Следующий способ предназначен для шифровки последовательностей нулей и единиц (или же, например, точек и тире). Пусть а(1) ..., а(n) — такая последовательность. То, что предлагается в качестве ее шифра,— это последовательность, образованная по следующему закону:

b(1)=a(1) b(i) = 1, если a(i) = a (i -1)
0 в проитивном случае

Пользуясь изложенным способом:
а) зашифровать данную последовательность;
б) расшифровать данную последовательность.

6.Изобразить на экране отрезок, вращающийся в плоскости экрана вокруг
а) своей середины;
б) своего конца;
в) точки, делящей отрезок в отношении 1:3.

Автор: volvo 2.06.2005 12:10

Цитата(MSDDV @ 2.06.05 5:18)
4.Даны квадратная матрица A порядка n, векторы x и y с n элементами. Получить вектор A(x+y).

Что значит A(x+y)? Произведение матрицы на вектор-строку, которая является суммой векторов x и y?

Вектора суммируются поэлементно, перемножение "сцепленных" матриц - здесь: http://forum.pascal.net.ru/index.php?showtopic=2694&view=findpost&p=23475 (умножаешь матрицу 1xN на NxN)...

P.S. Название темы поменяй...

Я поменял, но вообще-то пользуйся кнопкой "Правка" под первым сообщением

Автор: MSDDV 9.06.2005 23:29

Сорри за новую тему я эту почему то не заметил. blink.gif
Прошу кого-нибудь посмотреть задачи 1,2,5

Автор: virt 10.06.2005 0:59

Код
program MSDDV_5;
const maxn = 1000;
var a,b : array[1..maxn]of boolean;
   n,i,j : integer;
   c : byte;

begin
{encoding}
  n := maxn + 1;
  while n > maxn do
     begin
        write('input length <=',maxn);
        read(n);{read length}
     end;
  for i := 1 to n do
  begin
     read(c);
     a[i] := boolean(c);
  end;
  b[1] := a[1];
  for i := 2 to n do
     b[i] := a[i-1] = a[i];{ = not(a[i-1] xor a[i])}
  for i := 1 to n do
     write(byte(b[i]),' ');
{/encoding}
  writeln;
{decoding}
  fillchar(a,sizeof(a),0);
  a[1] := b[1];
  for i := 2 to n do
     a[i] := a[i-1] xor (not b[i]);
  for i := 1 to n do
     write(byte(a[i]),' ');
{/decoding}
end.


пятая задача.

Автор: MSDDV 10.06.2005 10:20

Virt Чего-то она не то делает вроде blink.gif , я ничё понять не могу

Автор: klem4 10.06.2005 10:46

Цитата(MSDDV)
имеет центр c координатами х(i) > y(i);


а это что значит ? то что центры окружностей на плоскости расположены только в точках, где координата X > координаты Y

т.е. в точке [2,1] будет окружность а в [1,2] нет ?

Автор: volvo 10.06.2005 14:46

Цитата(MSDDV @ 10.06.05 6:20)
Чего-то она не то делает вроде

Почему не то? Как раз все то... Может ты данные вводишь неверно? Попробуй подкорректировать. Вместо:

for i := 1 to n do begin
read( c );
a[i] := boolean( c );
end;

сделай так:
for i := 1 to n do begin
c := ord(readkey) - 48; write(c, ' ');
a[i] := boolean( c );
end;
writeln;

и у тебя 0 и 1-цы будут читаться сразу по нажатию соответствуюцих цифр на клавиатуре...

Автор: MSDDV 10.06.2005 15:28

блин там с x и y скорее всего косяк, там должно быть наверное, так круг C(i) с координатами (x(i);y(i)). А то и вправду фигня какая-то

А про шифровку и правда правильно было я уже сам разобрался, но всё равно СПАСИБО :yes:

Автор: MSDDV 11.06.2005 16:09

klem4
я задание подкорректировал если есть мысли то напиши

Автор: klem4 11.06.2005 22:01

вот, набрасал, руководствуясь вот этим :

Цитата
X,Y - координаты точки, a,b - координаты центра окружности (x,y), R - радиус

Если точка лежит в окружности - она будет на расстоянии L<=R от центра
вот и проверяем это условие (L=sqrt((X-а)^2+(Y-B)^2))


но что-то не так, где-то ошибка, голова не варит, может ктонить переделает правильно :

Код

{$n+}
uses crt;
var
 x,y,a,b:integer;
 flag:boolean;

function len(xx,aa,yy,bb:integer):boolean;
var l:extended;
begin
  len:=false;
  l:=sqrt(sqr(xx-aa)+sqr(yy-bb));
  if l<=aa then
   len:=true;
end;

Begin

  clrscr;

  for x:=0 to 15 do
   for y:=0 to 15 do begin
      a:=0;
      flag:=true;
      while(a<=15)and(flag) do begin
         b:=0;
         while(b<=15)and(flag) do
          if not(len(x,a,y,b)) then
           flag:=false
          else
           inc(b);
         inc(a);
      end;
      if flag then writeln('x=',x,'   y=',y);
   end;

  readln;
End.

Автор: klem4 11.06.2005 23:03

ну так нам и надо найти эту точку, а как если не перебором ?
если точка не принадлежит хоть одному из них,то она не подходит.

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

хмм еще можно попроьовать найти область пересечения всех окружностей, наверное это и будет одна точка.

добавлено :
ой) пока отвечал сообещние исчезло, не подумайте, это я не сам с собой разговариваю smile.gif_))

Автор: volvo 12.06.2005 13:51

klem4, внимательно читаем задание:

Цитата
Даны действительные числа х(1),…,х(15), y(1),…,y(15), r(1),… r(15). Выяснить, есть ли на плоскости точка, принадлежащая всем кругам c(1),…,c(15) <...>
Где у тебя в программе координаты 15 точек - центров окружностей ??? Я что-то ничего подобного
Var x, y, R: Array[1 .. 15] Of Integer;
в твоей программе не наблюдаю... Тебе же не говорилось, что окружность №1 имеет центром точку (1, 1) и ее радиус = 1, и т.д. Так где же хранятся данные?

Автор: klem4 12.06.2005 15:34

можно попробовать вот так :
только я не уверен в правильности проверки вхождения точки

Код
{$n+}
uses crt;

const n=3{15};

type

  TRec = record

      x,y,r : integer;
  end;


var

  i,a,b : integer;

 points : array[1..n] of TRec;

   flag : boolean;


function len(xx,yy,aa,bb:integer):boolean;
var

  l:extended;

begin
  len:=false;
  l:=sqrt(sqr(xx-aa)+sqr(yy-bb));
  if l<=aa then len:=true;
end;

Begin

  clrscr;

  for i:=1 to n do
   with points[i] do begin
       write('x='); readln(x);
       write('y='); readln(y);
       write('r='); readln(r);
       clrscr;
   end;

  for a:=0 to n do
   for b:=0 to n do begin
       flag:=true;
       i:=1;
       while(i<=n)and(flag) do
        if not(len(points[i].x,points[i].y,a,b)) then
         flag:=false
        else
         inc(i);

       if flag then
        writeln('x=',a,'  y=',b);
   end;

  readln;

end.




Автор: volvo 12.06.2005 15:54

А я бы сделал так:

{$n+}
Uses Crt;
Const
maxX = 640;
maxY = 480;
n = 15;

Type
TRec = Record
X, Y, R: Extended;
End;
Var
Points: Array[1 .. n] Of TRec;

function Dist(A, B: TRec): Extended;
Begin
Dist := Sqrt(Sqr(A.X - B.X)+Sqr(A.Y - B.Y))
End;

Var
T: TRec;
i, a, b: Integer;
Flag: Boolean;

Begin
ClrScr;
For i := 1 To n Do
With Points[i] Do Begin
Write('X='); ReadLn(X);
Write('Y='); ReadLn(Y);
Write('R='); ReadLn( R );
End;

For a:=0 To n Do
For b:=0 To n Do Begin
T.X := a; T.Y := b;
Flag := True;
i := 1;
While (i<=n) and Flag Do Begin
Flag := (Dist(Points[i], T) <= Points[i].R); Inc(i)
End;

If Flag Then Begin
Writeln( 'Да, точка существует...');
Writeln('Специально для преподавателей, дающих некорректные задания:');
Writeln( 'X = ', a, ' Y = ', B ); ReadLn; Halt(100);
End;
End;
WriteLn('Точки не существует... Извините, ВСЁ... Вывести больше нечего !!!');
ReadLn
End.

А то у тебя TRec.R нигде не используется rolleyes.gif

Автор: klem4 12.06.2005 15:56

Да, естественно, это ошибка, в ф-и len, в проверке L<=aa - не правильно, надо сравнивать с радиусом.

на всякий случай :

Len теперь так :

function len(xx,yy,aa,bb,rr:integer):boolean;
var

l:extended;

begin
len:=false;
l:=sqrt(sqr(xx-aa)+sqr(yy-bb));
if l<=rr then len:=true;
end;


в main'e :

if not(len(points[i].x,points[i].y,a,b,points[i].r)) then
flag:=false

Автор: Archon 12.06.2005 15:57

Хм... Вы всё немного не так поняли. Там написано:

Цитата
Даны действительные числа х(1),…,х(15), y(1),…,y(15), r(1),… r(15).

С целыми всё было бы проще прстого и задача решалась бы простым перебором.
Я сам сначало с целыми сделал :p1:, потом перечитал и задумался... :ypr:

Автор: klem4 12.06.2005 16:01

Если брать числа вещественными, то это бред, так как еще появится зависимость от точности, ведь можно просматривать точки с шагом 0.1 , а можно с 0.00001 sad.gif

непонятки. blink.gif

Автор: Archon 12.06.2005 16:04

Значит подход неверный, хотя, я не могу представить себе что ещё можно сделать...

Автор: volvo 12.06.2005 16:05

Цитата(Archon @ 12.06.05 11:57)
С целыми всё было бы проще прстого и задача решалась бы простым перебором.


Кстати, если уж на то пошло... Про то, что координаты точки, которая должна принадлежать всем окружностям должны быть вещественными, я в задании ничего не нашел, следовательно решение не является неверным... Вопросы?

Автор: Archon 12.06.2005 16:11

Насколько я знаю, в паскале при возведении в квадрат числа типа integer получается число типа integer. Может возникнуть ошибка переполнения.
Предлагаю использовать числа longint и ограничить максимальный размер числа (их лучше задавать random'ом).

Код

Program MSDDV_2;

Uses
 crt;

const
 MaxX = 319;
 MaxY = 199;
 MinR = 100;
 MaxR = 200;

var
 x, y, r : array [1..15] of longint;
 i, j, k : integer;
 S : boolean;

begin
 TextMode(259);
 Randomize;
 For k := 1 to 15 do
 begin
   x[k] := Random(MaxX+1);
   y[k] := Random(MaxY+1);
   r[k] := Random(MaxR-MinR+1)+MinR;
   Writeln('x[',k:2,']=',x[k]:3,'  y[',k:2,']=',y[k]:3,
           '  r[',k:2,']=',r[k]:3);
 end;
 For i := 0 to MaxX do
   For j := 0 to MaxY do
   begin
     S := true;
     For k := 1 to 15 do
       If sqr(i-x[k])+sqr(j-y[k]) > sqr(r[k]) then
         S := false;
     If S then Write('(',i:3,',',j:3,') ');
   end;
 ReadKey;
end.

Автор: Archon 12.06.2005 16:14

Цитата
Про то, что координаты точки, которая должна принадлежать всем окружностям должны быть вещественными, я в задании ничего не нашел,

Конечно, нет! :p2: Однако, может быть что условию удовлетворяет точка только с вещественными координатами :nono: .

Автор: volvo 12.06.2005 16:26

Цитата(Archon @ 12.06.05 12:11)
Насколько я знаю, в паскале при возведении в квадрат числа типа integer получается число типа integer. Может возникнуть ошибка переполнения.
Предлагаю использовать числа longint и ограничить максимальный размер числа (их лучше задавать random'ом).

Нет, не принимается !!! angry.gif У тебя не генерируется, а задается массив чисел (причем ты сам указал на то, что это - массив Действительных чисел)... Вот и будь добр ВВОДИТЬ 15 действительных чисел. И LongInt здесь совершенно не при чем. (кстати и при возведении Integer-ов в квадрат можно элементарно избежать переполнения - приведение типов еще никто не отменял... )

Кстати, в твоей программе есть логическая ошибка: у тебя будут распечатываться все те точки, которые попадают в круг №15, потому как S присваивается результату последней проверки, а результаты предыдущих проверок не учитываются...

Автор: Archon 12.06.2005 16:30

Цитата
при возведении Integer-ов в квадрат можно элементарно избежать переполнения - приведение типов еще никто не отменял...

Что-то у вас я этого не заметил B).

Так ты предлагаешь, сделать с действительными x,y,r и целыми координатами точек?

добавлено:
Код

Uses
 crt;

const
 MaxX = 319;
 MaxY = 199;
 MinR = 100;
 MaxR = 200;
 n = 3{15};

var
 x, y, r : array [1..n] of real;
 i, j, k : integer;
 S : boolean;

begin
 TextMode(259);
 Randomize;
 For k := 1 to n do
 begin
   Write('x[',k,']='); ReadLn(x[k]);
   Write('y[',k,']='); ReadLn(y[k]);
   Write('r[',k,']='); ReadLn(r[k]);
 end;
 For i := 0 to MaxX do
   For j := 0 to MaxY do
   begin
     S := true;
     For k := 1 to n do
       If sqr(i-x[k])+sqr(j-y[k]) > sqr(r[k]) then
         S := false;
     If S then Write('(',i:3,',',j:3,') ');
   end;
 ReadKey;
end.

Автор: Archon 12.06.2005 16:42

Цитата
Кстати, в твоей программе есть логическая ошибка: у тебя будут распечатываться все те точки, которые попадают в круг №15, потому как S присваивается результату последней проверки, а результаты предыдущих проверок не учитываются...

Извени, не понял... huh.gif
Перед проверкой S := true.
Во время проверки, если хоть в одну окружность точка не попадает, то S := false
После проверки если S = true выводим координаты точки.
Всё должно работать!

Автор: klem4 12.06.2005 16:51

В любом случае зачем каждый раз просматривать ВСЕ окружности, допустим у тебя после первой проверки S:=false... следующие 14 бессмысленны будут.



автор, уточни задание ;)

Автор: MSDDV 12.06.2005 23:44

Извините, что так долго не отвечал. У нас сегодня День Города, приезжал Дом2, мне впринципе всё равно, но моей девушке нравиться.
Уважаемые кодеры в задании нужно найти единственную точку принадлежащуюю всем 15ти окружностям....

Автор: klem4 12.06.2005 23:51

1) по поводу координат и радиуса, они все целые ?
2) Нам дано 15 окружностей, для которых мы сами задаем координаты центра и радиусы ? или же как я подумал в началe, окружности находятся в каждой точке плоскости 15*15 и радиус у нее(окружности) соответсвует иксу ( то есть у окружности в точке M(4,12) R=4) ? правда в таком случае решения не будет. =)

Автор: volvo 13.06.2005 0:28

Цитата(MSDDV @ 12.06.05 19:44)
в задании нужно найти единственную точку принадлежащуюю всем 15-ти окружностям....

Уважаемый, задание-то переиначивать не надо !!! В задании ясно сказано:
Цитата
Выяснить, есть ли на плоскости точка, принадлежащая всем кругам...
"Да" или "Нет" (True/False) ни о каких координатах речи вообще нет !!! Единственная ли точка, или их 5000, ответ будет "Да"

Автор: MSDDV 13.06.2005 0:31

1) по поводу координат и радиуса, они все целые. :D
2) Нам дано 15 окружностей, для которых мы сами задаем координаты центра и радиусы. :D

blink.gif Вроде так. Да препод чудак, так дал задания, что в некоторых даже непонятно, что нужно


Уважаемый Volvo как говорит наш препод: "Вывод на экран слогов типа Да и Нет не дает полного решения задачи"
Так что в этой задаче мне нужно найти и вывести координаты хотя бы одной точки, удовлетворяющей условию.

Автор: MSDDV 13.06.2005 16:45

:molitva: Помогите с заданиями 1 и 2 завтра сдача

Автор: volvo 13.06.2005 17:42

Задание №2 было решено еще в посте №14 !!! То решение неверное? Или оно просто не было замечено? (специально для преподавателя, давшего такое задание, я изменил вывод)... А по-поводу этого:

Цитата
Уважаемый Volvo как говорит наш препод: "Вывод на экран слогов типа Да и Нет не дает полного решения задачи"
Было задание "выяснить есть ли точка", оно было выполнено. Если у преподавателя могут быть претензии - то только к себе самому... Когда полное решение задачи подразумевает вывод координат точки, будь добр указать это в задании.

Автор: MSDDV 13.06.2005 18:46

Volvo Огромное спасибо!!

Автор: MSDDV 13.06.2005 21:30

Эту тему можно убить :D

Автор: -Игорь- 5.05.2012 22:37

3.Даны действительные числа s,t многочлен Р(х) степени n. Получить многочлен (sх^2 + t) Р(х) + Р'(х), где Р'(х) — производная многочлена Р(х).

не могу найти где она описана,очень надо,пожалуйста!

Автор: Anonimys 5.05.2012 22:41

Некропоост, дааа :D

Зачем труп 7-летней давности воскрешать?

Автор: Bujhm 5.05.2012 22:50

Я не могу в этой теме найти ответ на задачу,что прикажешь делать?! помоги напиши и все будет ок!

P.S Игорь и я одно лицо,когда писал пост не зарегался=_)