Говоря об одномерных массивах можно утверждать что
Урок 14. Одномерные массивы. Работа с элементами
Одномерные массивы. Определение.
Одномерный массив — это фиксированное количество элементов одного и того же типа, объединенных одним именем, где каждый элемент имеет свой номер. Обращение к элементам массива осуществляется с помощью указания имени массива и номеров элементов.
Между именем типа и именем переменной ставится знак «двоеточие». Array — служебное слово (в переводе с английского означает «массив», «набор»); [1..N] — в квадратных скобках указывается номер первого элемента, затем, после двух точек, номер последнего элемента массива; of — служебное слово (в переводе с английского «из»); integer — тип элементов массива.
Индексом могут быть не только натуральные числа: мы можем написать так: [0..10], [-29..45], [‘a’..’z’], [false..true] — то есть нам подходят любые символы и числа — главное соблюсти следующее условие: левая часть меньше правой. Для того чтобы определить, что меньше — восклицательный знак(‘!’) или точка(‘.’) используем таблицу ASCII и функции Ord() и Chr().
Как же производится ввод одномерного массива?
Для того чтобы ввести или вывести значения элементов такого массива, используем цикл с параметром(или с постусловием, или с предусловием — в общем, любой цикл. ).
Как видите, ничего страшного в массивах нет. Массивы применяют в тех случаях, когда нельзя обойтись одной-двумя переменными (примеры таких задач мы рассматривали в решении задач из блока Series). В случаях, когда после ввода последовательности целиком пользователю необходимо обратиться к переменным в середине последовательности, в начале, поменять их значения местами, отсортировать.
Раз уж мы затронули тему задач из блока Series, давайте решим пару задачек оттуда с помощью массивов, а не тем увечным способом, которым нам приходилось пользоваться.
Одномерные массивы. Решение задач.
Series8. Дано целое число N и набор из N целых чисел. Вывести в том же порядке все четные числа из данного набора и количество K таких чисел.
Series28. Дано целое число N и набор из N вещественных чисел: A1, A2, …, AN. Вывести следующие числа:
Исходное решение: Series28.
Более подробно про возведение числа в степень мы говорили в решении задачи for36.
Ну и напоследок давайте разберём веселенькую задачу на длинную арифметику.
Задача. Найти факториал числа.
Мы уже решали эту задачу здесь(for19).
Научимся вычислять факториал натурального числа N. Факториал числа — это произведение чисел 1*2*3*…*(N-1 )*N (обозначается как N!). Сложность задачи в том, что уже 8!=40320, а 13!=6227020800. Типы данных Integer, Longlnt применимы весьма в ограниченном диапазоне натуральных чисел. Для представления факториала договоримся использовать массив. Пример:
A[0] | A[1] | A[2] | A[3] | A[4] | A[5] | A[6] | A[7] | A[8] |
8 | 0 | 0 | 8 | 6 | 1 | 9 | 9 | 3 |
В массиве записано значение 11!=39916800. Каким образом? В А[0] фиксируется число занятых элементов массива, в А[1] — цифра единиц результата, в А[2] — цифра десятков результата, в А[3] — цифра сотен результата и т. д. Почему так, а не наоборот? Такая запись позволяет исключить сдвиг элементов массива при переносе значений в старший разряд. А сейчас наберите, как обычно, текст программы, выполните компиляцию и, выполните ее в пошаговом режиме, отслеживая изменение значений переменных при не очень большом значении N. Добейтесь полного понимания логики работы программы.
Для того чтобы выполнить программу в пошаговом режиме, нажмите «шаг без входа в подпрограмму» и перейдите в «локальные переменные».
Одномерный массив — это конечное упорядоченное множество элементов. За первым элементом идет второй, за вторым — третий и т. д. Индекс может быть чем угодно — и целым числом, и символом. Но чаще мы всё-таки будем пользоваться следующим диапазоном: [1.. N].
На сегодня все! Если у вас еще остались вопросы о том, как работает программа выше, оставляйте их в комментариях. И очень скоро мы начнем решать задачи на массивы из задачника М. Э. Абрамяна.
Pascal | Лекция №5
Массивы
СОДЕРЖАНИЕ:
Тип в программировании – это множество, для которого оговорен некоторый набор операций над элементами – значениями, которые могут принимать переменные этого типа. Существуют четыре стандартных типа Паскаля: типы Real, Integer (это числовые множества), тип Char (множество символов), тип Boolean. Однако в Паскале имеются средства, позволяющие определять, исходя из имеющихся типов, новые типы. Различают следующие структурированные типы данных:
В данной лекции мы подробно рассмотрим массивы.
Определение массива
Массивы, как и циклы, — величайшее изобретение программирующего человечества. Массивы приходят на помощь тогда, когда приходится иметь дело с наборами однотипных и однородных данных (например, координаты точки в двумерном, трехмерном пространстве).
Массив – это упорядоченная последовательность однотипных элементов определенной длины, имеющая общее имя. Номер элемента в последовательности называется индексом. Количество элементов в массиве не может быть изменено в процессе выполнения программы. Элементы массива размещаются в памяти последовательно и нумеруются от 1 до n, где n – их количество в массиве. К каждому элементу массива имеется прямой доступ. Это означает, что для того чтобы обратиться к какому-либо элементу массива, нет нужды перебирать все его предыдущие элементы, достаточно указать номер этого элемента.
Массив имеет следующие характеристики:
Массивы могут быть одномерными и многомерными. Но мы ограничимся рассмотрением только одномерных и двумерных массивов.
Одномерные массивы – массивы, в которых элементы пронумерованы последовательно по порядку: первый элемент, второй, третий и т.д. Для обозначения элементов одномерного массива используется один индекс.
Двумерные массивы – массивы, в которых данные условно организованы в виде таблицы (матрицы), где положение каждого элемента определяется номером строки т номером столбца. Для обозначения элементов двумерного массива используются два индекса: первый индекс для обозначения номера строки, второй индекс для обозначения номера столбца.
По аналогии с математикой одномерные числовые массивы часто называют векторами, а двумерные – матрицами.
Значения индексов можно задать непосредственно числом (прямая адресация) – A(1), A(4,2) или косвенно, указав в индексе идентификатор переменной, которая позволит вычислить индекс (косвенная адресация) – A(i), A(i, j+2).
При работе с массивами в программе они должны быть объявлены (описаны), т.е. указаны имя массива, тип элементов массива, его размерность.
При обращении к элементу массива, значение индекса которого выходит за допустимые границы, появляется сообщение об ошибке.
Одномерные массивы: описание, ввод и вывод, обработка массива
Описать массив можно двумя способами.
В разделе описания переменных мы можем описать массив следующим образом:
Здесь A – название массива;
Array – служебное слово;
n1,n2 – соответственно номер первого и последнего элемента массива;
– любой из уже изученных типов.
Количество элементов массива будет равно (n2- n1+1).
означает, что полученный массив будет состоять из 20 вещественных чисел, первое из которых будет иметь номер 1, последнее – 20. Наш массив будет иметь имя Massiv.
Описание массива заключается в создании нового оригинального типа. Для того, чтобы программист мог создавать свои новы типы в Паскале существует раздел описания типов Type. Этот раздел находится между разделом описания констант и разделом описания переменных.
После этого в разделе описания переменных мы можем описать массив, который имеет созданный нами тип, например,
В данном случае мы сначала описали новый тип Mas – массив из десяти целых чисел с номерами от 10 до 19, затем описали переменную B типа Mas.
В большинстве случаев для обработки массивов используются циклы. В цикле имеется возможность поочередно перебрать все элементы массива.
Для ввода массива с клавиатуры может быть использован цикл следующего вида: пусть имеется массив с именем A, состоящий из n элементов, тогда
В этом случае пользователь вводит через пробел n элементов массива. Для ввода элементов массива с новой строки используется оператор ReadLn. Ввод данных в массив происходит следующим образом: сначала значение счетчика цикла равно 1; выполняется операция Read (A[1]); поле чего счетчик цикла становится равным 2; выполняется операция Read (A[2])… и т.д. до значения i=n включительно.
Для вывода массива на экран используется следующий цикл:
В данном случае на экран в одну строку будут выведены все n элементов массива, после чего курсор переместится на одну строку вниз.
Как уже было сказано выше, для обработки массивов используются циклы.
Пример: пусть имеется массив M, состоящий из n элементов с номерами от 1 до n. Найти сумму элементов массива, вывести ее на экран.
Двумерные массивы: описание, ввод и вывод, обработка массива
В математике очень распространено такое понятие как матрица. Матрица – это таблица из коэффициентов A=(aij). Элементы матрицы образуют столбцы и строки. Первый индекс ( i ) указывает номер строки, второй ( j ) – номер столбца, на пересечении которых находится элемент aij.
Определим некоторые действия над матрицами:
В программировании матрицы удобно представлять с помощью двумерных массивов.
Описание двумерных массивов отличается от описания одномерных массивов только тем, что мы указываем начальное и конечное значение для обоих индексов:
Здесь n1,n2 – начальное и конечное значения первого индекса;
m1,m2 – начальное и конечное значения второго индекса.
Это массив, состоящий из 10*20*30=6000 целых чисел и занимающий в памяти 6000*2=12000 байт. В Паскале нет ограничения сверху на размерность массива. Однако в каждой конкретной реализации Паскаля ограничивается объем памяти, выделяемый под массивы. В Турбо Паскале это ограничение составляет 64 Кбайта.
В Паскале не допускается употребление динамических массивов, т.е. таких, размер которых определяется в процессе выполнения. Изменение размеров массива происходит через изменение в тексте программы и повторную компиляцию. Для упрощения таких изменений удобно определять индексные параметры в разделе констант:
Теперь для изменения размеров массива Mas и всех операторов программы, связанных с этими размерами, достаточно отредактировать только одну строку в программе – раздел констант.
Для ввода и вывода двумерных массивов используются два вложенных цикла.
Для обработки двумерных массивов также используются два вложенных цикла.
Пример: найти произведение массива A на число L.
Обр-ку дв. массива см. Рапаков стр.126!
Действия над массивом как единым целым
Такие действия допустимы лишь в двух случаях:
В обоих случаях массивы должны иметь одинаковые типы (тип индексов и тип элементов).
При выполнении операции присваивания P := Q все элементы массива P станут равны соответствующим элементам массива Q.
Как уже отмечалось, в многомерных массивах переменная с индексом может обозначать целый массив. Например,
Год | Месяц | |||||||||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | |
1981 | -23 | -17 | -8 | 7 | 14 | 18 | 25 | 19 | 12 | 5 | -4 | -19 |
1982 | -17 | -10 | -3 | 6 | 8 | 13 | 28 | 24 | 6 | 2 | -13 | -20 |
… | … | … | … | … | … | … | … | … | … | … | … | … |
1990 | -10 | -15 | -4 | 9 | 13 | 17 | 23 | 20 | 10 | 8 | -14 | -20 |
если в таблице H требуется, чтобы данные за 1989г. были такими же, как и за 1981г. (девятой строке присвоить значение первой строки), то это можно делать так:
А если нужно поменять местами значения этих строк, то это делается через третью переменную того же типа:
где P описана так:
Контрольные вопросы
Презентация к уроку
Понятие «массив» носит фундаментальный характер. Самым удобным способом хранения большого количества однотипных данных является массив. Обработка массивов является основой практически любой программы.
Школьник, который умеет обрабатывать массивы, может считать себя начинающим программистом.
Созданная обучающая программа может использоваться при изучении темы «Одномерные массивы в языке программирования Паскаль» в среднем и старшем звене общеобразовательной школы.
В презентации имеется главное меню, то есть Содержание (Презентеция), с которого с помощью гиперссылок мы можем перейти на любой пункт меню (слайд 2).
Презентация позволяет каждому учащемуся получить теоретические знания, разобрать примеры решения задач, получить задания для самостоятельной работы, дает возможность проверить полученные знания.
1. Одномерный массив
1.1. Понятие «массив»
С понятием «массив» приходится сталкиваться при решении научно-технических и экономических задач обработки совокупностей большого количества значений. В общем случае массив – это структурированный тип данных, состоящий из фиксированного числа элементов, имеющих один и тот же тип.
Название регулярный тип (или ряды) массивы получили за то, что в них объединены однотипные (логически однородные) элементы, упорядоченные (урегулированные) по индексам, определяющим положение каждого элемента в массиве. (Приложение 1 [13, с.181])
Массив – это составной объект, образованный из элементов (компонент) одного и того же типа. Такой тип данных применяется в программировании для обозначения объектов, аналогичных числовым последовательностям в математике, где сразу целая группа чисел обозначается одним именем (чаще всего буквой), а для обращения к каждому отдельному числу данной последовательности используются различные индексы (номера элементов). В математике это может выглядеть, например, так:
Таким образом, в программировании массив – это последовательность однотипных элементов, имеющих общее имя, причем каждый элемент этой последовательности определяется порядковым номером (индексом) элемента.
Массивы бывают одномерными (один индекс), двумерными (два индекса) и т.д.
1.2. Описание одномерных массивов
Одномерный массив – это фиксированное количество элементов одного типа, объединенных одним именем, причем каждый элемент имеет свой уникальный номер, и номера элементов идут подряд. (Приложение 1 [12, с.100])
Для описания подобных объектов в программировании предварительно следует ввести соответствующий тип в разделе описания типов.
Тип массив описывается следующим образом:
Имя типа = Array [тип индекса (ов)] Of тип элементов;
Переменную типа массив можно описать сразу в разделе описания переменных Var:
Var Имя переменной: array [тип индекса (ов)] Of тип элементов;
mas = array [1..20] of real;
Массив Х – одномерный, состоящий из двадцати элементов вещественного типа. Элементы массива хранятся в памяти компьютера последовательно друг за другом.
При использовании переменных для обозначения индекса их значения к моменту использования должны быть определены, а в случае арифметических выражений их результат не должен выходить за границы минимального и максимального значения индексов массива.
Индексы элементов массива могут начинаться с любого целого числа, в том числе и отрицательного, например:
Type bb = Array [-5..3] Of Boolean;
1.3. Ввод и вывод одномерных массивов в Паскале
Ввод и вывод массивов осуществляется поэлементно.
Введем одномерный массив Х, состоящий из 30 элементов, то есть необходимо ввести некую последовательность элементов Х1, Х2, …, Х30.
Пусть i – индекс (порядковый номер) элемента в массиве Х. Тогда
Для ввода массива можно использовать любой цикл.
Первый вариант: ввод массива с использованием цикла с предусловием (Рисунок 1).
Var i: integer;
X: array [1..30] of Integer;
Begin
While i 30;
Массив X введен с использованием цикла с постусловием.
Третий вариант: ввод массива с использованием цикла с параметром (Рисунок 3).
Var i: integer;
X: array [1..30] of Integer;
Begin
For i := 1 To 30 Do Read (X[i]);
Массив вводится с помощью цикла с параметром, где в качестве параметра используется индекс элемента массива (i).
Вывод одномерного массива осуществляется аналогично.
В программе вместо операторов Read или Readln используются операторы Write или Writeln. Но просто заменить одни операторы на другие здесь недостаточно. Для того чтобы выводимые значения не сливались между собой, надо явным образом вставлять между ними разделитель – пробел или перевод строки. Приведем два возможных способа вывода массива:
На первый взгляд второй способ может показаться более простым и удобным, но это далеко не всегда так. Результат работы такой программы зачастую неудобно, а то и просто невозможно анализировать. Ведь каждый элемент массива будет располагаться в отдельной строке, следовательно, мы не сможем увидеть более 25 элементов одновременно. Кроме того, очень часто массив требуется распечатать дважды, чтобы сравнить состояние массива до обработки и результат его обработки. В этом случае сравнение состояний массива гораздо удобнее проводить, если они распечатаны в двух соседних строках, а элементы выровнены по столбцам, то есть к варианту 1 должна быть добавлена еще и форматная печать (указано количество позиций, которое должно отводиться на печать одного элемента).
Например, выведем одномерный массив Х1, Х2, …, Хn, состоящий из элементов вещественного типа, используя цикл с параметром (Рисунок 4):
Const n = 30;
Var i: Integer;
X: Array [1..n] Of Real;
Begin
For i:= 1 To n Do Write (X[i] : 6 : 2, ‘ ‘);
2. Примеры решения задач
2.1. Вычисление суммы и произведения элементов массива, удовлетворяющих заданному условию.
Задача 1. Дан целочисленный одномерный массив, состоящий из n элементов. Найти сумму и произведение нечетных элементов, кратных 3. (Презентация)
Введем обозначения: n – количество элементов в массиве; А – имя массива; i – индекс элемента массива; Ai – i-й элемент массива A; s – сумма нечетных элементов массива, кратных 3; p – произведение нечетных элементов массива, кратных 3.
Входные данные: n, A.
Выходные данные: s, p.
При просмотре массива можно сразу вычислить и произведение элементов массива, удовлетворяющих заданному условию. Произведение вычисляется с помощью оператора p:=p*A[i]. При этом p справа и p слева имеют разные значения: p справа – уже известное, вычисленное ранее значение произведения, p слева – новое, вычисляемое его значение. Первоначально искомое произведение равно единице, т.е. p:=1.
При решении этой задачи можно использовать любой из видов циклов. Рассмотрим несколько вариантов решения задачи.
Первый способ. Для решения используется цикл с параметром:
Var A: Array[1..20] Of Integer;
Begin
For i:=1 To n Do Readln (A[i]);
For i:=1 To n Do
If (A[i] mod 2 <>0) and (A[i] mod 3 = 0) Then
Begin
End.
Второй способ. Для решения используется цикл с предусловием:
Var A: Array[1..20] Of Integer;
Begin
Write (‘n=’); Readln (n); i:=1;
While i 0) and (A[i] mod 3 = 0) Then
Begin
End; i:= i + 1
2.2. Нахождение количества элементов, удовлетворяющих заданному условию
Задача 2. Дан массив целых чисел. Найти количество тех элементов, значения которых положительны и не превосходят заданного натурального числа А. (Презентация)
Введем обозначения: n – количество элементов в массиве; X – имя массива; i – индекс элемента массива; Xi – i-й элемент массива X; А – заданное число; k – количество элементов, значения которых положительны и не превосходят заданного числа А.
Входные данные: n, X, A.
Выходные данные: k.
Вводим с клавиатуры значение числа А. Количество элементов, значения которых положительны и не превосходят заданного числа А, вначале полагаем равным нулю, то есть k:=0. Если очередной элемент массива положителен и не превосходят заданного числа A, то количество таких элементов нужно увеличить на единицу, то есть k:=k + 1. Таким образом, обрабатываются все элементы массива.
При решении этой задачи можно использовать любой из видов циклов. Рассмотрим несколько вариантов решения задачи.
Первый способ. Для решения используется цикл с параметром:
Var X: Array[1..20] Of Integer;
Begin
For i:=1 To n Do Readln (X[i]);
Write (‘A=’); Readln (A); k:= 0;
For i:=1 To n Do
If (X[i] >0) and (X[i] n;
Write (‘A=’); Readln (A); k:= 0; i:=1;
Repeat
If (X[i] >0) and (X[i] n;
2.3. Нахождение номеров элементов, обладающих заданным свойством
Задача 3. Найти номера четных элементов, стоящих на нечетных местах. (Презентация)
Введем обозначения: n – количество элементов в массиве; X – имя массива; i – индекс элемента массива; Xi – i-й элемент массива Х.
Входные данные: n, X.
Выходные данные: i.
Необходимо просмотреть весь массив. Если просматриваемый элемент является четным, а его порядковый номер – нечетный, то вывести его номер. При решении этой задачи можно использовать любой из видов циклов.
Составим программу с помощью цикла с параметром:
Var X: Array[1..20] Of Integer;
Begin
For i:=1 To n Do Readln (X[i]);
For i:=1 To n Do
If (X[i] mod 2 = 0) and (i mod 2<>0) Then Write (i:5);
Задача 4. Найти номер последнего отрицательного элемента массива.
Введем обозначения: n – количество элементов в массиве; А – имя массива; i – индекс элемента массива; Ai – i-й элемент массива A; m – номер последнего отрицательного элемента массива.
Входные данные: n, A.
Выходные данные: m.
Последний отрицательный элемент массива – это первый отрицательный элемент, который встретится при просмотре массива с конца. Если очередной элемент не является отрицательным, то нужно уменьшать значение текущего индекса (i:=i-1), пока он не станет меньше номера первого элемента или не будет найден отрицательный элемент. Переменная m получает значение i (номер отрицательного элемента), т.е. m := i. Если в массиве нет отрицательного элемента, то значение переменной m остается равным нулю.
Const n=10;
Var A: Array[1..n] Of Integer;
Begin
For i:=1 To n Do Readln (A[i]);
While (i >= 1) and (A[i] >=0) Do i:=i-1; m:=i;