- •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 с параметром
- •Вложенные циклы
- •Взаимозаменяемость циклов различных видов
- •Дополнительные конструкции переходов для циклов
- •«Вечные» циклы
- •Простейшие алгоритмы
- •Вычисление суммы и произведения
- •Организация счетчика
- •Нахождение наибольшего и наименьшего значений
- •Рекуррентные последовательности
- •Итерационные алгоритмы
- •Подпрограммы (процедуры и функции)
- •Понятие подпрограммы, ее описания и вызова
- •Цели введения подпрограмм
- •Способы передачи параметров. Виды параметров
- •Параметры-значения
- •Параметры-переменные
- •Параметры-константы
- •Корректность передачи параметров
- •Досрочное завершение работы программы и подпрограммы
- •Реализация вызова подпрограммы
- •Область действия и время жизни идентификаторов
- •Правила видимости
- •Время жизни идентификаторов
- •Побочный эффект функции
- •Массивы
- •Описание переменных-массивов
- •Обозначение элементов массива
- •Двумерные массивы – матрицы
- •Трехмерные массивы
- •Типизированные константы-массивы
- •Операции над массивами
- •Именная эквивалентность типов
- •Передача массива в качестве параметра
- •Открытые массивы
- •Типичные задачи для одномерных массивов
- •Поиск заданного элемента в массиве
- •Анализ методов поиска по количеству операций сравнения
- •Двумерные массивы – матрицы
- •Трехмерные массивы
- •Сортировки массивов
- •Понятие сортировки
- •Параметры оценки алгоритмов
- •Сортировка простым включением (простыми вставками) Принцип сортировки включением
- •Сортировка простым выбором Принцип сортировки выбором
- •Сортировка простым обменом (метод пузырька) Принцип сортировки обменом
- •Сравнение эффективности базовых методов сортировки
- •Использование индексных массивов при сортировке
- •Рекурсия
- •Что такое рекурсия
- •Рекурсивные подпрограммы
- •Прямая и косвенная рекурсия
- •Предварительное (опережающее) описание подпрограммы
- •Опасности рекурсии
- •Бесконечная рекурсия
- •Итерация и рекурсия. Необоснованное применение рекурсии
- •Глубокая рекурсия
- •Когда использовать рекурсию
- •Формы рекурсивных подпрограмм
- •Примеры рекурсивных программ
- •Ввод последовательности целых чисел, заканчивающейся нулем, вывод в обратном порядке
- •Поиск максимального элемента массива
- •Задача о Ханойских башнях
- •Символьные и строковые типы данных
- •Символьные типы данных
- •Представление символов в памяти компьютера
- •Символьные константы и переменные Неименованные символьные константы
- •Стандартные функции над символами
- •Строковые типы данных
- •Строковые типы. Представление строк в памяти компьютера
- •Стандартные функции и процедуры для строк
- •Выделение слов из строки
-
Открытые массивы
Открытый массив это формальный параметр подпрограммы, описывающий базовый тип элементов массива, но не указывающий тип его индексов. Это дает возможность использовать одни и те же подпрограммы для обработки одномерных массивов различных размеров.
Параметр открытый массив может передаваться как по значению, так и по адресу. Например:
procedure P1(V: array of integer); //V ─ открытый массив, параметр-значение
procedure P2(var V: array of integer); //V ─ открытый массив, параметр-переменная
procedure P3(const V: array of integer);//V ─ открытый массив, параметр-константа
В теле подпрограммы открытый массив трактуется как одномерный массив с нижней границей, равной 0, и верхней границей, равной N-1, где N = число элементов в фактическом параметре.
Эти границы возвращают соответственно стандартные функции Low(V)и High(V). Т.е. диапазон изменения индексов открытого массива равен Low(V)..High(V), причем функция Low(V) для открытого массива всегда выдает 0.
Для обработки всех элементов открытого массива в подпрограмме можно использовать цикл:
for i:=Low(V) to High(V) do V[i] … или for i:=0 to High(V) do V[i] …
В качестве фактических параметров можно передавать массивы с элементами указанного в заголовке подпрограммы типа, но с произвольными границами индексов. Например, можно передать массивы:
var v1:array[-10..10] of integer; //В массиве 21 элемент
v2:array[1..1000] of integer; //В массиве 1000 элементов
v3:array[’a’..’d’] of integer; //В массиве 5 элементов
begin P2(v1); P2(v2); P2(v3);
Диапазон изменения индекса фактического параметра-массива отображается при вызове подпрограммы в диапазон изменения индекса открытого массива:
-
-10..10 в 0..20;
-
1..1000 в 0..999;
-
’a’..’d’ в 0..3.
-
Типичные задачи для одномерных массивов
const n=50; //Глобальная константа, используется во всех подпрограммах type vector=array[1..n] of integer;// Пусть задан для примера такой тип одномерных массивов
procedure ReadVec(var V:vector);
// Заполнение массива числами с клавиатуры
var i:integer;
begin
for i:=1 to n do
begin
write(‘V[‘, i, ‘]=’)
readln(V[i])
end end;
procedure RandomVec(var V:vector; B:integer);
// Заполнение массива случайными числами от 0 до B-1
var i:integer;
begin
for i:=1 to n do
V[i]:=Random(B) //Random выдает случайное число, удовлетворяющее условию 0<= число < B
end;
Перед вызовом функции Random надо вызвать процедуру Randomize для инициализации датчика случайных чисел. Randomize гарантирует несовпадение последовательностей случайных чисел, выдаваемых функцией Random. Замечание: для заполнения вещественных массивов используют вызов функции Random без параметра, которая выдает случайное вещественное число, удовлетворяющее условию: 0<= число <1
procedure WriteVec(const V:vector; L,B:integer);
// Вывод элементов массива по L элементов в строке, ширина поля вывода B
var i:integer;
begin
for i:=1 to n do
begin write(M[i]:B) //Вывод элемента, остаемся в той же строке
if (i mod L)=0 //Если это последний элемент из L элементов в строке,
else writeln //то переход на новую строку
end;
writeln //Переход на новую строку после вывода всего массива
end;
function EqualVec(const V1,V2:vector):boolean;
// Сравнение двух векторов
var i:integer;
begin
Result:=true; //Пока считаем, что векторы равны
for i:=1 to n do
if V1[i]<>V2[i]
then begin Result:=false; break end //Найдена пара несовпадающих элементов
end;
procedure LeftVec(var V:vector);
// Сдвиг элементов вектора влево
var i:integer;
begin
for i:=1 to (n-1) do
V[i]:=V[i+1]
end;
procedure RightVec(var V:vector);
// Сдвиг элементов вектора вправо
var i:integer;
begin
for i:=n downto 2 do
V[i]:=V[i-1]
end;
procedure CirLeftVec(var V:vector);
// Циклический сдвиг элементов вектора влево
var i, tmp:integer;
begin
tmp:=V[1];
for i:=1 to (n-1) do
V[i]:= V[i+1];
V[n]:=tmp
end;
procedure CirRightVec(var V:vector);
// Циклический сдвиг элементов вектора вправо
var i, tmp:integer;
begin
tmp:=V[n];
for i:=n downto 2 do
V[i]:=V[i-1];
V[1]:=tmp
end;
function SumVec(const V:vector):integer;
// Сумма элементов вектора
var i:integer;
begin
Result:=0;
for i:=1 to n do
Result:=Result+V[i]
end;
function IndMaxVec(const V:vector):integer;
// Индекс максимального элемента. Если одинаковых максимальных элементов несколько,
// то индекс последнего из них
var i:integer;
begin
Result:=1;
for i:=2 to n do
if V[i] >= V[Result] then Result:=i
end;
procedure AllIndMaxVec(const V:vector; var Ind:vector; var K:integer);
// Индексы всех максимальных элементов вектора.
// Результат – массив индексов Ind, K – количество индексов совпадающих максимальных элементов
var i, max:integer;
begin
max:=V[1]; K:=0;
for i:=2 to n do //Поиск максимального значения в массиве
if V[i] > max then max:=V[i];
for i:=1 to n do //Занесение индексов всех совпадающих максимальных элементов в Ind
if V[i] = max
then begin K:=K+1; Ind[K]:=i end
end;