Сегодня мы с вами наконец-то начинаем новую тему — одномерные массивы .
Одномерные массивы. Определение.
Одномерный массив — это фиксированное количество элементов одного и того же типа, объединенных одним именем, где каждый элемент имеет свой номер. Обращение к элементам массива осуществляется с помощью указания имени массива и номеров элементов.
var a : array [1..N] of integer; //или type arr = array[1..N] of integer; var a: arr;
Между именем типа и именем переменной ставится знак «двоеточие». Array — служебное слово (в переводе с английского означает «массив», «набор»); [1..N] — в квадратных скобках указывается номер первого элемента, затем, после двух точек, номер последнего элемента массива; of — служебное слово (в переводе с английского «из»); integer — тип элементов массива.
Индексом могут быть не только натуральные числа: мы можем написать так: [0..10], [-29..45], [‘a’..’z’], [false..true] — то есть нам подходят любые символы и числа — главное соблюсти следующее условие: левая часть меньше правой. Для того чтобы определить, что меньше — восклицательный знак(‘!’) или точка(‘.’) используем таблицу ASCII и функции Ord() и Chr().
Работа с массивами Pascal
Как же производится ввод одномерного массива?
Для того чтобы ввести или вывести значения элементов такого массива, используем цикл с параметром(или с постусловием, или с предусловием — в общем, любой цикл. ).
for i := 1 to N do read(a[i]); //где a[i] — элемент одномерного массива a с индексом (порядковым номером) i.
Как видите, ничего страшного в массивах нет. Массивы применяют в тех случаях, когда нельзя обойтись одной-двумя переменными (примеры таких задач мы рассматривали в решении задач из блока Series). В случаях, когда после ввода последовательности целиком пользователю необходимо обратиться к переменным в середине последовательности, в начале, поменять их значения местами, отсортировать.
Раз уж мы затронули тему задач из блока Series, давайте решим пару задачек оттуда с помощью массивов, а не тем увечным способом, которым нам приходилось пользоваться.
Одномерные массивы. Решение задач.
Series8. Дано целое число N и набор из N целых чисел. Вывести в том же порядке все четные числа из данного набора и количество K таких чисел.
var a: array[1..1000] of integer; k, N, i: integer; begin write(‘N = ‘); readln(N); write(‘Введите ‘, N, ‘ целых чисел: ‘); for i := 1 to N do read(a[i]); write(‘Чётные числа: ‘); for i := 1 to N do begin if a[i] mod 2 = 0 then begin Inc(k); write(a[i], ‘ ‘); end; end; writeln(); writeln(‘Количество четных чисел — ‘, k); end.
Series28. Дано целое число N и набор из N вещественных чисел: A1, A2, …, AN. Вывести следующие числа:
Исходное решение: Series28.
Более подробно про возведение числа в степень мы говорили в решении задачи for36.
var a: array[1..1000] of integer; N, i, j, n_pow: integer; d, r: real; begin write(‘N = ‘); readln(N); write(‘Введите ‘, N, ‘ целых чисел: ‘); for i := 1 to N do read(a[i]); for i := 1 to N do begin n_pow := N + 1 — i; d := a[i]; if n_pow mod 2 <> 0 then r := d else r := 1; //в r будет записываться результат while n_pow > 1 do begin n_pow := n_pow div 2; d := d * d; if n_pow mod 2 <> 0 then r := r * d; end; writeln(a[i], ‘ в степени ‘, N + 1 — i, ‘ равно ‘, r); end; end.
Ну и напоследок давайте разберём веселенькую задачу на длинную арифметику.
Паскаль с нуля [ч7]. Одномерные массивы.
Задача. Найти факториал числа.
1.5.2. Примеры программ с массивами
Пример 1. Дан массиваиз 20 элементов. Вычислить сумму положительных и количество неположительных элементов массива. Начиная с этого примера, с целью улучшения наглядности, характеристики данных будем представлять в виде таблицы:
Таблица 6. Состав данных примера 1.
Тип 13
одномерный массив из 20 элементов
сумма положительных элементов массива
количество неположительных элементов
счетчик элементов массива
Алгоритм состоит из ввода исходных данных, цикла, в котором накапливаются sиk, и вывода результатов. Цикл управляется переменнойi, которая изменяется от 0 до 19. Перед циклом накапливаемым переменным присваиваются начальные значения (нулевые, так как прибавление нуля не изменяет сумму). Основной частью тела цикла является ветвление. Блок-схема алгоритма приведена на рис.
9. Далее приведена Паскаль-программа.
Var a:array[1..20] of real; s:real; k,i:integer;
writeln(‘Введите массив из 20 элементов’);
for i:=1 to 20 do
for i:=1 to 20 do
Пример 2. Дан массиваизNэлементов (N10). Вычислить произведение элементов массива, меньших заданного значенияс.
Таблица 7. Состав данных примера 2.
число элементов массива
одномерный массив из 10 элементов
произведение элементов массива, удовлетворяющих условию
счетчик элементов массива
количество элементов, удовлетворяющих условию
Обратите внимание, что структура массива апредполагает отведение пода десяти ячеек памяти. В программе описывается массиваиздесятиэлементов, a используются лишь первые N них. Пользователь данной программы должен помнить, что вводимое значение числа элементов массива должно находиться в интервале 1N10. Проверка корректности введенного значения N, несомненно, улучшила бы надежность программы; с целью упрощения программы мы не делаем такой проверки. Для устранения необходимости распределения памяти под массив «по максимуму» в любом алгоритмическом языке , требующем компиляции, следует использовать операторы динамического распределения памяти, но этот материал выходит за границы данного пособия.
Блок-схема алгоритма приведена на рис. 10. Алгоритм не сильно отличается от рассмотренного в примере 1. Остановимся на различиях. Для накапливания произведения необходимо перед циклом переменной р присвоить начальное значение 1 (умножение на 1 не изменяет произведение). Переменнаяkнужна для выявления ситуации отсутствия элементов, меньших заданного значения; развилка после цикла позволяет обнаружить эту ситуацию.
Далее приведена программа.
Type mas=array[1..10] of real;
используя описание a:array[1..10] of real>
writeln ( ‘Введите c, N’); readln(c,N);
writeln ( ‘Введите массив из ‘, N, ‘ элементов’);
writeln (‘таких элементов нет’)
Пример 3. Дан массиваизNэлементов (N10). Найти минимальное значение среди элементов массива и номер элемента с таким значением.
Таблица 7. Состав данных примера 3.
число элементов массива
одномерный массив из 10 элементов
минимальный элемент массива
номер минимального элемента
счетчик элементов массива
Блок-схема алгоритма приведена на рис. 11. В начале каждого выполнения цикла min– это минимальное значение среди (i-1) первых элементов массива. Это значениеminсравнивается с а[i] и в результате определяется минимум из первыхiэлементов массива; при изменении текущего минимального значения запоминается номер элемента, на котором достигается текущий минимум (операторk:=i).
Если минимальное (одинаковое) значение имеют несколько элементов массива, то предложенный алгоритм выдаст наименьший из их индексов; при нестрогом неравенстве (a[i]min) будет выдаваться наибольший номер. В ситуации, когда надо определить номера всех элементов, имеющих минимальное значение, алгоритм должен иметь два цикла обработки: в первом цикле должен определяться минимум, а во втором по сравнениюmin=a[i] находиться номера элементов.
Var a:array[1..10] of real;
writeln( ‘Введите число элементов массива,N
writeln( ‘Введите массив из ‘,N, ‘ элементов’);
writeln(‘ min=’,min, ‘ k=’, k);
Пример 4. Дана матрицааизNстрок иMстолбцов (N5,M5). Для каждой строки матрицы найти сумму элементов и определить число строк, для которых эта сумма положительна.
Таблица 8. Состав данных примера 4.
число строк матрицы
двумерный массив размером 5*5
счетчик строк матрицы
сумма элементов i-ой строки
число строк с положительной суммой элементов
счетчик столбцов матрицы
Обратим внимание, что считая s простой переменноймы предполагаем, что значения сумм всех строк должны последовательно записываться в одну ячейку памяти. В этом случаев одном цикле по строкам мы должны вычислить сумму элементов строки s, вывести s и сравнить ее с нулем для вычисления k. Можно было объявить s как одномерный массив (число его элементов равно числу строк матрицы); тогда алгоритм обработки мог бы состоятьиз двух последовательных циклов по строкам:в первом из них вычислялись бы все элементы массива s и накапливалось значение k, а во втором производился бы вывод значений элементов массива s.
Таким образом, этот несложный пример иллюстрирует два очень важных положения:
Источник: studfile.net
Массивы в Pascal
Переменные стандартного типа можно изобразить отдельными маленькими ячейками. То же самое относится и к переменным перечисляемого и интервального типов:
В данных ячейках могут содержаться любые значения из диапазона, определяемого их типами. Например, в ячейке month может быть любое одно значение от 1 до 12, а в ячейке x любое натуральное число в диапазоне примерно от -32000 до 32000.
Помимо этого, имеется также возможность объявлять переменные, которые являются массивами таких маленьких ячеек.
Ячейки массива можно назвать элементами; в квадратных скобках стоят индексы. Базовый тип массива – это тип элементов, из которых составлен массив (в каждом массиве все компоненты одного типа).
В ячейки массива можно помещать значения аналогично тому, как выполняется присваивание обычным переменным. Только здесь кроме имени переменной надо также указать номер (индекс) ячейки, в которую производится запись значения элемента:
nums[3] := 115.58; read(nums[1]);
Однако такое использование элементов массива в качестве обычных переменных не дает никакой выгоды. Массивы ценны тем, что индексы могут быть переменными или выражениями, с помощью которых выполняется последовательный доступ ко всем элементам массива.
Во фрагменте кода ниже записывается 0 во все элементы массива nums :
for i := 1 to 3 do nums := 0;
Одномерные массивы
Предположим, что программа работает с большим количеством однотипных данных. Скажем около ста разных целых чисел нужно обработать, выполнив над ними те или иные вычисления. Как вы себе представляете 100 переменных в программе? И для каждой переменной нужно написать одно и тоже выражение вычисления значения?
Это очень неэффективно.
Есть более простое решение. Это использование такой структуры (типа) данных как массив. Массив представляет собой последовательность ячеек памяти, в которых хранятся однотипные данные. При этом существует всего одно имя переменной связанной с массивом, а обращение к конкретной ячейке происходит по ее индексу (номеру) в массиве.
Следует понимать, что индекс ячейки массива не является ее содержимым. Содержимым являются хранимые в ячейках данные, а индексы только указывают на них. Действия в программе над массивом осуществляются путем использования имени переменной, связанной с областью данных, отведенной под массив.
Итак, массив – это именованная группа однотипных данных, хранящихся в последовательных ячейках памяти. Каждая ячейка содержит элемент массива. Элементы нумеруются по порядку, но необязательно начиная с единицы (хотя в языке программирования Pascal чаще всего именно с нее). Порядковый номер элемента массива называется индексом этого элемента.
Помним, все элементы определенного массива имеют один и тот же тип. У разных массивов типы данных могут различаться. Например, один массив может состоять из чисел типа integer , а другой – из чисел типа real .
Индексы элементов массива обычно целые числа, однако могут быть и символами, а также описываться другими порядковыми типами. То есть для индекса можно использовать тип, в котором определена дискретная последовательность значений, и все эти значения можно пересчитать по порядку. Индексировать можно как константами и переменными, так и выражениями, результат вычисления которых дает значение перечислимого типа.
Если индекс массива может приобретать все допустимые значения определенного перечислимого типа, то при описании массива возможно задание имени типа вместо границ изменения индекса. При этом границами индекса будут первое и последнее значения в описании типа индекса. Границы изменения индексов могут задаваться с помощью ранее объявленных констант. Рекомендуется предварительно объявлять тип массива в разделе описания типов.
Массив можно создать несколькими способами.
const N = 200; type months = (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec); years = 1900..2100; people = array[years] of longint; var growth: array[months] of real; hum: people; notes: array[1..N] of string;
Обращение к определенному элементу массива осуществляется путем указания имени переменной массива и в квадратных скобках индекса элемента.
Простой массив является одномерным. Он представляет собой линейную структуру.
var ch: array [1..11] of char; h: char; i: integer; begin for i := 1 to 11 do read(ch[i]); for i := 1 to 11 do write(ch[i]:3); end.
В примере выделяется область памяти под массив из 11 символов. Их индексы от 1 до 11. В процессе выполнения программы пользователь вводит 11 любых символов (например, ‘q’, ’w’, ’e’, ’2’, ’t’, ’9’, ’u’, ’I’, ’I’, ’o’, ’p’), которые записываются в ячейки массива.
Текущее значение переменной i в цикле for используется в качестве индекса массива. Второй цикл for отвечает за вывод элементов массива на экран.
Функция sizeof, примененная к имени массива или имени массивного типа, возвращает количество байтов, отводимое под массив.
Источник: pas1.ru