![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Решение. Эта задача является логическим продолжением задачи примера 4
Алгоритм Эта задача является логическим продолжением задачи примера 4. В самом деле, чтобы расположить элементы массива по такой схеме и выполнить условие задачи - упорядочить элементы в порядке возрастания, надо: 1) " растянуть" матрицу в одномерный массив; 2) упорядочить полученный массив в порядке возрастания; 3) " выбрать" из полученного одномерного массива столбцы с расположением элементов по предложенной схеме. Первый пункт этого алгоритма выполнить нетрудно, основываясь на предыдущем примере. Упорядочить полученный одномерный массив можно с помощью процедуры быстрой сортировки. Третий пункт является для нас новым. Чтобы выполнить его, надо заметить следующую закономерность. Если столбец двумерного массива имеет нечетный номер, т. е. 1-й, 3-й, 5-й и т.д., тогда элементы располагаются в порядке возрастания от 1-го элемента столбца до n-го - " сверху вниз". Если номера столбцов четные, т. е. 2-й, 4-й, 6-й и т. д., тогда элементы располагаются от n-го до 1-го - " снизу вверх". Теперь можно составить схему программы.
Схема программы Program Problem18; Описание массивов и переменных. Процедура быстрой сортировки. Begin Создание двумерного массива с помощью функции случайных чисел и одновременное " растягивание" в одномерный массив, а также вывод полученной матрицы на экран. Вызов процедуры быстрой сортировки и сортировка одномерного массива в порядке возрастания. v: = 1; - счетчик столбцов матрицы, получаемой из отсортированного одномерного массива; k: = 0; - счетчик элементов одномерного массива; Repeat if v mod 2 < > 0 then for i: = 1 to n do Begin k: = k + 1; a[i, v]: = b[k] End Else for i: = n downto 1 do Begin k: = k + 1; a[i, v]: = b[k] end; v: = v + 1 until v = m + 1; Вывод массива на экран. end. Program Problem18; uses WinCrt; const n = 5; m = 6; type s = array [1..m] of integer; t = array [1..n] of s; f = array [1..n*m] of integer; var a: t; b: f; i, j, k, v: integer; {----------------------------------------------------------------------------------------} Procedure create_two(n, m: integer; var a: t); var i, j: integer; begin writeln('Заданный двумерный массив целых чисел'); randomize; for i: = 1 to n do Begin for j: = 1 to m do Begin a[i, j]: = random(201) - 100; write(a[i, j]: 6, ' ') end; writeln End End; {----------------------------------------------------------------------------------------} Procedure sprain(n, m: integer; a: t; var b: f); var k, i, j: integer; begin k: = 0; for i: = 1 to n do for j: = 1 to m do Begin k: = k + 1; b[k]: = a[i, j] end End; {----------------------------------------------------------------------------------------} Procedure fast(q, p: integer; var b: f); var s, l, r: integer; begin l: = q; r: = p; s: = b[l]; repeat while (b[r] > = s) and (l < r) do r: = r - 1; b[l]: = b[r]; while (b[l] < = s) and (l < r) do l: = l + 1; b[r]: = b[l] until l = r; b[l]: = s; if q < l - 1 then fast(q, l - 1, b); if l + 1 < p then fast(l + 1, p, b) End; {----------------------------------------------------------------------------------------} Begin create_two(n, m, a); sprain(n, m, a, b); fast(1, n*m, b); for i: = 1 to n*m do write(b[i], ' '); writeln; v: = 1; k: = 0; repeat if v mod 2 < > 0 then for i: = 1 to n do Begin k: = k + 1; a[i, v]: = b[k] end Else for i: = n downto 1 do begin k: = k + 1; a[i, v]: = b[k] end; v: = v + 1 until v = m + 1; writeln('Массив расположения элементов по схеме'); for i: = 1 to n do Begin for j: = 1 to m do write(a[i, j]: 6, ' '); writeln end end.
|