
- •Основы разработки алгоритмов
- •Издание посвящается 400-летию г. Томска
- •1.Рекуррентные алгоритмы
- •Задачи для самостоятельного решения 1
- •2.Подпоследовательности в массиве
- •Задачи для самостоятельного решения
- •3.Упорядоченность в массиве
- •Задачи для самостоятельного решения
- •4.Матрицы
- •Задачи для самостоятельного решения.
- •5.Обработка текста
- •Задачи для самостоятельного решения
- •6.Информационные массивы
- •Задачи для самостоятельного решения.
- •7.Советы по решению задач
- •8.Краткий справочник по языку паскаль Структура программы
- •Типы данных
- •Операторы
- •Литература
Томский государственный университет
Факультет информатики
Ю. Л. Костюк, А. Л. Фукс, И. Л. Фукс
Основы разработки алгоритмов
Издание 2-е, дополненное
Методические указания
Томск – 2004
Методические указания рассмотрены и одобрены методической комиссией факультета информатики.
Декан факультета информатики С.П. Сущенко
Председатель методической комиссии В.В. Поддубный
Методические указания предназначены для подготовки к сдаче ЕГЭ, а также для подготовки к вступительному экзамену по информатике. Для решения предлагаемых задач достаточно знаний в объеме школьной программы по информатике и владения начальными навыками алгоритмизации.
В каждом разделе сборника для нескольких задач приведена пошаговая разработка алгоритмов и получающихся в результате программ на языке программирования Паскаль. Все задачи, предназначенные для самостоятельной работы, снабжены советами по решению. Приводится справочная информация по операторам языка Паскаль.
Издание посвящается 400-летию г. Томска
Почтовый адрес: 634050, г. Томск, пр. Ленина, 36, ТГУ,
приемная комиссия
Телефон: (382-2) 52-96-72
Информационный интернет-сервер: |
http://www.inf.tsu.ru |
Электронная почта: |
kostuk@inf.tsu.ru fooks@inf.tsu.ru foox@inf.tsu.ru |
© Костюк Ю. Л., Фукс А. Л., Фукс И. Л., 2004
1.Рекуррентные алгоритмы
Основой рекуррентных алгоритмов являются рекуррентные соотношения. Это соотношения вида:
где
– константы,
В
практических задачах чаще всего
.
Вычисление суммы элементов массива. Дан вещественный массив a длины n. Найти сумму элементов массива.
Введем обозначение
для суммы первых i
элементов массива. Тогда можно записать
следующее рекуррентное соотношение:
,
,
при
.
В
программе будем последовательно
вычислять
,
используя для этих сумм одну переменную
S.
S:=0;
for i:=1 to n do S:=S+a[i];
Нахождение минимума в массиве. Дан целочисленный массив длины n. Найти минимальный элемент в массиве.
Пусть
–
минимальный среди первых i
элементов массива. Очевидно, что
,
а при
выполняется:
.
В
программе будем последовательно
вычислять
,
используя для хранения этих значений
одну переменную m.
m:=a[1];
for i:=2 to n do
if a[i]<m
then m:=a[i];
Поиск второго максимума. Дан целочисленный массив длины n. Найти второй максимальный элемент (т.е. элемент, который будет иметь номер n-1, если массив упорядочить по возрастанию).
При поиске второго
максимального элемента необходимо
сохранять и первый максимальный – самый
большой элемент в массиве. Пусть
и
– это, соответственно, первый и второй
максимумы среди первых i
элементов массива. Исходные значения
для
и
определяются по первым двум элементам
массива, поэтому
,
,
.
При
выполняется:
,
,
если
,
,
,
если
,
,
,
если
.
В программе будем последовательно вычислять и , используя для этого переменные s и f.
if a[1]>=a[2]
then begin f:=a[1]; s:=a[2]; end
else begin f:=a[2]; s:=a[1]; end;
for i:=3 to n do
if a[i]>f then begin s:=f; f:=a[i]; end
else if a[i]>s then s:=a[i];
Вычисление числа по цифрам. Дан целочисленный массив, содержащий k десятичных цифр некоторого целого положительного числа N. Вычислить значение N.
Пусть цифры числа
заносились в массив последовательно
слева направо, т.е.
содержит цифру самого старшего (
)-го
разряда, а
– самого младшего (нулевого). Очевидно,
что при правильном задании массива
десятичных цифр
,
а искомое значение
.
Для исключения операции возведения в степень и упрощения вычислений воспользуемся схемой Горнера:
.
Будем последовательно вычислять выражения внутри скобок, начиная с самых внутренних, а результат сохранять в переменной N:
N:=a[1];
for i:=2 to k do N:=N*10+a[i];
Вычисление приближенного значения функции. Для заданного вещественного x и целого n вычислить приближенное значение
.
При вычислении
подобных сумм удобно определять сразу
два рекуррентных соотношения: одно –
для вычисления следующего слагаемого
на основе предыдущего, а другое – для
вычисления частичных сумм. Введем
обозначения:
– i-е слагаемое,
– сумма первых i
слагаемых (
).
Тогда
,
а при
.
Выразим
через
:
.
Для сумм выполняется:
и
.
В программе для хранения слагаемых и
сумм используем вещественные переменные
a и S.
a:=1; S:=1;
for i:=1 to n do
begin a:=a*x/i; S:=S+a; end;
Трудоемкость алгоритмов. Каждый из рассмотренных алгоритмов содержит цикл for, выполняющийся n ( или n – 1) раз. Так как перед циклом и внутри цикла количество выполняемых действий – константа, то общее число действий можно представить в виде C1 + C2 * n, где C1 и C2 – константы. Таким образом, трудоемкость этих алгоритмов – линейная.