Заказать курсовые, контрольные, рефераты...
Образовательные работы на заказ. Недорого!

Линейные массивы. 
Алгоритмический язык Турбо-Паскаль

РефератПомощь в написанииУзнать стоимостьмоей работы

Если известна зависимость, по которой изменяются значения элементов массива, то присвоение значений удобно проводить в операторах цикла c параметром или с условием. Например, присвоим значения элементам массива «y» по зависимости: y=sin (x), где x= Pi * i/180, 0≤ i ≤180. For i:= 0 to 180 Do y: = sin (Pi * i/180); Таким образом в оперативной памяти отводится место не под двумерные массивы «a1… Читать ещё >

Линейные массивы. Алгоритмический язык Турбо-Паскаль (реферат, курсовая, диплом, контрольная)

Массив — упорядоченные данные одного типа. Возможно создание массива, включающего массив другого типа. Массивом часто обозначают характеристики обьектов одного типа, имеющих одинаковые единицы измерения. Массив состоит из элементов, имеющих порядковые номера, т. е. элементы массива упорядоченны. Таким образом, если обьекты одного типа обозначить именем, например «A», то элементы обьекта будут A[1], A[2] и т. д. В квадратных скобках указан номер элемента. Порядковый номер элемента массива, обычно не несет никакой информации о значении элемента, а показывает расположение элемента среди других. К элементам массива можно обращаться только по их номеру (индексу). Значения элементам массива присваиваются также как и другим переменным с учетом типа массива. Если элементы массива имеют один индекс, то массив называется одномерным или линейным, либо массив — вектор. Значения элементов одномерного массива обычно выводят на экран или бумагу в виде столбца или строки. В некоторых случаях удобно элементы массива пронумеровывать двуми независимыми индексами, такие массивы называются двумерными или матрицами. Значения элементов двумерного массива обычно выводят на экран в виде таблицы. Если элементы массива имеют три независимых индекса, то массив называется трехмерным. Значения элементов трехмерного массива обычно выводят на экран в виде набора таблиц.

Линейным массивом можно обозначить, например, оценки учеников класса. Каждая оценка является значением элемента массива оценок «A» и имеет порядковый номер (индекс). В Турбо-Паскале значение индекса указывается в квадратных скобках после имени массива. Можно создать массив фамилий «S» учеников класса. Значением элемента массива будет фамилия ученика, а индексом — порядковый номер по списку. Пусть дан список фамилий учеников и их оценки:

Если известна зависимость, по которой изменяются значения элементов массива, то присвоение значений удобно проводить в операторах цикла c параметром или с условием. Например, присвоим значения элементам массива «y» по зависимости: y=sin (x), где x= Pi * i/180, 0<= i <=180. For i:= 0 to 180 Do y[i]: = sin (Pi * i/180);

Присвоим случайные значения в диапазоне от -30 до +40 ста элементам массива «R» :

Randomize; for i:= 1 to 100 Do R[i]: = - 30 + Random (71);

Присвоим значения семи элементам массива «A» оператором Readln:

For i:= 1 to 7 Do begin Write (' Введите A[ ', i, ' ] = '); Readln (A [ i ]) end;

При выводе массива на экран удобно размещать данные в виде таблицы — в несколько колонок. Для вывода обозначений переменных («шапки таблицы») можно использовать операторы вывода символов в цикле, например:

For j:=1 to 66 do Write ('-'); Writeln;

For j:=1 to 3 do Write ('_ _ Фамилия _ _ _ оценка _'); Writeln;

For j:=1 to 66 do Write ('-'); Writeln;

— шапка для вывода в три пары колонок значений переменных «S» и «A». Шапка занимает 66 позиций (по ширине экрана в текстовом режиме размещается 79 символов и пробел). Оператор Writeln; переводит курсор на новую строчку.

Вывод значений ста элементов массивов «S» и «A» в три пары колонок, произведем операторами:

For i:= 1 to 100 do begin Write ('', s[i]: 11,'', a[i]: 8, '');

if (i mod 3) = 0 Then Writeln;

if (i mod 60) = 0 then readln end;

В этом случае данные таблицы полностью не умещаются на экране и можно задержать прокрутку экрана при выводе данных, применяя оператор Readln после вывода, например, 20 строк.

В цикле удобно определять сумму элементов массива, наибольший (наименьший) элемент и создавать новые массивы, удовлетворяющие некоторому условию, например:

s:= 0; for i:= 1 to 100 do s:= s + a[i]; { s — сумма элементов массива }.

a_max:= a[1]; for i:= 1 to 100 do { поиск наибольшего элемента a[j] }.

if a[i] > a_max then begin a_max:= a[i]; j:= i end;

j:= 0; k:= 0;

for i:=1 to 100 do {создание новых массивов с элементами: b[j] >=0, c[k] <0}.

if a[i] >= 0 then begin j:= j+1; b[j]: = a[i] end.

else begin k:= k+1; c[k]: = a[i] end;

j:= 0; k:= 8;

for i:= 1 to 100 do {создание массива номеров «M» для элементов: a[i] > a[k]}.

if a[i] > a[k] then begin j:= j+1; M[j]: = i end;

Работа с элементами переменной строкового типа.

Переменная строкового типа (String) может рассматриваться как массив элементов символьного типа (Char). Например, если в программе определены переменные.

S: string; C: char; и задано S:='Москва', то S[1]='М', S[2]='о' и т. д. и возможно присвоение, например: C:= S[1]; Таким образом строка может рассматриваться как линейный массив символов. Элементы массива, составляющие строку можно переставлять местами и получать новые слова, например:

for i:= 1 to N div 2 do begin C:= S[i]; S[i]: = S[N-i+1]; S[N-i+1]: = C end; Writeln (S);

{ исходное слово выведется справа налево: «авксоМ» }.

Здесь N:= ord (S[0]); - число символов в переменной «S» хранится в переменной S[0]. Функция «ord» преобразует символьный тип в целый. N div 2 — количество перестановок для слова из «N» символов. В переменной «C» запоминается значение i-го элемента, который меняется с элементом, симметричным относительно середины строки.

Можно производить поиск и замену заданного символа в строке, например:

for i:=1 to N do if S[i]='_' then writeln ('найден символ пробел');

for i:=1 to N do if S[i]='/' then S[i]: =''; {замена символа «/» на «» }.

Заменяя или переставляя символы в строке по определенной схеме (закону) можно зашифровать строку. Для дешифровки используется, как правило, схема обратной перестановки или замены символов. Например:

for i:=1 to N do S[i]: = chr (ord (S[i])+2); {преобразование исходных символов в символы с кодом большим на две единицы}.

Напомним, что все используемые в MS-DOS символы имеют ASCII коды от 0 до 255.

Здесь удобно также использовать функции Pred (C); и Succ (C);

Двумерные массивы Массивы, рассмотренные выше, имеют элементы, упорядоченные по одному индексу и называются одномерными массивами или векторами. Массив может быть двумерным, трехмерным и т. д. Двумерные массивы имеют элементы, упорядоченные по двум индексам и часто называются матрицами. В Турбо-Паскале при описании многомерного массива диапазоны изменения индексов перечисляются через запятые, например:

Var A: array[1.30, 1.7] of byte;

Рассмотрим пример работы с двумерными массивами.

Обозначим массивом оценки учеников класса по нескольким предметам. Каждая оценка является значением элемента массива оценок «A» и имеет порядковый номер (два индекса). Поставим в соответствие первому индексу номер фамилии в списке учеников, а второму — номер предмета, по которому получена оценка. Тогда двумерный массив оценок можно представить в виде таблицы: каждый элемент a[i, j] находится на пересечении I-ой строки и J-го столбца.

Можно создать одномерные массивы фамилий «S» учеников класса и наименований предметов «P». Значением элемента массива «Р» будет наименование предмета, а индексом — порядковый номер предмета, например:

1 — физика, 2 — химия, 3 — алгебра, 4 — геометрия, 5 — история, 6 — биология.

Массив оценок можно задать с использованием функции Random, например:

for i:= 1 to N do for j:= 1 to M do A[i, j]: = random (4)+2;

Для вывода наименований предметов (" шапка" таблицы) можно использовать операторы:

Writeln;

Write ('ФамилияПредметы:'); For i:= 1 to M do write (P[i]: 9,'_ ');

Для вывода элементов массива «A» на экран удобно использовать вложенный цикл:

for i:= 1 to N do begin writeln; write (S[i]: 19, '_ ';

for j:= 1 to M do write (A[i, j]: 7, ' _ _ ') end;

Для расчета массива «SS» — сумм «M» элементов в каждой из «N» строк массива «A» (NxM) можно применить операторы:

for i:= 1 to N do begin SS[i]: = 0;

for j:= 1 to M do SS[i]: = SS[i] + A[i, j] end;

Здесь для каждого индекса «i» от 1 до N происходит суммирование элементов A[i, j] по индексу «j» от 1 до M.

При модификации массива «A» изменяется расположение данных в исходном массиве, например, в случае вставки данных из линейного массива «B» в колонку с номером «M1» необходимо сдвинуть данные в колонках J >= M1 используя операторы:

for i:= 1 to N do begin.

for j:=M+1 downto M1+1 do A[i, j]: =A[i, j-1]; A[i, M1]: =B[i] end;

Если порядковый номер предмета изменится, то необходимо изменить расположение оценок в массиве «A», например, перестановку колонок с оценками по физике и химии можно сделать операторами:

for j:= 1 to N do begin.

a1:=A[1,j]; A[1,j]: =A[2,j]; A[2,j]: =a1 end;

Примечание: при модификации массива «A» не забудьте соответственно изменять расположение данных в сопутствующих массивах, например, «P» или «S» .

При создании новых массивов согласно некоторым условиям выбираются данные из элементов исходного массива. Например, для создания массива «В» из четных столбцов массива «A» можно использовать операторы:

for j:= 1 to M do If (j Mod 2) = 0 then.

for i:= 1 to N do B[i, j Div 2]: = A[i, j];

Для создания массива «В», состоящего из строк массива «A», удовлетворяющих условию A[i, 1] > C, где C — заданное число, можно использовать операторы:

k:= 0; for i:= 1 to N do If A[i, 1] > C then begin.

k:= k + 1; for j:= 1 to M do B[k, j]: = A[i, j] end;

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

k:= 30/S_max; { k — нормирующий масштабный коэффициент }.

{ S_max — наибольший элемент массива «SS» }.

for i:=1 to N do begin writeln; { переход к новому столбику }.

yg:=round (k*SS[i]); { yg — длина столбика гистограммы }.

for j:=1 to yg do write (#220); { вывод символа с кодом 220 }.

end;

Создание баз данных с использованием массивов записей При работе с записями можно использовать массивы в полях записи или создавать массивы записей. Приведем примеры операторов для обоих случаев.

Type Pupil = Record.

Fam: String[20]; { Фамилия }.

Name: String[10]; { Имя }.

Otmetka: array[1.5] of Byte { Отметки по пяти предметам }.

end;

Var _10_A, _10_B: array[1.30]of Pupil; {Переменные типа массив записей }.

N, i: byte; { N — Число учеников в классе }.

Begin N:= 13;

_10_A[1]. Fam:= 'Гришин';

_10_A[1]. Name:= 'Анатолий';

{ и т. д. }.

Writeln ('Введите оценки учеников по первому предмету: ');

For i:= 1 to N do begin.

With _10_A[i] do Begin.

Write (Fam:21, Name:11, '_');

Readln (Otmetka[1]).

end.

end.

end.

{———————————————————————————————— }.

Type pupil = Record { массивы в полях записи }.

Fam: array[1.30] of String[20]; { Фамилия }.

Name: array[1.30] of String[10]; { Имя }.

N: Byte; { Число учеников в классе }.

Otmetka: array[1.5, 1.30] of Byte { Отметки по пяти предметам }.

end;

Var _10_A, _10_B: Pupil; { Переменные типа запись }.

i: byte;

Begin.

With _10_A do Begin N:= 13;

Fam[1]: = 'Гришин';

Name[1]: = 'Анатолий'; { и т. д. }.

Writeln ('Введите оценки учеников по первому предмету: ');

For i:= 1 to N do begin.

Write (Fam[i]: 21, Name[i]: 11,'_');

Readln (Otmetka[1, i]).

end.

end.

end.

Работа с большими массивами Поскольку суммарный размер всех переменных, описанных в программе, не может превышать длины сегмента (64 К), то использование массивов больших размеров вызывает определенные трудности. Опишем известный способ «разбиения» двумерного массива с использованием переменных типа ссылка.

program Big_Mas;

CONST N1= 30; N2= 50;

type M1= array [1.. N1 ] of REAL; { тип M1 — массив переменных вещественного типа}.

M2= array[1.N2] of ^M1; { тип M2 — массив ссылок на начальные адреса элементов массивов типа M1}.

var a1, a2: M2; { двумерные массивы N1xN2 переменных вещественного типа }.

i, j: word;

BEGIN.

for i:=1 to N2 do New (a1[i]);{ размещение массива в оперативной памяти }.

for i:=1 to N2 do New (a2[i]);

for j:= 1 to N1 do.

for i:= 1 to N2 do begin.

a1[i]^[j]: = j + Sin (Pi*i/N2); { пример расчета значений }.

a2[i]^[j]: = j — Cos (Pi*i/N2) { элементов двумерных массивов }.

end;

for i:= 1 to N2 do Dispose (a1[i]); { освобождение оперативной памяти }.

for i:= 1 to N2 do Dispose (a2[i]);

Readln;

END.

Таким образом в оперативной памяти отводится место не под двумерные массивы «a1» и «a2» размером N1xN2, а под одномерные массивы (размером N2) адресов первых элементов линейных массивов (размером N1). Операция a1[i]^[j] (a2[i]^[j]) называется разыменование переменной (элемента массива).

Показать весь текст
Заполнить форму текущей работой