Формирование таблицы идентификаторов
В задании упоминаются: двумерный массив вещественного типа, количество строк (М<=7), количество столбцов (N<=7), входной текстовый файл, номер столбца с минимальным элементом, одномерный массив вещественного типа. Кроме того, так как придется перебирать элементы двумерного массива, потребуется использовать текущий номер строки (i) и текущий номер столбца (j) элемента массива, а при поиске минимального элемента – использовать переменную для найденного минимума.
Сортировка пересчетом потребует заводить счетчик (ki) числа элементов, меньше рассматриваемого "i-го" элемента сортируемого столбца, признак незанятого места в выходном массиве (Pr), дополнительные счетчики в циклах перебора элементов при подсчете и записи (i1, i2). Еще можно упомянуть имя программы и выходного файла для результатов.
На основании перечисленных объектов таблица будет содержать:
Таблица 19. Идентификаторы программы 31 варианта
Имя | Тип | Р-р,байт | Назначение |
SortNum | Имя программы | - | Сортировка столбца пересчетом |
A | Веществ.массив | Исходный массив | |
B | Веществ.массив | Упорядоченный (выходной) массив | |
M | Целое | Количество строк (длина столбца) | |
N | Целое | Количество столбцов (длина строки) | |
Jmin | Целое | Номер строки с минимальным элементом | |
Fin | Текстовый файл | Файл с исходными числами | |
Fout | Текстовый файл | Файл с результатами работы | |
i | Целое | Текущий номер строки | |
j | Целое | Текущий номер столбца | |
Amin | Вещественное | Копия минимального элемента массива | |
ki | Целое | Число элементов массива < текущего | |
Pr | Вещественное | Признак незаполненного элемента | |
i1 | Целое | Вспомогательный счетчик перебора | |
i2 | Целое | Вспомогательный счетчик перебора | |
Vvod_M | Метка | - | Блок ввода числа строк |
Vvod_N | Метка | - | Блок ввода числа столбцов |
Алгоритм
Должен содержать следующие шаги:
- Открытие входного и выходного файлов. Текстовый входной файл связывается с набором данных с вещественными числами 'D:\LAB1\DATF.TXT' и открывается для чтения. Выходной файл связывается с новым набором данных 'UMNIК5.RES' (т.к. без указания пути – значит в текущем каталоге) и открывается для записи.
- Ввод количества строк массива. Контроль на попадание M в диапазон 2..7. Потребуется метка возврата (Vvod_M).
- Ввод количества столбцов массива. Контроль на попадание N в диапазон 2..7. Потребуется метка возврата (Vvod_N).
- Двойной цикл заполнения массива числами из файла. Запрос на ввод не требуется, так как ввод из файла. Контроль не требуется.
- Распечатка исходного массива. Сначала печать заголовка ("Исходный массив"), затем печать по строкам с форматом, выделяя на число 10 позиций. После печати каждой строки массива – переход на новую запись в выходном файле.
- Поиск столбца с минимальным элементом, запоминание его номера. Двойной цикл (по всем элементам массива), перед которым первый элемент запоминается в переменной Amin, а в переменной для номера Jmin запоминается 1.
- Определение признака незанятого элемента выходного массива. В качестве признака незанятого элемента выходного массива следует использовать число, которое наверняка не встречается в исходном массиве. Таким числом будет любое, меньшее чем минимальное в массиве, в частности Amin –1.
- Цикл заполнения выходного массива признаком незанятого места. Простой цикл присваивания M элементам массива A значения Pr.
- Цикл работы с "i-м" элементом сортируемого столбца:
a) Цикл расчета числа элементов, меньших "i-го". Перед циклом ki делаем равным не нулю, а единице, т.к. после подсчета числа элементов, меньших данного, его выходной номер должен стать на единицу больше этого числа.
b) Поиск места в выходном массиве, для рассматриваемого элемента. Если найденное место уже занято, следует двигаться дальше по массиву, пока не встретится незанятое место. Этот процесс необходим, если в сортируемом ряду несколько одинаковых чисел, претендующих, на одно и тоже место.
- Печать номера сортированного столбца.
- Печать отсортированного массива (начинается с печати заголовка "Упорядоченный массив"), и печать одномерного выходного массива с тем же форматом, что и для входного массива.
- Закрытие файлов.
При оформлении лабораторной работы, алгоритм следует изобразить в форме блок-схемы.
Текст программы.
PROGRAM SortNum;
{ Программа Лабораторной работы N 5
Вариант N 31.
А.Я.Умненькая, ст. гр. Я-007 }
VAR
M,N,Jmin,i,j,i1,ki : integer;
Amin,Pr : real;
A : array [1..7,1..7] of real;
B : array [1..7] of real;
Fin,Fout : text;
LABEL
Vvod_M, Vvod_N;
BEGIN
{ Открытие входного и выходного файлов }
assign(Fout,'UMNIK5.RES');
rewrite(Fout);
assign(Fin,'D:\LAB1\DATF.TXT');
reset(Fin);
{ Ввод количества строк массива }
Vvod_M:
writeln ('Введите число строк массива');
readln(M);
if (M < 2) or (M > 7) then
begin
writeln('Недопустимое значение!');
goto Vvod_M;
end;
{ Ввод количества столбцов массива }
Vvod_N:
writeln ('Введите число столбцов массива');
readln(N);
if (N < 2) or (N > 7) then
begin
writeln('Недопустимое значение!');
goto Vvod_N;
end;
{ заполнение массива числами из файла }
for i:=1 to M do
for j:=1 to N do
read(Fin,A[i,j]);
{ Закрытие входного файла }
close(Fin);
{ Распечатка исходного массива }
Writeln(Fout,' Исходный массив из ',M,'x',N,
' элементов');
for i:=1 to M do
begin
for j:=1 to N do
Write(Fout,A[i,j]:8:2); {печать текущей строки }
Writeln(Fout);
end;
Writeln(Fout);
{ Поиск столбца с минимальным элементом }
Amin := A[1,1];
Jmin := 1;
for i:=1 to M do
for j:=1 to N do
if A[i,j] < Amin then
begin
Amin := A[i,j];
Jmin := j;
end;
{ Определение признака незанятого места }
Pr := Amin - 1.0;
{ Очистка выходного массива }
for i:=1 to M do B[i] := Pr;
{ сортировка "Jmin-го" столбца в выходной файл пересчетом }
for i:= 1 to M do
begin
ki := 1;
for i1:=1 to M do
if A[i1,Jmin] < A[i,Jmin] then ki := ki+1;
{ сдвиг дальше, если элемент уже занят }
while B[ki] <> Pr do ki := ki+1;
B[ki] := A[i,Jmin];
end;
{ Печать номера столбца c минимальным элементом }
Writeln(Fout,'Результаты работы':30);
Writeln(Fout);
Writeln(Fout,' Минимальный элемент находится в ',
Jmin,' столбце');
{ Печать отсортированного массива }
Writeln(Fout,'Сортированный массив':30);
for i:=1 to M do
Write(Fout,B[i]:8:2);
Writeln(Fout);
{ Закрытие выходного файла }
close(Fout);
END.