Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
№___230105__ МУ_лаб и пр_ОАиП_часть первая.docx
Скачиваний:
4
Добавлен:
26.04.2019
Размер:
383.97 Кб
Скачать

Краткие теоретические сведения

Рассмотренные массивы – одномерные, то есть такие, у которых компоненты – скаляры. Разрешено объявлять массивы массивов (матрицы).

const N_Max = 5;

M_Max = 6;

Type Matrix = array [ 1 .. N_Max , 1 .. M_max] of Real;

Type Matr_Sqr = array [ 1..N_Max, 1 .. N_Max ] of Real;

var a: Matrix; {матрица n x m}

aij – j-ый элемент i- ойстроки матрицы

b : Matr_Sqr; {квадратная матрица}

Другое описание двумерного массива (вектор векторов) выглядит следующим образом:

const n = 5; m = 6; {объявление матрицы размером n x m}

Type Vector = array [1..m] of Real;

Matrix = array [1..n] of Vector;

var a: Vector;

b

Расположение матрицы в памяти компьютера

1строка( m элементов) 2 строка (m элементов)

: Matrix;

Первый вариант описания матрицы более наглядный, так как позволяет сразу определить размеры «таблицы», в которой будут храниться данные.

Замечание: рекомендуется описывать массивы, используя раздел констант и типов для быстрого изменения не только описания, но и для минимальных исправлений по дальнейшему тексту программы

В многомерных массивах (количество измерений формально не ограничено) каждое измерение не зависит от остальных, поэтому можно объявлять массивы с разными индексами:

Var M: Array [ -10..10, ‘A’ .. ‘D’, Boolean ] of Byte;

Эквивалентная запись выглядит следующим образом:

Var M: Array [ -10..10 ] of

Array [‘A’ .. ‘D’] of

Array [Boolean] of Byte;

Тип элемента массива М зависит от числа указанных в нем индексов:

M[0] – массив-матрица типа Array [‘A’..’D’, Boolean] of Byte;

M[0,’A’] – вектор типа Array [ Boolean ] of Byte;

M[0,’A’, True] – значение типа Byte.

При таком описании массивов необходимо помнить о совместимости типов при выполнении операции присваивания.

Type ArrayBType = Array [ Boolean ] of Byte;

ArrayCType = Array [‘A’ .. ‘D’ ] of ArrayBType;

ArrayMType = Array [-10 .. 10] of ArrayCType;

Var B,А: ArrayBType;

C: ArrayCType;

M: ArrayMType;

Begin

M[0] := C;

B := M[0,’A’];

A := B;

End.

В Turbo Pascal’e разрешается записывать индексы не только через запятую, но и отдельно:

M[ 0, ’A’, True ] тождественно M[0] [’A’] [True]

В памяти компьютера массивы располагаются последовательно (первая строка, вторая строка и т.д.), быстрее всего изменяется самый «дальний» индекс, если их несколько. Для определении стартового значения массива (в разделе констант) необходимо задавать значения так, как они будут располагаться в памяти (без учета скобок):

Type Dim1x5 = Array [ 1 .. 5] of Real;

Dim4x3x2 = Array [ 1 .. 4, 1 .. 3, 1 .. 2] of Byte;

Const D1x5 : Dim1x5 = ( 2.6, 7.9, -67.99, 3.89, 3.89e-06 );

D4x3x2 : Dim4x3x2 = ( ( (1,2), (3,4), (5,6) ),

( (34,56), (23,89), (24,76) ),

( (12,3), (25,67), (56,45) ),

( (90,56), (125,59), (66,99) ) );

При задании структур типа Array of Char, базирующихся на символах, можно не перечислять символы, а слить их в одну строку соответствующей длины

Const CharArray: Array[1 .. 10] oh Char =’abcdefghlk’;

Замечание: Тип можно формировать прямо в описании переменной, но предпочтительнее использовать введенное ранее имя этого типа.

При компиляции программы Turbo Pascal контролирует принадлежность индекса указанному диапазону (по умолчанию ключ компилятора установлен в положение {$R+}) и в случае нарушения границ диапазона программа прерывается с выдачей сообщения об ошибке 201 ( Range Check Error ). В режиме компиляции {$R-} никаких проверок не производиться и некорректное значение индекса извлечет какое-нибудь значение, не принадлежащее данному массиву. Поэтому при отладке программы необходимо использовать ключ {$R+}, а при эксплуатации {$R-}, в это несколько уменьшает размер Exe-файла и время его выполнения.

Адрес начала массива в памяти соответствует адресу его первого элемента (элемента с минимальными значениями индексов).

Замечание: Работа с элементами массива занимает больше времени, чем со скалярной переменной (необходимо вычислять местоположение элемента в памяти). Поэтому, если какой-то элемент массива используется многократно, то его лучше переписать в скалярную переменную

Вывод двумерных массивов.

{Ввод матрицы по строкам }

for i = 1 to n do Begin

for j := 1 to m do

Real(a[i,j]);

ReadLn;

End;

{ Лучше ввод матрицы организовать так: }

WriteLn(‘Введите элементы матрицы:’);

for i := 1 to n do begin

WriteLn( ‘Введите элементы ‘,i,’-ой строки матрицы’);

for j := 1 to m do Begin

Write( ‘a[‘, i, ‘,’ , j,’] = ’);

ReadLn(a[i,j]);

End;

End;

{Вывод матрицы по строкам }

Writeln(‘Результирующая матрица’);

for i := 1 to n do begin

for j := 1 to m do Write(a[i,j], ‘_‘);

WriteLn;

end;

Базовые алгоритмы обработки матриц

Сумма элементов матрицы

S := 0;

for i := 1 to n do

for j := 1 to m do

S := S + a[i,j];

Сумма элементов под главной диагональю (диагональ учитывается)

S := 0;

for i := 1 to n do

for j := 1 to i do

S := S + a[i,j];

Сумма элементов над главной диагональю (диагональ учитывается)

S := 0;

for i := 1 to n do

for j := i to n do

S := S + a[i,j];

Сумма над побочной диагональю

S := 0;

for i := 1 to n do

for j := 1 to n-i+1 do

S := S + a[i,j];

Сумма под побочной диагональю

S := 0;

for i := 1 to n do

for j := n-i+1 to n do

S := S + a[i,j];

Сумма элементов над главной и побочной диагоналями

S := 0;

for i := 1 to (n+1) div 2 do

for j := 1 to n-i+1 do

S := S + a[i,j];

Сумма под главной и побочной диагоналями

S := 0;

for i := n div 2 +1 to n do

for j := n-j+1 to i do

S := S + a[i,j];

Сумма слева от главной и побочной диагоналей

S := 0;

for i := 1 to (n+1) div 2 do

for j := 1 to n-i+1 do

S := S + a[i,j];

Сумма справа от главной и побочной диагоналей

S := 0;

for i := n div 2 +1 to n do

for j := n-j+1 to i do

S := S + a[i,j];

Сумма элементов главной диагонали

S := 0;

for i := 1 to n do S := S + a[i,i];

Сумма элементов побочной диагонали

S := 0;

for i := 1 to n do S := S + a[i,n-i+1];

Транспонирование матрицы

var a: array [1..n,1..m] of <T>; {T – заданный тип}

b: array [1..m,1..n] of <T>;

...

Begin

for i := 1 to n do

for j := 1 to m do

b[i,j] := a[j,i];

End.

Умножение матриц ( A(n x m) x B(m x l) = C(n x l))

For i:=1 to n do

For j:=1 to m do begin

c[i,j]:=0;

For k:=1 to l do c[i,j]:=c[i,j]+a[i,k]*b[k,j]

End;

Лабораторная работа №6(2 часа)

Тема: Составление и запись алгоритмов для вычисление суммы элементов строк (столбцов) двумерного массива, нахождение минимального элемента в виде программы.

Цель: Приобрести навыки составления и анализа алгоритмов обработки элементов двумерного массива.

Задание: Разработать алгоритм решения задачи согласно варианту(см. практическую работу №4), представить его в виде программы на языке программирования Turbo Pascal.

Лабораторная работа №7(2 часа)

Тема: Компиляция и тестирование программы (См. лаб. раб. №6) вычисления суммы элементов строк (столбцов) двумерного массива, нахождение минимального элемента.

Цель: Приобрести навыки проведения компиляции и тестирования программы.

Задание: Провести компиляцию и тестирование программы, разработанной в ходе выполнения лабораторной работы №6.

Практическая работа №6 (2 часа)

Тема: Составление и запись алгоритмов с использованием строковых типов данных в виде блок-схемы.

Цель: Изучить строковый тип переменных. Приобрести навыки работы с основными функциями обработки строковых переменных, составления и записи алгоритмов с использованием строковых типов данных в виде блок-схемы.

Задание: Разработать алгоритм решения задачи согласно полученному варианту, реализовать разработанный алгоритм в виде блок-схемы.

Вариант 1. Дана последовательность из 50 символов. Найти слова, у которых первая буква слова входит в слово хотя бы еще раз.

Вариант 2. Дана последовательность из 50 символов. Найти слова, имеющие одинаковые последние буквы.

Вариант 3. Дана последовательность из 50 символов. Проанализировать все слова, выделить среди них только слова нечетной длинны. Из средних букв этих слов составить новое слово.

Вариант 4. Дана последовательность из 50 символов. Проанализировать первое слово последовательности символов, выделить его вторую букву. Подсчитать сколько раз выделенная буква встречается в каждом из других слов этой последовательности символов.

Вариант 5. Дана последовательность из 32 символов. Проанализировать слова введенной последовательности символов. Среди пар ai и bi, где ai - первая, bi - последняя буквы i-го слова последовательности определить наиболее часто встречающуюся пару.

Вариант 6. Дана последовательность из 40 символовПреобразовать слова последовательности таким образом: у всех слов поменять местами последние и первые буквы.

Вариант 7. Дана последовательность из 40 символов русского алфавита. Напечатать те слова последовательности, которые оканчиваются на гласную букву.

Вариант 8. Дана последовательность из 40 символов русского алфавита. Определить слова последовательности, которые имеют максимальную длину.

Вариант 9. Дана последовательность из 40 символов русского алфавита. Определить слова последовательности, у которые нет повторяющихся букв.

Вариант 10. Дана последовательность из 40 символов русского алфавита. Преобразовать слова последовательности таким образом: если слово нечетной длины, то заменить его среднюю букву пробелом.