#15 Одномерные массивы и работа с ними в Паскале. Задание собственного типа данных. Примеры

#15 Одномерные массивы и работа с ними в Паскале. Задание собственного типа данных. Примеры

Одномерный массив — это фиксированное количество элементов одного и того же типа, объединенных одним именем, где каждый элемент имеет свой номер (индекс).

Для чего нужны массивы

Фактически массивы позволяют использовать огромное количество переменных (своих элементов) без отдельного объявления каждого из этих элементов.

То есть -- если вы программируете, используя массивы, то это значит, что ваша программа может запоминать большое количество сущностей, для каждой из которых не требуется отдельно объявлять переменную, а можно просто использовать элементы массива.

При дальнейшем чтении урока последняя мысль станет более понятной.

Объявление массива

Массив является сложным (составным) типом данных, так как представляет из себя целый набор элементов.

Объявить массив можно двумя способами:

  1. Не объявляя новый тип данных -- например так:
  2. Объявив новый тип данных и используя его -- например так:

- то есть в конечном итоге всё сводится к объявлению переменной в секции var, но имеется возможно отдельно задать собственный тип в секции type (до секции var) как это показано выше.

Работа с конкретными элементами массива

К конкретным элементам массива можно обращаться указывая их индекс в квадратных скобках после имени переменной-массива, им можно присваивать значения, выводить их на экран -- в общем работать с ними как с обычными переменными.

Рассмотрим пример программы (можно запустить):

-- в этой программе мы:

  • объявили собственный тип данных (массив из 3 символьных элементов);
  • присвоили первому и третьему элементу значения (инициализировали их);
  • вывели на экран все три элемента массива -- причём второй неинициализированный элемент отобразится как пустой;
  • c помощью оператора ветвления узнали совпадает ли этот неинициаллизрованный элемент с пробелом (является ли он пробелом -- вышло что нет) и с помощью стандартно функции ord() вывели его код в таблице ASCII, код $0$ соответствует пустому элементу. Таким образом мы выяснили, что неициализированные элементы массива типа char равны т.н. пустому символу.

Обход/перебор элементов массива

В программировании распространён термин т.н. обхода массива -- то есть перебора его элементов каком-то порядке с произвольной целью.

Перебор нужен в том числе чтобы:

    значения нескольких или вообще всех элементов массива.
  • Считывать значения элементов массива.
  • И вообще для любой "массированной" работы с элементами (т.е. такой где их используется много).

Например, получим от пользователя все значения для элементов массива, а затем выведем их на экран через пробел:

-- обход массива здесь мы выполняли с помощью цикла с параметром.

Инициализация массива в процедуре -- пример

Инициализация массива случайными значениями -- пример процедуры

Используя стандартный генератор случайных чисел и, например, передачу аргумента в процедуру по ссылке можно инициализировать массив случайными числами.

Приведём пример программы, которая делает подобное:

-- по сути формула, которая позволяет получить случайный числа от min до max, так как сама функция random(x) возвращается значения от $0$ до $x-1$ (см. подробнее про random(x)).

Самостоятельная работа

Задачи
  1. Задайте в коде программы массив из чисел семи чисел:

Затем обойдите это массив, выводя его значения на экран.

Примеры для проверки:

ПРИМЕЧАНИЕ: эту задачу можно решить, как вложенными циклами, так и вообще одним циклом (что более изящно).

Путь n=2, тогда после работы программы мы должны получить:

Примечание: операции сдвига элементов массива оформите в виде подпрограммы.

Далее пользователь вводит в цикле значения от 1 до 5 -- удаляйте из массива очередной элемент с позиции очередного введенного пользователем числа, сдвигая оставшиеся элементы массива влево, заполняя то, что справа нулями. Распечатывайте промежуточной состояние массива, после каждого удаления.

Цикл должен работать до тех пор, пока в массиве не останется ненулевых элементов или пока пользователь не введет число большее чем 5 или меньшее чем 1.

-- в данном случае программа завершилась, так как удалены все элементы. Если бы пользователь ввел число 10 или -5 - то это тоже была бы ситуация для завершения, но элементы в массиве ещё бы остались.

Примечание: оформить код сдвига элемента как функцию.

Например для массива:

-- функция должна "сообщить", что он неуникальный

Пусть есть процедура, которая умеет сдвигать массив влево на 1 элемент, начиная с указанного символа (устанавливая последний элемент равным нулю):

Задача: У вас есть исходный массив случайных целых чисел из 5 элементов. Пользователь вводит три числа целых числа, сохраните их во второй массив и затем проведите сдвиг элементов исходного массива, для каждого случая их совпадения с элементами из второго массива, для сдвига используйте процедуру shiftArr().

Протестируйте работу функции на массиве из 7 случайных элементов из диапазона от 1 до 15-ти. Например для:

  • a1, a2. aN -- случайные числа из диапазона от 1 до 100
  • # - один из случайных знаков (*, +, -)

Указание: Проверку массива на соответствие условиям задачи вынести в подпрограмму (функцию)

Указание: Проверку массива на соответствие условиям задачи вынести в подпрограмму (функцию)

В качестве ответа (если отрезок найден) получите его начальный и конечных индекс - $m$ и $p$ ( $ 1 \leq m \lt p \leq N $, считая что массив индексируется с единицы)

Указание: Проверку массива на соответствие условиям задачи вынести в подпрограмму (процедуру, которая вычислит нужные индексы, если есть)Подсказка: можно использовать функцию проверки отрезка в массиве из предыдущей задачи.

  • Для N = 6, k=2: $ 2\; \underbrace_\; 1 $
  • Для N = 10, k=2: $ 2\; 0\; 2\; 2\; 1\; 1\; 0\; \underbrace_ $
  • Для N = 15, k=3: $ 2\; 0\; 2\; 2\; 3\; 3\; 0\; 0\; 2 \; 3 \; \underbrace_ \; 0 $
  • Для N = 7, k=2: $ 0\; \underbrace< 1 \;0 \;0 \;0 \;2>_\; 0 $

Для быстрой проверки кода через запуск используйте следующий тип массива:

Сравните каждый 3-ий элемент 1-ого массива с каждый 2-ым элементов 2-ого массива - сравнение проводите пока не закончится та выборка, которая короче.

Например пусть мы имеем два массива (запишу лишь начальные элементы):

1 | 2 | -10 | 5 | 0 | 12 | 2 | 8 . 0 | 3 | 4 | 9 | 7 | 5 | -8 | 3.

для них программа должна вывести:

- других сравнений не последует, так как новых из "каждых третьих элементов" в 1-ом массиве больше нет.

Пояснение: На картинке выше фото часов, которые показывают время следующим образом:

  • в верхнем ряду отображают текущий час 4мя лампочками (битами) если лампа горит, складываем ее значение в основное т.е. 2 + 1 = 3 часа (в 12ти часовом формате)
  • В нижней линии 6 лампочек (бит) и они кодируют 16 + 8 + 1 = 25 минут.

Задача: Напишите программу, которая принимает у пользователя два целых числа (часы и минуты) и выводит в консоль полученное время в формате бинарных ASCII-часов 0-11 ч. и 0-59 мин.

Также отметим, что:

  • 12 часов "не выводиться" а соответствует пустым значениям/нулям (- - - -)
  • аналогично в минутах "не выводиться" 60 минут (- - - - - -)

Для случая с фотографии выше (время 3:25) ASCII-вариант будет выглядеть как:

А, если бы время было 10:40, то :

  • Решение данной задачи не требует вычислений в двоичной системе (достаточно знать как считают в обычной десятичной)
  • Историческая справка: задача была предложена к добавлению в курс по Паскалю участником boris68 летом 2021 г. (см. исходный текст)

Пользователь вводит целое число - сумму в некоторой валюте, требуется выдать эту сумму купюрами наибольшего достоинства.

Напишите программу, которая в качестве результата скажет как именно надо разменять указанную сумму купюрами наибольшего достоинства (укажет количество для купюры каждого типа)

Например, пусть у нас набор купюр 1000, 500, 100 и 50 рублей:

  • Сумму 350 рублей: по задаче следует выдать как: 3 по 100 и 1 по 50
  • Сумму 520 рублей: таким набором разменять нельзя.

Указания по возможному оформлению (можно оформлять и иначе):

Напишите процедуру, которая:

  1. принимает на вход число (сумму) по значению
  2. массив "достоинств" купюр отсортированный по убыванию (предположим, что видов купюр не может быть больше 10) по значению
  3. массив для "количеств купюр" по ссылке
  4. булевский параметр успешности подбора купюр (некоторые суммы вообще разменять нельзя)

После выполнения процедуры в четвертом параметре должен быть true или false, а в массиве "количеств" должены находится находится значения, на основании которых банкомант мог бы выдать купюры.

📎📎📎📎📎📎📎📎📎📎