Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2015, 23:51   #1
Vallery
Пользователь
 
Регистрация: 07.06.2015
Сообщений: 10
По умолчанию Взываю о помощи!

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

Код:
Код:
/объявление функции
//считает скалярное произведение векторов
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;
                    };

Последний раз редактировалось Stilet; 08.06.2015 в 06:32.
Vallery вне форума Ответить с цитированием
Старый 07.06.2015, 23:58   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Ну зачем плодить темы?
http://programmersforum.ru/showthread.php?t=279150
waleri вне форума Ответить с цитированием
Старый 08.06.2015, 00:00   #3
Vallery
Пользователь
 
Регистрация: 07.06.2015
Сообщений: 10
По умолчанию

потому что мне не ответили, а мне очень нужна помощь!
Vallery вне форума Ответить с цитированием
Старый 08.06.2015, 00:23   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Vallery Посмотреть сообщение
потому что мне не ответили, а мне очень нужна помощь!
И не ответят, потому, что бред написан. Такую прогу даже запустить для отладки запустить нельзя . Куски какие-то, не имеющие смысла.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 08.06.2015, 00:31   #5
Vallery
Пользователь
 
Регистрация: 07.06.2015
Сообщений: 10
По умолчанию

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

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

Последний раз редактировалось Stilet; 08.06.2015 в 06:33.
Vallery вне форума Ответить с цитированием
Старый 08.06.2015, 00:59   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Vallery Посмотреть сообщение
а если зашел просто почитать, нечего умничать, я жду реальной помощи!
Поумничать, у меня здесь есть где и с кем. Если не хотите предоставлять абсолютно весь код, просто вычистите его от "секретных" частей и предоставьте нерабочий участок с инклюдами и прочими необходимыми частями. Так-же, укажите те данные, на которых он выбивает ошибку. Желательно и само сообщение об ошибке. Иногда, это реально помогает, даже если нет исходного кода.
В Вашем случае - "пойди туда, не знаю куда, найди то, не знаю, что".
А раздражение Ваше и нетерпеливость, тут мало кого трогают. К стати, код тоже нужно правильно оформлять. Для этого есть значок - решетка.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 08.06.2015 в 01:02.
Smitt&Wesson вне форума Ответить с цитированием
Старый 08.06.2015, 01:07   #7
Vallery
Пользователь
 
Регистрация: 07.06.2015
Сообщений: 10
По умолчанию

прошу прощения!за оформление
я зарегистрировалась здесь сегодня только,ранее не пользовалась такими форумами,поэтому не знаю,как оформлять.

Я могу расчитывать на помощь?
Vallery вне форума Ответить с цитированием
Старый 08.06.2015, 01:10   #8
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Vallery Посмотреть сообщение
прошу прощения!за оформление
я зарегистрировалась здесь сегодня только,ранее не пользовалась такими форумами,поэтому не знаю,как оформлять.

Я могу расчитывать на помощь?
А чем мы по вашему репутации зарабатываем? Просто следуйте советам, которые Вам дают и пазл сложится.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 08.06.2015, 01:12   #9
Vallery
Пользователь
 
Регистрация: 07.06.2015
Сообщений: 10
По умолчанию

это заголовочный файл

Код:
#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();				//выводит массив координат
   Type Skal(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>
Type clVector<Type>::Skal(clVector a)
{
	Type sum=0;
	 for(int i=0; i<Len; i++)
	  sum+=mass[i]*a.mass[i];
	 return sum;
}
Vallery вне форума Ответить с цитированием
Старый 08.06.2015, 01:12   #10
Vallery
Пользователь
 
Регистрация: 07.06.2015
Сообщений: 10
По умолчанию

а это исходный
Код:
#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();
}

Последний раз редактировалось Stilet; 08.06.2015 в 06:33.
Vallery вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прошу помощи Пупсончик PHP 11 12.01.2014 10:42
не правильно реализована программа, взываю) Hikerr Паскаль, Turbo Pascal, PascalABC.NET 8 23.05.2013 21:59