![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() |
-ZoLToN- |
![]()
Сообщение
#1
|
Гость ![]() |
Здравствуйте! Помогите пожалуйста решить следующую задачу:
Реализовать набор подпрограмм для выполнения следующих операций над векторами: а) сложение; б) вычитание; в) скалярное умножение векторов; г) умножение вектора на число; д) нахождение длины вектора. 1) Дан массив A – массив векторов. Отсортировать его в порядке убывания длин векторов. 2) С помощью датчика случайных чисел сгенерировать 2N целых чисел. N пар этих чисел задают N точек координатной плоскости. Вывести номера тройки точек, которые являются координатами вершин треугольника с наибольшим углом. |
![]() ![]() |
мисс_граффити |
![]()
Сообщение
#2
|
![]() просто человек ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: ![]() ![]() ![]() |
в чем проблема? что пробовал делать?
-------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
Гость |
![]()
Сообщение
#3
|
Гость ![]() |
Основная проблема состоит именно в алгоритме поиска максимального угла (понятно что проще всего через скалярное произведение).Не могу написать алгоритм поиска. Также не получается передать в подпрограммы данные векторов.
|
мисс_граффити |
![]()
Сообщение
#4
|
![]() просто человек ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: ![]() ![]() ![]() |
а какие данные и как ты пытаешься передать?
судя по заданию, речь именно про определение по скалярному произведению (то есть по косинусу)... -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
-ZoLToN- |
![]() ![]()
Сообщение
#5
|
Гость ![]() |
Наколбасил следующее:
#include <iostream.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
int sloj(int x1,int y1,int x2,int y2,int pr)
// Функция сложения векторов! Сделал через признак выдачи (Int pr),
// т.к. не знаю как вернуть массив из функции!
{
int c[2];
c[1]=x1+x2;
c[2]=y1+y2;
if (pr==0)
{
return c[1];
}
else
{
return c[2];
}
}
int vich(int x1,int y1,int x2,int y2,int pr) // Вычитание!
{
int c[2];
c[1]=x1-x2;
c[2]=y1-y2;
if (pr==0)
{
return c[1];
}
else
{
return c[2];
}
}
int numum(int x1,int y1,int x2, int y2,int nu,int pr) // Умножение на число!
{
int c[2];
c[1]=(x2-x1)*nu;
c[2]=(y2-y1)*nu;
if (pr==0)
{
return c[1];
}
else
{
return c[2];
}
}
double dlin(int x1,int y1)
// Длина вектора! Взят тип double т.к. функции cos и acos требуют этот тип!
{
int a,b,c;
a=pow(x1,2);
b=pow(y1,2);
c=sqrt(a+b);
return c;
}
double skal(int x1,int y1,int x2,int y2) // Скалярное произведение! Аналогично!
{
int sk;
sk=x1*x2+y1*y2;
return sk;
}
void main ()
{
int n,i,j;
double a[10][2],tx,ty,t1,t2,t3,t4,t5,t6,tmax;
clrscr();
cout << "Enter number of pair points (max 10): ";
cin >> n;
tmax=(-2);
for (i=0;i<n;i++)
{
a[i][0]=(rand() % 20);
a[i][1]=(rand() % 20);
}
for (i=0;i<=n;i++) /* Вот тут главный затуп.
{
for (j=0;j<=n;j++) */
{
if (j<>i&i+1)
{
t1=a[i+1][1]-a[i][1]; // Вычисляем координаты вектора 1
t2=a[i+1][2]-a[i][2]; // Аналогично!
t3=a[j][1]-a[i+1][1];// Координаты второго!
t4=a[j][2]-a[j][2];
t5=skal(t1,t2,t3,t4)/dlin(t1,t2)*dlin(t3,t4);
// Ну тут ясно... Скалярное произведение в координатах делим
// на произв. модулей. Получаем косинус.
t6=acos(t5); // Берем арккосинус.
if (t6>tmax)
{
/* И тут! Надо сохранить координаты 3х точек*/
}
}
}
}
}
Вся проблема возникла в порядке обхода. Я придумал идею, в коде реализовать не могу =(. Например есть пять точек, по две координаты у каждой. Шаг 1:Мы берем первую точку (пусть i) Шаг 2:Берем i+1 точку. Шаг 3:Считаем координаты вектора из этих точек. Шаг 4: Берем одну точку из оставшихся (пусть j). (Нужно наверное выражение с if). Шаг 5: Считаем координаты вектора из точек i+1 и j. Шаг 6: Считаем угол. Шаг 7: Шаги 1-6 повторяем для всех точек, оставшихся после взятия точек i и i+1. Шаг 8: За i берем точку i+1 и повторяем сначала! Никак в коде этот алгоритм не могу сделать. Помогите кто чем может =) Заранее спасибо. |
-ZoLToN- |
![]()
Сообщение
#6
|
Гость ![]() |
Без аккаунта нельзя редактировать посты! Одну ошибку заметил:
t1=a[i+1][1]-a[i][1]; // Вычисляем координаты вектора 1
t2=a[i+1][2]-a[i][2]; // Аналогично!
t3=a[j][1]-a[i+1][1];// Координаты второго!
t4=a[j][2]-a[j][2];
Здесь везде должно быть 0 и 1. t1=a[i+1][0]-a[i][0]; // Вычисляем координаты вектора 1
t2=a[i+1][1]-a[i][1]; // Аналогично!
t3=a[j][0]-a[i+1][0];// Координаты второго!
t4=a[j][1]-a[j][1];
|
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
У тебя в заголовке темы написан язык С++? Значит, можно сделать класс TVector, и для него перегрузить операции сложения/вычитания/умножения? Тогда этот твой алгоритм будет проще реализовать...
Или пойдем сложным путем? |
мисс_граффити |
![]()
Сообщение
#8
|
![]() просто человек ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: ![]() ![]() ![]() |
Цитата Функция сложения векторов! Сделал через признак выдачи (Int pr), т.к. не знаю как вернуть массив из функции! как вариант: void sloj(int x1,int y1,int x2,int y2,int* c)
{
c[1]=x1+x2;
c[2]=y1+y2;
}
-------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
-ZoLToN- |
![]()
Сообщение
#9
|
Гость ![]() |
|
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
Чем решение trminator-а не устраивает? (или ты решил, что в данном разделе правила НЕ действуют?)
Операции над векторами |
-ZoLToN- |
![]()
Сообщение
#11
|
Гость ![]() |
Спасибо за помощь!
|
-ZoLToN- |
![]()
Сообщение
#12
|
Гость ![]() |
Никак не могу выловить ошибку в программе.
Floating point error: Domain. Это, судя по хелпу, ошибка которая возникает, когда функция бесконечна (т.е. деление на 0 например). #include <iostream.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
int sloj(int x1,int y1,int x2,int y2,int pr)
{
int c[2];
c[1]=x1+x2;
c[2]=y1+y2;
if (pr==0)
{
return c[0];
}
else
{
return c[1];
}
}
int vich(int x1,int y1,int x2,int y2,int pr)
{
int c[2];
c[1]=x1-x2;
c[2]=y1-y2;
if (pr==0)
{
return c[0];
}
else
{
return c[1];
}
}
int numum(int x1,int y1,int nu,int pr)
{
int c[2];
c[1]=x1*nu;
c[2]=y1*nu;
if (pr==0)
{
return c[0];
}
else
{
return c[1];
}
}
double dlin(int x1,int y1)
{
int a,b,c;
a=pow(x1,2);
b=pow(y1,2);
c=sqrt(a+b);
return c;
}
double skal(int x1,int y1,int x2,int y2)
{
double sk;
sk=x1*x2+y1*y2;
return sk;
}
void main ()
{
int n,i,j,k,z;
int a[5][2],tx,ty,tx2,ty2,tx3,ty3,t1,t2,t3,t4,t5,t6,tmax,b[3]; double tt;
clrscr();
cout << "Enter number of pair points (max 5): ";
cin >> n;
tmax=(-2);
for (i=0;i<=n-1;i++)
{
a[i][0]=(rand() % 10 >0 );
a[i][1]=(rand() % 10 >0);
}
for (i=0;i<=n-1;i++)
{
for (j=i+1;j<=n-1;j++)
{
for (k=j+1;k<=n;k++)
{
t1=a[j][0]-a[i][0];
t2=a[j][1]-a[i][1];
t3=a[k][0]-a[j][0];
t4=a[k][1]-a[j][1];
t5=a[i][0]-a[k][0];
t6=a[i][1]-a[i][1];
if (dlin(t1,t2) == 0)
{
i=i+1;
}
b[0]=skal(t1,t2,t3,t4)/(dlin(t1,t2)*dlin(t3,t4));
b[1]=skal(t3,t4,t5,t6)/(dlin(t3,t4)*dlin(t5,t6));
b[2]=skal(t5,t6,t1,t2)/(dlin(t5,t6)*dlin(t1,t2));
tt=(-2);
for (z=0;z<=1;z++)
{
if (b[z]<tt) { tt=b[z]; }
}
if (tt<tmax)
{tx=a[i][0];
ty=a[i][1];
tx2=a[j][0];
ty2=a[j][1];
tx3=a[k][0];
ty3=a[k][1];
}
}
}
}
cout << "\n1)X: " << tx << " Y: " << ty;
cout << "\n2)X: " << tx2 << " Y: " << ty2;
cout << "\n3)X: " << tx3 << " Y: " << ty3;
getch();
}
|
-ZoLToN- |
![]()
Сообщение
#13
|
Гость ![]() |
Подскажите пожалуйста если кто видит ошибку.
|
volvo |
![]()
Сообщение
#14
|
Гость ![]() |
Добавь строку:
if (dlin(t1,t2) == 0) {
cout << "zero" << endl; // <--- Вот эту
i=i+1;
}
И увидишь, что dlin(t1, t2) = 0... Однако:
b[0]=skal(t1,t2,t3,t4)/(dlin(t1,t2)*dlin(t3,t4)); // Делим на 0 ???
|
-ZoLToN- |
![]()
Сообщение
#15
|
Гость ![]() |
А есть какие-нибудь идеи как это исправить?
|
мисс_граффити |
![]()
Сообщение
#16
|
![]() просто человек ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: ![]() ![]() ![]() |
по смыслу: если вектор вырождается в точку, чем равен угол между ним и другим вектором?
-------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
![]() ![]() |
![]() |
Текстовая версия | 28.07.2025 6:12 |