- •64 Жегуло а.И. Компьютерные науки 2-й семестр 2011-2012 гг. Компьютерные науки Лекции для студентов 1 курса мехмата, 2011-2012 уч. Г.
- •2 Семестр
- •16.Модули
- •16.1.Модуль и модульное программирование
- •16.2.Структура модуля
- •Interface //Раздел интерфейса
- •Implementation //Раздел реализации
- •Initialization //Раздел инициализации
- •Пример модуля и его использования
- •Interface //Раздел интерфейса
- •Implementation //Раздел реализации
- •Заголовок модуля
- •Раздел интерфейса interface
- •Раздел реализации implementation
- •Раздел инициализации initialization
- •16.4.Использование объявленных в модуле объектов
- •17.Файлы
- •17.1.Файлы. Классификация файлов
- •17.2.Организация работы с файлами
- •17.3.Подпрограммы для работы с файлами любых типов Связывание файловой переменной с файлом
- •Запись в файл
- •17.5.Обработка ошибок ввода-вывода
- •17.6.Текстовые файлы
- •17.6.1.Структура текстового файла
- •17.6.2.Особенности открытия текстовых файлов
- •17.6.3.Особенности чтения и записи для текстовых файлов
- •17.6.7.Поэлементная обработка текстовых файлов, состоящих из строковых значений и чисел
- •17.7.Типизированные файлы
- •17.7.1.Описание и структура типизированного файла
- •17.7.5.Сравнение текстовых и типизированных файлов
- •17.7.6.Пример работы с типизированными файлами из записей
- •18.Процедурные типы
- •18.1.Назначение процедурных типов
- •18.2.Описание процедурных типов и процедурных переменных
- •18.3.Присваивание процедурным переменным. Вызов подпрограмм через процедурные переменные
- •18.4.Процедурные переменные в качестве параметров
- •19.Рекурсия
- •19.1.Что такое рекурсия
- •19.2.Рекурсивные подпрограммы
- •19.3.Прямая и косвенная рекурсия
- •19.4.Предварительное (опережающее) описание подпрограммы
- •19.5.Опасности рекурсии
- •19.5.1.Бесконечная рекурсия
- •19.5.2.Глубокая рекурсия
- •19.5.3.Итерация и рекурсия, необоснованное применение рекурсии
- •19.6.Когда использовать рекурсию
- •19.7.Формы рекурсивных подпрограмм
- •19.8.Примеры рекурсивных программ
- •19.8.1.Вывод цифр целого числа в прямом порядке
- •19.8.2.Поиск максимального элемента массива
- •19.9.Задача о Ханойских башнях
- •20.Указатели
- •20.1.Указательные типы
- •Описание типизированного указателя
- •20.2.Операции с указателями
- •20.3.Примеры присваивания для указателей
- •20.4.Статические и динамические переменные
- •Создание новой динамической переменной базового типа и установка на нее указателя
- •Уничтожение динамической переменной, на которую ссылается указатель
- •Проблема потерянных ссылок
- •21.Динамические структуры данных
- •21.1.Данные статической структуры и данные динамической структуры
- •21.2.Односвязные линейные списки
- •21.2.1.Структура односвязного линейного списка
- •Вставка элемента после заданного элемента
- •21.3.Стеки
- •21.3.1.Реализация стека через односвязный линейный список
- •21.3.2.Применение стеков
- •21.3.3.Реализация стека на основе массива
- •21.4.Деревья
- •21.4.1.Основные определения
- •Алгоритм построения идеально сбалансированного дерева
- •21.4.3.Способы обхода дерева
- •Деревья поиска
- •Построение дерева поиска
19.9.Задача о Ханойских башнях
Имеется башня из n дисков различного диаметра, нанизанных на один из трех стержней. Требуется построить аналогичную башню на другом стержне с использованием третьего при выполнении двух условий:
перемещать можно только один диск;
на диске меньшего диаметра нельзя помещать диск большего диаметра.
Трудолюбивые буддийские монахи день и ночь переносят диски со стержня на стержень. Легенда утверждает, что когда монахи закончат свою работу, наступит конец света. Для решения задачи с 64 дисками потребуется (264 – 1) перемещений. Поэтому конец света по легенде произойдет по истечении более 5 миллиардов веков, если считать, что один диск перемещается за одну секунду. Задачу и легенду для неё придумал в 1883 г. французский математик Э. Люка.
program Towers; {Перемещение с А на С, В - промежуточный} var N : integer; {число дисков} procedure Move(n:byte; A, C, B : char); begin if n=1 then writeln(A,’->’, C) else begin Move(n-1, A, B, C); writeln(A,’->’, C); Move(n-1, B, C, A) end end; begin write(’Число дисков=’); readln(N); Move(N, ’A’, ’C’, ’B’) end. |
|
20.Указатели
20.1.Указательные типы
Указателем называется переменная указательного типа, в которой хранится адрес некоторого объекта (например, переменной). Говорят, что указатель указывает или ссылается на другую переменную. |
|
Указатель занимает в памяти 4 байта.
Нулевой указатель – это указатель, который не ссылается ни на какой объект.
Для его обозначения служит константа Nil.
В языке Pascal различают два вида указателей:
бестиповые указатели, которые могут содержать адреса переменных любого типа. Они объявляются через стандартный указательный тип pointer, например: var p:pointer;
типизированные указатели, которые могут указывать на переменные только определенного типа; этот тип называется базовым типом для этих указателей. Далее будем рассматривать только типизированные указатели.
Описание типизированного указателя
С предварительным описанием пользовательского указательного типа type TPint = ^integer; //Указательный тип для ссылки на значения типа integer var pint : TPint; //Типизированный указатель типа TPint
Без описания имени типа var pint:^integer; //Типизированный указатель безымянного типа на значения типа integer
20.2.Операции с указателями
1. Взятие адреса @ имя_переменной
var x:integer; r:real;
p:^integer; //Типизированный указатель на значения типа integer
… p:=@x; //Указатель хранит адрес переменной x
p:=@r; //Это присваивание некорректно из-за несовпадения типов
2. Разыменование имя_переменной^
Разыменованный указатель p^ – это объект (место в памяти), на который указывает указатель.
Например, к переменной x можно обратиться либо непосредственно, либо через указатель p на x:
p:=@x;
x:=1; write(x,’ ’,p^); //Получим 1 1
p^:=2; write(x,’ ’,p^); //Получим 2 2
Замечание. Операции @ и ^ взаимообратны:
@(p^)=p и (@x)^=x
3. Сравнение на равенство =, сравнение на неравенство <>
Сравниваемые указатели должны быть одного и того же типа.
Операции сравнения проверяют, ссылаются ли два указателя на один и тот же адрес памяти.
if p1=p2 then …
if p1<>p2 then …
Замечание. Запрещены любые арифметические операции с указателями, их ввод-вывод и сравнение на больше-меньше.