0 / 0 / 0
Регистрация: 17.06.2013
Сообщений: 23
1

Сложить массивы почленно (используются шаблонные классы)

12.01.2017, 00:37. Показов 2572. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую. Почему-то ни в одной моей теме ответа так и не наблюдается за последнее время. Надеюсь, поможете.
Есть у нас лаба с таким вот заданием:

Разработать обобщённый класс «Массив», в котором реализовать методы: ввод информации о параметрах и элементах класса, получение минимального и максимального значений из элементов массива, поэлементное сложение двух массивов, отображение элементов массива на дисплее. Составить головную функцию, в которой осуществить создание объектов конкретных классов путём параметризации разработанного обобщённого класса простыми типами данных (действительный, целый). Выполнить все предусмотренные методы полученных классов.

Соответственно, не выходит сделать метод сложения двух массивов почленно. Программа у меня консольная. На сегоднящний день имею вот это:

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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <windows.h>
#include <stdlib.h>
using namespace std;
 
const int DefaultSize = 10;
 
template <class T> // объявляю шаблон и параметр
class Array { // параметрический класс
    public:
        // конструкторы
        Array (int itsSize = DefaultSize);
        Array (const Array &rhs);
        // деструктор
        ~Array () {
            delete [] pType;
        }
 
        // операторы
        Array& operator= (const Array&);
        T& operator[] (int offSet) const {
            return pType[offSet];
        }
 
        // функция доступа
        int getSize() const {
            return itsSize;
        }
 
        friend ostream& operator<< <T>(ostream &, const Array<T>&); // дружественный вывод
        friend istream& operator>> <T>(istream &, Array<T>&); // дружественный ввод
        void SearchMax(const Array<T>& theArray); // ищет и выводит максимум
        void SearchMin(const Array<T>& theArray); // ищет и выводит минимум
 
    private:
        T *pType;
        int itsSize;
};
 
// реализация конструктора
template <class T>
Array<T>::Array(int size = DefaultSize): itsSize(size) {
    pType = new T[size];
    for (int i = 0; i <size; i++) pType[i] = (T)0;
}
 
// вывод данных
template <class T>
istream & operator>> (istream & input, Array<T>& theArray) {
    for (int i = 0; i < theArray.getSize(); i++) {
        cout << "Введите число No." << i+1 << ": ";
        input >> theArray[i];
    }
    return input;
}
 
// вывод данных
template <class T>
ostream & operator<< (ostream & output, const Array<T>& theArray) {
    for (int i = 0; i < theArray.getSize(); i++)
        output << theArray[i] << " ";
    return output;
}
 
// конструктор копий
template <class T>
Array<T> :: Array(const Array &rhs) {
    itsSize = rhs.getSize();
    pType = new T[itsSize];
    for (int i = 0; i < itsSize; i++) pType[i] = rhs[i];
}
 
template <class T>
Array<T>& Array<T> :: operator= (const Array &rhs) {
    if (this == &rhs) return *this;
    delete [] pType;
    itsSize = rhs.getSize();
    pType = new T[itsSize];
    for (int i = 0; i < itsSize; i++) pType[i] = rhs[i];
    return *this;
}
 
template <class T>
void SearchMax(const Array<T>& theArray) {
    int maxval = theArray[0];
    for (int i = 0; i < theArray.getSize(); i++) {
        if (maxval < theArray[i]) {
            maxval = theArray[i];
        }
    }
    cout << "Максимальное значение: " << maxval << endl;
}
 
template <class T>
void SearchMin(const Array<T>& theArray) {
    int minval = theArray[0];
    for (int i = 0; i < theArray.getSize(); i++) {
        if (theArray[i] < minval) {
            minval = theArray[i];
        }
    }
    cout << "Минимальное значение: " << minval << endl;
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    system("color F0");
    system("cls");
 
    Array<int> intArray1;
    Array<int> intArray2;
    Array<int> sumArray;
 
    cout << "==========================================" << endl;
    cout << "         ШАБЛОННЫЙ КЛАСС «МАССИВ»" << endl;
    cout << "==========================================" << endl;
    cout << "Программа запрашивает ввод массивов," << endl << "после чего выводит их на экран," << endl << "ищет максимальный и минимальный элементы," << endl << "а также складывает их поэлементно" << endl;
    cout << endl;
 
    // ввод элементов массива с клавиатуры
    cout << "Ввод данных в первый массив:" << endl;
    cin >> intArray1;
    cout << endl;
    cout << "Ввод данных во второй массив:" << endl;
    cin >> intArray2;
    cout << endl;
    cout << "==========================================" << endl;
    // вывод массива на экран
    cout << "Первый массив:" << endl;
    cout << "[ " << intArray1 << "]" << endl;
    SearchMax(intArray1);
    SearchMin(intArray1);
    cout << "__________________________________________" << endl;
    cout << endl;
    cout << "Второй массив:" << endl;
    cout << "[ " << intArray2 << "]" << endl;
    SearchMax(intArray2);
    SearchMin(intArray2);
    cout << "__________________________________________" << endl;
    // сумма массивов
    for (int i = 0; i < sumArray.getSize(); i++) sumArray[i] = intArray1[i] + intArray2[i];
    cout << endl;
    cout << "Сумма массивов:" << endl;
    cout << "[ " << sumArray << "]" << endl;
    SearchMax(sumArray);
    SearchMin(sumArray);
 
    cout << endl;
    system("pause");
    return 0;
}
Как видно, в конце программы сложение реализовал грубо (временно). Прошу помощи.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.01.2017, 00:37
Ответы с готовыми решениями:

Шаблонные классы
Вообщем проблема такая. Если я класс полностью описываю в main.cpp то все хорошо. Но как только я...

Шаблонные классы
Добрый вечер,дорогие форумчане, подскажите пожалуйста верный синтаксис для шаблонного класса(где...

Шаблонные классы
Добрый день! Вопрос такой: есть класс class A { public: int x; A* z; } Мне нужно...

Шаблонные классы
Здравствуйте, возникла проблема: когда я хочу чтобы шаблонный класс при реализации в качестве типа...

6
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
12.01.2017, 01:56 2
Примерно:
C++
1
2
3
4
size_t size = std::min(arr1.size() + arr2.size());
Array<decltype(arr1[0] + arr2[0])> result(size);
for (size_t i = 0; i < size; ++i)
   result[i] = arr1[i] + arr2[i];
1
0 / 0 / 0
Регистрация: 17.06.2013
Сообщений: 23
12.01.2017, 02:28  [ТС] 3
Croessmah, спасибо! Сейчас попробую.

Добавлено через 9 минут
Не, не фурычет... Обидно. Я ещё попробовал вот так:

C++
1
Array& operator+ (const Array&);
C++
1
2
3
4
5
6
7
template <class T>
Array<T>& Array<T> :: operator+ (const Array &rhs) {
    itsSize = rhs.getSize();
    pType = new T[itsSize];
    for (int i = 0; i < itsSize; i++) pType[i] + rhs[i];
    return *this;
}
... но результат, как и ожидалось, неверный выдаёт.
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
12.01.2017, 11:43 4
Лучший ответ Сообщение было отмечено Adamaras как решение

Решение

Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
std::min(arr1.size() + arr2.size());
Наверное всё же
C++
1
std::min(arr1.size(), arr2.size());
Добавлено через 9 минут
Adamaras, попробуй вот так:
C++
1
2
3
4
5
6
7
8
template <class T>
Array<T> Array<T>::operator+ (const Array<T> &rhs) {
    size_t size = std::min(getSize(), rhs.getSize());
    Array<T> result(size);
    for (size_t i = 0; i < size; ++i)
        result->pType[i] = pType[i] + rhs->pType[i];
    return result;
}
2
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
12.01.2017, 12:04 5
Цитата Сообщение от likehood Посмотреть сообщение
Наверное всё же
Да, именно так.
0
0 / 0 / 0
Регистрация: 17.06.2013
Сообщений: 23
12.01.2017, 16:04  [ТС] 6
Спасибо вам, уважаемые! Сейчас буду пробовать.

Добавлено через 34 минуты
Да, всё получилось! Ещё раз огромное спасибо!))
Я немного допилил код, предложенный товарищем likehood (у меня -> не перегружен), и всё стало работать!))
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
12.01.2017, 16:15 7
Цитата Сообщение от Adamaras Посмотреть сообщение
у меня -> не перегружен
Да я и не предполагал, что он будет перегружен. Просто ошибся
Конечно же, вместо -> нужно использовать точку.
0
12.01.2017, 16:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.01.2017, 16:15
Помогаю со студенческими работами здесь

Шаблонные классы
Помогите разобраться с шаблонными классами template &lt;class Type&gt; class CL1 { }; class CL2 {...

Шаблонные классы
Помогите, пожалуйста! Не понимаю как реализовать! Создать параметризованный линейный кольцевой...

Шаблонные классы
Как сделать вот такой класс шаблонным? #ifndef CVECTOR_H #define CVECTOR_H #include &lt;iostream&gt;...

Шаблонные классы
Есть задание, на скрине ниже Помогите, как инициализировать объект PairArray в конструкторе класса...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru