- •Содержание
- •Часть 1. Основные понятия программирования §1.1. Этапы разработки программного обеспечения
- •§1.2. Основные сведения об алгоритмах Понятие алгоритма
- •Свойства алгоритма
- •Формы записи алгоритмов
- •Блок-схемы алгоритмов
- •§1.3. Языки программирования
- •§1.4. Паскаль и Object Pascal, Турбо-Паскаль и Delphi
- •Контрольные вопросы
- •Язык, оболочка и интегрированная среда разработки
- •Часть 2. Общие сведения о языке Паскаль §2.1. Алфавит и служебные слова
- •Описание общих конструкций языка
- •§2.2. Структура программы
- •§2.3. Разделы описаний Описание меток
- •Определение констант
- •Определение типов
- •Описание переменных
- •Контрольные вопросы
- •Часть 3. Простые типы данных Иерархия типов
- •§3.1. Целые типы
- •§3.2. Вещественные типы
- •§3.3. Логический тип
- •§3.4. Литерный тип
- •§3.5. Перечисляемый тип
- •§3.6. Диапазоны (интервальный тип)
- •Дополнительные типы в Delphi
- •Контрольные вопросы
- •Глава 4. Операторы языка Паскаль Выражения
- •§4.1. Оператор присваивания
- •§4.2. Ввод-вывод данных
- •§4.3. Составной оператор
- •§4.4. Пустой оператор
- •§4.5. Безусловный оператор перехода
- •§4.6. Условный оператор
- •§4.7. Оператор цикла с параметром for
- •§4.8. Оператор цикла с предусловием while
- •§4.9. Оператор цикла с постусловием repeat
- •§4.10. Оператор выбора case
- •Контрольные вопросы
- •Глава 5. Процедурное программирование §5.1. Функции
- •Параметры – значения
- •Параметры – переменные
- •Бестиповые параметры
- •§5.2. Процедуры
- •Правила использования подпрограмм
- •Рекурсия
- •Директивы
- •Процедурные типы
- •Пример использования подпрограмм
- •Контрольные вопросы
- •Глава 6. Структурированные типы данных
- •§6.1. Массивы
- •§6.2. Строки
- •§6.3. Записи
- •§6.4. Множества
- •Пример использования множеств
- •§6.5. Файлы
- •Установочные и завершающие операции
- •Операции ввода-вывода
- •Перемещения по файлу
- •Пример работы с файлом
- •Обработка ошибок ввода-вывода
- •Специальные операции
- •Пример объединения двух файлов
- •Текстовые файлы
- •Стандартные текстовые файлы
- •Файлы без типа
- •Контрольные вопросы
- •Глава 7. Динамические структуры данных §7.1. Динамические переменные
- •§7.2. Указатели
- •Работа с динамическими переменными
- •Пример двухсвязанного циклического списка
- •Указатели без типа
- •Контрольные вопросы
- •Глава 8. Низкоуровневые возможности Паскаля §8.1. Язык Ассемблер
- •§8.2. Доступ к аппаратуре Доступ к памяти
- •Доступ к портам ввода-вывода
- •Работа по прерываниям
- •Контрольные вопросы
- •Глава 9. Модули §9.1. Основные понятия
- •§9.2. Использование модулей
- •§9.3. Стандартные модули
- •§9.4. Модуль Crt
- •Работа с экраном в текстовом режиме
- •Работа с клавиатурой
- •Работа со звуком
- •§9.5. Модуль dos
- •§9.6. Графический режим монитора
- •Контрольные вопросы
- •Глава 10. Введение в объектно-ориентированное программирование §10.1. История развития программирования
- •Понятие объекта
- •§10.2. Свойства объектов
- •Раннее и позднее связывание
- •§10.3. Виртуальные методы
- •Конструкторы и деструкторы
- •§10.4. Динамические объекты
- •Скрытые поля и методы
- •Контрольные вопросы
- •Литература
Пример двухсвязанного циклического списка
Определим функции при работе со списком с пояснениями, представленными на рис. 7.1:
0 - просмотр влево (подпрограмма PRL);
1 - просмотр вправо (подпрограмма PRR);
2 - удаление (подпрограмма DEL);
3 - вставка (подпрограмма BCT);
4 - конец работы.
При проходе первого элемента переводится строка.
Рис. 7.1. Операции с узлами двухсвязанного циклического списка
Program SW_Spisok2;
{ Демонстрационный пример использования динамических переменных:
двухсвязанный циклический список }
Uses crt;
Type P=^dat;
dat=Record
INF:char; { любой нужный тип элемента списка }
L,R:P;
end;
Var Point, { указатель на начало кольца }
lef,rig,n:P;
ch:char;
Procedure PRL; { процедура сдвига влево }
Begin
rig:=lef;
lef:=rig^.l; { сдвиг указателей }
Write(lef^.inf); { вывод информационного поля }
If lef=Point then
Writeln; { начало кольца }
end;
Procedure PRR; { процедура сдвига вправо }
Begin
lef:=rig;
rig:=lef^.r;
Write(lef^.inf);
If lef=Point then
Writeln;
end;
Procedure DEL; { процедура удаления }
Begin
If lef^.l=lef^.r then { не менее 2х элементов }
Writeln('Осталось два элемента')
else
If lef=Point then
Writeln('Начало списка')
else
Begin
rig^.l:=lef^.l; { изменение указателей }
lef^.l^.R:=lef^.r;
Dispose(lef); { возвращение памяти }
lef:=Rig^.l;
end;
end;
Procedure BCT; { процедура вставки }
Begin
ch:=ReadKey; Write(ch);
NEW(n);
n^.inf:=ch;
n^.l:=lef; { связи из нового узла }
n^.r:=rig;
rig^.l:=n; { указание на новый узел }
lef^.r:=n;
rig:=n;
writeln;
end;
Begin { непосредственно сама программа }
ch:=ReadKey; Write(ch);
NEW(rig);
rig^.inf:=ch; { первый правый узел }
ch:=ReadKey; Write(ch);
NEW(lef);
lef^.inf:=ch; { первый левый узел }
rig^.l:=lef;
rig^.r:=lef;
lef^.l:=rig;
lef^.r:=rig;
Point:=lef; { начало кольца }
Repeat
Ch:=ReadKey;
Case ch of { анализируем введенную команду }
'0': PRL;
'1': PRR;
'2': DEL;
'3': BCT;
'4': Writeln('Конец')
else
Writeln('Неверный ввод')
end;
Until ch='4'; { пока не встретим команду «конец» }
end.
Указатели без типа
Турбо Паскаль содержит стандартный ссылочный тип, который позволяет не конкретизировать базового типа и считается совместимым со всеми ссылочными типами.
Var <имя_указателя> : pointer;
Работа с ними подразумевает их преобразование в указатели, ссылающиеся на значения конкретного типа, например, при необходимости организовать список, состоящий из записей различных типов.
Для создания и удаления переменных с такими указателями соответственно используются процедуры:
GetMem (<указатель>,<размер>);
FreeMem (<указатель>,<размер>);
Размер участка памяти указывается в байтах, обычно с применением функции SizeOf:
GetMem (Ptr,SizeOf(R));
Для работы с нетипизированными указателями используются дополнительные функции, здесь не рассматриваемые.
