Автор работы: Пользователь скрыл имя, 07 Ноября 2009 в 13:33, Не определен
Примеры алгоритмов
N - размер массива;
A - массив размером N;
M - число позиций сдвига;
Результат: A - массив, циклически сдвинутый на M позиций вправо;
Вспомогательные переменные:
I - индекс - управляющая переменная цикла;
P - массив размером не менее N (вариант 1) для временного хранения "хвоста" массива;
P - переменная
(вариант 2) для временного
хранения элемента массива A;
Y - управляющая переменная внутреннего
цикла (вариант 2).
Вариант
1: "хвост" массива пересылается
во вспомогательный массив, остальные
элементы перемещаются вправо на M позиций.
Порядок перемещения обратный, прямой
привел бы к искажениям массива. Далее
в первые элементы массива A пересылаются
элементы вспомогательного массива. Эта
процедура повторяется М раз.
Procedure SDVIG_VAR1( n, m : integer; A : mas; var A : mas ;);
{ процедура сдвига элементов массива на m позиций по первому варианту }
Var P : mas;
begin
for i := 1 to m do
for i := n - m downto 1 do
for i := 1 to m do A [ i ] := P [ i ] ;
end;
Вариант
2. Во вспомогательную переменную
каждый раз пересылается последний элемент
массива А, затем все элементы сдвигаются
вправо на одну позицию (в обратном порядке)
и на место первого элемента помещается
содержимое вспомогательной переменной.
Procedure SDVIG_VAR2( n, m : integer; A : mas; var A : mas ;);
{ где mas должен быть описан в главной программе, см 7.1.}
{ сдвиг элементов массива на m позиций по второму варианту}
Var P : real;
begin
for i := 1 to m do
end
end;
При
сравнении двух вариантов сдвига
элементов массива на m позиций
вправо можно отметить, что в варианте
1 потребуется больше памяти, а в
варианте 2 - больше затрат времени.
10
Упорядочение Массива
Задано: массив А=(a1,a2,...an).
Требуется: расположить элементы массива А в порядке возрастания (убывания).
Существует много различных методов. Рассмотрим один из них, основанный на поиске минимального (максимального) элемента массива или его части.
Исходные данные:
N - размер массива;
A - массив размером N;
Результат:
А - массив, упорядоченный по возрастанию;
Вспомогательные переменные:
P
- переменная для хранения
K - индекс минимального элемента;
I - индекс элемента упорядоченного массива (управляющая переменная внешнего цикла);
J
- индекс элемента части массива,
Вначале
найдем минимальный элемент массива
и поменяем его местами с первым
элементом, затем определим минимальный
элемент из оставшихся элементов (кроме
первого) и поменяем его местами со вторым
элементом.
Procedure SORTIROV (n : integer; A :mas; var A : mas; var K : integer);
{ где mas должен быть описан в главной программе, см 7.1.}
{ процедура упорядочивания одномерного массива по возрастанию}
Var p : real ; i, j : integer ; { локальные переменные }
begin
for i := 1 to n - 1 do
begin P := A [ i ] ; k := i ;
for j := i + 1 to n do
If A [ i ] < P then begin P := A [ i ] ; k := j end;
A [ k ] := A [ i ] ; A [ i ] := P
end
end;
После
нахождения минимального из последних
двух элементов и размещения его на предпоследнем
месте на последнем автоматически останется
самый большой элемент.
Представленные выше несколько типовых алгоритмов работы с массивами, так же как и более сложные фрагменты программ, можно легко проверить (так называемая, безмашинная отладка программ, или "прокрутка"). Для этого задаются конкретными значениями исходных данных и выполняют операторы процедур или программ шаг за шагом, фиксируя значение переменных после каждого выполнимого оператора.
Типовые
алгоритмы оформлены в виде процедур,
которые при необходимости
Пример 1.
Упорядочить по
возрастанию одномерный массив
A размером N.
program primer_1;
const N = 5;
var A : array [ 1..N ] of real;
p : real;
i, j, k, g : integer;
begin
writeln('упорядочение массива по возрастанию');
writeln('введите элементы массива через пробел в конце ENTER ');
for i := 1 to N do read (A [ i ] ); writeln;
{ второй
вариант ввода одномерного
{ for i := 1 to N do
begin write (' введите A [', i:2 ,' ] = ' ) ; readln ( A[i] ); end;}
{ для упорядочивания массива задействуем промежуточные
переменные p - для запоминания минимального значения массива,
k - для запоминания его
for i := 1 to N - 1 do
begin
p := a [ i ] ; k := i ;
for j := i + 1 to N do
if A [ j ] < p then begin p := A[ j ]; k := j ; end;
A [ k ] := A [ i ] ; A [ i ] := p ;
end;
for i := 1 to N do
begin write( ' A [ i ] ='); writeln( A [ i ] : 8 : 5 ); end;
end.
В
следующем примере представлен
более удобный вариант
Пример 2.
Программа для
умножения сцепленных матриц A = ?aik?
размера m x n и B = ?bik? размера r x s ( матрицы
называются сцепленными, если число столбцов
первой матрицы равно числу строк второй
). Произведение AB двух сцепленных матриц
есть матрица C=?cik? размера m x s, где
cik = ? aijbjk.
program primer_2;
uses CRT;
const n = 3; m = 2; r = 3; s = 3;
type massiv = array [1..10,1..10] of real;
var a,b,c : massiv;
sum : real;
i, j, k : integer;
ch : char;
procedure VVOD_2(n,m:integer;ch:char;var a:massiv);
{ процедура ввода двумерной матрицы построчно}
begin
writeln( ' введите элементы массива ');
for i := 1 to n do
begin
for j := 1 to m do read ( A [ i , j ] );
writeln; { для перехода на новую строку}
end;
end;
procedure PRINT_MAS(n,m:integer;ch:char;
{ печать матрицы построчно }
{ n,m - размер матрицы }
{ ch - название матрицы , для обозначения при выводе }
begin
writeln(' Элементы массива ',ch);
for i := 1 to n do
begin
for j := 1 to m do write(a [ i , j ] : 8 : 2);
writeln; { для перехода на новую строку }
end;
end;
begin {---------- main ------------------}
{ В рассматриваемом примере
констант. Заметим, что лучше это сделать вводом с клавиатуры или чтени-
ем данных из файла }
VVOD_2(m,n,'A',a); { вызов процедуры VVOD_2 для ввода матрицы A }
VVOD_2(r,s,'B',b); { вызов процедуры VVOD_2 для ввода матрицы B }
{ формирование матрицы C равной произведению матриц A*B }
for i := 1 to m do
for k := 1 to s do
begin
sum := 0; { обнуление переменной для вычисления суммы }
for j := 1 to N do sum := sum + a[ i , j ] * b [ j , k ] ;
c[ i , k ] := sum;
end;
{ вывод на экран исходных
PRINT_MAS(m,n,'A',a); { m,n - размеры матрицы A }
PRINT_MAS(r,s,'B',b); { r,s - размеры матрицы B }
PRINT_MAS(m,s,'C',c); { m,s - размеры матрицы C }
end.