- •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 с параметром
- •Вложенные циклы
- •Взаимозаменяемость циклов различных видов
- •Дополнительные конструкции переходов для циклов
- •«Вечные» циклы
- •Простейшие алгоритмы
- •Вычисление суммы и произведения
- •Организация счетчика
- •Нахождение наибольшего и наименьшего значений
- •Рекуррентные последовательности
- •Итерационные алгоритмы
- •Подпрограммы (процедуры и функции)
- •Понятие подпрограммы, ее описания и вызова
- •Цели введения подпрограмм
- •Способы передачи параметров. Виды параметров
- •Параметры-значения
- •Параметры-переменные
- •Параметры-константы
- •Корректность передачи параметров
- •Досрочное завершение работы программы и подпрограммы
- •Реализация вызова подпрограммы
- •Область действия и время жизни идентификаторов
- •Правила видимости
- •Время жизни идентификаторов
- •Побочный эффект функции
- •Массивы
- •Описание переменных-массивов
- •Обозначение элементов массива
- •Двумерные массивы – матрицы
- •Трехмерные массивы
- •Типизированные константы-массивы
- •Операции над массивами
- •Именная эквивалентность типов
- •Передача массива в качестве параметра
- •Открытые массивы
- •Типичные задачи для одномерных массивов
- •Поиск заданного элемента в массиве
- •Анализ методов поиска по количеству операций сравнения
- •Двумерные массивы – матрицы
- •Трехмерные массивы
- •Сортировки массивов
- •Понятие сортировки
- •Параметры оценки алгоритмов
- •Сортировка простым включением (простыми вставками) Принцип сортировки включением
- •Сортировка простым выбором Принцип сортировки выбором
- •Сортировка простым обменом (метод пузырька) Принцип сортировки обменом
- •Сравнение эффективности базовых методов сортировки
- •Использование индексных массивов при сортировке
- •Рекурсия
- •Что такое рекурсия
- •Рекурсивные подпрограммы
- •Прямая и косвенная рекурсия
- •Предварительное (опережающее) описание подпрограммы
- •Опасности рекурсии
- •Бесконечная рекурсия
- •Итерация и рекурсия. Необоснованное применение рекурсии
- •Глубокая рекурсия
- •Когда использовать рекурсию
- •Формы рекурсивных подпрограмм
- •Примеры рекурсивных программ
- •Ввод последовательности целых чисел, заканчивающейся нулем, вывод в обратном порядке
- •Поиск максимального элемента массива
- •Задача о Ханойских башнях
- •Символьные и строковые типы данных
- •Символьные типы данных
- •Представление символов в памяти компьютера
- •Символьные константы и переменные Неименованные символьные константы
- •Стандартные функции над символами
- •Строковые типы данных
- •Строковые типы. Представление строк в памяти компьютера
- •Стандартные функции и процедуры для строк
- •Выделение слов из строки
-
Трехмерные массивы
Описание трехмерного массива:
var A : array[1..p,1..m,1..n] of integer;
Для доступа к каждому элементу массива (например, для ввода) используется тройной вложенный цикл:
for i:=1 to p do {Цикл по плоскостям массива}
for j:=1 to m do {Цикл по строкам выбранной плоскости}
for k:=1 to n do {Цикл по элементам строки}
read(M[i,j,k])
-
Типизированные константы-массивы
-
Пример для одномерного целочисленного массива: const IntVector : array[1..10] of integer = (3,8,1,4,9,15,0,6,-2,7);
-
Пример для двумерного вещественного массива: const RMatrix : array[1..3,1..4] of real = ((1.1,1.2,1.3,1.4),(2.1,2.2,2.3,2.4),(3.1,3.2,3.3,3.4)); После запуска программы переменная-матрица RMatrix будет заполнена следующим образом:
|
1 |
2 |
3 |
4 |
1 |
1.1 |
1.2 |
1.3 |
1,4 |
2 |
2.1 |
2.2 |
2.3 |
2.4 |
3 |
3.1 |
3.2 |
3.3 |
3.4 |
-
Операции над массивами
В языке Pascal все действия над массивами надо выполнять поэлементно, за исключением присваивания одного массива другому массиву, если типы массивов эквивалентны, например:
var M1,M2:array[1..10] of integer;
. . . M1:=M2 (элементы массива M2 присваиваются соответствующим элементам массива M1).
Однако, при описании
var M1:array[1..10] of integer;
M2:array[1..10] of integer;
присваивание M1:=M2 вызовет ошибку несоответствия типов. Хотя массивы имеют одинаковую структуру, их типы различны.
-
Именная эквивалентность типов
Существует несколько схем для определения того, являются ли типы двух объектов эквивалентными. Наиболее часто используется структурная эквивалентность типов и именная эквивалентность типов:
-
в соответствии со структурной эквивалентности типов два объекта относятся к одному и тому же типу только в том случае, если их компоненты имеют одинаковые типы;
-
в соответствии с именной эквивалентности типов два объекта имеют один и тот же тип только в случае их определения с использованием имени того же типа; два типа T1 и T2 являются эквивалентными, если выполняется одно из двух условий:
-
T1 и T2 представляют собой один и тот же идентификатор типа;
-
Тип T2 описан с использованием типа T1 через непосредственное равенство вида type T2=T1 или посредством цепочки таких равенств.
В языке Pascal принята именная эквивалентность типов. Например:
Type T1 : array[1..10] of integer;
T2 : array[1..10] of integer;
T3 = T1;
Var M1:T1; V1:T1; M3:T3;
M2:T2;
Типы T1, T3 эквивалентны, поэтому массивы M1, V1, M3 имеют эквивалентные типы. Тип T2 не эквивалентен типам T1, T3, поэтому тип массива M2 отличается от типа массивов M1, V1 M3.
-
Передача массива в качестве параметра
Для передачи массива в качестве параметра необходимо предварительно описать тип массива, например:
const N=50; type vector=array[1..N] of integer; var M:vector;
-
Передача массива по значению: procedure P(V: vector); При вызове процедуры P(M) в процедуру будет передана копия массива M, что крайне неэффективно. Кроме того, действия процедуры над этой копией не отразятся на массиве M.
-
Передача массива по адресу как переменной: procedure P(var V: vector); При вызове процедуры P(M) в процедуру будет передан адрес массива M, причем процедура может изменять этот массив.
-
Передача массива по адресу как константы: procedure P(const V: vector); При вызове процедуры P(M) в процедуру будет передан адрес массива M, процедура может только брать элементы из массива M, но изменять массив M процедура не сможет.
Замечание: при вызове подпрограммы в рассмотренном примере в качестве фактического параметров можно задавать только массивы типа vector. Снять это ограничение позволяют открытые массивы.