1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
Здравствуйте! Помогите пожалуйста решить следующую задачу: Реализовать набор подпрограмм для выполнения следующих операций над векторами: а) сложение; б) вычитание; в) скалярное умножение векторов; г) умножение вектора на число; д) нахождение длины вектора. 1) Дан массив A – массив векторов. Отсортировать его в порядке убывания длин векторов. 2) С помощью датчика случайных чисел сгенерировать 2N целых чисел. N пар этих чисел задают N точек координатной плоскости. Вывести номера тройки точек, которые являются координатами вершин треугольника с наибольшим углом.
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует. На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
Основная проблема состоит именно в алгоритме поиска максимального угла (понятно что проще всего через скалярное произведение).Не могу написать алгоритм поиска. Также не получается передать в подпрограммы данные векторов.
а какие данные и как ты пытаешься передать? судя по заданию, речь именно про определение по скалярному произведению (то есть по косинусу)...
--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует. На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
#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; }
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 и повторяем сначала!
Никак в коде этот алгоритм не могу сделать. Помогите кто чем может =) Заранее спасибо.
У тебя в заголовке темы написан язык С++? Значит, можно сделать класс TVector, и для него перегрузить операции сложения/вычитания/умножения? Тогда этот твой алгоритм будет проще реализовать...
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует. На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
У тебя в заголовке темы написан язык С++? Значит, можно сделать класс TVector, и для него перегрузить операции сложения/вычитания/умножения? Тогда этот твой алгоритм будет проще реализовать...
Никак не могу выловить ошибку в программе. 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; }
по смыслу: если вектор вырождается в точку, чем равен угол между ним и другим вектором?
--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует. На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!