Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/75: Рейтинг темы: голосов - 75, средняя оценка - 4.59
0 / 0 / 0
Регистрация: 07.06.2015
Сообщений: 12

Скалярное произведение

07.06.2015, 16:40. Показов 14652. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Взываю о помощи!
в программе есть функция Skal, которая вычисляет скалярное произведение 2х векторов.
Вроде все сделала правильно, но работает она каждый раз по разному: иногда считает все и правильно, иногда перемножает друг на друга только первые координаты и выводит только их произведение, а всего координат,например, три (трехмерное пространство).
Причем у меня шаблонный класс и в main'е я завожу по 2 объекта класса типа int (clVector<int> vec1, vec2
и типа double (clVector<double> vec3, vec4 Так вот с интовыми функция эта работает еще куда ни шло, а вот с типом double она всегда только первые координаты векторов перемножает и считает, что это их скалярное произведение.
Что не так я сделала??

/
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/объявление функции
//считает скалярное произведение векторов
template<class Type>
Type clVector<Type>::Skal(clVector a)
{
    Type sum=0, skalar;
    for(int i=0; i<Len; i++)
    {
        mass[i]*=a.mass[i];
        sum+=mass[i];
        skalar=sum;
    }
    return skalar;
}
 
//вызов функции в мейне
//для типа int
case 4:{    // если выбрал "4", вызываем функцию Skal
                vec1.GetKord(n);
                vec1.Show();
                vec2.GetKord(n);
                vec2.Show();
                cout<<"Результат скалярного произведения векторов : "<<vec1.Skal(vec2);
                break;
                    };
 
//для типа double
case 4:{
                vec3.GetKord(n);
                vec3.Show();
                vec4.GetKord(n);
                vec4.Show();
                cout<<"Результат скалярного произведения векторов : "<<vec3.Skal(vec4);
                break;
                    };
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.06.2015, 16:40
Ответы с готовыми решениями:

Скалярное произведение.
Добрый лень, нужна помощь в реализации программы, вычисляющая скалярное произведение 2-х векторов используя рекурсию на языке Си. Заранее...

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

Скалярное произведение
Ввести прямоугольную матрицу вещественных чисел. Определить номера двух строк введенной матрицы с наибольшим скалярным произведением....

5
196 / 197 / 120
Регистрация: 27.05.2011
Сообщений: 545
07.06.2015, 16:49
Огласите, пожалуйста, весь список! Приведите код полностью. Только обязательно обрамите его в теги CODE. Кнопочки с названием языка вверху над редактором.
Честно не совсем понятно, в функции Skal что такое Len. Это член класса? И как он инициализируется? Зачем вам в цикле две переменные, которые всегда имеют одно и то же значение?. Почему вы изменяете координаты одного из векторов?
0
0 / 0 / 0
Регистрация: 07.06.2015
Сообщений: 12
07.06.2015, 16:55  [ТС]
Len - это член класса - длина массива координат
он равен введенному пользователем "n"
Две переменные завела от безысходности: код был короче, но когда поняла,что он выполняется неправиьно, решила разбить, чтобы наверняка.

Вот, это мой класс и методы ниже
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <iostream>
#include <conio.h>
#include <math.h>
#include <cmath>
 
using namespace std;
 
template<class Type> // шаблонный 
class  clVector      // класс
{
    int Len;    //длина массива mass
    Type *mass; //массив координат вектора
 
public:
    clVector(){Len=0; mass=0;};                   //конструктор
    clVector(clVector& a)           //конструктор копирования
     { 
        mass=NULL;
        mass = new Type[Len];   //выделяем память для массива mass шаблонного типа Type
        for (int i=0;i<Len;i++) mass[i]=0;
        memcpy(mass,a.mass,a.Len*sizeof(int)); 
     };        
   ~clVector()              //деструктор
   {delete []mass;};
 
   // определение функций
   void GetKord(int n);     //функция для ввода координат вектора с клавиатуры пользователем
   void Show();             //выводит массив координат
   double Norma();          //считает норму вектора
   void Multi(Type a);      //умножает вектор на число
   void Summa(clVector& a);         //сумма 2х векторов
   Type Skal(clVector a);           //считает скалярное произведение векторов
   double Angle(clVector a);        //считает величину угла между векторами
   
};
 
////////////////////////////////////////////////////////////////////////////////////
 // объявление функций
 
 //функция заполнения массива координат
template<class Type>
 void clVector<Type>::GetKord(int n)    // clVector<Type> - шаблонный аргумент
 {
     Len=n;
     delete [] mass;    
     mass=new Type[n];  
     cout<<"Введите координаты вектора \n";
     for(int i=0; i<n; i++)
     {
         cout<<"введите "<<i+1<<" координату:\n";
         cin>>mass[i];
     }
 }
 
 //выводит массив координат
 template<class Type>
 void clVector<Type>::Show()
{
    cout<<"Ваш вектор ( ";
    for (int i=0;i<Len;i++) cout<<mass[i]<<" ";
    cout<<")"<<endl;
}
 
//считает норму вектора
 template<class Type>
double clVector<Type>::Norma()
{
    double step=0,sum=0;    // заводим переменные для элемента массива и суммы элементов
                            // чтобы можно было работать с функцией pow
    for (int i=0;i<Len;i++)
    {
        step=mass[i];
        sum+=pow(step,2);
    }
    return sqrt(sum);
}
 
//умножает вектор на число
template<class Type>
void clVector<Type>::Multi(Type a)
{
    for(int i=0; i<Len; i++)
    mass[i]*=a;
}
 
//функция сложения 2х векторов
template<class Type>
void clVector<Type>::Summa(clVector& a)
{
    a.GetKord(Len);  //заполняем массив а с помощью функции GetKord
    a.Show();        //выводим на экран
    for(int i=0; i<Len; i++)
    mass[i]+=a.mass[i];
}
 
//считает скалярное произведение векторов
template<class Type>
Type clVector<Type>::Skal(clVector a)
{
    Type sum=0, skalar;
    for(int i=0; i<Len; i++)
    {
        mass[i]*=a.mass[i];
        sum+=mass[i];
        skalar=sum;
    }
    return skalar;
}
 
//считает величину угла между векторами
template<class Type>
double clVector<Type>::Angle(clVector a)
{
    double step1=0, step2=0, sum1=0, sum2=0, skalar=0, fi;
    for(int i=0; i<Len; i++)
    {
        step1=mass[i];
        sum1+=pow(step1,2);
        step2=a.mass[i];
        sum2=pow(step2,2);
        skalar+=mass[i]*a.mass[i];  
    }
    return fi=skalar/(sqrt(sum1)*sqrt(sum2));
}
а это мейн
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <iostream>
#include <conio.h>
#include <math.h>
#include <cmath>
#include "clVector.h"
 
using namespace std;
 
void menu() // список меню
{
    cout<<"\nВыберите, что хотите сделать\n\n1. Посчитать норму вектора\n2. Произведение вектора на число\n3. Сумма 2х векторов\n4. Скалярное произведение 2х векторов\n5. Найти значение угла между векторами\n\n";
}
 
 
void main()
{
    setlocale(LC_ALL, "Russian");   //подключаем русский текст для консоли
    char choice, choi;      // переменные для выбора пространства и продолжить/нет работу
    int n, nom, alfa1;      // переменные для размерности, выбора пункта меню и целочисленного alfa
    double alfa2;           // вещественное alfa
    clVector<int> vec1, vec2;   // определяем 2 объекта класса clVector типа int
    clVector<double> vec3, vec4;    // определяе 2 объекта класса clVector типа double
    do
    {
        cout<<"Введите размерность пространства ( больше 1 ):\n";
        cin>>n; // пользователь вводит размерность пространства
        cout<<"С каким пространством хотите работать?\na. Пространство целых чисел\nb. Пространство вещественных чисел\n";
        cin>>choi; // пользователь выбирает пространство
        switch(choi)    //заводим оператор множественного выбора для выбора пространства
        {
        case 'a':{      // если выбрали 'a', работаем с целочисленными векторами
            menu();     // выводим на экран меню
            cin>>nom;   // пользователь выбирает пункт меню
            switch(nom) // заводим оператор множественного выбора для выбора пункта меню
            {
            case 1:{    // если выбрал "1", вызываем функцию Norma
                vec1.GetKord(n);
                vec1.Show();
                cout<<"\nНорма вектора : "<<vec1.Norma();
                break;
                   };
            case 2:{    // если выбрал "2", вызываем функцию Multi
                vec1.GetKord(n);    
                vec1.Show();
                cout<<"\nВведите alfa :\n"; cin>>alfa1; cout<<"\n";
                cout<<"Результат произведения : ";
                vec1.Multi(alfa1);
                vec1.Show();
                break;
                    };
            case 3:{    // если выбрал "3", вызываем функцию Summa
                vec1.GetKord(n);
                vec1.Show();
                vec1.Summa(vec2);
                cout<<"Результат сложения векторов : ";
                vec1.Show();
                break;
                    };
            case 4:{    // если выбрал "4", вызываем функцию Skal
                vec1.GetKord(n);
                vec1.Show();
                vec2.GetKord(n);
                vec2.Show();
                cout<<"Результат скалярного произведения векторов : "<<vec1.Skal(vec2);
                break;
                    };
            case 5:{    // если выбрал "5", вызываем функцию Angle
                vec1.GetKord(n);
                vec1.Show();
                vec2.GetKord(n);
                vec2.Show();
                cout<<"Значение сos угла между векторами : "<<vec1.Angle(vec2);
                break;
                    };
            default: break; // иначе выходим 
            }
               };
        case 'b':{      // если выбрали 'b', работаем с пространством вещественных чисел
            menu();
            cin>>nom;
            switch(nom)
            {
            case 1:{
                vec3.GetKord(n);
                vec3.Show();
                cout<<"\nНорма вектора : "<<vec3.Norma();
                break;
                    };
            case 2:{
                vec3.GetKord(n);
                vec3.Show();
                cout<<"\nВведите alfa :\n"; cin>>alfa2; cout<<"\n";
                cout<<"Результат произведения : ";
                vec3.Multi(alfa2);
                vec3.Show();
                break;
                    };
            case 3:{
                vec3.GetKord(n);
                vec3.Show();
                vec3.Summa(vec4);
                cout<<"Результат сложения векторов : ";
                vec3.Show();
                break;
                    };
            case 4:{
                vec3.GetKord(n);
                vec3.Show();
                vec4.GetKord(n);
                vec4.Show();
                cout<<"Результат скалярного произведения векторов : "<<vec3.Skal(vec4);
                break;
                    };
            case 5:{
                vec3.GetKord(n);
                vec3.Show();
                vec4.GetKord(n);
                vec4.Show();
                cout<<"Значение сos угла между векторами : "<<vec3.Angle(vec4);
                break;
                };
            default: break;
            }
               };
        }       
        cout<<"\nПродолжить? (y/n)\n";
        cin>>choice; // пользователь выбирает продолжить работу или нет
    } while(choice=='y');   // выполняем цикл, пока ответ 'у' (yes)
getch();
}
0
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,238
07.06.2015, 17:02
C++
1
2
3
4
5
6
7
8
template<class Type>
Type clVector<Type>::Skal(clVector a)
{
    Type sum=0;
    for(int i=0; i<Len; i++)
        sum+=mass[i]*a.mass[i];
    return sum;
}
0
0 / 0 / 0
Регистрация: 07.06.2015
Сообщений: 12
07.06.2015, 17:14  [ТС]
Спасибо конечно! но как сократить код я знаю. Изначально он именно так и выглядел.
Проблема, к сожалению, от этого не решилась.
Вот,прилагаю скрин.
Первый раз все получилось правильно,а во второй раз, когда в качестве первой координаты я ввела "1" опять он умножил только первую координату одного вектора, на первую координату второго и вывел это как результат, а дальше делать не стал.
Миниатюры
Скалярное произведение  
0
0 / 0 / 0
Регистрация: 07.06.2015
Сообщений: 12
07.06.2015, 18:07  [ТС]
ну что?
ничего не получается, да?(
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.06.2015, 18:07
Помогаю со студенческими работами здесь

Скалярное произведение векторов
Объясните, пожалуйста, значение вот этой строки: int scalar(int V1, int V2, int n)

Найти скалярное произведение
ДОБРООГО ДНЯ ВСИМ КТО МОЖЕ МЕНИ ДОПОМОГТИ В РИШЕНІ ДАНОЇ ЗАДАЧИ НЕХАЙ ДАНА МАТРИЦЯ N*N ВСІ ЕЛЕММЕНТИ ЯКОЇ РІЗНІ ЗНАЙДІТЬ СКАЛЯРНИЙ...

Скалярное произведение векторов
Здравствуйте! Помогите пожалуйста найти ошибки #include &lt;iostream&gt; using namespace std; int main(int argc, char *argv) { ...

Найти скалярное произведение векторов
Даны два вектора x, y есть Rn. Найти скалярное произведение векторов.

Скалярное произведение двух векторов
Даны два вектора (одномерных массива), содержащих n вещественных элементов. Найти скалярное произведение двух векторов.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru