- •35 Жегуло а.И. Компьютерные науки 2010-2011 гг. Компьютерные науки Лекции для студентов 1 курса, 2010-2011 уч. Г., семестр 1
- •1. Основные понятия 3
- •2. Введение в язык программирования Pascal 3
- •7. Массивы 16
- •8. Сортировки массивов 22
- •9. Рекурсия 25
- •1. Символьные и строковые типы данных 31
- •Основные понятия
- •Способы описания алгоритма:
- •Введение в язык программирования Pascal
- •Структура программы на языке Pascal
- •Правила записи программ
- •Стиль программирования
- •Переменные и константы. Понятие типа данных
- •Классификация типов данных
- •Стандартные простые типы данных
- •Целые типы
- •Вещественные типы
- •Логические (булевские) типы
- •Перечисляемые типы
- •Интервальные типы
- •Порядковые типы
- •Описание данных
- •Описание переменных
- •Описание констант
- •Описание типизированных констант
- •Выражения
- •Операции отношения
- •Приоритеты операций
- •Арифметические выражения
- •Логические выражения
- •Операторы
- •Оператор присваивания
- •Оператор ввода с клавиатуры
- •Оператор вывода на экран монитора
- •Форматный вывод
- •Условный оператор (оператор альтернативы)
- •Составной оператор
- •Оператор выбора
- •Оператор цикла с предусловием while
- •Оператор цикла с постусловием repeat
- •Оператор цикла for с параметром
- •Вложенные циклы
- •Взаимозаменяемость циклов различных видов
- •Дополнительные конструкции переходов для циклов
- •«Вечные» циклы
- •Простейшие алгоритмы
- •Вычисление суммы и произведения
- •Организация счетчика
- •Нахождение наибольшего и наименьшего значений
- •Рекуррентные последовательности
- •Итерационные алгоритмы
- •Подпрограммы (процедуры и функции)
- •Понятие подпрограммы, ее описания и вызова
- •Цели введения подпрограмм
- •Способы передачи параметров. Виды параметров
- •Параметры-значения
- •Параметры-переменные
- •Параметры-константы
- •Корректность передачи параметров
- •Досрочное завершение работы программы и подпрограммы
- •Реализация вызова подпрограммы
- •Область действия и время жизни идентификаторов
- •Правила видимости
- •Время жизни идентификаторов
- •Побочный эффект функции
- •Массивы
- •Описание переменных-массивов
- •Обозначение элементов массива
- •Двумерные массивы – матрицы
- •Трехмерные массивы
- •Типизированные константы-массивы
- •Операции над массивами
- •Именная эквивалентность типов
- •Передача массива в качестве параметра
- •Открытые массивы
- •Типичные задачи для одномерных массивов
- •Поиск заданного элемента в массиве
- •Анализ методов поиска по количеству операций сравнения
- •Двумерные массивы – матрицы
- •Трехмерные массивы
- •Сортировки массивов
- •Понятие сортировки
- •Параметры оценки алгоритмов
- •Сортировка простым включением (простыми вставками) Принцип сортировки включением
- •Сортировка простым выбором Принцип сортировки выбором
- •Сортировка простым обменом (метод пузырька) Принцип сортировки обменом
- •Сравнение эффективности базовых методов сортировки
- •Использование индексных массивов при сортировке
- •Рекурсия
- •Что такое рекурсия
- •Рекурсивные подпрограммы
- •Прямая и косвенная рекурсия
- •Предварительное (опережающее) описание подпрограммы
- •Опасности рекурсии
- •Бесконечная рекурсия
- •Итерация и рекурсия. Необоснованное применение рекурсии
- •Глубокая рекурсия
- •Когда использовать рекурсию
- •Формы рекурсивных подпрограмм
- •Примеры рекурсивных программ
- •Ввод последовательности целых чисел, заканчивающейся нулем, вывод в обратном порядке
- •Поиск максимального элемента массива
- •Задача о Ханойских башнях
- •Символьные и строковые типы данных
- •Символьные типы данных
- •Представление символов в памяти компьютера
- •Символьные константы и переменные Неименованные символьные константы
- •Стандартные функции над символами
- •Строковые типы данных
- •Строковые типы. Представление строк в памяти компьютера
- •Стандартные функции и процедуры для строк
- •Выделение слов из строки
-
Поиск заданного элемента в массиве
Задача поиска состоит в том, чтобы определить индекс элемента, значение которого равно заданному аргументу поиска. Решение этой задачи зависит от того, упорядочен массив или нет:
-
линейный поиск используется в неупорядоченных массивах;
-
бинарный поиск можно применять только в упорядоченных массивах.
Анализ методов поиска по количеству операций сравнения
Линейный поиск в массиве из N элементов:
-
в среднем требует [N/2] сравнений значений элементов массива с искомым значением,
-
в худшем случае N сравнений (когда искомый элемент является последним элементом массива).
Бинарный поиск:
-
в худшем случае требует [log2 N] сравнений.
const n=50; //Глобальная константа, используется во всех подпрограммах type vector=array[1..n] of integer;// Пусть задан для примера такой тип одномерных массивов
function LinSearch(const V: vector; B:integer):integer;
// ЛИНЕЙНЫЙ ПОИСК индекса первого из элементов, удовлетворяющих условию поиска.
// Последовательно проверяются все элементы массива. Если элемент не найден, функция возвращает -1
var i, n:integer;
begin
Result:=-1; //Пока элемент не найден
i:=1;
repeat
if (V[i]=B) then Result:=i //Запомним индекс первого найденного элемента
i:=i+1
until (i>n) or (Result>0) //Выход либо по концу массива, либо найден элемент
end;
function BinSearch(const V:array of integer; b:integer):integer;
// БИНАРНЫЙ ПОИСК индекса первого из элементов, удовлетворяющих условию поиска.
//Бинарный поиск применим только в упорядоченных массивах, для определенности пусть массив не убывает.
//Массив делится пополам, средний элемент массива сравнивается с искомым значением.
//Если они равны, то поиск заканчивается.
//Если средний элемент меньше искомого, то все элементы левее его также меньше искомого, искать следует правее
//среднего элемента.
//Если средний элемент больше искомого, то все элементы правее его также больше искомого, искать следует левее
//среднего элемента.
//На каждом шаге зона поиска уменьшается вдвое.
//Поиск прекращается, когда либо элемент найден, либо массив исчерпан.
var i,L,R:integer;
begin
Result:=-1; //Пока элемент не найден
L:=1; //Левая текущая граница зоны поиска в массиве
R:=n; //Правая текущая граница зоны поиска в массиве
while (L<=R) and (Result=-1) do
begin
i:=(L+R) div 2; //Индекс среднего элемента
if V[i]=b then Result:=i //Элемент найден, его индекс равен i
else if V[i] < b //Если средний элемент меньше искомого,
then L:=i+1 //то будем искать правее среднего элемента
else R:=i-1 //иначе будем искать левее среднего элемента
end
end;
-
Схема Горнера и ее применение для вычисления полиномов
Дан полином
f(x)=a0xn + a1xn-1 + a2xn-2 + … + an-2x2 + an-1x + an
Идея схемы Горнера – вынести за скобки все, что можно.
f(x)=(…(((a0x + a1)x + a2)x + a3)…)x + an
Вычисление происходит «изнутри»:
p1 = a0x + a1 p2 = p1x + a2 p3 = p2x + a3 … pn = pn-1 + an В результате pn = f(x)
Коэффициенты полинома ai поместим в массив с индексами от 0 до n. Массив опишем с запасом.
program Polinom;
Const m=100;
var n : integer; //Степень полинома
A : array[0..m] of real; //Массив коэффициентов полинома
f : real; //Значение полинома
begin
// 1. Ввод степени полинома
repeat
write(‘Степень полинома=’); readln(n)
until n <=m;
// 2. Ввод коэффициентов полинома
for i:=0 to n do
read(A[i]);
// 3. Ввод значения x
write(‘x=’); readln(x);
// 4. Вычисление значения полинома в точке x
f := A[0];
for i:=1 to n do
f:=f*x + A[i];
writeln(’Значение полинома=’, f:8:3)
end.
Пример. Подсчитать S – общее количество секунд, если дано:
A[0] – количество секунд, A[1] – количество минут, A[2] – количество часов, A[3] – количество полных суток
A[4] – количество недель.
S= A[4]*7*24*60*60 + A[3]*24*60*60 + A[2]*60*60 + A[1]*60 + A[0]
Это выражение содержит 14 операций.
Вычисление по схеме Горнера требует 8 операций:
S = (((A[4]*7 + A[3])*24 + A[2])*60 + A[1])*60 + A[0]