вот задание
Матричная арфметика. Элементы матрицы могут быть одного типа с плавающей точкой. Для решения даннной задачи использловать шаблон базовых классов(размещение матрицы в динамической памяти и ее инициализация - конструктор,при необходимости - конструктор копирования, деструктор, заполнение матрицы значениями из файла, печать содержимого матрицы в файл) и шаблон производных классов(характеристикой строки матрицы назовем сумму ее положительных элементов, имеющих четные значения индексов, переставляя строки заданной матрицы, расположить их в соответствии с ростом характеристик)
помогите пожалуйста понять структуру программы, больно тут сложный код
и почему тут используются контейнеры
вот код
Код:
#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;
}