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

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

Образовательный студенческий форум _ Информатика / Программирование _ С++ & Pascal

Автор: InFuz 29.9.2010, 14:09

Вот и начался новый мучебный год, всем привет!

Дано: 2 похожие задачки, мне все равно на чем их писать на С++ или Паскале, хотя с Паскалем я знаком дольше чем с С++.

Проблема: не знаю как эти задачи так то решить не точно запрограммировать их rolleyes.gif (по этой же причине нет пока своих наработок т.к. не знаю даже с чего начать blush.gif )

Автор: Евгений М. 29.9.2010, 14:22

Цитата
не знаю даже с чего начать

Почитать литературу.

Автор: InFuz 29.9.2010, 14:27

Поделитесь хотя бы ссылкой а то гугл всякую фигню выдает.

Автор: Harch 29.9.2010, 14:30

гм, прогать умею отлично, но раз ты не можешь сделать их просто, то помогу сделать сначала математически:

евклидова норма это корень из суммы квадратов координат вектора.
скалярное произведение в евклидовом пространстве думаю у тебя происходит покоординатно (то есть x1y1 + x2y2 + ... + xNyN)

если скалярное произведение = 0, то вектора перпендикулярны.

Если координаты векторов пропорциональны с одним коэффициэнтом (т.е. существует K, такое что y1 = k * y2 и x1 = k * x2 и т. д.), то вектора коллинеарны.

все, запрогать думаю сможешь сам

Автор: Евгений М. 29.9.2010, 14:32

Я думал Вам преподы уже давали.
Подбельский. Язык Си++

Автор: InFuz 29.9.2010, 14:35

Цитата
Я думал Вам преподы уже давали.
Подбельский. Язык Си++

не не я про математическую часть задачи smile.gif

Автор: Harch 29.9.2010, 14:38

а я разве ее не объяснил?

Автор: Vahappaday 29.9.2010, 14:39

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

Автор: InFuz 29.9.2010, 14:39

Harch спасибо за "пищу для ума"

Автор: Harch 29.9.2010, 14:41

то есть ты не понял? объяснить подробнее?
P.S. по мне куда уж подробнее smile.gif

Автор: InFuz 29.9.2010, 14:47

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

Автор: Harch 29.9.2010, 14:48

Хорошо. Пояснения по синтаксису и написанию программ есть? (я знаю только C/C++/Java/C#/PHP/JavaScript/HTML/DirectX/OpenGL)

Автор: InFuz 29.9.2010, 14:52

С программной частью вроде проблем нет.

Автор: Harch 29.9.2010, 14:58

Хорошо.

Автор: InFuz 3.10.2010, 11:19

Для 2 программы вот так получилось

Код
void main()
    {
      clrscr();
      int x1,y1,x2,y2,sp,xmin,xmax,ymin,ymax;
      float kx,ky;
      cout<<"x1= "; cin>>x1;
      cout<<"y1= "; cin>>y1;
      cout<<"x2= "; cin>>x2;
      cout<<"y2= "; cin>>y2;
      sp=x1*y1+x2*y2;
      if(sp==0) cout<<"Vektora perpend.";
      else cout<<"Vertora ne perpend.";
      cout<<"\n";
      if(x1>=x2) {xmax=x1; xmin=x2;}
      else {xmax=x2; xmin=x1;}
      if(y1>=y2) {ymax=y1; ymin=y2;}
      else {ymax=y2; ymin=y1;}
      if(xmin!=0) kx=xmax/xmin;
      if(ymin!=0) ky=ymax/ymin;
      if(kx==ky) cout<<"Vektora kollinearnbl";
      else cout<<"Vektora ne kollinearnbl";
      getch();
    }

Автор: Vahappaday 3.10.2010, 11:24

это не n-мерное пространство, а 2-мерное

Автор: InFuz 3.10.2010, 11:31

Цитата(Vahappaday @ 3.10.2010, 15:24) *

это не n-мерное пространство, а 2-мерное

я спросил у препода, он сказал можно как частный случай взять 2 мерное, так что это не принципиально.

Автор: Евгений М. 3.10.2010, 11:32

У меня сомнения, что вектора (1;2) и (2;5) коллинеарны. Вообще Вы используете целочисленное деление (т.е. дробные части откидываются).
Используйте это равенство:
x1*y2-x2*y1=0
Если равенство выполняется то вектора коллинеарны.

Автор: InFuz 3.10.2010, 11:39

все заменил.

Автор: InFuz 3.10.2010, 12:08

а квадрат евклидовой нормы это будет e=x1^2+y1^2+x2^2+y2^2 ?

Автор: tig81 3.10.2010, 12:28

Цитата(InFuz @ 3.10.2010, 15:08) *

а квадрат евклидовой нормы это будет e=x1^2+y1^2+x2^2+y2^2 ?

Откуда такая формула?

Автор: InFuz 3.10.2010, 13:11

евклидова норма это корень из суммы квадратов координат вектора.
я не совсем понял вот и спрашиваю.

Автор: Vahappaday 3.10.2010, 13:18

e = (x2-x1)^2 + (y2-y1)^2 - это уже квадрат нормы

Автор: InFuz 3.10.2010, 13:29

1 вот так получилась

Цитата
program vekt;
uses crt;
var x1,x2,y1,y2,xb,yb,sp:integer; en:real;
BEGIN
clrscr;

write('x1= '); readln(x1);
write('y1= '); readln(y1);
write('x2= '); readln(x2);
write('y2= '); readln(y2);

xb:=x1+x2;
yb:=y1+y2;
writeln('A(x1,y1)+B(x2,y2)= (',xb,',',yb,')');
xb:=x1-x2;
yb:=y1-y2;
writeln('A(x1,y1)-B(x2,y2)= (',xb,',',yb,')');
sp:=x1*y1+x2*y2;
writeln('A*B=',sp);
en:=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
writeln('Evk. norm.= ',en);

readkey
END.

Автор: Vahappaday 3.10.2010, 13:45

То что я написал - это норма разности двух векторов.
Немножко перепутал норму и метрику.
норма вычисляется относительного одного вектора
Для первого: sqrt(x1^2+y1^2)
Для второго: sqrt(x2^2+y2^2)

По первой более нет замечаний.

Автор: tig81 3.10.2010, 13:46

Цитата(Vahappaday @ 3.10.2010, 16:18) *

e = (x2-x1)^2 + (y2-y1)^2 - это уже квадрат нормы

Квадрат нормы чего?


Цитата(Vahappaday @ 3.10.2010, 16:45) *

То что я написал - это норма разности двух векторов.

А...

Автор: InFuz 3.10.2010, 13:54

ясно

Автор: InFuz 8.10.2010, 13:50

Цитата(Евгений М. @ 3.10.2010, 15:32) *

У меня сомнения, что вектора (1;2) и (2;5) коллинеарны. Вообще Вы используете целочисленное деление (т.е. дробные части откидываются).
Используйте это равенство:
x1*y2-x2*y1=0
Если равенство выполняется то вектора коллинеарны.


а для n мерного пространства какая будет формула?

Автор: Vahappaday 8.10.2010, 15:41

для n-мерного пространства будет n-1 формула
(x1)1*(x2)2 - (x1)2*(x2)1=0
(x2)1*(x3)2 - (x2)2*(x3)1=0
....
(x(n-1))1*(xn)2 - (x(n-1))2*(xn)1=0,
где
(xi)j - i-я координата j-го вектора

Автор: InFuz 9.10.2010, 12:29

Vahappaday чот не въеду не как в то что вы написали.
вот у меня такая штука получилась, я создал массив kmas который хранит коэффициенты k для каждой пары x1,x2; y1,y2 и т.д. но все равно не фига не работает выдает что (1,2) кол-ен (2,5)

Код
//-----------------------------------------------------------------
    void main()
    {
      clrscr();
      int i,sp1=1,sp2=1,n,f=0;
      cout<<"n="; cin>>n;
      int* vek1 = new int[n];
      int* vek2 = new int[n];
      double* kmas = new double[n];
//------------------------------------------------------------------
      cout<<"zadaite 1 vektor"<<"\n";
      for (i=0; i<n; i++)
      {
    cin>>vek1[i];
      }
      cout<<"zadaite 2 vektor"<<"\n";
      for (i=0; i<n; i++)
      {
    cin>>vek2[i];
      }
//------------------------------------------------------------------
      for (i=0; i<n; i++)
      {
    sp1=sp1*vek1[i];
    sp2=sp2*vek2[i];
    if(vek2[i]!=0)kmas[i]=(double)vek1[i]/vek2[i];
      }
      sp2=sp1+sp2;
      if(sp2==0) cout<<"vektora perp. \n";
      else cout<<"vektora ne perp. \n";
      for (i=0; i<n-1; i++)
      {
    if(kmas[i]==kmas[i+1]) f=1;
    else {f=0; break;}
      }
      if(f=1) cout<<"vektora kol.";
      else cout<<"vektora ne kol.";
       for (i=0; i<n; i++)
      {
    cout<<"\n kmas["<<i<<"]="<<kmas[i];
      }

      delete []vek1;
      delete []vek2;
      delete []kmas;
      getch();
    }

Автор: Vahappaday 9.10.2010, 15:42

if(f==1) cout<<"vektora kol.";
Косячить будет ещё и в случае, когда один из векторов имеет нулевую координату.
Так что рекомендую всё же обратиться к тем формулам, что я написал.

Да и проверка на перпендикулярность не корректна:
например, на вектора (2; 2), (1; -1) ваша программа говорит, что они не перпендикулярны, хотя они как раз таковыми являются.
Перемножать надо не все координаты одного вектора между собой.
Надо сделать сумму произведений соответствующих координат векторов.


Автор: InFuz 10.10.2010, 10:47

Цитата(Vahappaday @ 9.10.2010, 19:42) *

Да и проверка на перпендикулярность не корректна:
например, на вектора (2; 2), (1; -1) ваша программа говорит, что они не перпендикулярны, хотя они как раз таковыми являются.
Перемножать надо не все координаты одного вектора между собой.
Надо сделать сумму произведений соответствующих координат векторов.


как же 2,2 и 1,-1 преп. если 2*2 не равно 1*(-1)? если скалярное произведение = 0, то вектора перпендикулярны.

помогите формулы внедрить а то чот я в них ни как не разбирусь например (xi)j - i-я координата j-го вектора у нас только 2 вектора нам не нужно j.

Автор: Vahappaday 10.10.2010, 11:25

Насчёт (2;2) и (1; -1) - нарисуйте на бумажке, будет сразу видно, что они перпендикулярны.
И скалярное произведение у них будет такое:
2*1 + 2*(-1) = 2-2=0

Насчёт коллинеарности, я бы проверял так:
f=1;
for (i=0; i<n-1; i++)
{
if(vek1[i]*vek2[i+1] - vek1[i+1]*vek2[i])
{
f=0;
break;
}
}
А дальше уж Ваша проверка.

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)