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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.10.2011, 16:36   #1
akush
Новичок
Джуниор
 
Регистрация: 01.10.2011
Сообщений: 2
По умолчанию Рандомно заполнить двумерный массив, используя шаблонную функцию

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


template<class T>
void init_mas(T &mas, int n, int m)
{srand( (unsigned)time( NULL ) );
 cout<<"da";
	mas = new float * [n];
	for(int i=0;i<n;i++)
	{
	mas[i] = new float  [m];
	for(int j=0;j<m;j++)
    mas[i][j]=rand()%(100+1+100)-100+1/(rand()%(1000+1));

	}
 
}

template<class T>
void vivod_mas(T **mas, int n, int m)
{cout << "Massive:\n\n";
	for(int i=0;i<n;i++)
	{
	for(int j=0;j<m;j++)
	cout << mas[i][j] << "\t";
	cout << "\n";
	}
	cout << "\n";
}

template<class T>
int max_v_stolbtse(T **mas, int n, int m, int k)//ищет максимум в К-ом столбце
{int max = mas[0][k];//сохраняем текущий максимум
 int i_max = 0;//сохраняем номер наибольшего элемента (максимума)
 for(int i=1;i<n;i++)
 if(mas[i][k]>max)
	{
	 max = mas[i][k];
	 i_max = i;
     }
 return i_max;//возвращаем номер наиб.элемента
}              

template<class T>
void poisk_sedlo(T **mas, int n, int m)
{cout << "Sedlovie tochki:\n\n";
 int min,i_min;//min - само значение, i_min - номер наименьшего элемента
 for(int i=0;i<n;i++)
	{
	 min = mas[i][0];
	 i_min = 0;
	 for(int k=1;k<m;k++)
	 if(mas[i][k] < min)
		{
		 min = mas[i][k];
		 i_min = k;
	    }
	 if(max_v_stolbtse(mas, n, m, i_min)==i)//если номер наибольшего элемента в столбце и номер строки совпадают, то седловая точка
		cout << min << "\n";
	}
}


int main(){
	int n,m;
   float **mas;

 cout << "Enter n,m \n";
 cin >> n >> m;
 init_mas(mas, n, m);
 cout<<"da";
 vivod_mas(mas, n, m);
 poisk_sedlo(mas, n, m);
 return 0;
}
Когда меняю float **mas на любой другой тип выдает ошибку(необходимо char **mas), то есть init_mas(T &mas, int n, int m) как шаблон не работает, подскажите как ее исправить.

Последний раз редактировалось akush; 01.10.2011 в 16:46.
akush вне форума Ответить с цитированием
Старый 01.10.2011, 19:28   #2
_kilik_
Пользователь
 
Аватар для _kilik_
 
Регистрация: 16.08.2011
Сообщений: 69
По умолчанию

У вас получается <class T> это тип**
Не проще объединить функции в класс или использовать вектор ?
Код:
#include <iostream>
#include <cstdlib>
#include <time.h>
#include <string>
using namespace std;
template<class T> class tas{
	T **mas;
public:
	void init_mas(int n, int m);
	void vivod_mas( int n, int m);
	int max_v_stolbtse( int n, int m, int k);
	void poisk_sedlo( int n, int m);

	tas(){};

};
int main(){
	int n,m;
	tas<int>test;
	tas<double>test1;
	cout << "Enter n,m \n";
	cin >> n >> m;
	test.init_mas( n, m);
	cout<<"da";
	test.vivod_mas(n, m);
	test.poisk_sedlo( n, m);
	system("pause");
	return 0;
}

template<class T> 
void tas<T>::init_mas(int n, int m){
	srand( (unsigned)time( NULL ) );
	cout<<"da";
	mas = new T * [n];
	for(int i=0;i<n;i++){
		mas[i] = new T  [m];
		for(int j=0;j<m;j++)
			mas[i][j]=rand()%(100+1+100)-100+1/(rand()%(1000+1));
	}
 }
template<class T> 
void tas<T>::vivod_mas(int n, int m){
	cout << "Massive:\n\n";
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++)
			cout << mas[i][j] << "\t";
		cout << "\n";
	}
	cout << "\n";
}

template<class T> 
int tas<T>::max_v_stolbtse( int n, int m, int k)//ищет максимум в К-ом столбце
{
	int max = mas[0][k];//сохраняем текущий максимум
	int i_max = 0;//сохраняем номер наибольшего элемента (максимума)
	for(int i=1;i<n;i++)
		if(mas[i][k]>max){
			max = mas[i][k];
			i_max = i;
		}
	return i_max;//возвращаем номер наиб.элемента
}              

template<class T> 
void tas<T>::poisk_sedlo( int n, int m){
	cout << "Sedlovie tochki:\n\n";
	int i_min;//min - само значение, i_min - номер наименьшего элемента
	T min;
	for(int i=0;i<n;i++){
		min = mas[i][0];
		i_min = 0;
		for(int k=1;k<m;k++)
			if(mas[i][k] < min)
			{
				min = mas[i][k];
				i_min = k;
			}
			if(max_v_stolbtse(n, m, i_min)==i)//если номер наибольшего элемента в столбце и номер строки совпадают, то седловая точка
				cout << min << "\n";
	}
}

Последний раз редактировалось _kilik_; 01.10.2011 в 19:32.
_kilik_ вне форума Ответить с цитированием
Старый 01.10.2011, 19:37   #3
akush
Новичок
Джуниор
 
Регистрация: 01.10.2011
Сообщений: 2
По умолчанию

классом нельзя, в задании именно шаблонная функция
akush вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
двумерный массив. вывести все строки, содержащие хотя бы один "0"(ноль) (написать через функцию в Delphi) BLADIMIR Помощь студентам 4 07.09.2011 21:24
Используя функцию, составить программу Васильева Зинаида Помощь студентам 1 18.11.2010 22:04
Массив используя функцию и процедуру. Profan4ik Помощь студентам 1 30.05.2010 14:06
как заполнить массив рандомно ronny137 Помощь студентам 9 02.05.2010 21:25
Используя функции Otr и Perim описать функцию Area Flat Помощь студентам 1 08.11.2009 22:16