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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2012, 15:57   #1
skorpionsej
Пользователь
 
Регистрация: 10.10.2012
Сообщений: 10
По умолчанию Шаблоны матрицы

Дана целочисленная прямоугольная матрица 10*14.
1) количество столбцов, не содержащих ни одного нулевого элемента.
2) максимальное и минимальное значение элементов матрицы;
3) среднее арифметическое значение элементов строк и столбцов матрицы.

Реализовал данную программу без шаблона: все вроде бы правильно
Код:
#include "stdafx.h"
#include <iomanip>
#include <iostream>
#include "conio.h"
#include "stdlib.h"
#include <time.h>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	srand (static_cast <unsigned int> (time(NULL)));
	setlocale (LC_ALL, "russian");
	const int x = 10, y = 14;
	int matrix[x][y];
	cout<< "Генерация чисел" <<endl;						 // целочисленная прямоугольная матрица  [10][14]
	for (int i = 0; i < x ; i++)
		for (int j=0; j<y; j++)
			matrix[i][j] = rand()%50;
	for (int i = 0; i < x ; i++) 
	{
		for (int j=0; j<y; j++)
		cout << setw(3) << matrix[i][j] << " ";
		cout << endl;
	}
	cout << endl;												// создали матрицу. идем дальше :)
	int min = matrix[0][0], max = matrix[0][0];					// ищем максимальное и минимальное значение элементов матрицы:
	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y; j++)
		{
			if ( max < matrix[i][j] ) max = abs( matrix[i][j] );
			if ( min > matrix[i][j] ) min = abs( matrix[i][j] );
		}
	}
	cout<<"Максимальный по модулю элемент матрицы = "<< max << endl << endl;
	cout<<"Минимальный по модулю элемент матрицы = "<< min << endl << endl;		// нашли. идем дальше :)
	float sred = 0;								 // ищем среднее арифметическое значение элементов строк и столбцов матрицы
	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y; j++)
		{
			sred += matrix[i][j];
		}
	}
	cout << "Cреднее арифметическое значение элементов = " << sred/140 << endl << endl;  // нашли. идем дальше :)
	int kolElem = 0, kolStr = 0;							// количество столбцов, не содержащих ни одного нулевого элемента
	bool flag = true;
	for (int j = 0; j < y; j++)
	{
		flag = true;
		for (int i = 0; i < x; i++)
		{
			if ( matrix[i][j] == 0)
			{
				flag = false;
			}
		}
		if (flag)
		{
			kolStr++;
		}
	}
	cout << "Количество столбцов, не содержащих ни одного нулевого элемента = " << kolStr << endl << endl;
	system ("pause");
	return 0;
}
Затем начал реализовывать шаблоны и столкнулся с грубым матом компилятора (говорит error C2783: float srednee(Type **,int,int): не удается составить аргумент шаблон для "Туре"; error C2783: int null(Type **,int,int): не удается составить аргумент шаблон для "Туре" )

Переделанный код с шаблонами:
Код:
using namespace std;

template <class Туре> // // ищем максимальное и минимальное значение элементов матрицы:
int max(class Type**m, int x, int y)
{	
	Type max = m[0][0];
	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y; j++)
		{
			if ( max < m[i][j] ) max = abs( m[i][j] );
		}
	}
	return max;
}

template <class Туре>
int min (class Type**m, int x, int y)
{	
	Type min = matrix[0][0];
	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y; j++)
		{
			if ( min > matrix[i][j] ) min = abs( matrix[i][j] );
		}
	}
	return min;
}

template <class Туре>  // ищем среднее арифметическое значение элементов строк и столбцов матрицы
float srednee (class Type**m, int x, int y)
{
	Type summ = 0;			
	Type sred;
	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y; j++)
		{
			summ += mint[i][j];
		}
	}
	sred = summ / (x * y);
	return sred;
}

template <class Туре> 	// количество столбцов, не содержащих ни одного нулевого элемента
int null (class Type**m, int x, int y)
{
	Type kolStr = 0;
	bool flag = true;
	for (int j = 0; j < y; j++)
	{
		flag = true;
		for (int i = 0; i < x; i++)
		{
			if ( mint[i][j] == 0)
			{
				flag = false;
			}
		}
		if (flag)
		{
			kolStr++;
		}
	}
	return kolStr;
}

int _tmain(int argc, _TCHAR* argv[])
{
	srand (static_cast <unsigned int> (time(NULL)));
	setlocale (LC_ALL, "russian");
	const int x = 10, y = 14;
	int mint[x][y];
	short mshort[x][y];
	char mchar[x][y];
	cout<< "Генерация чисел" <<endl;						 // целочисленная прямоугольная матрица  [10][14]
	for (int i = 0; i < x ; i++)
		for (int j=0; j<y; j++)
			mint[i][j] = rand()%50;
	for (int i = 0; i < x ; i++) 
	{
		for (int j=0; j<y; j++)
		cout << setw(3) << mint[i][j] << " ";
		cout << endl;
	}
	cout << endl;												// создали матрицу. идем дальше :)
	cout<<"Максимальный по модулю элемент матрицы = "<< max (**mint, 10, 14) << endl << endl;
	cout<<"Минимальный по модулю элемент матрицы = "<< min (**mint, 10, 14) << endl << endl;		// нашли. идем дальше :)
	cout << "Cреднее арифметическое значение элементов = " << srednee(**mint, 10, 14) << endl << endl;  // нашли. идем дальше :)
	cout << "Количество столбцов, не содержащих ни одного нулевого элемента = " << null(**mint, 10, 14)  << endl << endl;
	system ("pause");
	return 0;
}
помогите студенту
skorpionsej вне форума Ответить с цитированием
Старый 19.11.2012, 16:15   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

1) class в аргументе лишнее.
2) Всё-таки, srednee возвращает Type или float?
3) Аналогично, null возвращает Type или int?
4) Кто такие matrix из min и mint из srednee и null?
5) И как в таких условиях бедный компилятор должен догадываться о значении Type? Вот он и говорит: "извини, хозяин, чё-то я не понимаю, чему должен быть равен Type". Помогите бедняге, вызывайте методы с явным указанием параметра шаблона (например, srednee<float> или null<int>).
6) И вообще, null я бы на вашем месте не использовал - слишком близко к зарезервированной лексеме NULL.
Abstraction вне форума Ответить с цитированием
Старый 19.11.2012, 16:31   #3
skorpionsej
Пользователь
 
Регистрация: 10.10.2012
Сообщений: 10
По умолчанию

подправил, все равно что-то не так...
4) Кто такие matrix из min и mint из srednee и null?
- издержки производства )))

Код:
#include "stdafx.h"
#include <iomanip>
#include <iostream>
#include "conio.h"
#include "stdlib.h"
#include <time.h>
using namespace std;

template <Туре> // // ищем максимальное и минимальное значение элементов матрицы:
Type max(class Type**m, int x, int y)
{	
	Type max = m[0][0];
	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y; j++)
		{
			if ( max < m[i][j] ) max = abs( m[i][j] );
		}
	}
	return max;
}

template <Туре>
Type min (class Type**m, int x, int y)
{	
	Type min = m[0][0];
	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y; j++)
		{
			if ( min > m[i][j] ) min = abs( m[i][j] );
		}
	}
	return min;
}

template <Туре>  // ищем среднее арифметическое значение элементов строк и столбцов матрицы
Type srednee (class Type**m, int x, int y)
{
	Type summ = 0;			
	Type sred;
	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y; j++)
		{
			summ += m[i][j];
		}
	}
	sred = summ / (x * y);
	return sred;
}

template <Туре> 	// количество столбцов, не содержащих ни одного нулевого элемента
Type nulliv (class Type**m, int x, int y)
{
	Type kolStr = 0;
	bool flag = true;
	for (int j = 0; j < y; j++)
	{
		flag = true;
		for (int i = 0; i < x; i++)
		{
			if ( m[i][j] == 0)
			{
				flag = false;
			}
		}
		if (flag)
		{
			kolStr++;
		}
	}
	return kolStr;
}

int _tmain(int argc, _TCHAR* argv[])
{
	srand (static_cast <unsigned int> (time(NULL)));
	setlocale (LC_ALL, "russian");
	const int x = 10, y = 14;
	int mint[x][y];
	cout<< "Генерация чисел" <<endl;						 // целочисленная прямоугольная матрица  [10][14]
	for (int i = 0; i < x ; i++)
		for (int j=0; j<y; j++)
			mint[i][j] = rand()%50;
	for (int i = 0; i < x ; i++) 
	{
		for (int j=0; j<y; j++)
		cout << setw(3) << mint[i][j] << " ";
		cout << endl;
	}
	cout << endl;
	cout<<"Максимальный по модулю элемент матрицы = "<< max (**mint, 10, 14) << endl << endl;
	cout<<"Минимальный по модулю элемент матрицы = "<< min (**mint, 10, 14) << endl << endl;
	cout << "Cреднее арифметическое значение элементов = " << srednee (**mint, 10, 14) << endl << endl;
	cout << "Количество столбцов, не содержащих ни одного нулевого элемента = " << nulliv (**mint, 10, 14)  << endl << endl;
	system ("pause");
	return 0;
}
skorpionsej вне форума Ответить с цитированием
Старый 19.11.2012, 17:00   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Если "что-то не так", то сделайте "что-нибудь". Моя не телепат.
Цитата:
Помогите бедняге, вызывайте методы с явным указанием параметра шаблона (например, srednee<float> или nulliv<int>).
А, вот ещё тонкий момент:
Код:
int mint[x][y];
Этот код объявляет один блок памяти, т.е. тип mint - int*. Для получения массива массивов, вместо этого следует использовать динамическую память (либо в прототипах функций указывать Type m[][y], объявив по крайней мере y глобальной константой, но это не очень хороший способ):
Код:
int* mint[x];
for(int i=0; i<x; ++i) mint[i] = new int[y];
По идее, компилятор должен был выдать предупреждение о преобразовании типов.
Abstraction вне форума Ответить с цитированием
Старый 19.11.2012, 17:09   #5
skorpionsej
Пользователь
 
Регистрация: 10.10.2012
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
сделайте "что-нибудь". Моя не телепат
если бы знал что сделать - помощи бы не просил. сам понимаю как это должно работать. не могу реализовать, точнее что-то где-то не так написано.

Будь проклят тот день, когда я сел за баранку компилятора

Может все-таки запустите визуалку и посмотрите на что он ругается. Пальцем в небо и я тыкать умею )))
skorpionsej вне форума Ответить с цитированием
Старый 21.11.2012, 20:36   #6
skorpionsej
Пользователь
 
Регистрация: 10.10.2012
Сообщений: 10
По умолчанию

решил сам. спасибо мне))
skorpionsej вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
шаблоны InKo1 Общие вопросы C/C++ 3 05.11.2012 01:54
Шаблоны С++ Secc Помощь студентам 4 27.12.2009 17:35
Шаблоны, Си++ Нataша Помощь студентам 1 11.12.2009 01:35
C++|Циклический сдвиг матрицы|Шаблоны|Перегрузка Troi666 Помощь студентам 2 01.05.2009 14:46
Шаблоны bondik Общие вопросы C/C++ 10 04.05.2008 09:50