Пример двухсвязанного циклического списка

Определим функции при работе со списком с пояснениями, представленными на рис. 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));

Для работы с нетипизированными указателями используются дополнительные функции, здесь не рассматриваемые.

Контрольные вопросы

1.  Что означает термин «статические переменные»?

2.  Как производится обращение к статическим переменным?

3.  Что означает термин «динамические переменные»?

4.  Как производится обращение к динамическим переменным?

5.  В каких случаях используются динамические переменные?

6.  Что такое «указатели»?

7.  Для каких целей используются указатели?

8.  Что такое «пустой указатель», и как он обозначается?

9.  Для чего используется операция взятия адреса?

10.  Что такое «разыменование»?

11.  При каком значении указателя его нельзя разыменовывать?

12.  Как выглядит процедура создания динамической переменной?

13.  Что происходит при выполнении процедуры создания динамической переменной?

14.  Что можно определить с помощью функции MaxAvail?

15.  Как выглядит процедура уничтожения динамической переменной?

16.  Что происходит при выполнении процедуры уничтожения динамической переменной?

17.  С помощью какой функции можно определить максимальный размер непрерывного участка свободной памяти?

18.  Какой тип совместим со всеми ссылочными типами?

Глава 8. Низкоуровневые возможности Паскаля

§8.1. Язык Ассемблер

Специфика системных программ, ориентированных на непосредственное взаимодействие с физическими устройствами компьютера, а так же необходимость доступа ко всем его аппаратным возможностям, часто не позволяют создавать элементы программ средствами языков высокого уровня. Более того, исполняемый код, порождаемый компиляторами, менее эффективен, чем код, созданный вручную. Поэтому повышенные требования к быстродействию и объему программ вызывают необходимость использования машинных команд или языка ассемблера.

Ассемблер (assembler, assembly language – монтаж, сборка) – язык программирования, понятия которого отражают архитектуру ЭВМ. Обеспечивает доступ к регистрам, указание методов адресации и описание операций в терминах команд конкретного процессора. Ассемблер, содержащий средства более высокого уровня: встроенные и определяемые макрокоманды, соответствующие нескольким машинным командам, автоматический выбор команды в зависимости от типов операндов, средства описания структур данных и т. д., является макроассемблером.

Язык ассемблера используется при:

1.  Создании драйверов низшего уровня и некоторых других программ, требующих прямого доступа к потенциальным возможностям компьютера.

2.  Достижении наибольшей эффективности использования вычислительных ресурсов при вычислениях с большим количеством вложенных циклов. Самые внутренние циклы часто программируются на языке ассемблера.

3.  Решении задач в реальном масштабе времени, то есть управляющих программ, которые требуют быстрой реакции вычислительной системы на внешние воздействия, и процессы, строго привязанные к определенным моментам времени. Более того, управляющие однокристальные ЭВМ обычно имеют маленький объем памяти.

4.  Для управляющих ЭВМ набор языков программирования очень ограничен. Обычно это ассемблер и Си, причем последний часто отсутствует.

Изучение языка ассемблера дает понимание организации вычислительных процессов в процессоре, принципов его работы и позволяет создавать оптимальные программы и на языках высокого уровня.

Язык Турбо Паскаль допускает три основных вида доступа ко всем аппаратным возможностям ЭВМ:

1.  Можно запрограммировать подпрограммы вне среды Паскаль на языке ассемблера или любом другом языке программирования и подключить полученный после ассемблирования или трансляции объектный модуль к Паскаль-программе.

2.  Начиная с шестой версии в Паскале появились средства включения в текст программ фрагментов на языке ассемблера. Эти средства называются «встроенный ассемблер».

3.  Можно непосредственно включать в текст программы фрагменты, написанные в машинном коде. Эти средства оставлены для совместимости с предыдущими версиями Турбо Паскаля и сейчас практически не используются и здесь не рассматриваются.

После трансляции с большинства языков программирования получается промежуточный объектный файл (OBJ-файл). Кроме непосредственно кодов он содержит некоторую дополнительную информацию.

Для подключения внешних подпрограмм в Паскале используется директива external, следующая за заголовком подпрограммы. Кроме этого, где-либо в тексте программы надо задать директиву компилятора $L, аргументом которой является имя OBJ-файла, содержащего код подключаемой подпрограммы, например:

Procedure SRoots(A, B,C:real); external;

Procedure CRoots(B, C,D. F:real); external;

...

{$L ROOTS. OBJ}

Для обеспечения корректности такого подключения необходимо соблюдать определенные межъязыковые соглашения о связях, принятые в системе Турбо Паскаль.

Средства встроенного ассемблера позволяют подключать ассемблерный текст непосредственно в Паскаль-программы, что гораздо удобнее и гибче, чем техника подключения независимо разработанных ассемблерных программ с помощью аппарата внешних подпрограмм.

Встроенный ассемблер реализует подмножество языка ассемблера, совместимого с языками Turbo Assembler фирмы Borland (TASM) и макроассемблера фирмы Microsoft (MASM). Хотя некоторые возможности по описанию структур не реализованы, но они во многом соответствуют описаниям Паскаль-объектов – констант, переменных, подпрограмм.

Средства, образующие встроенный ассемблер, организованы в виде двух конструкций: ассемблерные операторы (asm-операторы) и ассемблерные подпрограммы.

Структура asm-оператора:

asm

<команды (операторы) ассемблера>

end

Например:

asm

mov ah, 12 {работа с клавиатурой}

{информация о статусе смены регистра}

int 16h

mov OsnFlag, al

mov DopFlag, ah

end;

Обычно комментарии на ассемблере следуют за точкой с запятой. Но в asm-операторах используются ограничители, принятые для Паскаля: { } и (* *). Точкой с запятой могут разделяться команды ассемблера, но обычно используется общепринятый разделитель – переход на новую строку.

Поэтому возможна следующая запись:

asm

mov ax, Left; xchg ax, Right; mov Left, ax;

end;

Синтаксис команды:

[метка:][префикс] инструкция [операнд[,операнд]]

Инструкцией является мнемоническое обозначение действия, выполняемого командой.

Особенности использования asm-операторов.

1.  Использование регистров. В связи с тем, что Паскаль использует некоторые регистры в своих целях, не допускается изменять содержимое регистров BP, SP, SS и DS.

2.  Метки. Образование меток такое же, как и в Паскале. Они могут быть глобальными или локальными в asm-операторе. Но в последнем случае они не описываются и должны начинаться с символа «@».

3.  Коды инструкций. Поддерживаются только все коды инструкций процессора i8086. Для использования расширения этих кодов для процессора i80286 и арифметических сопроцессоров необходимо использовать специальные директивы компилятора.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Основные порталы (построено редакторами)

Домашний очаг

ДомДачаСадоводствоДетиАктивность ребенкаИгрыКрасотаЖенщины(Беременность)СемьяХобби
Здоровье: • АнатомияБолезниВредные привычкиДиагностикаНародная медицинаПервая помощьПитаниеФармацевтика
История: СССРИстория РоссииРоссийская Империя
Окружающий мир: Животный мирДомашние животныеНасекомыеРастенияПриродаКатаклизмыКосмосКлиматСтихийные бедствия

Справочная информация

ДокументыЗаконыИзвещенияУтверждения документовДоговораЗапросы предложенийТехнические заданияПланы развитияДокументоведениеАналитикаМероприятияКонкурсыИтогиАдминистрации городовПриказыКонтрактыВыполнение работПротоколы рассмотрения заявокАукционыПроектыПротоколыБюджетные организации
МуниципалитетыРайоныОбразованияПрограммы
Отчеты: • по упоминаниямДокументная базаЦенные бумаги
Положения: • Финансовые документы
Постановления: • Рубрикатор по темамФинансыгорода Российской Федерациирегионыпо точным датам
Регламенты
Термины: • Научная терминологияФинансоваяЭкономическая
Время: • Даты2015 год2016 год
Документы в финансовой сферев инвестиционнойФинансовые документы - программы

Техника

АвиацияАвтоВычислительная техникаОборудование(Электрооборудование)РадиоТехнологии(Аудио-видео)(Компьютеры)

Общество

БезопасностьГражданские права и свободыИскусство(Музыка)Культура(Этика)Мировые именаПолитика(Геополитика)(Идеологические конфликты)ВластьЗаговоры и переворотыГражданская позицияМиграцияРелигии и верования(Конфессии)ХристианствоМифологияРазвлеченияМасс МедиаСпорт (Боевые искусства)ТранспортТуризм
Войны и конфликты: АрмияВоенная техникаЗвания и награды

Образование и наука

Наука: Контрольные работыНаучно-технический прогрессПедагогикаРабочие программыФакультетыМетодические рекомендацииШколаПрофессиональное образованиеМотивация учащихся
Предметы: БиологияГеографияГеологияИсторияЛитератураЛитературные жанрыЛитературные героиМатематикаМедицинаМузыкаПравоЖилищное правоЗемельное правоУголовное правоКодексыПсихология (Логика) • Русский языкСоциологияФизикаФилологияФилософияХимияЮриспруденция

Мир

Регионы: АзияАмерикаАфрикаЕвропаПрибалтикаЕвропейская политикаОкеанияГорода мира
Россия: • МоскваКавказ
Регионы РоссииПрограммы регионовЭкономика

Бизнес и финансы

Бизнес: • БанкиБогатство и благосостояниеКоррупция(Преступность)МаркетингМенеджментИнвестицииЦенные бумаги: • УправлениеОткрытые акционерные обществаПроектыДокументыЦенные бумаги - контрольЦенные бумаги - оценкиОблигацииДолгиВалютаНедвижимость(Аренда)ПрофессииРаботаТорговляУслугиФинансыСтрахованиеБюджетФинансовые услугиКредитыКомпанииГосударственные предприятияЭкономикаМакроэкономикаМикроэкономикаНалогиАудит
Промышленность: • МеталлургияНефтьСельское хозяйствоЭнергетика
СтроительствоАрхитектураИнтерьерПолы и перекрытияПроцесс строительстваСтроительные материалыТеплоизоляцияЭкстерьерОрганизация и управление производством