Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
xWhoAmIx
14 / 0 / 0
Регистрация: 09.03.2014
Сообщений: 30
#1

Создание шаблонной функции для работы с массивами разных типов данных - C++

23.03.2014, 22:25. Просмотров 340. Ответов 3
Метки нет (Все метки)

Здравствуйте. Столкнулся со следующей проблемой: не могу написать шаблонную функцию подсчета суммы элементов в массиве между первым и последним отрицательными элементами. Нужно, чтобы функция умела работать с массивами разных типов данных: int, float, double(считала сумму чисел между первым отрицательным и последним отрицательным элементами). Программа должна быть модульной.
код соотвествующих файлов:
Main.cpp
Кликните здесь для просмотра всего текста
Код
// Main.cpp: определяет точку входа для консольного приложения.
//
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "stdlib.h"
#include "Text.h"
#include <iostream>

void main()
{
	setlocale(LC_ALL, "Russian");
	int k=1;
	int size=0;
	int tmp;
	int *arr=new int[2];
	float *arr2=new float[2];
	double *arr3=new double[2];
	while (k!=4)
	{
				printf("\n\n\t\tМеню:\n\n");
				printf("\t1. Заполнить массив\n\n");
				printf("\t2. Вычислить сумму элементов с нечетными номерами..\n\n");
				printf("\t3. Вычислить сумму элементов, расположенных между \n\t\t первым и последним отрицательными элементами... \n\n");
				printf("\t4. Выход\n\n");
				printf("\tВведите номер пункта: \n");
				scanf("%d", &k); 

			switch (k)
			{
				case 1:
				{
					tmp = 0;
					printf("\n\n\t\tПодменю:\n");
					printf("\t1. Массив int\n");
					printf("\t2. Массив float\n");
					printf("\t3. Массив double\n");
					printf("\tВведите номер пункта: \n");
					scanf("%d", &tmp);
									
					if (tmp == 1)
						size=sozdanie(arr);
					if (tmp == 2)
						size=sozdanie(arr2);

					if (tmp == 3)
						size=sozdanie(arr3);
					
				} break;
				
				case 2:
				{ 
					tmp = 0;
					printf("\n\n\t\tПодменю:\n\n");
					printf("\t1. Для массива int\n\n");
					printf("\t2. Для массива float\n\n");
					printf("\t3. Для массива float\n\n");
					printf("\tВведите номер пункта: \n");
					scanf("%d", &tmp);
					if (tmp == 1)
					{
						printf("Сумма нечетных чисел:\t%d\n\n", summnechet(size, arr));
					}

					if (tmp == 2)
					{
					printf("Сумма нечетных чисел:\t%4.3f\n\n", summnechet(size, arr2));
					}

					if (tmp == 3)
					{
					printf("Сумма нечетных чисел:\t%4.6f\n\n", summnechet(size, arr3));
					}
				}
				break;

				case 3: 
				{
					tmp = 0;
					printf("\n\n\t\tПодменю:\n");
					printf("\t1. Массив int\n");
					printf("\t2. Массив float\n");
					printf("\t3. Массив double\n");
					printf("\tВведите номер пункта: \n");
					scanf("%d", &tmp);
									
					if (tmp == 1)
					{
						int d=0;
						d=summbtwotr(size, arr);
						

					}

					if (tmp == 2)
					{
					break;
					}

					if (tmp == 3)
					{
					break;
					}
				} break;
		
			}		
	}
	delete []arr;
	delete []arr2;
	delete []arr3;
	return;
}

Text.h
Кликните здесь для просмотра всего текста
Код
//директива предпроцессору, чтобв если в основном файле инклюд прописан несколько раз - файл подключился только 1 раз
#pragma once

#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>
#include <algorithm>

int sozdanie(int* &arr);
int sozdanie(float* &arr2);
int sozdanie (double* &arr3);
////////////////////////////////////////////////
int summnechet(int size, int* &arr);
float summnechet(int size, float* &arr2);
double summnechet(int size, double* &arr3);
///////////////////////////////////////////////
template <typedef Summ>
Summ summbtwotr(int size, Summ *array);

Text.cpp
Кликните здесь для просмотра всего текста
Код
#define _CRT_SECURE_NO_WARNINGS

#include "Text.h"
#include "algorithm"

int sozdanie (int* &arr)
{
	int size;
	setlocale(LC_ALL, "Russian");
	srand(time(NULL));
	printf("\tВведите число элементов массива:");
	scanf("%d", &size);
	printf("\n\n");
	delete [] arr;
	arr=new int[size];
	for (int i=0; i<size; i++)
		{
			arr[i] =rand() %9-5;
			printf("%d\t", arr[i]);
		}
	printf("\n");
	return size;
}
int sozdanie (float* &arr2)
{   
	int size;
	setlocale(LC_ALL, "Russian");
	srand(time(NULL));
	printf("\tВведите число элементов массива:");
	scanf("%d", &size);
	printf("\n\n");
	delete [] arr2;
	arr2=new float[size];
	for (int i=0; i<size; i++)
		{
			arr2[i] =(rand() % 10 -6) / float((rand() % 10 + 1));
			printf("%3.3f\t", arr2[i]);
		}
	printf("\n");
	return size;
}
int sozdanie (double* &arr3)
{   
	int size;
	setlocale(LC_ALL, "Russian");
	srand(time(NULL));
	printf("\tВведите число элементов массива:");
	scanf("%d", &size);
	printf("\n\n");
	delete [] arr3;
	arr3=new double[size];
	for (int i=0; i<size; i++)
		{
			arr3[i] =(rand() % 10 -6) / double((rand() % 10+5));
			printf("%3.6f\t", arr3[i]);
		}
	printf("\n");
	return size;
}
/////////////////////////////////////////////////////
int summnechet(int size, int* &arr)
{
	int summ=0;
	for(int i=0; i<size; i++)
	{
		summ+=arr[i];
		i++;
	}
	return summ;
}
float summnechet(int size, float* &arr2)
{
	float summ=0;
	for(int i=0; i<size; i++)
	{
		summ+=arr2[i];
		i++;
	}
	return summ;
}
double summnechet(int size, double* &arr3)
{
	double summ=0;
	for(int i=0; i<size; i++)
	{
		summ+=arr3[i];
		i++;
	}
	return summ;
}
/////////////////////////////////////////////////////
template <typedef Summ>
Summ summbtwotr(int size, Summ *array)
{
	int otric[2];
	int i;
	Summ S;
	for(i=0; i<size; i++)
	{
		if(array[i]<0)
		{
			otric[0]=i;
			break;
		}
	}
	for(i=(size-1); i>=0; i--)
	{
		if(array[i]<0)
		{
			otric[1]=i;
			break;
		}
	}
	for(i=otric[0]; i<=otric[1]; i++)
		S+=array[i];
	return S;
}


При попытке запустить сие творение - получаю кучу ошибок с необьявленными итендификаторами(хотя при убирании всего, что связано с шаблоном и новой функцией - все работает нормально) плюс основная проблема - получаю сообщения в main.cpp на 89 строке:
"template <int Summ> <error-type> summbtwotr(int size, <error-type> *array)
Error: отсутвуют экзампляры шаблон функции summbtwotr, соответствующие типу аргументов: (int, int*)"

Подскажите, пжолуйста, где я косячу с описанием шаблона? Просто побовал некоторые варианты, что находил в интернете, но получаю постоянно различные ошибки. Плюс я не совсем понимаю, как использовать шаблон в таком случае - почти все примеры идут для программ, написанных в одном файле, правильно ли я обьявляю шаблон при модульной программе?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2014, 22:25     Создание шаблонной функции для работы с массивами разных типов данных
Посмотрите здесь:

C++ Функции для работы с массивами
C++ Создать класс, в котором реализовать функции для работы с одномерными массивами
Создание функций для работы с массивами C++
C++ Создание шаблонной функции
Создание специализации шаблонной функции и задача на std::vector C++
C++ Не считает произведение разных типов данных
C++ Определить наибольшее из 3 чисел для данных разных типов
C++ Функция swap перестановки значений двух переменных для данных разных типов. Используйте template
C++ Простое создание строки из объектов разных типов данных
Используя механизм перегрузки функции, вычислить для разных типов параметров C++
Выбор IDE C++ для работы/обработки с текстовыми массивами данных C++
C++ Объяснить нюансы работы массивов разных типов в С++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
758 / 691 / 124
Регистрация: 27.07.2012
Сообщений: 1,980
Завершенные тесты: 3
24.03.2014, 11:03     Создание шаблонной функции для работы с массивами разных типов данных #2
Не typedef, а typename надо использовать в списке аргументов шаблона:
C++
1
2
template <typename Summ>
Summ summbtwotr(int size, Summ *array)
aLarman
640 / 561 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
24.03.2014, 11:07     Создание шаблонной функции для работы с массивами разных типов данных #3
Цитата Сообщение от John Prick Посмотреть сообщение
Не typedef, а typename надо использовать в списке аргументов шаблона:
даже после этого не скомплится, перенесите реализацию метода summbtwotr в .h файл
xWhoAmIx
14 / 0 / 0
Регистрация: 09.03.2014
Сообщений: 30
24.03.2014, 19:26  [ТС]     Создание шаблонной функции для работы с массивами разных типов данных #4
Спасибо! Все компилится и работает.
Yandex
Объявления
24.03.2014, 19:26     Создание шаблонной функции для работы с массивами разных типов данных
Ответ Создать тему
Опции темы

Текущее время: 16:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru