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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2018, 20:35   #1
Desolar
Пользователь
 
Регистрация: 30.03.2018
Сообщений: 19
По умолчанию С++ Сортировка массива и вывод количества элементов на чётных позициях с использованием шаблонов

Здравствуйте! Проблема в том, что не могу разобраться именно с шаблонами, в задание указано : " Шаблон класса должен описывать и обеспечивать набор действий над данными параметризованного массива, а все вычисления должны быть реализованы в виде методов, ввод размера с клавиатуры".
Функции для сортировки и вывода количества элементов на чётных позициях я написал правильно, отдельно проверял.
В остальном ничего не выходит, буду благодарен если поможете мне разобраться и довести программу до ума.

Код:
#include <iostream>
using namespace std;

template <class T, size_t size>
class Arr {
private:
	T *arr, count;
	public: 
		Arr(T count_) {
			arr = new T[size];
			count = count_;
		}
		~Arr() {
			delete[] arr;
		}
		
		T Sum();
		T Sort();
		T par();
};
template <class T>
T Arr<T>::Sum() {
	int sum = 0;
	while (N > 0)
	{
		sum += N % 10;
		N /= 10;
	}
	return sum;
}

template <class T>
T Arr<T>::Sort() {
	for (int i = 0; i < N; i++)
	{
		for (int j = N - 1; j > i; j--)
		{
			if (Sum(arr[j]) > Sum(arr[j - 1]))
			{
				swap(arr[j], arr[j - 1]);
			}
		}
	}
	cout << "Sorted arr:" << endl;
	for (int i = 0; i < N; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
}

template <class T>
T Arr<T>::par() {

	for (int i = 0; i<N; i += 2)
		count++;
	cout << "number of Arr elements:" << count << endl;

}

int main()
{
	Arr <int, 0> obj();
	int N, count=0;
	cout << "Enter arr size:" << endl;
	cout << "N = ";
	cin >> N;
	int *arr = new int[N];
	cout << "Enter arr:" << endl;
	for (int i = 0; i < N; i++)
	{
		cin >> arr[i];
	}

	obj.Sort(); //?
	
	obj.par(); //?

	system("pause");
	return 0;
}

Последний раз редактировалось Desolar; 17.04.2018 в 20:55.
Desolar вне форума Ответить с цитированием
Старый 17.04.2018, 21:33   #2
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 735
По умолчанию

Цитата:
Сообщение от Desolar Посмотреть сообщение
Код:
template <class T, size_t size>
- а зачем size указывать в параметрах шаблона. Там указываются только типы, которые будут использоваться внутри класса - это же Вам не функция.
Цитата:
Сообщение от Desolar Посмотреть сообщение
Код:
Arr(T count_){
    arr = new T[size];
    count = count_;
}
- Может быть count и size это одно и то же? - Я прав?:D
А, да. Если все-таки я прав, то count это должно быть int, а тип T используется только для создания массива.

А что для каждой функции тоже надо template писать, я думаю что нет - там Вы не создаете шаблоны. У Вас уже есть декларации функций - Вам только нужно их описать. Не нужно писать template перед функциями. Докажите обратное. Или это требует C++?
Намешали все в кашу. Сделайте Ваш код попроще и попонятнее.
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.

Последний раз редактировалось Cuprum5; 17.04.2018 в 21:48. Причина: Добавил фразу.
Cuprum5 на форуме Ответить с цитированием
Старый 17.04.2018, 21:58   #3
Desolar
Пользователь
 
Регистрация: 30.03.2018
Сообщений: 19
По умолчанию

Думал, что нужно указывать size для передачи размера массива, count - это подсчёт количества элементов массива на чётных позициях.
Цитата:
Сообщение от Desolar Посмотреть сообщение
template <class T>
T Arr<T>:: par() {

for (int i = 0; i<N; i += 2)
count++;
cout << "number of Arr elements:" << count << endl;

}
Это такой синтаксис, чтобы эти функции были связаны с шаблонным классом, по-другому не знаю как написать в этом случае, ибо задание хочет, чтобы всё вычисления были реализованы как методы.
Desolar вне форума Ответить с цитированием
Старый 17.04.2018, 22:01   #4
Desolar
Пользователь
 
Регистрация: 30.03.2018
Сообщений: 19
По умолчанию

Честно говоря, я вообще запутался, что мне делать. Особенно интересно можно ли передать элементы и размер массива здесь, если да, то как, плюс как же вызвать эти методы.
Desolar вне форума Ответить с цитированием
Старый 18.04.2018, 00:42   #5
Desolar
Пользователь
 
Регистрация: 30.03.2018
Сообщений: 19
По умолчанию

Немножко подправил, кто может сказать стало ли лучше? Но всеровно не работает.
Код:
#include <iostream>
using namespace std;

template <class T>
class Arr {
private:
	T *arr;
	int N, count;
	public: 
		Arr() {
			N = 0;
			count = 0;
			arr = new T[N];
		
			
		}
		~Arr() {
			delete[] arr;
		}
		
		Arr(int N1);

		int Sum();
		void Sort();
		void par();

};

template <class T>
Arr<T>::Arr(int N1) {
	arr = new T[N];
	int N = 0;
	cout << "Enter arr size:" << endl;
	cout << "N = ";
	cin >> N;
	
	cout << "Enter arr:" << endl;
	for (int i = 0; i < N; i++)
	{
		cin >> arr[i];
	}

}




template <class T>
Arr<T>::Sum() {
	int sum = 0;
	while (N > 0)
	{
		sum += N % 10;
		N /= 10;
	}
	return sum;
}


template <class T>
Arr<T>::Sort() {
	for (int i = 0; i < N; i++)
	{
		for (int j = N - 1; j > i; j--)
		{
			if (Sum(arr[j]) > Sum(arr[j - 1]))
			{
				swap(arr[j], arr[j - 1]);
			}
		}
	}
	cout << "Sorted arr:" << endl;
	for (int i = 0; i < N; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;



}

template <class T>
Arr<T>::par() {

	for (int i = 0; i<N; i += 2)
		count++;
	cout << "number of Arr elements:" << count << endl;

}





int main()
{
	Arr <int> obj;
	int N;


	
	obj.Sort(); 
	
	obj.par(); 
	
	
	
	system("pause");
	return 0;
}
Desolar вне форума Ответить с цитированием
Старый 18.04.2018, 06:36   #6
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 735
По умолчанию

Цитата:
Сообщение от Desolar Посмотреть сообщение
Особенно интересно можно ли передать элементы и размер массива здесь, если да, то как, плюс как же вызвать эти методы.
- Элементы передаются по указателю из другого массива, который заранее заготовлен. Размер передается просто числом.
Цитата:
Сообщение от Desolar Посмотреть сообщение
Немножко подправил, кто может сказать стало ли лучше? Но всеровно не работает.
- А что не работает-то? Ну передавайте число элементов в массиве в конструктор Arr или там как-то по-другому надо сделать?
Цитата:
Сообщение от Desolar Посмотреть сообщение
Код:
template <class T>
T Arr<T>::Sum(){
	int sum = 0;
	while (N > 0)
	{
		sum += N % 10;
		N /= 10;
	}
	return sum;
}
- я не понял вот этот участок кода. Здесь же ведь не находится сумма элементов массива - вообще бред какой-то!!!!!!!!!!!!!!!!!:D Что Вы хотели сказать этим кодом? Также переменная N не имеет инициализации - это плохо там будет мусор и программа будет творить вообще неизвестно что.
Цитата:
Сообщение от Desolar Посмотреть сообщение
Код:
template <class T>
Arr<T>::Arr(int N1){
	arr = new T[N];
	int N = 0;
	cout << "Enter arr size:" << endl;
	cout << "N = ";
	cin >> N;
- Вот это глупость!!!!!!!!!!!! Сначала создаете динамический массив, а потом уже спрашиваете его размер у Пользователя и заполняете его - в результате расход памяти. - Нужно делать наоборот.
Т.е. спрашиваете сначала размер массива у Пользователя, а потом создаете массив этого размера и заполняете его либо с консоли, либо случайными значениями.
Цитата:
Сообщение от Desolar Посмотреть сообщение
Код:
Arr<int> obj;
- Вот здесь лучше вызывать конструктор с параметром - который число элементов массива, потому что нужно создать какой-то массив с каким-либо числом элементов и заполнить его.
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.

Последний раз редактировалось Cuprum5; 18.04.2018 в 08:00. Причина: Добавил фразу.
Cuprum5 на форуме Ответить с цитированием
Старый 18.04.2018, 09:37   #7
Desolar
Пользователь
 
Регистрация: 30.03.2018
Сообщений: 19
По умолчанию

Спасибо, попробую.
Возможно, вас запутало название этой функции :D Она просто необходима, для функции сортировки по убыванию.

Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
- Вот это глупость!!!!!!!!!!!! Сначала создаете динамический массив, а потом уже спрашиваете его размер у Пользователя и заполняете его - в результате расход памяти. - Нужно делать наоборот.
Т.е. спрашиваете сначала размер массива у Пользователя, а потом создаете массив этого размера и заполняете его либо с консоли, либо случайными значениями.
О, честно говоря, просто не заметил, что так написал, спасибо.
Desolar вне форума Ответить с цитированием
Старый 18.04.2018, 09:41   #8
Desolar
Пользователь
 
Регистрация: 30.03.2018
Сообщений: 19
По умолчанию

Список ошибок, не вижу где их нужно исправить. Потому что, вроде бы всё есть.
Изображения
Тип файла: jpg Screenshot_1.jpg (20.1 Кб, 133 просмотров)
Desolar вне форума Ответить с цитированием
Старый 18.04.2018, 13:20   #9
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 735
По умолчанию

Если честно не вижу, что там за ошибки. - Надо было увеличить картинку.
Так он раньше компилировался что-ли? - Если компилировался, то надо искать ошибки там где исправляли код.
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.
Cuprum5 на форуме Ответить с цитированием
Старый 18.04.2018, 14:58   #10
Desolar
Пользователь
 
Регистрация: 30.03.2018
Сообщений: 19
По умолчанию

Попробуйте приблизить, если не сложно. Раньше он так же не компилировался.
Desolar вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[РЕШЕНО]: ListBox: как добавить из TStringList текст через 1 строку, чтобы в listBox данные располагались на чётных/нечётных позициях? pas2 Помощь студентам 2 21.03.2017 20:54
Структура для хранения массива произвольного типа с использованием шаблонов. V.O.L.T. Общие вопросы C/C++ 0 24.12.2015 01:34
Fortran: Подпрограмма типа Function: написать функцию вычисления минимального из чётных элементов массива shewlett Помощь студентам 2 03.05.2015 14:08
Вывод количества элементов, попадающих в заданный интервал Dark Raven Помощь студентам 1 21.03.2012 08:41
Найти среднее арифметическое чётных элементов массива Ринка Паскаль, Turbo Pascal, PascalABC.NET 3 21.09.2011 19:29