лабораторные на Pasca (Кудрявцев)l
.pdf83
Лабораторная работа № 8
МАССИВЫ
Массив – это структурированный тип данных, состоящий из фик- сированного числа элементов, имеющих один и тот же тип. Эле- ментами массива могут быть данные любого, но только одного ти- па, включая структурированные. Число элементов массива фикси- руется при описании и в процессе выполнения программы не меня- ется. Доступ к каждому отдельному элементу осуществляется пу- тем индексирования элементов массива. Индексы представляют со- бой выражения любого скалярного типа, кроме вещественного. Тип индекса определяет границы изменения значений индекса.
Для описания массивов используется зарезервированное слово
Array of.
Пример описания массивов различной размерности:
Cons t
Min = 10; Мах = 25;
Type
MassivA = Array [1..100] of Real; MassivB = Array [1..20, 1..50] of Integer;
MassivO = Array [1..10, 1..20, 1..30] of Char;
Var
a:MassivA;
b:MassivB;
o:MassivC;
Mas: Array [1..Min, 1..Max] of Char;
Как видно из примера, массив может быть описан без представ- ления типа в разделе описания типов данных. Однако, если исполь-
зовать описание
Var
a; Array [1..5] of Real; b: Array [1..5] of Real;
84 |
Лабораторная работа № 8 |
|
|
то переменные а и b считаются в Turbo Pascal переменными разных типов. Для обеспечения их совместимости необходимообъявить их так:
Type
Massiv = Array [1..5] of Real;
Var
a,b: Massiv;
При индексации компонентов (элементов) массива надо соблюдать лишь два требования: во–первых, диапазон не должен принад- лежать типу Longlnt, т.е. он обязан «уместиться» максимум в типе Word, а, во–вторых, произведение количества компонентов массива, задаваемое диапазоном индексов, на размер компонента в байтах не может превышать 65520 байт.
В общем случае ничто не обязывает объявлять диапазон индекса числами. В качестве индексов можно использовать любые перечис- лимые типы, как встроенные, так и вводимые. Индексы могут зада- ваться по–прежнему диапазоном, а если диапазон соответствует всему типу, то можно вместо него просто записать имя этого пере- числимого типа:
Type
MonthType = (January, February, March, April, May); ComplectType = Array [MonthType] of Word; SpringType = Array [March..May] of Word;
Var
Complect: СompleсtType; |
{5 элементов типа Word} |
Spring: StringType; |
{3 элемента типа Word} |
Alpha: Array['A'..'z'] of Char; |
{52 символа} |
Switch: Array [Boolean] of Byte; |
{2 элемента} |
Элементы массивов будут индексироваться значениями заданных перечислимых типов или их диапазонов: Complect[January] – пер- вый, a Spring[May] – последний элементы в своих массивах.
При описании многомерных массивов количество измерений фор- мально не ограничено. Каждое измерение не зависит от остальных, и можно объявлять массивы с разными индексами:
Var
m: Аггау[–10..0, 'А'..'С', Boolean] of Byte;
Массивы |
85 |
|
|
Turbo Pascal позволяет записывать индексы не через запятую, а как
бы изолированно
m[–3, 'B', True] эквивалентно m[–3]['В'][True].
Следует помнить, что, если индекс элемента массива задается кон- стантой, то скорость обращения к нему будет максимальной, пото-
му что компилятор в этом случае вычислит расположение элемента еще на этапе компиляции программы.
Действия над массивами. Для работы с массивом как единым це-
лым используется идентификатор массива без указания индекса в квадратных скобках. Массив может участвовать только в операциях отношения «равно», «не равно» и в операторе присваивания. Мас- сивы, участвующие в этих действиях, должны быть идентичны по структуре, т.е. иметь одинаковые типы индексов и одинаковые ти- пы компонентов. Например, если массивы а и b описаны как
Var
a, b: Array[1..20] of Real;
то применение к ним допустимых операций даст следующий ре- зультат:
Выражение
А= В
А<> B
А:= В
Результат
Равен True, если значение каждого элемента масси- ва А равно соответствующему значению элемента массива В.
Равен True, если хотя бы одно значение элемента массива А не равно значению соответствующего элемента массива В.
Все значения элементов массива В присваиваются соответствующим элементам массива А. Массив В не меняется.
Действия над элементами массивов. Индексированные элементы массива называются индексированными переменными и могут быть использованы, как и простые переменные, т.е. они могут на- ходиться в выражениях в качестве операндов, использоваться в
86 |
Лабораторная работа № 8 |
|
|
операторах for, while, repeat, входить в качестве параметров в про-
цедуры read[ln], write[ln].
Инициализация массива заключается в присваивании каждому эле- менту массива одного и того же значения соответствующего базо- вого типа. Это можно сделать, записав группу операторов присваи- вания. Например,
а[1] := 0; а[2] := 0; а[3] := 0; а[4] := 0; а[5] := 0;
Однако гораздо удобнее получить этот же результат, использовав оператор for:
for i :=1 to 5 do a[i] :=0;
Для инициализации двумерного массива используют вложенный оператор for:
for i := 1 to n do
for j := 1 to m do b[i, j] := 0;
Значения элементам массива можно присваивать с помощью опе- ратора присваивания, как в примере инициализации, однако чаще всего они вводятся с экрана с помощью процедуры read[ln] c ис- пользованием оператора for:
for i := 1 to n do readln(a[i]);
Значения двумерного массива вводятся с помощью вложенного оператора for:
for i := 1 to n do
for j := 1 to n do begin write('b[', i, ',' , j, ']='); readln(b[i, j]);
end;
Если значения элементов могут принимать произвольные значения, используют датчик случайных чисел:
Randomize; |
|
for i := 1 to n do |
|
a[i] := random(100); |
{целые числа 1..100} |
или для двумерногомассива
Массивы |
87 |
|
|
Randomize;
for i := 1 to n do
for j := 1 to m do
b[i, j] := random(10); {вещественные числа из диапазона 1..10}
Вывод значений элементов массива выполняется аналогичным об- разом, но используется процедура write[ln]:
for i := 1 to n do for j := 1 to m do
writeln('b['i,',', j,']=', b[i, j]:8:4);
Копированием массивов называется присваивание значений всех элементов одного массива всем соответствующим элементам дру- гого массива. Копирование можно выполнить одним оператором присваивания:
d := а;
или с помощью оператора for:
for i := 1 to n do d[i] := a[i];
Поиск в массиве каких–либо элементов, удовлетворяющих неко- торым известным условиям, осуществляют, вводя дополнительную переменную k и используя операторы for и If:
k := 0;
for i := 1 to n do
if a[i] := 0 then k := k + 1;
Программа определяет число элементов массива а, имеющих нуле- вое значение. Перестановка значений элементов массива осу- ществляется с помощью дополнительной переменной того же типа, что и базовый тип массива. Например, требуется поменять значе- ния первого и пятого элементов массива а:
vs := а[5]; а[5] := а[1]; а[1] := vs;
88 |
Лабораторная работа № 8 |
|
|
КОНТРОЛЬНЫЕ ЗАДАНИЯ
1. Составить программу, которая, сформировав с помощью датчика случай- ных чисел одномерный массив данных, подсчитывает следующие выражения:
1)y = x11 + x22 +K+ xnn ;
2)y = x1x1 + x2x2 +K+ xn xn ;
3)y = 

x1 × x2 ×K× xn ;
4)y = x1 − x2 + x3 −K+ xn−1 − xn ;
5)y = x1xn + x2 xn−1 +K+ xn x1;
6)y = (x1 + x2n )(x2 + x2n−1 )K(xn + xn+1 );
7) |
y = xn (xn + xn−1 )(xn + xn−1 + xn−2 )K(xn +K+ x1 ); |
||||
8) |
y = |
x1 + x2 +K+ xn |
+ |
x2 +K+ xn |
+K+ xn ; |
n |
|
||||
|
|
|
n -1 |
||
2. В случайной последовательности x1, x2 ,K, x3n каждая тройка чисел описы-
вает координаты центра и радиус круга. Существует ли изолированный круг, который не пересекается другими?
3. В случайной последовательности x1, x2 ,K, x2n – пары соседних членов х2k-1
и х2k, описывают концы отрезков. Накрывают ли полностью эти отрезки от-
резок [хmin , хmax] ?
4. Даны действительные числа x, y1, y2, ¼, y100 (y1 < y2 < ¼< y100, y1 < x < y100). Найти натуральное k, при котором yk−1 < x ≤ yk .
5. Даны n и a1,a2 ,K, an (n > 3); ai – результат i–го спортсмена в беге на 100 м. Сформировать тройку призеров.
6. Даны n натуральных чисел a1,a2 ,K, an . Определить и вывести количество членов последовательности:
1) являющихся нечетными числами;
2) кратных 3 и не кратных 5;
3) являющихся квадратами четных чисел;
4) удовлетворяющих условию ak < ak−1 + ak+1 ; 2
5)удовлетворяющих условию 2k < аk < k!;
6)имеющих четные порядковые номера и являющихся нечетными числами;
Массивы |
89 |
|
|
7)являющихся удвоенными нечетными числами;
8)при делении на 7 дающих остаток 1, 2 или 5;
9)обладающих тем свойством, что корни уравнения x2 + 3ai − 5 дей- ствительны и положительны.
10)Найти количество и сумму тех членов данной последовательности, которые делятся на 5 и не делятся на 7.
11)Получить произведение членов последовательности, кратных р (р – натуральное).
12)Получить удвоенную сумму всех положительных членов после- довательности.
13)Заменить все большие 7 члены последовательности числом 7, под- считать количество таких членов.
14)Получить сумму тех чисел данной последовательности, которые кратны 5.
15)Получить сумму тех чисел данной последовательности, которые нечетны и отрицательны.
16)Получить сумму чисел данной последовательности, которые удов- летворяют условию |at| < t2.
7.Даны натуральное n , символы s1,s2 ,K, sn .
1)подсчитать, сколько раз среди данных символов встречается символ «+» и сколькораз символ « »;
2)подсчитать общее число вхождений символов «+», « – », « » в после- довательность.
Преобразовать последовательность, заменив в ней:
3)все восклицательные знаки точками;
4)каждую точку многоточием (т.е. тремя точками);
5)каждую из групп стоящих рядом точек одной точкой;
6)каждую из групп стоящих рядом точек многоточием (т.е. тремя точка- ми).
Среди символов есть двоеточие. Получить все символы, расположенные:
7)до первого двоеточия включительно;
8)после первого двоеточия;
9)между первым и вторым двоеточием.
8.Даны действительные числа a1,a2 ,K, a2n . Получить:
1)a1,an+1,a2, an+2,K, an, a2n;
2)a1,a2n ,a2 ,a2n−1,K, an, an+1;
3)a1 + a2n ,a2 + a2n−1,K, an + an+1;
90 |
Лабораторная работа № 8 |
|
|
4)a2n ,a1,a2 ,K,a2n−1;
5)an+1,an+2 ,K, a2n , a1, a2,K, an;
6)an+1,an+2 ,K,a2n ,an, an−1,K, a1;
7)a2n ,an+1,a2n−1, an ,K, an, a1;
8)a1,a3,K, a2n−1,a2, a4,K, a2n;
9.C помощью датчика случайных чисел сформировать: в заданиях 1)–3) од- номерный массив из N элементов, в заданиях 4)–10) – двумерный массив N N и выполнить следующие действия:
1)упорядочить элементы массива по возрастанию (сортировку произ- водить перестановкой соседних элементов);
2)упорядочить элементы массива по возрастанию (алгоритм сортиров- ки следующий: поиск наименьшего элемента, помещение его на пер- вое место; поиск наименьшего элемента из оставшихся и помещение его на второе место и т.д.);
3)упорядочить элементы массива по убыванию (просматривать после- довательно элементы и вставлять их на подходящее место в упорядо- ченную создаваемую последовательность; это место определяется последовательным сравнением элемента с уже упорядоченными эле- ментами).
4)упорядочить (переставить) строки матрицы по неубыванию значений первых элементов строк;
5)упорядочить (переставить) строки матрицы по невозрастанию сумм элементов строк;
6)упорядочить (переставить) строки матрицы по неубыванию значений наименьших элементов строк;
7)упорядочить (переставить) строки матрицы по невозрастанию значе- ний наибольших элементов строк;
8)упорядочить (переставить) строки матрицы по неубыванию сумм элементов строк;
9)упорядочить (переставить) строки матрицы по неубыванию наи- меньших элементов строк;
10)упорядочить (переставить) строки матрицы по невозрастанию наи- больших элементов строк.
10.Дан упорядоченный одномерный массив целочисленных значений и це- лое число р. Удалить k–ый элемент массива и вставить в массив число р так, чтобы не нарушилась упорядоченность.
11.Дана действительная квадратная матрица порядка 2N. Получить новую матрицу, переставляя ее блоки размера N N, как показано на рисунке:
Массивы |
|
|
|
|
|
91 |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
1) |
|
|
2) |
|
|
|
|
3) |
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12. Дана действительная квадратная матрица порядка 3N. Найти наибольшее из значений элементов, расположенных в заштрихованной части матрицы:
1) |
|
2) |
|
3) |
|
|
|||
|
|
|
|
|
4) |
5) |
6) |
||
|
|
|
|
|
|
|
|
|
|
7) |
8) |
9) |
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
92 |
Лабораторная работа № 8 |
|
|
ПРИЛОЖЕНИЕ
{ввод одномерного массива}
write('укажите размер массива n='); readln(n); for i := 1 to n do
begin
write('a[', i, ']='); readln(a[i]);
end;
{формирование одномерного массива с помощью датчика случайных чисел}
writе('укажите размер массива n='); readln(n); Randomize;
for i := 1 to n do begin
a[i] := random(200); b[i] := 10 random;
end;
{ввод двумерного массива по строкам}
write('укажите число строк n='); readln(n); writе('укажите число столбцов m='); readln(m); for i := 1 to n do
begin
write('введите ', i, '–ю строку'); for j := 1 to m do
begin
write('b[', i. ', ', j, ']='); readln(b[i, j]);
end;
end;
{ввод двумерного массива по столбцам}
write ('укажитете число столбцов m='); readln (m); write('укажите число строк n='); readln(n);
