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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2012, 20:55   #1
MrRifleman
Пользователь
 
Регистрация: 24.03.2012
Сообщений: 13
Восклицание Шаблоны функций. Исправьте ошибки.

Код:
#include <iostream>
#include <math.h>
using namespace std;
template <class atype>
int find(atype summ)
{
    int n,i,j,
maxelem, minelem;
    for (maxelem=minelem=i=summ=0;i<n;i++){
if (arr[i] > 0) summ += arr[i]; // Сумма положительных элементов
if (fabs(arr[i]) > fabs(arr[maxelem])) maxelem = i; // Определение номера максимального по модулю элемента
if (fabs(arr[i]) < fabs(arr[minelem])) minelem = i; // И минимального
}
}
 
int main(){
int n,i,j,
maxelem, minelem; // Номера максимального и минимального элементов
float summ = 0, // Сумма положительных элементов
temp;
cout << "Enter n: "; // Ввод количества элементов массива
cin >> n;
float *arr = new float [n]; // Создание массива
for (i = 0; i < n; i++){
cout << "Enter element number " << i + 1 << " : "; // Ввод элементов массива
cin >> arr[i];
}
maxelem = minelem = 0;
 
cout << "Summ = " << find(summ) << endl; // Вывод суммы положительных елементов
if (abs(maxelem - minelem) > 1){ // Если между максимальным и минимальным по модулю элементами
// есть элементы
int stelem = (maxelem < minelem ? maxelem : minelem); // Определяем какой из максимального и минимального элементов
int endelem = (maxelem < minelem ? minelem : maxelem); // имеет меньший номер
for (i = stelem + 1,temp = 1; i < endelem; i++)
temp *= arr[i]; // Произведение промежуточных элементов
cout << "Pro = " << temp << endl; // Вывод полученного произведения
}
else
cout << "No elements";
cout << "Source array:\n[";
for (i = 0; i < n; i++) // Вывод исходного массива
cout << arr[i] << (i < n-1 ? ", " : "]\n"); //
// Сортировка массива методом сравнения:
for (int i = 0; i < n-1; i++) // Проход всего массива кроме последнего элемента
for (int j = i + 1; j <= n-1; j++) // Проход оставшейся части массива
if (arr[i] < arr[j]){ // Сравнение текущего элемента с элементом из оставшейся части.
temp = arr[i]; // Обмен значений элементов если они стоят в неправильном порядке
arr[i] = arr[j];
arr[j] = temp;
}
 
cout << "Array sorted:\n[";
for (i = 0; i < n; i++) // Вывод отсортированного массива
cout << arr[i] << (i < n-1 ? ", " : "]\n"); //
delete [] arr;
cin.get(),cin.get();
return 0;
}
Незнаю еще мало знаком с шаблонами функций поэтому, скажите правильно ли делаю? По идее нада каждый пункт задания оформить в виде шаблона, ну я начал с суммы положительных элементов в массиве.
MrRifleman вне форума Ответить с цитированием
Старый 01.06.2012, 21:15   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Обрати внимание:

Код:
using namespace std;  //использование имен std
template <class atype>
int find(atype summ)
//объявление функции с таким же именем, как std::find

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

http://www.cplusplus.com/reference/algorithm/find/
_Bers вне форума Ответить с цитированием
Старый 01.06.2012, 21:27   #3
MrRifleman
Пользователь
 
Регистрация: 24.03.2012
Сообщений: 13
По умолчанию

ну это можно изменить, а вот прога то все же с ошибками и не работает, вот и попрошу найти и исправить
MrRifleman вне форума Ответить с цитированием
Старый 01.06.2012, 21:33   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от MrRifleman Посмотреть сообщение
а вот прога то все же с ошибками и не работает
телепаты в отпуске.
_Bers вне форума Ответить с цитированием
Старый 01.06.2012, 22:21   #5
zvoronz
Пользователь
 
Регистрация: 03.01.2011
Сообщений: 49
По умолчанию

1. Что ты вообще от шаблона хочешь?
2. Как у тебя в функции оказался локально использующийся массив arr?
zvoronz вне форума Ответить с цитированием
Старый 01.06.2012, 22:29   #6
zvoronz
Пользователь
 
Регистрация: 03.01.2011
Сообщений: 49
По умолчанию

Вот немного подшаманил, что то выдаёт.

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

template <class T>
T myfind(T* arr, int n)
{
	int i,j,maxelem,minelem;
	T summ;

	for (maxelem = minelem = i = summ = 0; i < n; i++){
		if (arr[i] > 0) summ += arr[i]; // Сумма положительных элементов
		if (fabs(arr[i]) > fabs(arr[maxelem])) maxelem = i; // Определение номера максимального по модулю элемента
		if (fabs(arr[i]) < fabs(arr[minelem])) minelem = i; // И минимального
	}

	return summ;
}

int main(){
	int n,i,j,
		maxelem, minelem; // Номера максимального и минимального элементов
	float summ = 0, // Сумма положительных элементов
		temp;
	cout << "Enter n: "; // Ввод количества элементов массива
	cin >> n;
	float *arr = new float [n]; // Создание массива
	for (i = 0; i < n; i++){
		cout << "Enter element number " << i + 1 << " : "; // Ввод элементов массива
		cin >> arr[i];
	}
	maxelem = minelem = 0;

	cout << "Summ = " << myfind(arr, n) << endl; // Вывод суммы положительных елементов
	if (abs(maxelem - minelem) > 1){ // Если между максимальным и минимальным по модулю элементами
		// есть элементы
		int stelem = (maxelem < minelem ? maxelem : minelem); // Определяем какой из максимального и минимального элементов
		int endelem = (maxelem < minelem ? minelem : maxelem); // имеет меньший номер
		for (i = stelem + 1,temp = 1; i < endelem; i++)
			temp *= arr[i]; // Произведение промежуточных элементов
		cout << "Pro = " << temp << endl; // Вывод полученного произведения
	}
	else
		cout << "No elements";
	cout << "Source array:\n[";
	for (i = 0; i < n; i++) // Вывод исходного массива
		cout << arr[i] << (i < n-1 ? ", " : "]\n"); //
	// Сортировка массива методом сравнения:
	for (int i = 0; i < n-1; i++) // Проход всего массива кроме последнего элемента
		for (int j = i + 1; j <= n-1; j++) // Проход оставшейся части массива
			if (arr[i] < arr[j]){ // Сравнение текущего элемента с элементом из оставшейся части.
				temp = arr[i]; // Обмен значений элементов если они стоят в неправильном порядке
				arr[i] = arr[j];
				arr[j] = temp;
			}

	cout << "Array sorted:\n[";
	for (i = 0; i < n; i++) // Вывод отсортированного массива
		cout << arr[i] << (i < n-1 ? ", " : "]\n"); //
	delete [] arr;
	cin.get(),cin.get();
	return 0;
}

Enter n: 5
Enter element number 1 : 1
Enter element number 2 : 2
Enter element number 3 : 3
Enter element number 4 : 4
Enter element number 5 : 5
Summ = 15
No elementsSource array:
[1, 2, 3, 4, 5]
Array sorted:
[5, 4, 3, 2, 1]
zvoronz вне форума Ответить с цитированием
Старый 01.06.2012, 22:30   #7
zvoronz
Пользователь
 
Регистрация: 03.01.2011
Сообщений: 49
По умолчанию

А для макс и мин либо пиши отдельно функции либо передавай их в myfind по ссылке.
zvoronz вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
исправьте ошибки rwrwrw Паскаль, Turbo Pascal, PascalABC.NET 1 26.10.2011 08:59
Шаблоны функций masashama Visual C++ 7 05.10.2011 01:46
исправьте ошибки CHOSEN1 Помощь студентам 7 08.10.2010 15:48
Шаблоны функций. (*_*) Общие вопросы C/C++ 2 05.06.2009 20:21
шаблоны функций с++6.0 tanya Общие вопросы C/C++ 18 20.12.2008 19:39