- •Часть 1
- •1. With elem 50
- •2.1. Если поступившая запись предшествует корневой, идти в левое 98
- •2.2. Иначе – в правое поддерево. 98
- •Введение Основные этапы решения задач на эвм
- •Языки программирования
- •Трансляторы
- •2. Данные в паскале. Простые типы данных
- •1. Общие сведения о языке паскаль
- •1.1. Алфавит языка. Идентификаторы и зарезервированные слова
- •2.1. Целочисленный тип
- •2.2. Вещественный тип
- •2.3. Логический тип
- •2.4. Символьный тип
- •2.5. Перечисляемый тип
- •Var m1, m2: metall;
- •2.6. Ограниченный (диапазонный) тип данных
- •Над значениями ограниченного типа допустимы те же операции, что и над значениями базового типа, используемыми при задании в разделе определения типов. Если, к примеру, задано определение:
- •Var y:bukva;
- •3. Операции и выражения
- •2.1. Целочисленный тип
- •3.2. Арифметические выражения и операции
- •3.3. Логические операции и выражения
- •3.4. Операции отношения
- •3.5. Стандартные функции
- •3.6. Приоритеты операций
- •4. Структура программы
- •4.1. Раздел определения констант
- •4.2. Раздел определения типов
- •4.3. Раздел описания переменных
- •V: boolen;
- •4.4. Раздел описания процедур и функций
- •4.5. Раздел операторов
- •4.6. Директивы компилятора и управляющие символы
- •5. Операторы языка паскаль
- •5.1. Оператор присваивания
- •5.2. Оператор вывода информации
- •5.3. Оператор ввода информации
- •5.4. Составной оператор
- •5.5. Условный оператор
- •5.6. Оператор варианта case
- •5.7. Операторы цикла
- •5.7.1. Оператор цикла по счетчику (цикл с параметром )
- •Иденти-фикатор перемен-ной
- •I,n:integer; {I -пар-р цикла, n - его кон.Занч.}
- •X,s,p;integer;
- •5.7.2. Оператор цикла с предусловием
- •Пример составления таблицы переменных
- •Var a,Summa:real;
- •Inc (Summa, a);
- •5.7.3. Оператор цикла с постусловием
- •X,Summa:real;
- •6. Структурированные типы данных
- •6.1. Массивы
- •I,ne:integer;
- •6.1.1. Сортировка массивов
- •Vr:char;
- •Vr : char;
- •6.2. Строки
- •6.3. Множества
- •I : byte;
- •6.4. Записи
- •With elem
- •7. Типизированные константы
- •7.1. Типизированные константы скалярных типов
- •7.2. Типизированные константы - массивы и строки
- •7.3. Типизированные константы – множества
- •Var a: hvor;
- •I, j, k, simp: byte;
- •7.4. Типизированные константы – записи
- •8. Файлы
- •8.1. Типизированные файлы
- •8.2. Текстовые файлы
- •Var f : text;
- •9. Подпрограммы
- •9.1. Процедуры и функции
- •9.2. Процедуры и функции пользователя
- •Var p: real;
- •Var p: real;
- •9.3. Параметры подпрограмм
- •Var X: real; m: integer;
- •Var I : integer;
- •10. Рекурсии
- •10.1. Рекурсивные алгоритмы и определения
- •10.2. Рекурсивные процедуры и функции
- •Var f : longint ;
- •Var a, y, z : real;
- •10.3. Виды рекурсивных процедур
- •If условие
- •If условие
- •If условие then Recur ; then begin
- •Var k : integer;
- •Var c : char;
- •Var c : char;
- •11. Графика в паскале
- •11.1. Основы работы в графическом режиме
- •11.1.1. Аппаратная и программная поддержка графики
- •Init Graph (Driver, Mode, Path);
- •11.1.3. Обработка ошибок
- •11.1.4. Закрытие видеорежима
- •11.2. Система координат дисплея
- •11.1.2. Запуск графической системы
- •Var Driver, Mode: integer;
- •11.3. Экран и окно
- •11.4. Установка цвета, заполнения и палитры
- •11.5. Построение простейших геометрических образов
- •11.6. Работа с текстом OutText (X,y:integer; txt:string) – вывести строку txt с текущего положения указателя.
- •11.7. Вывод числовых значений
- •12. Программные модули
- •12.1. Структура программного модуля
- •Interface –интерфейсные раздел («видимая» часть модуля)
- •Implementation – раздел реализации («черный ящик»)
- •Interface
- •Var X:integer;
- •Implementation
- •Interface
- •X: integer;
- •Implementation
- •12.3. Ссылки на модули
- •Unit hlp _ sr;
- •Xa, ya, xb, yb, xc, yc: integer;
- •13. Динамическая память
- •Var a1: array[1..300,1..300] of integer.
- •13.1. Адресация памяти
- •13.2. Указатели
- •13.2.1. Операции с указателями
- •13.2.2. Нетипизированные указатели
- •X: integer;
- •13.2.3. Типизированные указатели
- •13.3. Создание и уничтожение динамических переменных
- •X: real;
- •13.4. Администратор кучи
- •Heapend содержит адрес конца кучи
- •13.5. Примеры использования указателей
- •Объявление
- •Var Pr:preco;
- •14. Использование указателей для организации связанных динамических структур
- •14.1. Списки
- •14.1.1. Алгоритмы работы со списками
- •14.2. Организация стека в динамической памяти
- •Var p, st :pstack; {st - указатель на вершину стека}
- •I: integer;
- •14.3. Очереди
- •14.4. Деревья
- •14.4.1. Организация деревьев в динамической памяти
- •14.4.2. Построение полного двоичного дерева
- •I,j :I nteger; I - значение инф. Поля очередной
- •Var p,h:pstack;
- •Inc(I); {создаем новый узел – вершину}
- •Inc(j); {переместим указатель t и переход
- •14.4.3. Алгоритмы работы с двоичными упорядоченными деревьями (деревьями поиска)
- •14.4.4. Рекурсивные алгоритмы работы с двоичными деревьями
- •I, X : integer;
- •Литература
- •Часть 1. Язык программирования Паскаль
Var Pr:preco;
Выделение памяти
В результате выполнения процедур New и Getmem в ячейки переменных-указателей записываются адреса, по которым будут располагаться данные соответствующих типов, и выделяется память по указанным адресам для хранения объектов, на которые ссылаются указатели:
New(x); New(y); New(B); New(R); New(Pa); New(Pr);
Getmem (p, sizeof(real)); Getmem(q, sizeof(A));
Разыменование (занесение значений)
x^ := 10; y^ := 20; B^:=255; R^:=1.125;
for i:=1 to 5 do Pa^[i] := sqr(i);
Pr^.c := `$`; Pr^.n := 1000;
Копирование значений
x^ := y^;
R^ := B^;
Копирование адресов
x:=y;
Пусть в тексте программы имеется: var k:real; … k := 625.5;
Тогда присвоение адреса переменной k указателям r и p будет выглядеть следующим образом: r:=@k; p:=@k;
Высвобождение памяти
Dispose(y); Dispose(x);
Freemem (p,sizeof(p));
Dispose(Pa); Dispose(Pr);
13.5.7. Задание «нулевого» значения
new(x);
x := nil;
14. Использование указателей для организации связанных динамических структур
Чаще всего указатели используют для ссылки на записи, чем достигается значительная экономия памяти. В такие записи включаются информационные поля для хранения интересующих пользователя данных (любого типа, который может быть полем записи) и обязательно хотя бы одно поле-указатель на следующую запись. Наличие поля-адреса позволяет образовывать связанные списки – структуру, в которой отдельные записи связаны последовательно друг с другом посредством поля-указателя.
14.1. Списки
Линейный список – связанный список, в котором имеется адрес точки входа в список (обозначим его HEAD), а последний элемент указывает на Nil. В любую точку списка разрешается добавлять элемент (ы) и исключать любой элемент. Обе операции производятся с помощью перенастройки указателей и, соответственно, выделения памяти и занесения в нее значения (в случае вставки элемента в список) или высвобождения памяти (в случае удаления из списка).
П р и м е р линейного односвязного списка представлен на рис. 14.1.
Рис. 14.1. Список в динамической памяти
Таким образом, все указатели списка, кроме первого (HEAD), размещаются в динамической памяти. Поскольку каждый элемент списка состоит из разнотипных частей - хранимой информации в виде информационных полей и указателя, то естественно представить в Паскале такой элемент типом Record. Для указателя на вход в список необходимо описать переменную соответствующего типа.
П р и м е р описания списка
Type psp = ^tsp;
tsp = Record
… {Поля любых типов}
…
next : psp
end;
14.1.1. Алгоритмы работы со списками
1. Построение списка сводится к последовательному добавлению элементов в первоначально пустой список. На пустой список указывает (head = nil). Пусть требуется создать список слов, вводимых с клавиатуры. Последнее слово в списке – «end».
Type
psp = ^tsp;
tsp = Record
wd:string; {В нашем примере информационное по
ле имеет тип string}
next : psp
end;
Var
head,p:psp;
sl:string;
begin
new(p);
head:=p;
p^.next:=nil;
readln(sl);
p^.wd:=sl;
while sl<>'end'
do begin
readln(sl);
new(q);
q^.wd := sl;
p^.next := q;
q^.next := nil;
p := q
end;
end;
2. Просмотр и печать списка. Пусть требуется написать процедуру Print_Spisok печати элементов списка, созданного в алгоритме 1.
Procedure Print_spisok;
begin
p:= head;
while p <> nil
do begin
writeln((p^.wd);
p := p^.next
end
end;
3. Поиск элемента в списке. Определить, есть ли в списке (алгоритм I) слово «begin» и если есть, то сколько раз встречается. К описанию алгоритма 1 добавим: var k : integer;
…
begin
p := head;
while p <> nil
do begin
if p^.wd = ‘begin’
then inc(k);
p := p^.next
end;
if k=0
then writeln(‘Такого элемента нет’)
else writeln(‘Слово’,sl,’ встречается ‘,k,’ раз’)
end;
4. Удаление первого элемента списка. Необходимо: 1) передвинуть указатель head на следующий элемент; 2) освободить память; 3) освободить память, занятую удаляемым элементом.
begin
p := head;
head := p^.next;
dispose(p);
Print_Spisok
end;
5. Удаление последнего элемента списка. К разделу описаний алгоритма 1 добавим вспомогательную переменную q типа psp.
begin
p := head;
q := p^.next;
while q^.next <> nil
do begin
p := q;
q := q^.next
end;
dispose(p);
p^.next := nil;
Print_Spisok
end;
6. Вставка элемента в список. Пусть необходимо вставить в список (алгоритм 1) новый элемент sl_new перед первым вхождением элемента sl_old, если sl_old входит в список. Добавим к разделу описаний алгоритма I описание переменных sl_new,sl_old : string; и fl:Boolean.
begin
write('Введите искомое слово ');
readln(sl_old);
write('Введите новое слово ');
readln(sl_new);
fl:=false;
p:=head;
while (p<> nil) and not fl
do if p^.wd=sl_old
then fl:=true
else p:=p^.next;
if fl
then begin {Вставка элемента}
new(q);
q^.wd:=sl_old;
q^.next:=p^.next;
p^.wd:=sl_new;
p^.next:=q
end;
Print_Spisok;
end;
