Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Lab_8
- #include "stdafx.h"
- #include <iostream>
- #include <ctime>
- using namespace std;
- //16. Даны два массива найти их скалярное произведение
- template <typename T> class Element {
- public:
- T elem;
- Element() {}
- Element(T e)
- { //cout << "Constructor " << endl;
- elem = e;
- }
- template <typename T> T operator *(T &e)
- { //cout << "Operation *" << endl;
- return elem * e.elem;
- }
- template <typename T> T operator +=(T &e)
- { //cout << "Operation +=" << endl;
- return elem += e.elem;
- }
- operator T()
- { //cout << "operator T" << endl;
- return elem;
- }
- Element(const Element &base)
- { //cout << "Copy constructor" << endl;
- elem = base.elem;
- }
- };
- //явное инстанцирование шаблона функции
- template int ScalarDefaultType(int*, int*, int);
- int ScalarDefaultType(int* arrayA, int* arrayB, int size)
- {
- int result = 0;
- for (int i = 0; i < size; i++)
- result += arrayA[i] * arrayB[i];
- cout << "\nint";
- return result;
- }
- template double ScalarDefaultType(double*, double*, int);
- double ScalarDefaultType(double* arrayA, double* arrayB, double size)
- {
- double result = 0;
- for (int i = 0; i < size; i++)
- result += arrayA[i] * arrayB[i];
- cout << "\ndouble";
- return result;
- }
- template float ScalarDefaultType(float*, float*, int);
- float ScalarDefaultType(float* arrayA, float* arrayB, int size)
- {
- float result = 0;
- for (int i = 0; i < size; i++)
- result += arrayA[i] * arrayB[i];
- cout << "\nfloat";
- return result;
- }
- template <typename T> T ScalarDefaultType(T* arrayA, T* arrayB, int size); //шаблон функции для стандартных типов данных (int, float, double)
- template <typename T> T ScalarDefaultType(T* arrayA, T* arrayB, int size)
- {
- T result = 0;
- for (int i = 0; i < size; i++)
- result += arrayA[i] * arrayB[i];
- return result;
- }
- template <class T> T ScalarAbstractType(T arrayA[], T arrayB[], int size); //шаблон функции для абстрактного типа данных
- template <class T> T ScalarAbstractType(T arrayA[], T arrayB[], int size)
- {
- T result[1];
- result[0] = 0;
- for (int i = 0; i < size; i++)
- result[0] += arrayA[i] * arrayB[i];
- return result[0];
- }
- int main()
- {
- int size = 0;
- srand(time(NULL));
- cout << "Enter size arrays: ";
- cin >> size;
- cout << "template <typename T>" << endl;
- float *arrayA = new float[size];
- cout << "Array A: " << endl;
- for (int i = 0; i < size; i++)
- {
- arrayA[i] = (rand() % 100)/2.3;
- cout << arrayA[i] << " ";
- }
- float *arrayB = new float[size];
- cout << "\nArray B: " << endl;
- for (int i = 0; i < size; i++)
- {
- arrayB[i] = rand() % 100;
- cout << arrayB[i] << " ";
- }
- cout << "\nScalarDefaultType Product A & B = " << ScalarDefaultType(arrayA, arrayB, size) << endl;
- cout << "\ntemplate <class T>" << endl;
- Element<double> *AbstractArrayA = new Element<double>[size];
- Element<double> *AbstractArrayB = new Element<double>[size];
- cout << "\nArray A(AbstractType) double: " << endl;
- for (int i = 0; i < size; i++)
- {
- AbstractArrayA[i].elem = (rand() % 100) / 3.14;
- cout << AbstractArrayA[i].elem << " ";
- }
- cout << "\nArray B(AbstractType) double: " << endl;
- for (int i = 0; i < size; i++)
- {
- AbstractArrayB[i].elem = (rand() % 100) / 3.14;
- cout << AbstractArrayB[i].elem << " ";
- }
- cout << "\nScalarAbstractType Product A & B = " << ScalarAbstractType(AbstractArrayA, AbstractArrayB, size) << endl;
- Element<int> *AbstractArrayAInt = new Element<int>[size];
- Element<int> *AbstractArrayBInt = new Element<int>[size];
- cout << "\nArray A(AbstractType) int: " << endl;
- for (int i = 0; i < size; i++)
- {
- AbstractArrayAInt[i].elem = (rand() % 100);
- cout << AbstractArrayAInt[i].elem << " ";
- }
- cout << "\nArray B(AbstractType) int: " << endl;
- for (int i = 0; i < size; i++)
- {
- AbstractArrayBInt[i].elem = (rand() % 100);
- cout << AbstractArrayBInt[i].elem << " ";
- }
- cout << "\nScalarAbstractType Product A & B = " << ScalarAbstractType(AbstractArrayAInt, AbstractArrayBInt, size) << endl;
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment