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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2011, 00:44   #1
Aion
Пользователь
 
Регистрация: 13.12.2008
Сообщений: 16
Сообщение хочу понять программу

вот задание

Матричная арфметика. Элементы матрицы могут быть одного типа с плавающей точкой. Для решения даннной задачи использловать шаблон базовых классов(размещение матрицы в динамической памяти и ее инициализация - конструктор,при необходимости - конструктор копирования, деструктор, заполнение матрицы значениями из файла, печать содержимого матрицы в файл) и шаблон производных классов(характеристикой строки матрицы назовем сумму ее положительных элементов, имеющих четные значения индексов, переставляя строки заданной матрицы, расположить их в соответствии с ростом характеристик)

помогите пожалуйста понять структуру программы, больно тут сложный код
и почему тут используются контейнеры


вот код

Код:
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <utility>
#include <functional>
#include <algorithm>
#include <iterator>
#include <iomanip>

using std::cin;
using std::cout;
using std::endl;


template < class Container >
void Show( Container container )
{
	for( unsigned i = 0; i < container.size(); i++ )
	{
		for( unsigned j = 0; j < container.size(); j++ ) 
			std::cout<<std::setw(5)<<std::setprecision(2)<<container[ i ][ j ];
		std::cout<<std::endl;
	}
}

template < class Container >
bool open_file( Container& container, const std::string& filename )
{
		std::ifstream in( filename.c_str(), std::ifstream::in );		
		if( !in ) return false;
		for( unsigned i = 0; i < container.size(); i++ )
			for( unsigned j = 0; j < container.size(); j++ )
				in>>container[i][j];
        in.close();	
		return true;
}

template < class Container >
void save_file( const Container& container, const std::string& filename )
{
		std::ofstream out( filename.c_str(), std::ifstream::out );			

		for( unsigned i = 0; i < container.size(); i++ )
		{
			for( unsigned j = 0; j < container.size(); j++ )
				out<<container[i][j]<<" ";
			out<<std::endl;
		}
        out.close();	
}

class SortBySumRows : public std::binary_function< std::pair<double, std::vector< double > >, std::pair<double, std::vector< double > >, bool >
{
public: bool operator()( const std::pair<double, std::vector< double > >& left_pair, const std::pair<double, std::vector< double > >& right_pair )
		{
			return left_pair.first < right_pair.first;
		}
};

template < class Container >
std::vector< std::pair<double, std::vector< double > > >
	characteristic_rows( Container massiv )
{
	std::vector< std::pair<double, std::vector< double > > > rows;

	for( unsigned i = 0; i < massiv.size(); i++ )
	{
		double sum = 0.0;
		std::vector< double > row;

		for( unsigned j = 0; j < massiv.size(); j++ )
		{
			if( massiv[ i ][ j ] >= 0.0 && j%2 == 0 ) 
				sum +=  massiv[ i ][ j ];

			row.push_back( massiv[ i ][ j ] );
		}
		rows.push_back( std::make_pair( sum, row ) );
	}

	std::sort( rows.begin(), rows.end(), SortBySumRows() );

	return rows;
}

void Show_sort_rows( const std::vector< std::pair<double, std::vector< double > > >& rows)
{
	for( unsigned i = 0; i <rows.size(); i++ )
	{
		std::cout<<"Характеристика: "<<rows[i].first<<"\t";
		for( unsigned j = 0; j < rows.size(); j++ ) 
			std::cout<<std::setw(5)<<std::setprecision(2)<<rows[ i ].second[ j ];		
		std::cout<<std::endl;
	}
}

void save_file_sort_rows( const std::vector< std::pair<double, std::vector< double > > >& rows, const char* filename )
{
	std::ofstream out( filename, std::ofstream::out | std::ios::app );		
	for( unsigned i = 0; i < rows.size(); i++ )
	{
		out<<"Характеристика: "<<rows[i].first<<"\t";
		for( unsigned j = 0; j < rows.size(); j++ ) 
			out<<rows[ i ].second[ j ]<<" ";		
		out<<std::endl;
	}
	out.close();											
}

int main()
{
	setlocale( LC_ALL, "russian" );

	std::string filename;
	cout<<"Введите имя входного файла ->";
	cin>>filename;

	std::vector< std::vector<double> > massiv( 6, std::vector< double >( 6 ) );

	if( !open_file( massiv, filename ) )
	{
		cout<<"ошибка открытия файла"<<endl;
		system("pause");
		return 0;
	}

	cout<<"Исходный массив:"<<endl;
	Show( massiv );

	std::vector< std::pair<double, std::vector< double > > > rows  = characteristic_rows( massiv );

	cout<<endl<<"Отсортированый по росту характеристик строк:"<<endl;
	Show_sort_rows( rows );

	filename.clear();
	cout<<"Введите имя выходного файла либо 0 для выхода ->";
	cin>>filename;

	if( filename == "0" ) return 0;

	std::ofstream out( filename.c_str(), std::ofstream::out | std::ofstream::app );
	out<<"Исходный массив:"<<endl;
	save_file( massiv, filename.c_str() );

	out<<endl<<"Отсортированый по росту характеристик строк:"<<endl;
	save_file_sort_rows( rows, filename.c_str() );
	out.close();

	system("pause");
	return 0;
}

Последний раз редактировалось Stilet; 03.02.2011 в 07:10.
Aion вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
хочу понять Наташа1973 Помощь студентам 1 28.01.2010 21:39
Хочу написать Программу Letnab Помощь студентам 2 16.12.2009 12:24
Помогите, не могу понять, как объяснить программе, что именно я от нее хочу Dead Romantic Общие вопросы C/C++ 4 03.12.2009 21:51
Не могу понять как отредактировать программу asale Microsoft Office Excel 1 31.01.2007 20:57