/*
Написать программу на языке С++. В программе предусмотреть диалог,
откуда будут вводится элементы исходной матрицы – с клавиатуры или из
текстового файла. Результаты выводить на экран и в результирующий
текстовый файл. Матрицу выводить до и после преобразований.
ЗАДАНИЕ:
В матрице Р(n,m) найти строку с максимальной суммой элементов и
поэлементно поменять ее с первой строкой.
*/
/*
codeby.net
Autor: DarkKnight125 (Denis Goncharov)
*/
#include <iostream>
#include <iomanip>
#include <fstream>
#include <time.h>
using namespace std;
void main(void)
{
setlocale (LC_ALL,".1251"); //Установим локаль в 1251-кодовую станицу
char filename_in[128]={0}; //Имя входного файла
char filename_out[128]={0}; //Имя выходного файла
ofstream file_out; //Дескриптор выходного файла
ifstream file_in; //Дескриптор входного файла
int **Arr; //Наша матрица
int n,m; //Размерность матрицы
//Диолог с пользователем
int InitSelection = 0;
cout << "Выберите вариант загрузки данных : " << endl;
cout << "\t<0>: Загрузка из файла" << endl;
cout << "\t<1>: Сгенерировать генератором случ. величины" << endl;
cout << "Выберите: ";
cin >> InitSelection; //Выбор пользователя
cin.ignore(); //Уберем из потока ввода символ возрата корретки
cout << endl;
switch (InitSelection)
{
case 0: //Если выбор загрузка из файла
cout << "Введите имя файла (входного) : ";
cin.getline(filename_in, 127); //Получим имя файла (127-символов максимум)
file_in.open(filename_in,ios::beg); //Откроем файл
if (!file_in) //Если файла не существует выведим сообщение о ошибке и выйдем из программы
{
cout << "Ошибка: файл <" << filename_in << "> - не найден" << endl;
return;
}
//Если файл есть то
file_in >> n >> m; //Прочтем размерность массива
Arr = new int*[n]; //Выделим память под строки матрицы
for (int i =0; i< n; i++)
{
Arr[i] = new int[m];
for (int j = 0; j<m && !file_in.eof(); j++)
file_in>>Arr[i][j];
}
file_in.close();
break;
case 1: //Если матрица генерируется случ. величинами
srand(time(NULL)); //Инициализация генератора случ. величины
cout << "Введите размерность матрицы через пробел (n m) : ";
cin >> n >> m;
cin.ignore(); //Уберем из потока ввода символ возрата корретки
Arr = new int*[n]; //Выделим память под строки матрицы
//Заполним матрицу случ. величинами
for (int i = 0; i<n; i++)
{
Arr[i] = new int[m]; //Выделим память под столбцы
for (int j = 0; j<m; j++)
Arr[i][j] = rand()%1000 * (rand()%2?-1:1); //Генерация случ. значение [-999,999]
}
cout<< "Генерация значений завершена" <<endl;
break;
default:
cout << "Ошибка: Не верно введен параметр ввода данных" << endl;
return;
}
int IndexMaxStr = -1; //Индекс строки с макс. суммой элементов
int MaxSum = numeric_limits<int>::min();
cout << endl << "Матрица размерностью "<< n<< "x"<< m<< endl;
//Выведим матрицу на экран и найдем сразу строку с макс суммой элементов
for (int i =0; i<n; i++)
{
int SumTemp = 0;
for (int j = 0; j<m; j++)
{
cout<<setw(5)<<Arr[i][j]; //Вывод элемента на экран
//Находим сумму текущей строки
SumTemp += Arr[i][j];
}
//Проверим сумму на максимальную
if (SumTemp > MaxSum)
{
IndexMaxStr = i;
MaxSum = SumTemp;
}
cout << endl;
}
//Теперь меняем эту строку с первной
for (int i = 0; i<m; i++)
{
int Temp = Arr[IndexMaxStr][i];
Arr[IndexMaxStr][i] = Arr[0][i];
Arr[0][i] = Temp;
}
//Получим имя выходного файла
cout << "Введите имя файла (Выходного) : ";
cin.getline(filename_out, 127); //Получим имя файла (127-символов максимум)
file_out.open(filename_out,ios::beg); //Откроем файл
if (!file_out) //Если файла не существует выведим сообщение о ошибке и выйдем из программы
{
cout << "Ошибка: файл <" << filename_out << "> - не возможно создать" << endl;
return;
}
//Запишим в файл размерность матрицы
file_out<<n<<" "<<m;
//Теперь выведим еще раз массив после замены, и запишим его в файл
cout << endl << "...После замены строк..."<< endl;
for (int i =0; i<n; i++)
{
for (int j = 0; j<m; j++)
{
cout<<setw(5)<<Arr[i][j]; //Вывод элемента на экран
file_out<<" "<<Arr[i][j]; //Запишим в файл
}
cout << endl;
}
//Почистим за собой память
for (int i = 0; i<n; i++)
delete[] Arr[i];
delete[] Arr;
file_out.close();
}