Лабораторная работа №5 (1081990), страница 2
Текст из файла (страница 2)
//using namespace std;
int main()
{
ifstream fin("input.txt", ios::in);
if (!fin)
{ cout <<" Файл input.txt не найден " << endl;
return 1;
}
int nrow,ncol;
fin>>nrow>>ncol; // ввод размерности массива
int i, j;
// выделение памяти под вспомогательный массив указателей на строки
int **a = new int *[nrow];
// выделение памяти под строки матрицы
//и инициализация вспомогательного массива указателей на строки
for(i = 0; i < nrow; i++)
a[i] = new int [ncol];
//ввод массива
for (i = 0; i < nrow; i++)
for (j = 0; j < ncol; j++)
fin >> a[i][j];
// формирование массива сумм элементов строк
int *sum = new int [nrow];
for (i =0; i < nrow; i++)
{
sum[i] = 0;
for (j = 0; j < ncol; j++)
sum[i] += a[i][j];
}
// контрольный вывод
for (i = 0; i < nrow; i++)
{
for (j = 0; j < ncol; j++)
cout << setw(4) << a[i][j] << " ";
cout << "| " << sum[i] << endl;
}
cout << endl;
int buf_sum;
int nmin, buf_a;
for (i = 0; i < nrow - 1; i++) // упорядочивание
{
nmin = i;
for (j = i + 1; j < nrow; j++)
if (sum[j] < sum[nmin]) nmin = j;
buf_sum = sum[i];
sum[i] = sum[nmin];
sum[nmin] = buf_sum;
for (j = 0; j < ncol; j++)
{
buf_a = a[i][j];
a[i][j] = a[nmin][j];
a[nmin][j] = buf_a;
}
}
for (i = 0; i < nrow; i++)
{ // вывод упорядоченной матрицы
for (j = 0; j < ncol; j++) cout <<setw(4) << a[i][j] << " ";
cout << endl;
}
return 0;
}
В программе используются две буферные переменные: buf_sum, через которую осуществляется обмен двух значений сумм, имеет такой же тип, что и сумма, а для обмена значений элементов массива определена переменная buf_a того же типа, что и элементы массива.
Как и в предыдущем примере, данные читаются из файла. Этот способ ввода является предпочтительнее стандартного ввода, поскольку при формировании файла легче продумать, какие значения лучше взять для исчерпывающего тестирования программы. В данном случае для первого теста следует подготовить массив не менее чем из четырех строк с небольшими значениями элементов для того, чтобы можно было в уме проверить, правильно ли вычисляются суммы.
Ввод размерности массива и его элементов выполняется из файла input.txt, расположенного в том же каталоге, что и программа, а результаты выводятся в файл output. txt. В программе определены объект fin класса входных файловых потоков и объект fout класса выходных файловых потоков. Файловые потоки описаны в заголовочном файле <fstream.h>. Работа с этими объектами аналогична работе со стандартными объектами cin и cout, то есть можно пользоваться теми же операциями помещения в поток << и извлечения из потока >>.
Предполагается, что файл с именем input.txt находится в том же каталоге, что и текст программы, иначе следует указать полный путь, дублируя символ обратной косой черты, так как иначе он будет иметь специальное значение:
ifstream fin("c:\\A_Worker\\input.txt", ios::in | ios::nocreate);
Обратите внимание, что для контроля вместе с исходным массивом рядом с каждой строкой выводится сумма ее элементов, отделенная вертикальной чертой.
Дополнительно следует проверить, правильно ли упорядочивается массив из одной и двух строк и столбцов, поскольку многие ошибки при написании циклов связаны с неверным указанием их граничных значений.
Основные правила работы с двухмерными массивами.
-
В массивах, определенных с помощью операторов описания, обе размерности должны быть константами или константными выражениями.
-
Массив хранится по строкам, каждая строка хранится в непрерывной области памяти.
-
Первый индекс всегда представляет собой номер строки, второй — номер столбца. Каждый индекс может изменяться от 0 до значения соответствующей размерности, уменьшенной на единицу.
-
При описании массива можно в фигурных скобках задать начальные значения его элементов.
-
Для выделения динамической памяти под массив, в котором все размерности переменные, используются циклы.
-
Освобождение динамической памяти из-под массива с любым количеством измерений выполняется с помощью операции delete [ ] А, где А – имя массива.
Рекомендации по порядку создания программы.
-
Выбрать тип и способ хранения в программе исходных данных, результатов и промежуточных величин.
-
Записать алгоритм сначала в общем виде, стремясь разбить его на простую последовательность шагов, а затем детализировать каждый шаг.
-
Написать программу. При написании программы рекомендуется:
-
давать переменным понятные имена;
-
не пренебрегать содержательными комментариями;
-
использовать промежуточную печать вычисляемых величин в удобном формате;
-
при написании вложенных циклов следить за отступами;
-
операторы инициализации накапливаемых в цикле величин задавать непосредственно перед циклом, в котором они вычисляются.
4. Параллельно с написанием программы задать тестовые примеры, которые проверяют все ветви алгоритма и возможные диапазоны значений исходных данных. Исходные данные удобнее формировать в файле (по крайней мере, при отладке), не забывая проверять в программе успешность его открытия.