Формирование таблицы идентификаторов

В задании упоминаются: двумерный массив вещественного типа, количество строк (М<=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 Метка - Блок ввода числа столбцов

Алгоритм

Должен содержать следующие шаги:

  1. Открытие входного и выходного файлов. Текстовый входной файл связывается с набором данных с вещественными числами 'D:\LAB1\DATF.TXT' и открывается для чтения. Выходной файл связывается с новым набором данных 'UMNIК5.RES' (т.к. без указания пути – значит в текущем каталоге) и открывается для записи.
  2. Ввод количества строк массива. Контроль на попадание M в диапазон 2..7. Потребуется метка возврата (Vvod_M).
  3. Ввод количества столбцов массива. Контроль на попадание N в диапазон 2..7. Потребуется метка возврата (Vvod_N).
  4. Двойной цикл заполнения массива числами из файла. Запрос на ввод не требуется, так как ввод из файла. Контроль не требуется.
  5. Распечатка исходного массива. Сначала печать заголовка ("Исходный массив"), затем печать по строкам с форматом, выделяя на число 10 позиций. После печати каждой строки массива – переход на новую запись в выходном файле.
  6. Поиск столбца с минимальным элементом, запоминание его номера. Двойной цикл (по всем элементам массива), перед которым первый элемент запоминается в переменной Amin, а в переменной для номера Jmin запоминается 1.
  7. Определение признака незанятого элемента выходного массива. В качестве признака незанятого элемента выходного массива следует использовать число, которое наверняка не встречается в исходном массиве. Таким числом будет любое, меньшее чем минимальное в массиве, в частности Amin –1.
  8. Цикл заполнения выходного массива признаком незанятого места. Простой цикл присваивания M элементам массива A значения Pr.
  9. Цикл работы с "i-м" элементом сортируемого столбца:

a) Цикл расчета числа элементов, меньших "i-го". Перед циклом ki делаем равным не нулю, а единице, т.к. после подсчета числа элементов, меньших данного, его выходной номер должен стать на единицу больше этого числа.

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

  1. Печать номера сортированного столбца.
  2. Печать отсортированного массива (начинается с печати заголовка "Упорядоченный массив"), и печать одномерного выходного массива с тем же форматом, что и для входного массива.
  3. Закрытие файлов.

При оформлении лабораторной работы, алгоритм следует изобразить в форме блок-схемы.

Текст программы.

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.

Наши рекомендации