Как составить алгоритм для массивов

В современной школе информатика –
достаточно сложный предмет для усвоения
учащимися. Основное препятствие для
полноценного изучения информатики – нехватка
времени. Мною проанализировано много учебных
планов и методик преподавания информатики и для
общеобразовательных классов, и для профильных с
углубленным изучением информатики. Вывод
неутешителен. Предлагаемые материалы
основываются на гораздо большем годовом
количестве учебных часов, чем то, которым мы
реально располагаем. Следствием расхождения
между рекомендуемым и реальным объемом учебных
часов является невозможность использовать в
процессе обучения какой-то один учебник
информатики. Это неудобно как ученикам, так и
преподавателю. Выходом из этой ситуации является
разработка собственной методики преподавания
информатики с ориентацией на творческую
деятельность учащихся и тестовый контроль,
которая, не уменьшая объем материала, позволяла
бы сократить время на его усвоение учениками и
уложиться в отведенное количество часов.

Основываясь на своем опыте работы с
учащимися старшего звена, я выделила несколько
основных тем, без усвоения которых невозможно
успешное изучение всего курса информатики, и
разработала собственную методику их
преподавания. Я пользуюсь ей уже несколько лет,
что позволяет добиваться хороших результатов в
освоении учениками моего предмета. С методикой
преподавания одной из таких тем я и хочу
познакомить вас.

Секрет могущества ЭВМ – высокая
скорость и большая память. Для записи алгоритмов,
работающих с большими объемами информации, в
алгоритмическом языке существуют специальные
табличные величины (или просто таблицы).
Исполнение многих алгоритмов было бы просто
невозможно, если бы соответствующие объекты не
были каким-либо образом организованы:
упорядочены, классифицированы, занумерованы и
так далее. Итак, нужно уметь организовать не
только действия, но и те объекты, над которыми эти
действия производятся.

Необходимо отметить, что таблицы
(массивы) как основное средство представления
однородной информации неизбежно используются во
всех реальных компьютерных программах. На
табличном принципе основана и архитектура
современных ЭВМ: память машины можно
рассматривать как большой массив байтов, адреса
которых располагаются по возрастанию.

Следовательно, без понимания
информационной сущности таблиц и основных
алгоритмов их обработки невозможно формирование
полноценных представлений о возможностях ЭВМ и
принципах их работы. Для построения сколь-нибудь
сложных и содержательных программ необходимо
уверенное владение общими принципами применения
таблиц и базовыми приемами их
обработки. В данной работе будет рассмотрен ряд
простых алгоритмов, которые используются при
построении более сложных.

Алгоритм вычисления суммы

1. Пусть дан массив A,
состоящий из n элементов: a1,
a2, a3, …, an. Нужно
найти их сумму, т.е. S=a1+a2+a3+…+an.

Нахождение суммы есть
последовательное нахождение суммы по формулам:

S=0 S=S+a2 … S=S+ai S=S+an

S=S+a1 S=S+a3

Алгоритм вычисления суммы удобно
организовать циклом, взяв за параметр цикла
переменную i, которая
меняется от 1 до n с шагом 1, и
записав в цикле формулу S=S+ai один раз. Схема алгоритма приведена
на рис. 1а.

Рисунок 1

В схеме блок 4 присваивает S нулевое значение, блок 5 счетчику i
присваивает начальное значение,
блок 6 выполняет накопление суммы, блок 7 изменяет
значение i на 1, блок 8
осуществляет проверку условия повторения цикла.
При выполнении этого условия управление
передается в начало цикла, а при невыполнении –
осуществляется выход из цикла, т.к. при i=n+1 суммировать не нужно. n – в схеме предполагается число, но n может быть и переменной, значение
которой равно числу элементов массива A, которое нужно вводить перед
описанием массива.

При разработке этого алгоритма
учащимся можно предложить изменить схему на
случай, если нужно найти сумму элементов,
расположенных на четных местах в массиве A
(Ответ: Блок 5 надо изменить на i=2 и блок 7 на i=i+2)
или задать вопрос – что изменится в схеме на
рис.1а, если суммировать только положительные
элементы массива A?
(Ответ:
Перед блоком суммирования 6 нужно поставить блок
проверки элемента массива ai на положительность и, если он
положителен, то его суммировать, а если нет, то
обходить блок суммирования.) Схема алгоритма
будет иметь вид:

Рисунок 2

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

Рисунок 3

(Ответ: Надо ввести
переменную k для получения
количества положительных элементов и перед
циклом присвоить ей значение 0. После блока
проверки 7 по пути “+” нужно поставить блок,
содержащий k=k+1, который ведет
счет количества положительных элементов массива
A.) Схема алгоритма приведена
на рис.3а.

Алгоритм вычисления произведения

Этот алгоритм предлагается учащимся
разработать самостоятельно, взяв за основу
алгоритм определения суммы элементов массива
(Рис. 1а). Учащиеся должны не только указать на
изменения блока 6 на S=S*ai
(в S будет направляться
произведение элементов), но и дать четкое
объяснение изменению блока 4 на S=1. Схема алгоритма представлена на
рис.1б.

Алгоритм формирования нового массива

Как положительные элементы массива A сформировать в массив? Обозначим
массив положительных элементов B и по пути “+” после блока 7 поставим
присвоение соответствующему элементу массива B элемент массива A,
т.е. блок, содержимое которого bk=ai.

k будем использовать
как меняющийся индекс нового массива. Необходимо
обратить внимание учащихся на блок 2, в котором
требуется описать массив B,
указав количество его элементов равное
количеству элементов массива A. Схема алгоритма на рис.3б.

Алгоритм определения максимального элемента

Для получения максимального числа
введем переменную M и ей
присвоим значение первого элемента массива a1, а затем необходимо сравнить M с текущим элементом массива ai и если текущий элемент будет больше M, то значение M
заменить на значение этого элемента. Схема
алгоритма на Рис. 4. Очень важно обратить внимание
учащихся на начальное значение переменной M.
Почему, например нельзя
переменной M присвоить
значение равное нулю?
(Ответ: Для массива с
отрицательными значениями элементов максимум не
будет найден.)

Рисунок 4

Алгоритм упорядочения массива методом
“Пузырька”

Действия по упорядочению некоторых
данных по ключу называются процессом сортировки.
Очевидно, что с отсортированными данными
работать легче и быстрее, чем с произвольно
расположенными. Все применения ЭВМ основаны на
их способности к быстрой и точной обработке
больших объемов информации, а это возможно
только тогда, когда информация однородна и отсортирована.
Существует довольно много различных методов
сортировки, отличающихся друг от друга степенью
эффективности, под которой понимается
количество сравнений и количество обменов,
произведенных в процессе сортировки, время
выполнения и объем
занимаемой ОП. Рассмотрим сортировку методом
“Пузырька”, которая легко описывается в форме
четких алгоритмов и приводит к простой
программной реализации.

Одномерный массив A
из n элементов упорядочим по
возрастанию
. При
пузырьковой сортировке элементы массива попарно
сравниваются и более “легкие” элементы как бы
всплывают на поверхность. При реализации
алгоритма возникает проблема в определении
количества шагов сортировки. Для решения этой
задачи воспользуемся известным методом
“расстановки флажков”, благодаря
которому однозначно будет определен момент
завершения сортировки и выхода из цикла (блок 5).

В качестве “флажка” возьмем числовую
переменную F и присвоим ей
произвольное начальное значение отличное от
нуля (блок 4). Схема алгоритма на рис. 5. По парное
сравнивание элементов и их обмен местами
происходит в блоках 9-12, здесь же изменяется
значение флажка (блок 13). В случае, когда все
элементы массива будут упорядочены, значение F останется равным нулю (блок 6). Блоки
3 и 15 являются укрупненными, т.к. алгоритмы ввода и
вывода элементов массива подробно не описаны на
схеме (Рис. 5).

Рисунок 5

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

Задачи “Первые шаги

  1. В массиве а1, а2, …, а50
    определить количество нулей.
  2. В массиве d1, d2, …, d35
    найти сумму чисел, расположенных на нечетных
    местах.
  3. В массиве с1, с2
    , …, с40
    найти произведение отрицательных чисел.
  4. В массиве b1, b2, …, b45
    найти сумму отрицательных чисел.
  5. В массиве b1, b2, …, b20
    найдите количество «единиц».
  6. Из массива а1, а2
    , …, а30
    найти произведение чисел, расположенных на
    нечетных местах.
  7. В массиве с1, с2
    , …, с40
    найти сумму чисел больших единицы.
  8. В массиве чисел а1, а2
    , …, а50
    найти количество чисел меньших единицы.
  9. В массиве с1, с2
    , …, с37
    найти произведение чисел больших 2.
  10. В массиве а1, а2
    , …, а40
    найти сумму чисел, расположенных на местах
    кратных 3.
  11. В массиве а1, а2
    , …, а50
    найти произведение чисел меньших или равных 2.
  12. В массиве b1, b2, …, b45
    найти количество чисел равных 3,5.
  13. В массиве d1, d2, …, d50
    найти сумму чисел равных 4,7.
  14. В массиве b1, b2, …, b30
    найти произведение чисел больших
    или равных 5.
  15. В массиве с1, с2
    , …, с70
    найти количество «нулей», стоящих на
    нечетных местах.
  16. В массиве b1, b2, …, b65
    найти сумму чисел больших или
    равных 5.
  17. В массиве d1, d2, …, d30
    найти произведение чисел, исключая
    первый и последний элемент.
  18. В массиве а1, а2
    , …, а35
    найти количество «единиц», стоящих на четных
    местах.
  19. В массиве чисел а1, а2
    , …, а30
    найти сумму отрицательных чисел, стоящих на
    нечетных местах.
  20. В массиве чисел в1, в2, …, в35
    найти произведение чисел больших или равных 2.
  21. В массиве чисел с1, с2, …, с40
    найти количество чисел, попавших в интервал [а,
    в]
  22. В массиве чисел с1, с2, …, с40
    найти сумму чисел, не попавших в
    интервал [с, d].
  23. В массиве чисел в1, в2, …, в45
    найти произведение всех ненулевых чисел.
  24. В массиве чисел с1, с2, …, с60 найти
    количество нулей стоящих на местах, кратных 4 т.е.
    среди чисел с4, с8, …, с60.
  25. В массиве чисел z1, z2, …, z200
    найти сумму чисел z5, z10,
    …, z200.

Задачи “Джентльменский
набор
”.

  1. Даны три последовательности
    чисел а1, а2, …,
    a9, b1, b2 …, b9,
    с1, с2, …, с9.
    Составьте новую последовательность d1, d2,
    …, d9, каждый элемент
    которой определяется по правилу di =
    max (аi, bi, сi), где i=
    1,2, …,9.
  2. Найти номер первого нулевого
    элемента массива х1, х2, …, х20 и
    сумму элементов предшествующих ему.
  3. Даны три последовательности
    чисел: а1, а2, …, а8; b1, b2, …, b8; с1, с2
    , …, с8.
    Составить новую последовательность, в которой
    чередовались бы числа всех трех
    последовательностей, т.е. d1 = a1; d2=b1;
    d3 = c1; d4 = a2; d5 = b2;
    d6 = c2.
  4. Известно, что в массиве а1, а2, …, а16
    количество отрицательных чисел
    равно количеству положительных. Составить новый
    массив так, чтобы чередовались положительные и
    отрицательные числа.
  5. Найти сумму элементов
    последовательности b1, b2, …, b15
    , расположенных правее последнего
    отрицательного элемента и номер этого элемента.
  6. Дана последовательность чисел с1
    , с2, …, с16
    . Найти произведение элементов этой
    последовательности до первого нулевого и сумму
    элементов, расположенных после него.
  7. Из массива с1
    , с2, …, с18
    получить массив х1
    , х2, …, х18
    по правилу; х1
    = с1, х2
    3, …, х9
    17, x1018
    , х1116,
    …, x182.
  8. Из данного массива чисел х1
    , х2, …, х25
    исключить последнее положительное
    число. Оставшиеся числа переписать в новый
    массив z1, z2, …, z24.
  9. Найти номер первого
    положительного элемента массива b1, b2,
    …, b15 и сумму элементов,
    расположенных правее него.
  10. Все положительные элементы
    массива а1, а2
    , …, а20,
    расположенные правее первого нулевого элемента,
    увеличить в два раза.
  11. В массиве х1
    , х2, …, х25
    поменять местами элементы х1
    , х4, х7
    , х10, …, х22
    с наименьшим из следующий за
    ними соответствующей пары элементов.
  12. Из заданного массива а1
    , а2, …, а12
    , не содержащего нулей, получить
    массив b1, b2, …, b12
    , приняв в качестве первых его
    элементов все положительные элементы массива A
    с сохранением порядка их
    следования, а в качестве остальных элементов все
    отрицательные элементы также с сохранением
    порядка их следования.
  13. Дан массив с1
    , с2, …, с15, состоящий из нулей и единиц.
    Подсчитать количество 0, количество 1 и
    количество нулей до первой единицы.
  14. Дан массив чисел х1, х2, …, х22
    . Переписать в другой массив из
    данного все элементы, расположенные правее
    последнего отрицательного элемента, сохраняя
    порядок их следования.
  15. По данным числам х, у, z получить массив а1, а2, …, а17
    , где а1 = х,
    а2 = у, а3 = z,
    а каждый следующий элемент
    массива определяется как среднее арифметическое
    трех предшествующих.
  16. Из заданных массивов а1
    , а2, …а8;
    b1, b2, …, b12; с1
    , с2, …, с6
    получить массив d1, d2,
    …, d26 в котором
    разместить сначала все элементы массива A, затем элементы массива B
    и в конце элементы массива C.
  17. В массиве а1
    , а2, …, а18 вычислить сумму отрицательных до
    последнего нулевого и произведение элементов
    расположенных правее него.
  18. В массиве у1, у2, …, у18
    элементы с номерами, кратными 4,
    заменить среднем арифметическим из трех
    предшествующих элементов.
  19. Массивы х1, х2, …, х10
    и у1, у2, …, у10
    преобразовать по правилу: большее из хi
    и уi
    принять в качестве нового значения хi
    , а меньшее – в качестве нового
    значения уi (i = 1,2, …,10).
  20. Все элементы массива а1
    , а2, …, а45, начиная с первого по порядку
    положительного элемента, уменьшить на 0,5, если
    значение элемента превышает 1 и увеличивать на 0,5
    в противном случае.
  21. В массиве а1, а2, …, а25
    найти произведение первых трех
    положительных элементов.
  22. Из десяти последних
    отрицательных чисел последовательности t1,
    t2, t3, …, t300
    сформировать последовательность у1, у2, …, у10.
  23. Если наименьший элемент данной
    последовательности х1,
    х2, …, х27 больше 0,1 то все отрицательные
    элементы последовательности заменить единицей.
  24. Дана последовательность а1, а2, …, а50
    . Сформировать последовательность в1, в2, …, в50
    следующим образом: в начале
    расположить все отрицательные элементы
    последовательности, а затем все остальные.

Задачи “Уже
проблемы

  1. Дан массив а1, а2,
    …, a20. Получить массив
    х11
    , х22, …, хrr
    , где элементами массива х1, х2, …, хp
    являются отрицательные, а
    элементами массива у1, у2
    , …, уt
    положительные элементы массива A, r = min
    (р, t).
  2. Найти номер первого нулевого элемента массива а1, а2, …, а25
    и произведение элементов,
    расположенных до него, а среди элементов,
    расположенных правее первого нулевого, найти
    максимальный элемент.
  3. В данном массиве чисел с1, с2, …, с25
    поменять местами максимальный элемент с
    последним отрицательным элементом.
  4. Из массива х1, х2, …, х25
    сформировать два массива; в одном написать числа,
    расположенные до минимального элемента массива
    х, в другой расположенный правее минимального.
  5. Пять последних элементов последовательности у1,
    у2, …, у40 помножить на номер
    максимального элемента данной
    последовательности.
  6. Из массива а1, а2, …, а30
    исключить максимальный элемент.
  7. Среди отрицательных элементов массива х1,
    х2, …, х50 найти минимальный и
    помножить на него все отрицательные элементы,
    стоящие левее этого минимального.
  8. Дана последовательность чисел d1, d2,
    …, d50. Найти сумму S1 элементов до
    максимального элемента и сумму S2
    элементов, расположенных правее него.
  9. В данном массиве чисел а1, а2, …, а25
    поменять местами минимальный и максимальный
    элементы.
  10. Найти сумму положительных элементов
    последовательности d1, d2, …, d40,
    расположенных до первого нулевого элемента,
    заменить этой суммой минимальный элемент
    массива.
  11. Из отрицательных элементов массива х1, х2
    …, x30, расположенных левее минимального
    элемента, сформировать новый массив.
  12. Из элементов последовательности у1, у2,
    …, у25, расположенных между первым нулевым и
    максимальным (в предположении, что в массиве есть
    положительные числа) (или максимальным и первым
    нулевым), сформировать новый массив.
  13. Дан массив чисел а1, а2, …, а50.
    Найти сумму элементов массива, стоящих правее
    первого положительного элемента, и максимальный
    элемент, его номер среди чисел предшествующих
    первому положительному.
  14. В массиве у1, у2, …, у25 поменять
    местами минимальный элемент с первым
    положительным элементом.
  15. Среди элементов последовательности а1, а2,
    …, а25 расположенных до первого
    отрицательного элемента, найти минимальный
    элемент. Из положительных элементов массива,
    расположенных правее минимального, сформировать
    новый массив.
  16. Три отрицательных элемента массива b1, b2,
    …, b25, расположенных правее максимального
    помножить на номер максимального элемента.
  17. Дан массив х1, х2, …, х30.
    Помножить элементы массива на квадрат его
    наименьшего элемента, если хi больше или
    равно 0, и на квадрат его наибольшего элемента,
    если хi меньше 0.
  18. Дана последовательность t1, t2, …, t20.
    Среди положительных элементов найти
    максимальный и помножить на него все
    положительные элементы последовательности.
  19. Из элементов последовательности с1, с2,
    с3 …, с45, стоящих на нечетных местах и
    расположенных правее минимального элемента
    данной последовательности, сформировать новый
    массив d1, d2, …
  20. В массиве чисел х1, х2, …, х17
    заменить нулем все отрицательные элементы,
    предшествующие его максимальному элементу.
  21. Дана последовательность чисел а1, а2,
    …, а25; из положительных элементов данной
    последовательности, расположенных до
    минимального элемента, сформировать
    последовательность р1, p2, p3
  22. Из массива у1, у2, …, у50
    сформировать новый массив в1, в2, в3,
    …, в который записать все числа, находящиеся в
    массиве у между его максимальным и минимальным
    (или минимальным и максимальным) элементами.
  23. Из массива х1, х2, …, х30
    получить массив у1, у2, …, уn
    состоящий из элементов массива х, расположенных
    правее его максимального элемента.
  24. Если наименьший элемент данной
    последовательности х1, х2, …, х27
    больше 0,1 то все отрицательные элементы
    последовательности заменить единицей.
  25. Найти наименьший элемент из элементов
    последовательности x1, x2, …, x25,
    расположенных до первого отрицательного числа.
    Все отрицательные числа, расположенные правее
    первого отрицательного, помножить на этот
    наименьший.
  26. В последовательности у1, у2, …, у25
    найти максимальный элемент из элементов, стоящих
    на четных местах. Помножить на него все элементы
    данной последовательности, стоящие на нечетных
    местах и расположенные правее найденного
    максимального.

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

Применение массивов
при описании алгоритмов решения
практических задач позволяет:

  1. записать коротким
    алгоритмом работу с большим объемом
    информации;

  2. расширить область
    применимости алгоритма.

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

Массив
– это
упорядоченная по индексам, конечная
совокупность однотипных объектов,
образованных по одному и тому же правилу.

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

При работе с
массивами, каждому массиву дается имя.
Работа с массивом – это работа с
элементами массива. Элементу массива
дается имя, соответствующее имени
массива, и указывается в квадратных или
круглых скобках порядковый номер этого
элемента в массиве.

Очевидно, чтобы
задать массив (таблицу), необходимо:

  1. указать, что
    однотипные объекты объединены в массив
    (таблицу);

  2. указать имя
    массива (таблицы), начальный и конечный
    порядковые номера индексов его (её)
    элементов;

  3. указать тип
    значений элементов массива (таблицы).

При описании
массива после имени массива будем в
круглых (квадратных) скобках указывать
начальный и конечный номера каждого
индекса элементов массива через
двоеточие. Если массив многомерный, то
описание начального и конечного номеров
каждого индекса элементов массива
разделим запятой. Например, А(1:50) –
массив, элементы которого: А(1), А(2), … ,
А(50); В(1:2,1:3) – массив, элементы которого:

.

Пример 1.
Одномерный массив Осадки (1:365) –
количество осадков в течение года.

Дни года

1

2

3

364

365

Осадки в мм

50

34

120

23

5

Пример 2.
Двумерный массив Расписание (1:4,1:2) –
расписание уроков на 2 дня в 4 классе
общеобразовательной школы.

Дни
недели

Номер
урока

Понедельник

Вторник

1

Математика

Русский язык

2

Русский язык

Математика

3

Природоведение

История

4

Физкультура

Рисование

Массивы
имеют размер и размерность. Размер
массива

это количество
элементов

в данном массиве, размерность
количество
индексов,

необходимых для однозначного определения
места фиксированного элемента массива.
Массив примера 1 имеет размерность,
равную 1 (одномерный), размер – 365. Массив
примера 2 имеет размерность равную 2
(двумерный), размер 2∙4=8. Элемент массива
называется переменной с индексом,
переменная без индекса – простой
переменной. Над элементами массива
можно производить те операции, которые
допустимы для базового типа.

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

Пример 3.
Пусть массив A
– одномерный массив, имеющий 4 элемента
целого типа – integer:
-12, 0, 41, -131.

направление изменения
индекса


1
2 3 4


12

0

41

-131

A[1]=-12;
если
i=2,
то
A[i]=0;
если
i=1,
j=3,
то
A[i+j]=-131

Пример 4.
Массив Q
– двумерный массив, имеющий 3 строки и
4 столбца – 12 элементов вещественного
типа – real:


.

направление изменения второго индекса


1 2 3 4

1

12,5

71

0

-18,34

2

51

-17

2,4

5
,121

3

-45,41

14

-28

31

н

аправление

изменения

первого

и
ндекса

Q[3,3]=-28;
если
i=1,
j=2,
s=2,
то
Q[is,j+2]=Q[2,4]=5,121

З
адача
21
. Произведение
элементов массива. Составьте блок-схему
алгоритма нахождения произведения
вещественных чисел

П =
a(1)a(2)…a(n).

Решение.
Смотри
блок-схему алгоритма (задача 21),
использована циклическая структура
«while
P
do
S».

Произведение можно
находить так:

П:=а(1); П:=Па(2);
… ; П:=Па(n).

В блок-схеме вместо
этой цепочки операторов запишем оператор
П:=Па(k),
где k
изменяется от 1 до n;
k
– параметр цикла. Чтобы значение первого
произведения было равно a1,
следует положить начальное значение П
равным 1. Операторы 5-6 составляют тело
цикла.

Задача 22.
Произведение матриц. Составьте блок-схему
нахождения произведения матрицы А
на матрицу В:


,


.

Решение.
Смотри блок-схемы 1-3 алгоритма (задача
22).

Смотри блок-схему
1 (задача 22). Произведение матрицы А
на матрицу
В
есть матрица-столбец; обозначим ее С.


,
где

,
i=1,2,…,m.

Функциональный
блок, вычисляющий величину c(i),
обозначим S1.
Смотри блок-схему 2 (задача 22).

П


олучать
элементы c(i)
при фиксированном i
можно так: c(i) = c(i)+a(i,j)∙b(j),
где 1jn,
а начальное значение c(i)
равно 0.

Очевидно, что
функциональный блок S1
будет содержать циклическую структуру,
например, структуру «repeat
S
until
P».

Подставив
детализацию блока S1
(блок-схема 2 (задача 22)) в блок-схему 1
(задача 22), получим одну циклическую
структуру внутри другой, вложенные
циклы – блок-схема 3(задача 22).

Задача
23.

Положительные числа. Дана числовая
последователь­ность a1,
a2,
… , an.
Определите, есть ли среди ai,
1in
положительные числа, если да, то
переменной K
присвойте значение 1, в противном случае
– значение 0. Составьте блок-схему
алгоритма решения поставленной задачи.

Решение.
Смотри блок-схему алгоритма (задача
23).

Б

лок-схема
алгоритма
(задача
23
):
Блок-схема
алгоритма (задача
24
):

Поскольку
положительный элемент может оказаться
на i-ом
месте, где i<n,
то нужно иметь возможность выйти из
цикла при i<n.
С этой целью перед началом цикла
переменной K
присвоено значение 0, а если ai>0
– истинно, K
получит значение 1. Проверка окончания
организована так, что выход из цикла
произойдёт или при i>n
(положительного элемента нет), K
= 0, или при
i>n
и K = 1
(этот элемент – последний в массиве),
или при i<n
и K
= 1 (положительный
элемент – ai,
где 1in1).

Задача 24.
Поиск
буквы. Пусть w
– слово, состоящее из n
букв русского алфавита: w(1),
w(2),
… , w(n);
v
– буква, относительно которой требуется
установить, входит ли она в слово. Если
входит, то укажите номер позиции первого
вхождения буквы в слово. Составьте
блок-схему алгоритма решения поставленной
задачи.

Решение.
Смотри блок-схему алгоритма (задача
24).

Будем просматривать
последовательно все буквы данного
слова. Для реализации этого используем
цикл с постусловием. Если буква v
не входит в слово, то выход из цикла
осуществляется при i>n,
где i
– номер рассматриваемой буквы. Значение
переменной K
в этом случае равно 0. Если буква v
входит в слово, выход из цикла может
быть осуществлен раньше, чем i
станет больше n,
при K<>
0, где K
– номер позиции первого вхождения
буквы v
в слово w.

Задача 25.
Количество
положительных элементов. Дана
последовательность чисел a1,
a2,
… , an.
Присвойте переменной m
номер K-го
положительного элемента этой
последовательности. Если в последовательности
положительных элементов меньше K,
то переменной m
присвойте значение 0. Составьте блок-схему
алгоритма решения поставленной задачи.

Решение.
Смотри блок-схему алгоритма (задача
25).

Подсчет
количества положительных элементов
массива организуем с помощью цикла с
постусловием. Если положительных
элементов нет или их меньше, чем K,
выход из
цикла осуществим при i>n,
m
присвоим значение 0. При l
= K,
где l
– число положительных элементов, также
реализуем выход из цикла. При этом i
получит уже следующее значение. Значит,
номер K-го
положительного элемента на единицу
меньше i.

Задача 26.
Сдвиг в
массиве.
Переставьте вещественные элементы
массива A(1:n)
таким образом, чтобы они шли в следующем
порядке: А(n),
А(1), А(2), … , A(n-2),
A(n-1),
т.е. в массиве произведите сдвиг элементов
на одну позицию вправо. Составьте
блок-схему алгоритма решения поставленной
задачи.

Решение.
Смотри блок-схему алгоритма (задача
26).

Б
лок-схема

алгоритма (задача
25
):
Блок-схема
алгоритма (задача
26
):

Задача 27.
Максимальные
элементы массива. Дана последовательность
чисел a1,
a2,
… , an.
Найдите количество максимальных
элемен­тов последовательности и их
номера. Составьте блок-схему решения
поставленной задачи.

Решение.
Смотри блок-схемы 1-2 алгоритма (задача
27).

В
блок-схеме1 алгоритма (задача 27) первый
цикл организуем для определения
максимального элемента, значение
которого присваивается переменной b.
Начальное значение b
положим равным a1.
Второй
цикл считает K
– количество одинаковых максимальных
элементов. Переменная M(K)
принимает значение индекса встретившегося
максимального элемента. M(K)
– числовая последовательность, членами
которой являются эти индексы.

Б

лок-схема1

алгоритма (задача
27
):
Блок-схема2
алгоритма (задача
27
):

Блок-схема2
алгоритма (задача 27) предполагает в
одном цикле на i-ом
шаге определение максимального элемента
из i
рассмотренных, подсчет количества
таких элементов и фиксирование их
номеров. Если на (i+1)-ом
шаге встречается больший элемент, то
операторы b:=ai,
K:=1,
mK:=i
зададут новые начальные значения
переменных b,
K,
mK,
и все вычисления будут проведены
относительно нового большего элемента.

Задача 28.
Дружественные числа.
Дружественными
числами называются два натуральных
числа, таких, что каждое из них равно
сумме всех натуральных делителей
другого, исключая само это другое число.
Числа 220 и 284 являются дружественными
числами, так как сумма делителей числа
220 – это 1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 =
284, а сумма делителей числа 284 – это 1 +
2 + 4 + 71 + 142 = 220. Составьте блок-схему
алгоритма нахождения дружественных
чисел на отрезке [2;n].

Решение.
Смотри блок-схему алгоритма (задача
28).

Блок-схема
алгоритма (задача
28
):


С
уммы
делителей чисел от 2 до n
организуем в виде массива Делитель(2:n),
где Делитель(k)
– текущая сумма делителей числа k.
Вычислим суммы делителей всех чисел
от 2 до n,
затем попарно сравним эти суммы, если
суммы делителей чисел k
и s,
принадлежащих [2;n],
равны, то числа k
и s
– дружественные, их необходимо вывести.

Н
екоторые
пары дружественных чисел:

220 и 284,
1184 и 1210, 2620 и 2924, 5020 и 5564, 6232 и 6368 и т.д.

Задача 29.
Группировка.
Дан массив A(1:n),
элементы которого отличны от нуля.
Расположите их в таком порядке, чтобы
первыми были все положительные элементы,
а затем – все отрицательные, причем
порядок следования как положительных,
так и отрицательных элементов должен
сохраняться. При решении задачи нельзя
заводить новую таблицу. Составьте
блок-схему алгоритма решения поставленной
задачи.

Решение.
Смотри блок-схемы 1-2 алгоритма (задача
29).

Для решения
поставленной задачи будем перебирать
элементы массива с первого по n-ый.
Если A(i)>0,
никаких изменений в массиве не производим,
увеличиваем i
на единицу и переходим к исследованию
следующего элемента. Если же A(i)<0,
поставим его на n-ое
место (в конец таблицы), предварительно
освободив это n-ое
место, произведя сдвиг элементов массива
от A(i+1)
до A(n)
на один номер влево. Количество
просмотренных элементов массива будем
запоминать в переменной k.

Д
етализируем
блок «сдвиг влево на одну позицию и
перестановку A(i)
на n-ое
место»: скопируем A(i)
в переменную C,
произведем сдвиг и A(n)
присвоим значение C.
Смотри блок-схему2 алгоритма (задача
29).

Теперь детализированный
блок можно подставить в блок-схему1
алгоритма (задача 29).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Здесь приведены примеры программ и алгоритмов, используемых в курсе Основы программирования для студентов 1 курса ФИИТ мехмата ЮФУ

Редактировать

Методы и операции для работы с массивами

Объявление и выделение памяти

  var n := ReadInteger;
  var a: array of integer;
  a := new integer[n];

или

  var n := ReadInteger;
  var a := new integer[n];

Ввод-вывод

  var a := ReadArrInteger(n);
  var r := ReadArrReal(n);
  Print(a);
  a.Println;
  a.Println(', ');

Заполнение

  a := |1,3,7|;
  a := Arr(1..10);
  a := ArrFill(10,666);
  a := ArrGen(n,i->elem(i)[,from:=0])
  a := ArrGen(n,first,x->next(x))
  a := ArrGen(n,first,second,(x,y)->next(x,y))

Примеры:

a := ArrGen(10,1,x -> x + 2); // 1 3 5 7 9 11 13 15 17 19
a := ArrGen(10,1,x -> x * 2); // 1 2 4 8 16 32 64 128 256 512 
a := ArrGen(10,1,1,(x,y) -> x + y); // 1 1 2 3 5 8 13 21 34 55 

Заполнение случайными числами

  a := ArrRandomInteger(n[,from,to]);
  r := ArrRandomReal(n[,from,to]);

Срезы

  var a := Arr(0..9);
  a[2:5]    // 2 3 4 
  a[:2]     // 0 1
  a[5:]     // 5 6 7 8 9 
  a[:]      // копия массива a
  a[::2]    // 0 2 4 6 8
  a[1::2]   // 1 3 5 7 9
  a[5:2:-1] // 5 4 3
  a[::-1]   // 9 8 7 6 5 4 3 2 1 0

Операции + и *

  var a := |1,2,3|;
  var b := |4,5,6|;
  a + b // 1 2 3 4 5 6
  a * 2 // 1 2 3 1 2 3
  |0|*3 + |1|*3 // 0 0 0 1 1 1 
  (|0| + |1|)*3 // 0 1 0 1 0 1

Циклы по массиву

For

for var i:=0 to a.Length-1 do
  a[i] += 1;

Foreach

foreach var x in a do
  Print(x);

Foreach по индексам

foreach var i in a.Indices do
  a[i] *= 2;

Foreach по определённым индексам

foreach var i in a.Indices(x -> x in 10..20) do
  a[i] += 1;
foreach var i in a.Indices((x,i) -> i.IsEven and (x > 0)) do
  a[i] += 1;

Инвертирование

Задача. Инвертировать массив

Решение 1. Алгоритм

procedure Reverse<T>(a: array of T);
begin
  var n := a.Length;
  for var i:=0 to n div 2 - 1 do
    Swap(a[i],a[n-i-1]);
end;

Решение 2. С помощью срезов

Решение 3. С помощью стандартной процедуры

Поиск

Задача. Есть ли в массиве a элемент x

Решение. С помощью операции in или метода Contains:

Задача. Найти индекс первого вхождения элемента x

Решение 1. С использованием break

function IndexOf<T>(a: array of T; x: T): integer;
begin
  Result := -1;
  for var i := 0 to a.High do // a.High = a.Length - 1
    if a[i] = x then
    begin
      Result := i;
      break;
    end;
end;

Решение 2. Без использования break

function IndexOfW<T>(a: array of T; x: T): integer;
begin
  var n := a.Length;
  var i := 0;
  while (i<n) and (a[i]<>x) do
    i += 1;
  Result := i=n ? -1 : i;
end;

Решение 3. Поиск с барьером

Добавим в конец массива барьер, равный x. В массиве должно быть место под этот элемент

function IndexOfWithBarrier<T>
  (a: array of T; n: integer; x: T): integer;
begin
  Assert((0 < n) and (n < a.Length));
  a[n] := x; // барьер
  var i := 0;
  while a[i]<>x do
    i += 1;
  Result := i=n ? -1 : i;
end;

За счет использования барьера экономится одна операция сравнения

Решение 4. Стандартные методы

a.IndexOf(x)
a.LastIndexOf(x)

Поиск по условию

Задача. Поиск по условию

Решение 1. Алгоритм

function FindIndex<T>(a: array of T; cond: T->boolean): integer;
begin
  Result := -1;
  for var i := 0 to a.High do
    if cond(a[i]) then
    begin
      Result := i;
      break;
    end;
end;

Решение 2. С помощью стандартного метода

Количество по условию

Задача. Количество элементов, удовлетворяющих заданному условию

Решение 1. Алгоритм

function Count<T>(a: array of T; cond: T->boolean): integer;
begin
  Result := 0;
  foreach var x in a do
    if cond(x) then
      Result += 1;
end;

Решение 2. С помощью стандартного метода

Минимумы-максимумы

Задача. Найти минимальный элемент и его индекс

Решение 1. Алгоритм

function MinElemAndIndex(a: array of real): (real,integer); 
begin
  var (min, minind) := (real.MaxValue, -1);  
  for var i:=0 to a.Length-1 do
    if a[i]<min then
      (min, minind) := (a[i], i);
  Result := (min, minind)
end;

Решение 2. С помощью стандартной функции

Задача. Найти минимальный элемент, удовлетворяющий условию, и его индекс

Решение. Алгоритм

function MinElemAndIndexCond(a: array of real: cond: real -> boolean): 
  (real,integer); 
begin
  var (min, minind) := (real.MaxValue, -1);  
  for var i:=0 to a.Length-1 do
    if (a[i]<min) and cond(a[i]) then
      (min, minind) := (a[i], i);
  Result := (min, minind)
end;

Сдвиги

Задача. Сдвиг влево на 1

Решение 1. Алгоритм

procedure ShiftLeft<T>(a: array of T);
begin
  for var i:=0 to a.Length-2 do
    a[i] := a[i+1];
  a[a.Length-1] := default(T);
end;

Решение 2. С помощью срезов

Задача. Сдвиг вправо

Решение 1. Алгоритм

procedure ShiftRight<T>(a: array of T);
begin
  for var i:=a.Length-1 downto 1 do
    a[i] := a[i-1];
  a[0] := default(T);
end;

Решение 2. С помощью срезов

a := |0| + a[:a.Length-1];

Задача. Циклический сдвиг вправо

Решение 1. Алгоритм

procedure CycleShiftRight<T>(a: array of T);
begin
  var v := a.Last;
  for var i:=a.Length-1 downto 1 do
    a[i] := a[i-1];
  a[0] := v;  
end;

Решение 2. С помощью срезов

var m := a.Length-1;
a := a[m:] + a[:m];

Задача. Циклический сдвиг влево на k

Решение 1. С помощью срезов

Решение 2. С помощью частичного Reverse

Reverse(a,0,k);
Reverse(a,k,a.Length-k);
Reverse(a);

Преобразование элементов

Задача. Требуется преобразовать элементы массива по правилу $$x -> f(x)$$

Решение 1. Алгоритм

procedure Transform<T>(a: array of T; f: T -> T);
begin
  for var i:=0 to a.Length-1 do
    a[i] := f(a[i]);
end;

Решение 2. С помощью стандартного метода

Для преобразования части элементов:

a.Transform(x -> if x mod 2 = 0 then x*x else x)

Слияние

Задача. Слияние двух упорядоченных массивов в один упорядоченный

В массивах должно быть место под один барьерный элмент

function Merge(a,b: array of real; n,m: integer): 
  array of real;
begin
  Assert((0 < n) and (n < a.Length));
  Assert((0 < m) and (m < b.Length));
  a[n] := real.MaxValue; // барьер
  b[m] := real.MaxValue; // барьер
  SetLength(Result,m+n);
  var (ia,ib) := (0,0);
  for var ir:=0 to n+m-1 do
    if a[ia]<b[ib] then
    begin
      Result[ir] := a[ia]; 
      ia += 1;
    end
    else
    begin
      Result[ir] := b[ib]; 
      ib += 1;
    end;
end;

Бинарный поиск

Задача. Поиск в упорядоченном массиве

Решение 1. Алгоритм

function BinarySearch(a: array of integer; x: integer): integer;
begin
  var k: integer;
  var (l,r) := (0, a.Length-1); 
  repeat
    k := (l+r) div 2;
    if x>a[k] then
      l := k+1
    else r := k-1;
  until (a[k]=x) or (l>r);
  Result := a[k]=x ? k : -1;
end;

Асимптотическая сложность $$Theta(log n)$$

Решение 2. С помощью стандартного метода

Алгоритмы сортировки

Сортировка выбором

procedure SortByChoice(a: array of integer);
begin
  for var i := 0 to a.High-1 do
  begin
    var min := a[i];
    var imin := i;
    for var j := i + 1 to a.High do
      if a[j] < min then
      begin        
        min := a[j];
        imin := j;
      end;  
    Swap(a[imin],a[i]);
  end;
end;

С использованием срезов:

procedure SortByChoice(a: array of integer);
begin
  for var i := 0 to a.High-1 do
    Swap(a[a[i:].IndexMin + i],a[i]);
end;

Асимптотическая сложность $$Theta(n^2)$$

Пузырьковая сортировка

procedure BubbleSort(a: array of integer);
begin
  for var i := 0 to a.High-1 do
    for var j := a.High downto i+1 do
      if a[j] < a[j-1] then
        Swap(a[j], a[j-1]);
end;

Асимптотическая сложность $$Theta(n^2)$$

С флагом (эффективнее в ситуациях, когда массив частично отсортирован):

procedure BubbleSort2(a: array of integer);
begin
  var i := a.High;
  var q: boolean;
  repeat
    q := true;
    for var j := 0 to i - 1 do
      if a[j+1] < a[j] then
      begin
        Swap(a[j+1], a[j]);
        q := false;
      end;
    i -= 1;
  until q;
end;

Асимптотическая сложность $$Theta(n^2)$$ в среднем и $$Theta(n)$$) в лучшем случае (когда массив отсортирован).

Сортировка вставками

procedure SortByInsert(a: array of integer);
begin
  for var i:=1 to a.High do
  begin
    var x := a[i];
    var j := i - 1;
    while (j >= 0) and (x < a[j]) do
    begin
      a[j+1] := a[j];
      j -= 1;
    end;
    a[j+1] := x;
  end;
end;

Асимптотическая сложность $$Theta(n^2)$$

Стандартная сортировка

Асимптотическая сложность $$Theta(n cdot log n)$$

Методы и операции для работы cо списками List

Список List<T> – это динамический массив с возможностью динамического изменения размеров по ходу работы программы.

Объявление списка:

var l := new List<integer>;

Добавление элементов в конец списка:

l.Add(5); // список расширяется, выделяя память под новые элементы
l.Add(3);
l.Add(4);
l += 8; // синоним l.Add(8)

Цикл по списку:

for var i:=0 to l.Count-1 do
  Print(l[i]);
foreach var x in l do
  Print(x);

Заполнение списка:

var l := Lst(5,2,3); 
var l1 := Lst(1..10); 

Операции со списками:

var l := Lst(5,2,3); 
Print(2 in l); // True
Print(2 * l); // [5,2,3,5,2,3]
l.Print; // 5 2 3
Print(l + Lst(7,6,8)); // 5 2 3 7 6 8

Методы списков:

l.Insert(ind,x); // вставка x по индексу ind
l.RemoveAt(ind); // удаление элемента по индексу ind
l.RemoveRange(ind,count) // удаление диапазона элементов
l.RemoveAll(x -> x.IsOdd); // возвращает число удалённых элементов
l.IndexOf(3); // индекс первого вхождения или -1
l.FindIndex(x -> x > 4); // индекс первого вхождения или -1
l.Clear; // очищает список
l.Reverse; // инвертирует список
l.Sort; // сортирует список

Реализация функции Distinct

Задача. Реализовать функцию Distinct, по заданному массиву возвращающая список только различных элементов массива

Решение. Алгоритм

function Distinct(a: array of T): List<T>;
begin
  Result := new List<T>;
  foreach var x in a do
    if not (x in Result) then
      Result += x;
end;

Вставка и удаление элементов в массиве и списке

Задача. Дан массив (список) $$N$$ вещественных. Требуется вставить элемент $$x$$ на $$k$$-тое место (начиная с 0), $$k leq N$$.

Решение. В массиве — с помощью срезов:

var N := ReadInteger;
var a := ReadArrInteger(N);
var l := Lst(a);
var k := ReadInteger;
a := a[:k] + |x| + a?[k:]; 

Решение. В списке — с помощью стандартного метода:

Задача. Дан массив (список) $$N$$ вещественных. Требуется удалить элемент с индексом $$k$$, $$k<N$$.

Решение. В массиве — с помощью срезов:

var N := ReadInteger;
var a := ReadArrInteger(N);
var l := Lst(a);
var k := ReadInteger;
a := a[:k] + a?[k+1:]; 

Решение. В списке — с помощью стандартного метода:

to continue to Google Sites

Not your computer? Use Guest mode to sign in privately. Learn more

Вопросы:

·     Поиск
элемента массива с заданным значением.

·     Сортировка
элементов массива.

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

Задача: Написать
программу, которая определяет, есть ли в массиве из 100 случайных целых чисел,
на промежутке от 1 до 200, число, введённое пользователем.

Начнём написание
программы для решения задачи. Назовём нашу программу zadannoe_chislo.
Для работы программы нам потребуется массив из 100 элементов. Назовём его a.
Так как элементами массива будут целые числа на промежутке от 1 до 200, укажем
тип элементов массива byte.
Также нам понадобятся переменные для хранения номера текущего элемента — i
и для хранения числа, введённого пользователем — num.
Объявим принадлежащими к целочисленному типу byte.

Напишем логические
скобки. Тело программы будет начинаться с оператора writeln,
который будет выводить на экран сообщение о том, что это программа,
определяющая, есть ли в массиве случайных чисел число, введённое пользователем.
Теперь запишем цикл для заполнения массива случайными числами. Это будет цикл для
i, изменяющегося от 1 до 100. В нём
будет оператор присваивания i-тому
элементу массива a, суммы случайного
целого числа на промежутке от 0 до 199 и 1. После того как мы заполнили массив
случайными числами, напишем оператор write,
выводящий на экран запрос на ввод числа на промежутке от 1 до 200, а также
оператор readln для считывания
значения переменной num.

Для того чтобы
определить, есть ли введённое число в массиве a,
мы позже опишем логическую функцию, которую назовём poisk,
поэтому сейчас напишем условный оператор if,
условием которого будет значение функции poisk,
с введённым числом num
в качестве аргумента. После служебного слова then
в этом условном операторе, напишем оператор writeln,
выводящий на экран сообщение о том, что число num
есть в массиве. После слова else
также напишем оператор writeln,
который будет выводить на экран сообщение о том, что числа num нет в
массиве.

Для того чтобы
пользователь могу убедиться в том, что программа работает правильно, напишем
оператор write, выводящий
сообщение о том, что это массив, а также цикл с для i
для вывода элементов массива через пробел. На этом описание основной программы
завершено.

program zadannoe_chislo;

var

 a: array [1..100] of
byte;

 i, num: byte;

begin

 writeln (‘Программа, определяющая, есть ли в массиве случайных чисел число,
введённое пользователем.’);

 for i:=1 to 100
do

  a[i]:=random (200)+1;

 write (‘Введите число на промежутке [1;
200]>>> ‘);

 readln (num);

 if poisk (num)

 then write (‘Число ‘, num, ‘ есть в
массиве.’)

 else write (‘Числа ‘, num, ‘ нет в массиве.’);

end.

Заголовок,
переменные и операторный блок основной программы

Теперь рассмотрим, как же
проверить, есть ли в массиве Элемент с указанным значением. Для этого будем
проверять последовательно все элементы массива от первого к последнему, пока не
найдём нужный или же пока они не закончатся. Такой поиск элемента в массиве
называется линейным.

Напишем для нашей
программы логическую функцию, определяющую, есть ли в массиве a
заданное число. Как мы помним, она должна называться poisk.
Эта функция должна иметь один аргумент целочисленного типа byte,
назовём его t. Также функция
должна возвращать значение логического типа boolean.
Для работы функции нам потребуется дополнительная переменная, которая будет
хранить номер текущего элемента массива. Назовём её i
и укажем принадлежащей к целочисленному типу byte.
В логических скобках опишем операторный блок функции. В его начале присвоим
переменной i начальное значение – 0.
Дальше напишем цикл с постусловием. Условием окончания работы цикла будет то,
что i-тый Элемент массива a
равен t или что достигнут конец
массива и i равно 100. Тело цикла
будет содержать единственный оператор, увеличивающий значение переменной i
на 1. После завершения работы цикла нам будет достаточно проверить равен ли i-тый
элемент массива a t
и присвоить значение истинности этого высказывания переменной функции poisk.
На этом описание функции закончено.

function poisk (t: byte): boolean;

var

 i: byte;

begin

 i:=0;

 repeat

  i:=i+1;

 until (a[i]=t) or (i = 100);

 poisk:=a[i]=t;

end;

Функция poisk

Запустим программу на
выполнение. Введём число 75.
Программа вывела сообщение о том, что такое число есть в массиве. Просмотрев
элементы массива, мы можем убедиться, что такое число действительно в нём есть.

Снова запустим программу
и введём число 120. Программа вывела сообщение о том, что такого числа нет в
массиве. Программа работает правильно. Задача решена.

Рассмотрим функцию poisk.
Очевидно, что в лучшем случае при её выполнении будет выполнена 1 проверка, а в
худшем – 100. Это не очень много, но предположим, что у нас есть программа,
которая будет выполнять поиск тысячи или даже миллионы раз. Тогда для этого
может потребоваться много времени, но поиск в массиве можно организовать проще,
если элементы массива расположены в соответствии с некоторыми правилами,
например, по возрастанию или по убыванию своих значений.

Мы можем изменить порядок
следования элементов массива, отсортировав их. Сортировкой элементов массива
называется изменение порядка их следования в соответствии с некоторыми
правилами. По значениям элементы массива можно отсортировать разными способами.
Рассмотрим наиболее распространённые. Если в массиве не может быть равных
элементов, то его можно отсортировать по возрастанию или по убыванию.
Если же в массиве могут быть равные элементы, то его можно отсортировать по
неубыванию
или по невозрастанию.

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

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

Итак, что же нужно
сделать чтобы отсортировать массив по возрастанию методом пузырька… Вначале предположим,
что элементы массива уже расположены по возрастанию. Дальше будем
последовательно проверять пары элементов массива. Если найдём пару, в которой
элементы расположены не по возрастанию, то мы опровергнем начальное
предположение о том, что элементы уже расположены по возрастанию. Мы поменяем
местами элементы массива в паре, и продолжим проверять его дальше. После того,
как мы проверили все пары элементов массива мы должны проверить, осталось ли
наше начальное предположение о том, что элементы массива расположены по
возрастанию не опровергнутым. Если предположение было опровергнуто – мы начнём
выполнять алгоритм сначала, в противном случае – алгоритм завершит свою работу.
Когда после завершения работы алгоритма начальное положение останется не опровергнуто
алгоритм завершит свою работу.

Для написанной нами
программы для поиска элементов массива напишем процедуру сортировки элементов
массива a но не убыванию. Назовём
её sort. Для работы
процедуры нам нужна переменная для хранения, номера текущего элемента массива –
i и переменная для хранения одного из
элементов массива, когда мы будем менять их местами – k,
а также логическая переменная – p.
Напишем программный блок процедуры. В нём будет цикл с постусловием, в качестве
условия завершения работы которого будет значение логической переменной p.
Тело цикла будет начинаться с того что мы предположим, что элементы массива уже
расположены по возрастанию. Для этого переменной p
мы присвоим значение true.
Дальше будет следовать цикл с параметром i,
изменяющимся от 1 до 99. Это будет цикл для проверки пар элементов массива. В
нём будет условный оператор, который проверяет расположены ли элементы массива
с индексами i и i
+ 1

не по неубыванию. То есть что a[i]
>
a[i
+ 1]
.
Если это условие выполняется, мы должны поменять эти два элемента массива
местами. Для этого после слова then
в логических скобках запишем четыре оператора присваивания: переменной p
– значения false, так как мы
опровергли начальное предположение, переменной k
– значения a[i],
a[i]
– значение a[i
+ 1]
,
a[i
+ 1]

– значение переменной k.
Таким образом, мы опровергли начальное предположение и поменяли местами
элементы массива с индексами i
и i + 1.
На этом описание процедуры завершено.

procedure sort ();

var

 p: boolean;

 i, k: byte;

begin

 repeat

  p:=true;

  for i:=1 to 99
do

   if a[i]>a[i+1]

   then begin

    p:=false;

    k:=a[i];

    a[i]:=a[i+1];

    a[i+1]:=k;

   end;

 until p;

end;

Процедура сортировки
элементов массива по неубыванию методом пузырька

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

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

Теперь рассмотрим, как мы
можем организовать поиск элемента с заданным значением в массиве,
отсортированном по неубыванию. Очевидно, что элементы с наименьшим и наибольшим
значениями располагаются по краям. Для поиска элемента с заданным значением
можно использовать метод деления отрезка пополам (метод двоичной
дихотомии)
. Если элементы массива расположены по возрастанию, то мы можем проверить
его средний элемент. Так мы можем точно сказать где нужно искать элемент с
искомым значением. Если средний элемент массива будет меньше искомого, то
искомый элемент нужно искать после среднего, а в противном случае от первого до
среднего. Таким образом мы сократим область поиска сразу в два раза. Точно
также мы найдём средний элемент на новом промежутке поиска, сравним его с
искомым и так далее. Так будет продолжаться до тех пор, пока начальный или
конечный элемент промежутка поиска не будет равен искомому или пока промежуток
поиска не станет равен одному элементу.

В написанной нами
программе изменим функцию poisk.
В ней нам понадобится дополнительные переменные для хранения номеров первого и
последнего элемента массива на промежутке поиска, назовём их соответственно f
и l, объявим их
целочисленного типа byte.
Запишем логические скобки. Операторный блок процедуры будет начинаться с того,
что мы присвоим переменным f
и l их начальные значения,
то есть соответственно 1 и 100. Дальше мы запишем цикл с постусловием. Условием
завершения его работы будет, то что один из элементов массива с индексами f
и l равен искомому элементу t
или что промежуток поиска сузился до одного элемента, то есть f
= l.
В теле цикла будет условный оператор, который будет проверять меньше ли средний
элемент массива, с индексом равным (f
+
l) div
2
,
искомого t. Если это условие
выполняется, то мы должны сократить промежуток поиска элемента. Поэтому после слова
then присвоим переменной f
значение (f
+
l) div
2 + 1
. В противном случае – сократим промежуток поиска в
другом направлении и присвоим переменной l
значение (f
+
l) div
2
.
После завершения работы цикла проверим, равен ли один из элементов с индексами f
и l искомому t.
И присвоим значение истинности этого высказывания переменной функции – poisk.

function poisk (t: byte): boolean;

var

 f, l: byte;

begin

 f:=1;

 l:=100;

 repeat

  if a[(f+l) div 2]<t

  then f:=(f+l) div 2
+ 1

  else l:=(f+l)
div 2;

 until (a[f]=t) or (a[l]=t)
or (f=l);

 poisk:=(a[f]=t) or (a[l]=t);

end;

Функция поиска элемента с
заданным значением методом деления отрезка пополам

Запустим программу на
выполнение. Введём число 45. Программа вывела сообщение о том, что такого числа
нет в массиве.

Снова запустим программу
и введём число 190. Программа вывела сообщение о том, что это число есть в
массиве.

Программа работает
правильно задача решена.

Понравилась статья? Поделить с друзьями:
  • Как найти центральный угол если знаем вписанный
  • Как найти цену капитала пример
  • Составить социальный портрет российской молодежи какие черты вы бы отметили как главные
  • Как найти покупателя на долю в доме
  • Как найти время для подготовки к экзаменам