Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лабораторные на Pasca (Кудрявцев)l

.pdf
Скачиваний:
32
Добавлен:
18.03.2015
Размер:
1.63 Mб
Скачать

83

Лабораторная работа № 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+ xn1 xn ;

5)y = x1xn + x2 xn1 +K+ xn x1;

6)y = (x1 + x2n )(x2 + x2n1 )K(xn + xn+1 );

7)

y = xn (xn + xn1 )(xn + xn1 + xn2 )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, при котором yk1 < 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 < ak1 + 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 ,a2n1,K, an, an+1;

3)a1 + a2n ,a2 + a2n1,K, an + an+1;

90

Лабораторная работа № 8

 

 

4)a2n ,a1,a2 ,K,a2n1;

5)an+1,an+2 ,K, a2n , a1, a2,K, an;

6)an+1,an+2 ,K,a2n ,an, an1,K, a1;

7)a2n ,an+1,a2n1, an ,K, an, a1;

8)a1,a3,K, a2n1,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)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

{диапазон изменения чисел 0..199} {вещественные числа в диапазоне 0.0..9.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);