Министерство образования и науки Российской Федерации Федеральное агентство по образованию Государственное образовательн...
11 downloads
268 Views
403KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Министерство образования и науки Российской Федерации Федеральное агентство по образованию Государственное образовательное учреждение высшего профессионального образования
«Ростовский государственный университет»
Е.С. НЕВСКАЯ, А.А. ЧЕКУЛАЕВА
Структура данных − массив Часть 1
Методические указания для студентов 1 и 2 курсов (дневного и вечернего отделений) механико-математического факультета
Ростов-на-Дону 2006
Печатается по решению кафедры прикладной математики и программирования механико-математического факультета РГУ от 16 февраля 2006 года, протокол № 6 .
АННОТАЦИЯ Методические указания предназначены для поддержки основного курса, связанного с методами программирования, «Системное программирование». Особое внимание уделяется описанию операций с массивом в виде процедур и функций. Методические указания содержат список задач для индивидуальной работы студентов. Методические указания предназначены для студентов вечернего и дневного отделений механико-математического факультета. Авторы : Е.С.Невская, А.А. Чекулаева
@ Е.С.Невская, А.А. Чекулаева
2
СОДЕРЖАНИЕ
ВВЕДЕНИЕ.................................................................................................................................................................4 1. ОПРЕДЕЛЕНИЕ МАССИВА И ЕГО НАЗНАЧЕНИЕ...................................................................................5 2. ОПИСАНИЕ МАССИВА И ПРЕДСТАВЛЕНИЕ ЕГО В ПАМЯТИ КОМПЬЮТЕРА............................6 3. ОДНОМЕРНЫЕ МАССИВЫ. КЛАССИФИКАЦИЯ ОПЕРАЦИЙ............................................................8 3.1. ОПЕРАЦИИ ВВОДА−ВЫВОДА .............................................................................................................................8 3.2. ПОИСК ЭЛЕМЕНТА В МАССИВЕ .......................................................................................................................10 3.3. ОПЕРАЦИИ, ИЗМЕНЯЮЩИЕ СОСТОЯНИЕ МАССИВА ........................................................................................15 3.4. ОБРАБОТКА ЭЛЕМЕНТОВ МАССИВА ................................................................................................................23 3.5. СОРТИРОВКА МАССИВА ..................................................................................................................................26 4. СПИСОК ЗАДАЧ ................................................................................................................................................30 ЛИТЕРАТУРА .........................................................................................................................................................42
3
ВВЕДЕНИЕ Методические указания предназначены для студентов, изучающих программирование с использованием алгоритмического языка Pascal. Здесь рассматривается часто использующаяся структура данных − массив. Методические указания представлены в двух частях. Первая часть посвящена одномерным массивам; вторая часть − двумерным массивам. Одномерный массив − это такая структура данных, с помощью которой отображаются такие математические понятия, как последовательность, вектор с n − координатами, множество. Кроме того, программист может сам ввести абстрактное понятие, соответствующее его задаче, и представить его с помощью массива. В первой части определяются типичные для последовательности операции, а именно, поиск, редактирование, включающее операции добавить, вставить, удалить. Далее рассматриваются простые операции обработки элементов последовательности: определить максимальный элемент последовательности, определить скалярное произведение двух векторов. Кроме того, разбираются простейшие методы сортировки элементов последовательности: метод вставки, метод выбора и метод пузырька (метод обмена). Методические указания содержат список задач, которые являются индивидуальными заданиями для студентов по теме «Одномерные массивы». Предполагается, что для решения этих задач необходимо использовать введенные операции, а также вводить новые операции, соответствующие задаче, и определять их с помощью процедур и функций алгоритмического языка Pascal. Алгоритм решения задачи следует формулировать в терминах введенных операций. Вторая часть методических указаний посвящена двумерным массивам.
4
1. ОПРЕДЕЛЕНИЕ МАССИВА И ЕГО НАЗНАЧЕНИЕ Массивы относятся к структурированным типам данных. Переменная, имеющая структуру массива, является совокупностью элементов-переменных одного и того же типа. Каждый элемент массива явно обозначен и к нему имеется прямой доступ. Число элементов массива определяется при его описании и в дальнейшем не меняется. Для обозначения элементов используется имя переменной массива и индекс, который однозначно определяет элемент. Индексы должны иметь один из доступных типов данных, который называется типом индекса массива. Типами индексов могут быть только скалярные типы, кроме типа
real. Элементы массива упорядочены по месту расположения: a1, a2,…,an. Тип индекса задает множество значений, которые могут использоваться для обращения к элементам массива. Определение типа для массива включает описание типа элементов и типа индексов:
Type
T=[1..20]; Tip=integer; Arr=array[T] of Tip;
где Arr – идентификатор нового типа, T – тип индекса, Tip – тип элементов. Опишем переменную типа Arr:
var
a : Arr;
Элемент массива a, соответствующий значению индекса i, обозначается как a[i], его математическое обозначение ai . 5
Массив с одним индексом называют одномерным. В этом случае элементы относятся к скалярному типу. Если элемент массива является структурным типом, например, одномерным массивом, то массив называется двумерным ( математическое понятие − матрица). Массив предназначен для отображения таких математических понятий, как последовательность, множество, многомерный вектор, отношение, матрица. Структуру данных массив удобно использовать, когда известно, что количество элементов в нем не будет превышать некоторого заданного значения, которое определяется в разделе констант. Фактическое количество элементов может меняться, но не должно превышать заданной константы.
2. ОПИСАНИЕ МАССИВА И ПРЕДСТАВЛЕНИЕ ЕГО В ПАМЯТИ КОМПЬЮТЕРА Синтаксис описания массива:
var : array[] of ; где имя массива − идентификатор, − список одного или нескольких индексных типов, разделенных запятыми. Возможен другой способ описания массива:
type < имя типа>= array[] of ; var : ; где имя типа − идентификатор. Здесь вводится новое понятие − < имя типа>, которое в дальнейшем и используется. Такое описание массива является предпочтительней. 6
В качестве примера опишем вектор A[1..N].
const N=20; type Tip = integer; Первый способ.
var A : array[1..N] of Tip; Второй способ.
Type
vect= array[1..N] of Tip;
Var A:vect; Массиву выделяется сплошная область памяти. Это значит, что элементы вектора a1, a2,…,an располагаются последовательно друг за другом. Пусть описан одномерный массив:
var
a:array[m..n] of
Tip;
Если предположить, что элемент типа Tip занимает p байт памяти, то адресом элемента массива с индексом i будет:
a+ (i-m)*p, где a – адрес первого элемента массива. Приведенные формулы вычисления адреса содержат обычные арифметические операции. При неправильном значении индексов будет получен неправильный адрес. Программист должен предусматривать возможность возникновения таких ошибок, включая проверки правильности значений индексов, а именно, проверку нахождения индексов внутри границ диапазона. Если использовать директиву компилятора {$R+}, то проверка будет выполняться автоматически.
7
Следует отметить, что вычисление адреса связано с выполнением дополнительных операций, поэтому по возможности рекомендуется уменьшать использование переменных с индексами.
3. ОДНОМЕРНЫЕ МАССИВЫ. КЛАССИФИКАЦИЯ ОПЕРАЦИЙ 3.1. Операции ввода−вывода Опишем процедуру Input ввода массива a[1..n] с клавиатуры:
const n_max=20; type vect=array[1..n_max] of integer; procedure Input(var n:integer; var a:vect); var i:integer; begin writeln(‘Задайте кол − во, не превышающее’,n_max); read(n); writeln(‘Задайте элементы’); for i:=1 to n do read(a[i]); end; Опишем процедуру Output вывода массива a[1..n]:
const n_max=20; type vect=array[1..n_max] of integer; procedure Output(n:integer; const a:vect); var i:integer; begin writeln; for i:=1 to n do write(a[i]:5); writeln end; Данные удобно хранить в файле на диске. Пусть создан текстовый файл Dan.txt, в котором содержатся элементы массива. Файл с данными соз8
дается аналогично тому, как создается программный текст на языке PASCAL Опишем процедуру Input_D ввода массива a[1..n] с диска:
const n_max=20; type vect=array[1..n_max] of integer; procedure Input_D(var n:integer; var a:vect); var f:text; begin assign(f,’DAN.txt’); reset(f); n:=0; while not eof(f) and (nn и a[i]≠ x ), то значения x нет в массиве (i=n+1).
10
Из математического определения задачи следует, что для организации просмотра элементов массива необходимо использовать оператор цикла
while… или repeat…. Описание алгоритма (с использованием repeat …).
i:=0; repeat i:=i+1 until (a[i]= x) or (i=n); if a[i] ≠ x then i:=n+1; Описание алгоритма (с использованием while …)
i:=1; while (i≤n)and (a[i] ≠ x ) i:=i+1; Предполагается, что при i>n происходит выход из цикла без проверки условия a[i] ≠ x (i=n+1). Задача 2. Поиск с барьером. Задача поиска часто используется в других более сложных задачах, поэтому ее алгоритм должен быть эффективным, то есть кратким и быстро выполнимым. Метод решения. Упростим составное условие в заголовке цикла, используя следующий прием: • добавим к массиву еще один элемент a[n+1]; • новому элементу присваивается значение x (a[n+1]:=x) и оно служит граничным признаком. Этот метод называют поиском с барьером. 11
Описание алгоритма (поиск с барьером).
a[n+1]:=x; i:=0; repeat i:=i+1 until (a[i]= x); Опишем алгоритм в виде функции. Так как одним из параметров функции является массив, то следует определить тип массива и возможное количество элементов так, как это делалось при описании процедур
вво-
да−вывода. Необходимо не забыть, что в массиве будут находиться n+1 элементов.
const n_max=20; type vect=array[1..n_max] of integer; function search(n:integer;const a:vect; x:integer):integer; var i:integer; begin a[n+1]:=x; i:=0; repeat i:=i+1 until (a[i]= x); search:=i end; Задача 3. Поиск элемента в упорядоченном массиве. Линейный поиск. Постановка задачи. Входные данные: n − количество элементов массива n ∈ N);
a[1], a[2], … , a[n] − элементы массива, a[1..n] ∈ Z (множеству целых чисел); x ∈ Z (значение, которое требуется найти в массиве). 12
Выходные данные: если a[i]=x, то i является найденным номером, в противном случае x∈(a[i];a[i+1]), 1≤ij ). 17. Дан массив. Найти среди его элементов два элемента, модуль разности которых имеет наименьшее значение. 18. Дан массив. Найти пару соседних элементов, наиболее близко расположенных друг к другу. 33
19. Элементами массива являются 0 и 1.Проверить, существует ли строгое чередование 0 и 1. 20. Среди элементов массива найти к наибольших элементов. 21. Пусть числовая ось разбита на отрезки точками a1 , a 2 ,..., a n . Проверить, образуют ли точки упорядоченную последовательность. Если да, то определить, какому отрезку принадлежит значение х. В противном случае проверить, принадлежит ли х последовательности. 22. Найти количество элементов, удовлетворяющих условию 2 i < ai < i! , а также проверить, удовлетворяет ли этому условию максимальный элемент массива. 23. Среднестатистическим назовём элемент массива, если для него модуль разности его значения и среднего арифметического элементов массива достигает минимума. Уникальным будем называть элемент, для которого такой модуль разности достигает максимума. В массиве A(n) найти номера (индексы) среднестатистического и уникального элементов. 24. Дан вещественный массив. Найти элемент массива, значение которого наиболее близко к какому-нибудь целому числу. 25. Если количество нулей в массиве A[1..n] больше количества нулей в массиве B[1..m], то в каждом массиве найти максимальный элемент, иначе найти сумму элементов в массиве A и сумму элементов в массиве B. Описать функции: для подсчёта нулей в массиве, для нахождения максимального элемента и для нахождения суммы элементов. 26. Если максимальный элемент массива A[1..n] больше максимального
элемента
массива
B[1..m],
34
то
преобразовать
массивы:
n
ai = ai / ∑ ai , i =1
m
bi = bi / ∑ bi . Описать функцию нахождения максимального i =1
элемента в массиве, функцию нахождения суммы элементов массива и процедуру деления элементов массива на заданное число. 27 Если первые ненулевые элементы массивов A[1..n] и B[1..m] различны, то в каждом массиве найти максимальные элементы после первого ненулевого элемента, иначе в каждом массиве все элементы возвести в квадрат. Описать необходимые процедуры и функции. Группа 3. 1. Преобразовать массив по правилу: если ai ≥ 0 , то увеличить ai на квадрат наименьшего элемента массива, иначе увеличить ai на квадрат наибольшего элемента массива. 2. Преобразовать массив х[1..n] по следующему правилу ( xk' − значе'
ние к−го элемента после преобразования): x k' = max xi
при 1 ≤ i ≤ k ;
3. Преобразовать массив х[1..n] по следующему правилу ( x k' - значение '
к-го элемента после преобразования): x1' = x1 , x n' = x n , xk = ( xk −1 + xk + xk +1 ) / 3 при к=2, 3, … , n-1. '
4. Каждый j-ый элемент массива (кроме первого) заменить средним значением первых j элементов. 5. В массиве из чётного количества элементов каждый элемент с чётным
индексом
поменять
с
предыдущим
элементом,
т.е.
получить
z 2 z1 z 4 z 3 ...z 2 n z 2 n −1 . Вспомогательный массив не заводить.
6. Удалить из массива элемент, расположенный перед максимальным элементом. 7. Удалить из массива первые К элементов. 35
8. Удалить из массива все вхождения максимального и минимального элементов. 9. Удалить из массива значение элемента с заданным номером, затем проверить наличие отрицательного элемента в изменённом массиве. 10. Из каждого положительного элемента массива вычесть предыдущий. Вспомогательный массив не заводить. 11. Имеется целочисленный массив. Необходимо ’сжать’ массив, выбросив из него нулевые элементы. Если нулевых элементов нет, сообщить, что сжатие невозможно. Дополнительный массив не применять. 12. Вставить в массив А[1..n] элемент с1 перед каждым элементом со значением с2. 13. Вставить в массив А[1..n] максимальный элемент после минимального элемента, получая массив A[1..n+1]; 14. Вставить в массив А[1..n] заданное значение после элемента с заданным номером и проверить, является ли полученный массив упорядоченным по неубыванию. 15. Дан массив Х. Переслать в другой массив все элементы, значения которых принадлежат отрезку [а;b]. 16. Переслать в массив Y все элементы массива X с нечётными номерами, а в массив Z, элементы массива X, значения которых кратны 5. 17. Элементы, расположенные в массиве между минимальным и максимальным элементами (включая эти элементы), расположить в обратном порядке. 18. Вставить в массив А на заданную позицию максимальный элемент массива В. 19. Наименьший элемент массива заменить на среднее арифметическое отрицательных элементов. 36
20. Сравнить два массива: массив A[1..n] и массив B[1..n+1] после того, как из второго массива удалён его максимальный элемент. 21. Проверить, упорядочены ли по убыванию массивы A[1..n] и B[1..m]. Если оба массива упорядочены по убыванию, то построить новый массив C[1..n+m] слиянием массивов A и B без нарушения упорядоченности. В противном случае в массиве С расположить вначале все элементы массива A, затем все элементы массива B. 22. Каждый элемент массива А(n) (кроме двух крайних) заменить выражением ai' = a1' =
a1 + a 2 ; 2
ai −1 + 2ai + ai +1 , i = 2,3,..., n − 1, а крайние элементы – выражениями 4
an =
a n −1 + a n . 2
23. Удалить из массива A(n) “лишние”(кроме первого) элементы так, чтобы оставшиеся образовали возрастающую последовательность. 24. Описать функцию нахождения среднего арифметического элементов массива, значения которых отличны от заданного числа С, и функцию нахождения номера максимального элемента массива. Воспользоваться функциями для замены в массиве A[1..n] максимального элемента на среднее арифметическое элементов, отличных от заданного числа X и для замены в массиве B[1..m] максимального элемента на среднее арифметическое элементов, отличных от заданного числа Y. 25. Удалить из каждого массива A[1..n] и B[1..m] первый отрицательный элемент, если он имеется в массиве. Описать функцию нахождения номера первого отрицательного элемента (или номеру присвоить ноль) и процедуру удаления из массива элемента с заданным номером. Группа 4.
1. Построить массив из n вещественных чисел 37
1/2, 3/4, 5/6, … 2. Построить массив из n вещественных чисел 1, 1+1/2, 1+1/2+1/3, … 3. Дан массив X целых положительных чисел. Сумму цифр каждого числа поместить в массив Y. 4. Сформировать массив, элементами которого являются числа 1, 3, 5, …, n-1, n, n-2, n-3, …, 2. 5. Сформировать массив, элементами которого являются числа 2, 1, 4, 3, 6, 5, …, n, n-1. 6. Сформировать массив, элементами которого являются числа 1, n, 2, n-1, 3, n-2, … ,n div 2, n div 2+1. 7. Сформировать массив по правилу ai = x i (x – задано, i=1,2,…,n). 8. Сформировать массив по правилу ai = x n + i! (x, n – заданы, i=1,2,…,n). 9. Сформировать массив из 2n элементов, элементами которого являются числа
1, -1, 2, -2, …, n, -n.
10. Дан массив из n 2 элементов. Найти сумму каждых n элементов и поместить в массив из n элементов. b1 =a 1 +... + a n , b2 = a n +1 + ... + a 2 n ,
..., bn = a ( n −1) n +1 + ... + a n 2 .
11. Даны два массив A[1..n] и B[1..n]. Получить массив C[1..n], элементы которого вычисляются по правилу: c1 = a1 + bn , c 2 = a 2 + bn−1 , ..., c n = a n + b1 . В полученном массиве подсчитать количество нулевых элементов.
38
12. Рассматривая массивы А и В как последовательности цифр десятичной записи некоторых неотрицательных целых чисел, получить в массиве С – аналогичное представление для суммы этих двух чисел. 13. Рассматривая массивы А и В как последовательности цифр двоичной записи некоторых неотрицательных целых чисел, получить в массиве С – аналогичное представление для суммы этих двух чисел. 14. Рассматривая массивы А и В как последовательности цифр десятичной записи некоторых неотрицательных целых чисел, получить в массиве С – аналогичное представление для разности этих двух чисел. 15. Преобразовать массив по следующему правилу: все отрицательные элементы массива перенести в его начало, а все остальные - в конец, сохраняя исходное взаимное расположение как среди отрицательных, так и среди всех остальных. Выполнить два варианта: воспользоваться вспомогательным массивом и не использовать вспомогательный массив. 16. Преобразовать массив по следующему правилу: все отрицательные элементы массива перенести в его конец, все положительные – в начало, все равные нулю - в середину, сохраняя исходное взаимное расположение как среди отрицательных, так и среди всех остальных. Выполнить два варианта: воспользоваться вспомогательным массивом и не использовать вспомогательный массив. 17. Найти коэффициенты к – го многочлена Чебышева (к=2, 3, … ,n). Многочлены Чебышева определяются по формулами T0 ( x) = 1; T 1( x) = x; Tn ( x) = 2 xTn −1 ( x) − Tn − 2 ( x),
n=2, 3, …
18. Целое число М задано массивом своих двоичных цифр. Напечатать массив двоичных цифр числа М+1.
39
Группа 5.
1.
Рациональное
алгебраическое
выражение
n
z = ∑ a i x ki , i =1
i=1,2,…,n задано своим массивом a[1..n]
k i ≤ m,
коэффициентов ai и массивом
k[1..n] соответствующих показателей степеней k i . Привести в нём подобные члены и сформировать массив коэффициентов полученного многочлена Pm ( x) (по возрастанию степеней x). 2. Из элементов массива A(2n) получить массивы B(n) и C(n) следующим образом. Выбрать из массива A два наиболее близких по значению элемента, меньший из них поместить в массив B, а больший- в массив C. Продолжить выбор из оставшихся элементов до полного заполнения массивов B и C. 3. В массиве A(n) наименьший элемент поместить на первое место, наименьший из оставшихся – на последнее место, следующий по величинена второе место, следующий- на предпоследнее и так далее – до середины массива. 4. В массиве, все элементы которого различны, найти и удалить к наименьших элементов, сдвигая элементы массива к началу и сохраняя порядок следования остальных элементов. 5. Переменной t присвоить значение true или false в зависимости от того, есть ли среди элементов массива хотя бы одно число Фибоначчи. 6. Даны два массива целых чисел. Найти наименьшее среди тех элементов первого массива, которые не входят во второй массив (считать, что хотя бы одно такое число имеется). 7. По массиву коэффициентов многочлена Pn ( x) = p0 x n + p1 x n −1 + ... + p n −1 x + p n
получить R – массив коэффициентов многочлена (x-a)P(x); 40
8. По массиву коэффициентов многочлена Pn ( x) = p0 x n + p1 x n −1 + ... + p n −1 x + p n
получить Q − массив коэффициентов многочлена P(x+a). 9. В массиве найти (напечатать) номера (индексы) локальных максимумов, т.е. таких a , что ai −1 < ai > a . Найти сумму и произведение остальi
i +1
ных элементов. 10. Если массив А[1..n] упорядочен по неубыванию, изменить в нём порядок следования элементов на обратный. В противном случае найти сумму элементов до первого нарушения упорядоченности. 11. Дан массив A[1..n] , содержащий повторяющиеся элементы. Все неповторяющиеся элементы массива А, поместить в другой массив. 12. type element=0..99; mnojestvo = array[element] of boolean; var x, y, z : mnojestvo; t : boolean; Рассматривая массивы x,y,z как представления некоторых множеств из объектов типа element (x[k]=true, если элемент k принадлежит множеству x, и x[k]=false иначе и т.п.), реализовать следующие операции над этими массивами-множествами: а) переменной t присвоить значение true, если множество x является подмножеством множества y, и значение false иначе; б) z = x I y - пересечение множеств; в) z = x U y -объединение множеств; г) z=x\y - разность множеств (в z входят все элементы из x, которые не входят в y).
41
ЛИТЕРАТУРА
1..Минакова Н.И. Методы программирования. Учебное пособие / Н.И.Минакова,
Е.С.
Невская,
Г.А.
Угольницкий,
А.А.
Чекулаева,
М.И. Чердынцева. – М.: Вузовская книга, 2000. –280 с. –ISBN 5-89522-038-X. 2. Невская Е.С., Чекулаева А.А., Чердынцева М.И. Искусство программирования. – М.: Вузовская книга, 2002. – 240 с. – ISBN 5-9502-0003-9. 3. Фаронов В.В. Турбо Паскаль 7.0. Начальный курс. – М.: «Нолидж», 1997. – 616 с. ISBN 5-89251-012-3. 4. Епанешников А.М., Епанешников В.А. Программирование в среде Turbo Pascal 7.0 – М.: «Диалог – МИФИ», 1996 – 288 с. – ISBN 5-86404-029-0.
42