Реферат: Алгоритмический язык Паскаль - текст реферата. Скачать бесплатно.
Банк рефератов, курсовых и дипломных работ. Много и бесплатно. # | Правила оформления работ | Добавить в избранное
 
 
   
Меню Меню Меню Меню Меню
   
Napishem.com Napishem.com Napishem.com

Реферат

Алгоритмический язык Паскаль

Банк рефератов / Программирование

Рубрики  Рубрики реферат банка

закрыть
Категория: Реферат
Язык реферата: Русский
Дата добавления:   
 
Скачать
Архив Zip, 57 kb, скачать бесплатно
Заказать
Узнать стоимость написания уникального реферата

Узнайте стоимость написания уникальной работы

Основные понятия алгоритмиче ского языка 1. ОСНОВ НЫЕ ПОН ЯТИЯ АЛГОРИ ТМИЧЕСКОГО ЯЗЫКА СОСТАВ ЯЗЫКА . Обычный разговорный язык состоит из четырех основных элементов : си мволов , слов , словосочетаний и предложений . Алг оритмический язык содержит подобные элементы , только слова называют элементарными конструкциям и , словосочетания -выражениями , предложения-оператор ами . Символы , элементарные конструкции , выражения и операторы составляют иерархическую структу ру , поскольку элементарные конструкции образуются из последовательности символов , выражения-это последовательность элементарных конструкци й и символов , а оператор-последовательность вы ражений , элементарных конструкций и символов. ОПИСАНИЕ ЯЗЫКА есть описание четырех названных элементов . Описание символов заключаетс я в перечислении допустимых символов языка . Под описанием элементарн ых конструкций понимают правила их образования . Описание в ыражений-это правила образования любых выражений , имеющих смысл в данном языке . Описание операторов состоит из рассмотрения всех ти пов операторов , допустимых в языке . Описание каждого элемента язык а задается е го СИНТАКСИСОМ и СЕМАНТИКОЙ . Синтаксические о пределения устанавливают правила построения элем ентов языка . Семантика определяет смысл и правила использования тех элементов языка , дл я которых были даны синтаксические определени я. СИМВОЛЫ языка-это основные неделимые знаки , в терминах которых пишутся все т ексты на языке. ЭЛЕМЕНТАРНЫЕ КОНСТРУКЦИИ -это минимальные единицы языка , имеющие самостоятельный смысл . Они образуются из основных символов языка. ВЫРАЖЕНИЕ в алгоритмическом языке состоит из элеме нтарных конструкций и символ ов , оно задает правило вычисления некоторого значения. ОПЕРАТОР задает полное описание некоторог о действия , которое необходимо выполнить . Для описания сложного действия может потребовать ся группа операторов . В этом случае операт оры объединяются в СОСТАВНОЙ ОПЕРАТОР или БЛОК. Действия , заданные операторами , выполняются над ДАННЫМИ . Предложения алгоритмического языка , в которых даются сведения о типах да нных , называются ОПИСАНИЯМИ или неисполняемыми операторами. Объединенная единым алгоритмом совокупн ость описаний и операторов образует ПРОГРАММУ на алгоритмическом языке. В процессе изучения алгоритмического язык а необходимо отличать алгоритмический язык от того языка , с помощью которого осуществля ется описание изучаемого алгоритмиче ского языка . Обычно изучаемый язык называют прост о языком , а язык , в терминах которого д ается описание изучаемого языка - МЕТАЯЗЫКОМ. Синтаксические определения могут быть зад аны формальными или неформальным способами . С уществуют три формальных способа : -м еталингвистическая символика , называемая Бэкуса-Наура формулами ; -синтаксические диаграммы ; -скобочные конструкции. Мы в последующем изложении будем поль зоваться неформальным способом. Основные символы языка -буквы , цифры и специальные символы-составляют е го алфавит . ТУРБО ПАСКАЛЬ включает сл едующий набор основных символов : 1) 26 латинских строчных и 26 латинских пропи сных букв : A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 2) _ подчеркивание 3) 10 ц ифр : 0 1 2 3 4 5 6 7 8 9 4) знаки операций : + - * / = <> < > <= >= := @ 5) ограничители : . , ' ( ) [ ] (. .) (* *) .. : ; 6) спецификаторы : ^ # $ 7) служебные (зарезервированные ) слова : ABSOLUTE EXPORTS LIBRARY SET ASSEMBLER EXTERNAL MOD SHL AND FAR NA ME SHR ARRAY FILE NIL STRING ASM FOR NEAR THEN ASSEMBLER FORWARD NOT TO BEGIN FUNCTION OBJECT TYPE CASE GOTO OF UNIT CONST IF OR UNTIL CONSTRUCTOR IMPLEMENTATION PACKED USES DESTRUCTOR IN PRIVATE VAR DIV INDEX PROCEDURE VIRTUAL DO INHERITED PROGRAM WHILE D OWNTO INLINE PUBLIC WITH ELSE INTERFACE RECORD XOR END INTERRUPT REPEAT EXPORT LABEL RESIDENT Кроме перечисленн ых , в набор основных символов входит пробе л . Пробелы нельзя использовать внутри сдвоенн ых символов и зарезервированных слов. Элементарные конст рукции языка ПАСКАЛ Ь включают в себя имена , числа и строк и. Имена (идентификаторы ) называют элементы я зыка - константы , метки , типы , переменные , процед уры , функции , модули , объекты . Имя - это посл едовательность букв и цифр , начинающаяся с буквы . В именах м ожет использоваться символ _ подчеркивание . Имя может содержать произвольное количество символов , но значащими являются 63 символа. Не разрешается в языке ПАСКАЛЬ исполь зовать в качестве имен служебные слова и стандартные имена , которыми названы стандарт ны е константы , типы , процедуры , функции и файлы. Для улучшения наглядности программы в нее могут вставляться пробелы . По крайней мере один пробел требуется вставить между двумя последовательными именами , числами или служебными и стандартными именами . Пробелы нельзя использовать внутри имен и чисел. Примеры имен языка ПАСКАЛЬ : A b12 r1m SIGMA gamma I80_86 Числа в языке ПАСКАЛЬ обычно записываются в десятичной системе счисления . Они могут быть целыми и действительными . Положительный знак числа может быть опущ ен . Целые числа запи сываются в форме без десятичной точки , нап ример : 217 -45 8954 +483 Действительные числа записываются в фо рме с десятичной точкой или в форме с использованием десятичного порядка , который изображается буквой Е : 28.6 0.65 -0.018 4.0 5Е 12 -1.72Е 9 73.1Е -16 ПАСКАЛЬ допускает запись целых чисел и фрагментов действительных чисел в форме с порядком в шестнадцатиричной системе счи сления : $7 F $40 $ ABC 0 Строки в языке ПАСКАЛЬ - это последо вательность символов , записанная между апострофам и . Ес ли в строке в качестве содерж ательного символа необходимо употребить сам а построф , то следует записать два апострофа . Примеры строк : 'СТРОКА ' ' STRING ' 'ПРОГРАММА ' 'АД ''ЮТАНТ ' В математике принято классифицировать пер еменные в соответствии с некоторыми ва жными характеристиками . Производится строгое разграничение между вещественными , комплексными и логическими переменными , между переменными , представляющими отдельные значения и множес тво значений и так далее. При обработке данных на ЭВМ такая классификация еще более важна . В любо м алгоритмическом языке каждая константа , пер еменная , выражение или функция бывают определ енного типа. В языке ПАСКАЛЬ существует правило : ти п явно задается в описании переменной или функции , которое предшествует их использован ию . Ко нцепция типа языка ПАСКАЛЬ имеет следующие основные свойства : -любой тип данных определяет множество значений , к которому принадлежит константа , которые может принимать переменная или выраже ние , или вырабатывать операция или функция ; -тип значения , задавае мого константой , переменной или выражением , можно определить по их виду или описанию ; -каждая операция или функция требует а ргументов фиксированного типа и выдает резуль тат фиксированного типа. Отсюда следует , что транслятор может и спользовать информацию о типах для пров ерки вычислимости и правильности различных ко нструкций. Тип определяет : -возможные значения переменных , констант , ф ункций , выражений , принадлежащих к данному тип у ; -внутреннюю форму представления данных в ЭВМ ; -операции и функции , которые мо гут выполняться над величинами , принадлежащими к данному типу. Обязательное описание типа приводит к избыточности в тексте программ , но такая избыточность является важным вспомогательным с редством разработки программ и рассматривается как необходимое свойс тво современных а лгоритмических языков высокого уровня . В язык е ПАСКАЛЬ существуют скалярные и структуриров анные типы данных. К c калярным типам относятся стандартные типы и типы , определяемые пользователем. Стандартные типы включают целые , действит ельные , символьный , логические и адресный типы . Типы , определяемые пользователем , - перечисл яемый и интервальный. Структурированные типы имеют четыре разно видности : массивы , множества , записи и файлы. Кроме перечисленных , TURBO PASCAL включает еще два типа - проце дурный и объектный. Из группы скалярных типов можно выдел ить порядковые типы , которые характеризуются следующими свойствами : -все возможные значения порядкового типа представляют собой ограниченное упорядоченное множество ; -к любому порядковому типу может быть применена стандартная функция Ord , которая в качестве результата возвращает порядковый номер конкретного значения в данном типе ; -к любому порядковому типу могут быть применены стандартные функции Pred и Succ , которые возвра щают предыдущее и последующ ее значения соответственно ; -к любому порядковому типу могут быть применены стандартные функции Low и High , которые возвра щают наименьшее и наибольшее значения величин данного типа. В языке ПАСКАЛЬ введены понятия эквив алентности и совместимости типов. Два типа Т 1 и Т 2 являются экв ивалентными (идентичными ), если выполняется одно из двух условий : -Т 1 и Т 2 представляют собой одно и то же имя типа ; -тип Т 2 описан с использованием типа Т 1 с помощью равенства или последовательнос ти равенств . Например : type T 1 = Integer ; T 2 = T 1; T 3 = T 2; Менее строгие ограничения определены с овместимостью типов . Например , типы являются с овместимыми , если : -они эквивалентны ; -являются оба либо целыми , либо действ ительными ; -один тип - интервальный , другой - его ба зовый ; -оба инт ервальные с общим базовым ; один тип - строковый , другой - символьный. В ТУРБО ПАСКАЛЬ ограничения на совмес тимость типов можно обойти с помощью прив едения типов . Приведение типов позволяет расс матривать одну и ту же величину в пам яти ЭВМ как принадлежащую разным типам . Для этого используется конструкция Имя _Типа (переменная или значение ). Напрмер, Integer (' Z ') представляет собой значение кода символа ' Z ' в двухбайтном представлении целого числа , а Byte (534) даст значение 22, поскольку целое число 534 име ет тип Word и занимает два байта , а тип Byte занимает один байт , и в процессе приведения старший байт будет отброшен. К стандартным относятс я целые , действительные , логические , символьный и адресный типы. ЦЕЛЫЕ типы определяют константы , переме нные и фун кции , значения которых реали зуются множеством целых чисел , допустимых в данной ЭВМ. Над целыми операндами можно выполнять следующие арифметические операции : сложение , вы читание , умножение , деление , получение остатка от деления . Знаки этих операций : + - * div mod Результат арифметической операции над цел ыми операндами есть величина целого типа . Результат выполнения операции деления целых в еличин есть целая часть частного . Результат выполнения операции получения остатка от д еления - остаток от деления целы х . Напр имер : 17 div 2 = 8, 3 div 5 = 0. 17 mod 2 = 1, 3 mod 5 = 3. Операции отношения , примененные к целым операндам , дают результат логического типа TRUE или FALSE ( истина или ложь ). В языке ПАСКАЛЬ имеются следующие опе рации отношения : равенство =, н еравенство <>, б ольше или равно >=, меньше или равно <=, больше >, меньше < . К аргументам целого типа применимы сл едующие стандартные (встроенные ) функции , результат выполнения которых имеет целый тип : Abs(X), Sqr(X), Succ(X), Pred(X), и которые опре дел яют соответственно абсолютное значение Х , Х в квадрате , Х +1, Х -1. Следующая группа стандартных функций для аргумента целого типа дает действительный результат : Sin(X), Cos(X), ArcTan(X), Ln(X), Exp(X), Sqrt(X). Эти функции вычисляют синус , косинус и аркт ангенс угла , заданного в радианах , логарифм натуральный , эк споненту и корень квадратный соответственно. Результат выполнения функции проверки цел ой величины на нечетность Odd ( X ) имеет значение истина , если аргумент нечетный , и значение ложь , е сли аргумент четный : X=5 Odd(X)=TRUE , X=4 Odd(X)=FALSE. Для быстрой работы с целыми числами определены процедуры : Inc(X) X:=X+1 Inc(X,N) X:=X+N Dec(X) X:=X-1 Dec(X,N) X:=X-N ДЕЙСТВИТЕЛЬНЫЕ ти пы определяет те данные , которые реализуются подмножеством действительных чисел , допусти мых в данной ЭВМ. Тип Real определен в стандартном ПАСКАЛЕ и математическим сопроцессором не поддерживается. Остальные действительные типы определены стандартом IEEE 457 и реализованы на всех современных компьютерах. Для их использования пр и наличии сопроцессора или при работе на ЭВМ т ипа 80486 необходимо компилировать программу с кл ючом $ N + , а при отсутствии сопроцессора - с к лючами $ N -, E + . Тип Comp хотя и относится к действительным типам , хранит только длинные целые значения. Над дейс твительными операндами можно выполнять следующие арифметические операции , дающие действительный результат : сложение + , вычитание - , умножение * , деление / . К величинам действительного типа применим ы все операции отношения , дающие булевский результат. Один из операндов , участвующих в этих операциях , может быть целым. К действительным аргументам применимы фун кции , дающие действительный результат : Abs(X), Sqr(X), Sin(X), Cos(X), ArcTan(X), Ln(X), Exp(X), Sqrt(X), Frac(X), Int(X), Pi. Функция Frac ( X ) во звращает дробную часть X , функция Int ( X ) - целую часть X . Безаргументная функция Pi возвращает значение чис ла Пи действительного типа. К аргументам действительного типа примени мы также функции Trunc(X) и Round(X), дающие целый р езультат . Первая из них вы деляет целую часть действительного аргумента путем отсече ния дробной части , вторая округляет аргумент до ближайшего целого. ЛОГИЧЕСКИЙ тип ( Boolean ) определяет те данные , которые могут принимать логические значения TRUE и FALSE . К булевским операндам прим енимы с ледующие логические операции : not and or xor . Логический тип определен таким образом , что FALSE < TRUE . Это позволяет применять к булевским операндам все операции отношения. В ТУРБО ПАСКАЛЬ введены еще разновидн ости логического типа : ByteBool , WordBool и LongBool , которые занимают в памяти ЭВМ один , два и четыре байта соответственно. СИМВОЛЬНЫЙ тип ( Char ) определяет упорядоченную сов окупность символов , допустимых в данной ЭВМ . Значение символьной переменной или константы - это один символ из допустимого наб ора. Символьная константа может записываться в тексте программы тремя способами : -как один символ , заключенный в апостр офы , например : ' A ' ' a ' 'Ю ' 'ю '; -с помощью конструкции вида # K , где K - код соотв етствущего символа , при этом значение K должно находиться в пределах 0..255; -с помощью конструкции вида ^ C , где C - код соотв етствущего управляющего символа , при этом зна чение C должно быть на 64 больше кода управля ющего символа. К величинам символьного типа применимы все операции от ношения. Для величин символьного типа определены две функции преобразования Ord ( C ) Chr ( K ). Первая функция определяет порядковый номе р символа С в наборе символов , вторая определяет по порядковому номеру К символ , стоящий на К-ом месте в наборе символов . Порядковый номер имеет целый тип. К аргументам символьного типа применяются функции , которые определяют предыдущий и последующий символы : Pred(C) Succ(C). Pred('F') = 'E' ; Succ('Y') = 'Z' . При отсутствии предыду щего или последующего символов значение с оответствующих функций не определено. Для литер из интервала ' a '..' z ' применима функц ия UpCase ( C ), кото рая переводит эти литеры в верхний регист р ' A '..' Z '. АДРЕСНЫЙ тип ( Pointer ) определяет переменные , которы е могут содержать значения адресов данных или ф рагментов программы . Для хранения адреса требуются два слова (4 байта ), одно из них определяет сегмент , второе - смещен ие. Работа с адресными переменными (указателя ми ) будет рассмотрена позже , сейчас отметим , что для получения значения адреса какой-либ о пе ременной введена унарная операция @. Тип констант в языке ПАСКАЛЬ определя ется по их виду : константы целого типа - это целые числа , не содержащие десятичной точки , константы действительного типа - действ ительные числа , логические константы - логические зн ачения TRUE и FALSE , символьные константы - либо строки длиной в один символ , либо конст рукции вида # K или ^ K . Язык ПАСКАЛЬ допускает использовать синон имы для обозначения констант , в этом случа е текст программы содержит раздел описания констант , например : Тип переменных определ яется пользователем в разделе описания переме нных : В настоящее время в профессиональном программировании принято записывать имена переме нных с использованием так называемой венгерск ой нотации. Венгерская нотация - это соглашени е о наименованиях переменных и функций . Согла шение широко используется при программировании на языках PASCAL , C и в среде WINDOWS . Венгерская нотация основывается на следую щих принципах : -имена переменных и функций должны сод ержать префикс , описывающий их тип ; -имена переменных и функций записываются полными словами или словосочетаниями или их сокращениями , но так , чтобы по имени можно было понять назначение переменной или действие , выполняемое функцией. Префиксы записываются малыми буквами , пер вая буква ка ждого слова заглавная , пре фиксы и слова записываются либо слитно , ли бо через символ _ (подчеркивание ). Для языка PASCAL могут быть рекомендованы следующие префиксы для скалярных переменных и функций : Префикс Тип --------------------by Byte sh Shortint i In teger w Word l Longint r Real si Single d Double e Extended c Comp ch Char b Boolean p Pointer x,у координаты символа или точки на экране Для величин ст руктурированного типа могут быть использованы следующие префиксы : a Array s String sz Stringz se Set re Record f File t Text Например : rV, arVector[1..20], sName, iCount. В откомпилированн ой программе для всех переменных отведено место в памяти , и всем переменным присв оены нулевые значения. Для задания начальных значений переменным (инициализации перемен ных ) TURBO PASCAL позволяет прис ваивать начальные значения переменным одновремен но с их описанием . Для этого используется конструкция имя переменной : тип = значение ; которая должна быть размещена в разде ле описания констант , например : const rWeight : Real = 0.4; Выражение состоит из констант , переменных , указателей функций , знак ов операций и скобок . Выражение задает пра вило вычисления некоторого значения . Порядок вычисления определяется старшинством (приоритетом ) содержащихся в нем операций . В языке ПА СКА ЛЬ принят следующий приоритет операций : 1. унарная операция not , унарный минус -, взятие адреса @ 2. операции типа умножения * / div mod and shl shr 3. операции типа сложения + - or xor 4. операции отношения = <> < > <= >= in Выражения входят в состав многих операторов языка ПАСКАЛЬ , а также могут быть аргументами встроенных функций. Тип переменной и т ип выражения должны совпадать кроме случая , когда выражение относится к целому типу , а переменная - к действительному . При этом происходит преобразование значения выражения к действительному типу. 10. О П Е Р А Т О Р Ы В В О Д А И В Ы В О Д А Рассмотрим организацию ввода и вывода данных с терминального устройства . Терминаль ное устройство - это устройство , с которым работает пользователь , обычно это экра н (дисплей ) и клавиатура. Для ввода и вывода данных используютс я стандартные процедуры ввода и вывода Read и Write , оперир ующие стандартными последовательными файлами INPUT и OUTPUT . Эти файлы разбиваются на строки перем енной длины , отделяемые друг от друг а признаком конца строки . Конец строки зада ется нажатием клавиши ENTER . Для ввода исходных данных используются операторы процедур ввода : Read(A1,A2,...AK); ReadLn(A1,A2,...AK); ReadLn ; Первый из них реализует чтение К значений исходных данных и присваива ни е этих значений переменным А 1, А 2, ..., АК . В торой оператор реализует чтение К значений исходных данных , пропуск остальных значений до начала следующей строки , присваивание сч итанных значений переменным А 1, А 2, ..., АК . Тре тий оператор реализует пропуск строки исходных данных. При вводе исходных данных происходит преобразование из внешней формы представления во внутреннюю , определяемую типом переменных . Переменные , образующие список ввода , могут принадлежать либо к целому , либо к действи тельному , либо к с имвольному типам . Чт ение исходных данных логического типа в я зыке ПАСКАЛЬ недопустимо. Операторы ввода при чтении значений п еременных целого и действительного типа пропу скает пробелы , предшествующие числу . В то же время эти операторы не пропускают проб елов , предшествующих значениям символьных пе ременных , так как пробелы являются равноправн ыми символами строк . Пример записи операторов ввода : var rV , rS : Real ; iW , iJ : Integer ; chC, chD: Char; ................ Read(rV, rS, iW, iJ); Read ( chC , chD ); Значения и сходных данных могут отделяться друг от друга пробелами и нажа тием клавиш табуляции и Enter . Для вывода результатов работы программы на экран используются операторы : Write(A1,A2,...AK); WriteLn(A1,A2,...AK); WriteLn ; Первый из этих операторов реализует в ывод значений переменных А 1, А 2,...,АК в строку экрана . Второй оператор реализуе т вывод значений переменных А 1, А 2, ..., АК и переход к началу следующей строки . Трети й оператор реализует пропуск строки и пер еход к началу следующей строки. Переменные , соста вляющие список вывод а , могут относиться к целому , действительному , символьному или булевскому типам . В каче стве элемента списка вывода кроме имен пе ременных могут использоваться выражения и стр оки. Вывод каждого значения в строку экран а происходит в соотве тствии с шириной поля вывода , определяемой конкретной реализа цией языка. Форма представления значений в поле в ывода соответствует типу переменных и выражен ий : величины целого типа выводятся как цел ые десятичные числа , действительного типа - как действитель ные десятичные числа с де сятичным порядком , символьного типа и строки - в виде символов , логического типа - в виде логических констант TRUE и FALSE . Оператор вывода позволяет задать ширину поля вывода для каждого элемента списка вывода . В этом случае элеме нт спи ска вывода имеет вид А :К , где А - вы ражение или строка , К - выражение либо конс танта целого типа . Если выводимое значение занимает в поле вывода меньше позиций , чем К , то перед этим значением располагают ся пробелы . Если выводимое значение не пом ещае т ся в ширину поля К , то для этого значения будет отведено необходи мое количество позиций . Для величин действите льного типа элемент списка вывода может и меть вид А :К :М , где А - переменная и ли выражение действительного типа , К - ширина поля вывода , М - число цифр дробн ой части выводимого значения . К и М - в ыражения или константы целого типа . В этом случае действительные значения выводятся в форме десятичного числа с фиксированной точкой. Пример записи операторов вывода : . . . . . . . . . . . . var rA , rB : Real ; iP , iQ : Integer ; bR, bS: Boolean; chT, chV, chU, chW: Char; . . . . . . . . . . . . WriteLn(rA, rB:10:2); WriteLn(iP, iQ:8); WriteLn(bR, bS:8); WriteLn(chT, chV, chU, chW); 11. С Т Р У К Т У Р А П Р О Г Р А М М Ы Программа на языке ПАСКАЛ Ь сос тоит из заголовка , разделов описаний и раз дела операторов. Заголовок программы содержит имя программ ы , например : Program PRIM ; Описания могут включать в себя раз дел подключаемых библиотек (модулей ), раздел оп исания меток , раздел описания констант , р аздел описания типов , раздел описания переменных , раздел описания процедур и функци й. Раздел описания модулей определяется служ ебным словом USES и содержит имена подключа емых модулей (библиотек ) как входящих в со став системы TURBO PASCAL , так и написанных по льзователем . Раздел описания модулей должен б ыть первым среди разделов описаний . Имена модулей отделяются друг от друга запятыми : uses CRT , Graph ; Любой оператор в программе может б ыть помечен меткой . В качестве метки испол ьзуются произвольные целые бе з знака , содержащие не более четырех цифр , либо име на . Метка ставится перед оператором и отде ляется от него двоеточием . Все метки , испо льзуемые в программе , должны быть перечислены в разделе описания меток , например : label 3, 471, 29, Quit ; Описание конс тант позволяет исполь зовать имена как синонимы констант , их нео бходимо определить в разделе описаний констан т : const K = 1024; MAX = 16384; В разделе описания переменных необходи мо определить тип всех переменных , используем ых в программе : var P,Q,R: Integ er; A,B: Char; F1,F2: Boolean; Описание типов , прцедур и функций будет рассмотрено ниже . Отдельные разделы описаний могут отсутствовать , но следует помнить , что в ПАСКАЛЬ - пр ограмме должны быть обязательно описаны все компоненты программы. Раздел операто ров представляет собой составной оператор , который содержит между служебными словами begin ....... end последовательность операторов . Операторы отде ляются друг от друга символом ;. Текст программы заканчивается символом то чка. Кроме описаний и операторов ПА СКА ЛЬ - программа может содержать комментарии , кот орые представляют собой произвольную последовате льность символов , расположенную между открывающей скобкой комментариев и закрывающей скобкой комментариев . Текст ПАСКАЛЬ - программы может содержать ключи компиляции , которые позволяют упр авлять режимом компиляции . Синтаксически ключи компиляции записываются как комментарии . Ключ компиляции содержит символ $ и букву-ключ с последующим знаком + (включить режим ) или - (выключить режим ). Например : $ E + - эму лировать математический сопроцессо р ; $ F + - формировать дальний тип вызова процед ур и функций ; $ N + - использовать математический сопроцессор ; $ R + - проверять выход за границы диапазонов. Некоторые ключи компиляции могут содер жать параметр , например : $ I имя файла - включить в текст компил ируемой программы названный файл. Пример записи простой программы : Program TRIANG ; var A, B, C, S, P: Real; begin Read(A,B,C); WriteLn(A,B,C); P:=(A+B+C)/2; S:=Sqrt(P*(P-A)*(P-B)*(P-C)); WriteLn('S=',S:8:3) end. Б итовая или по разрядная арифметика введена в TURBO PASCAL для обеспечени я возможности работы с двоичными разрядами (битами ). Операции битовой арифметики применимы только к целым типам. Первая группа операций - логические операц ии not , and , or и xor . Операци я not является одноместной , она изменяет каждый бит целого числа на обрат ный. Операции and , or и xor - двуместные , операнды этих операций - целые величины одинаковой длины . Операции выполняются попарно над всеми двоичн ыми разрядами операндов. Вторая группа операций - это операции сдвига влево shl и сдвига вправо shr : I shl N I shr N. Эти операции сдвигают двоичную последовательность значения I влево или вправо на N двоичных разрядов . При эт ом биты , уходящие за пределы разрядной сет ки , теряются , а освободи вшиеся двоичные разряды заполняются нулями . При сдвиге впра во отрицательных значений освободившиеся разряды заполняются единицами. Обычно операторы в программе выполняются в том порядке , в каком они записаны . Оператор перехода прерывает естественный поря док выполнения программы и указывает , что дальнйшее выполнение должно продолжаться , начиная с оператора , помеченного меткой , указа нной в операторе перехода . Пример записи о ператора перехода : goto 218; Структуризованная програм ма (или подпрограмма ) - это программа , сост авленная из фиксированного множества базовых конструкций . Рассмотрим основные определения и способы образования этих конструкций в схе мах алгоритмов . Из операций , развилок и слияний строят ся базовые конструкции : следование , ветвление , цик л . Применяя только эти три конструк ции , можно реализовать алгоритм решения любой задачи. Конструкция , представляющая собой последовате льное выполнение двух или более операций , называется следованием. Конструкция , состоящая из развилки , двух операций и слия ния , называется ветвлени ем . Одна из операций может отсутствовать. Конструкция , имеющая линии управления , вед ущие к предидущим операциям или развилкам , называется циклом. Конструкции следование , ветвление и цикл можно представить как операции , так как они и меют единственный вход и ед инственный выход . Произвольную последовательность операций можно представить как одну операц ию. Операция может быть реализована любым оператором языка ПАСКАЛЬ (простым или соста вным ), либо группой операторов , за исключением опера тора перехода GOTO . В языке ПАСКАЛЬ количество базовых ко нструкций увеличено до шести , это : -следование ; -ветвление ; -цикл с предусловием ; -цикл с постусловием ; -цикл с параметром ; -вариант. Далее рассмотрим , как эти базовые конс трукции реализуются в языке ПАСКАЛЬ. Условный оператор в короткой форме ра ботает по правилу : если булевское выражение B исти нно , то выполняется оператор ОР 1, далее вып олняется оператор , следующий за условным . Если булевское выражение B ложно , то будет выполнять ся оператор , следу ющий за этим условны м оператором. Для всех операторов цикла выход из цикла осуществляется как вследствие естественного окончания оператора ц икла , так и с помощью операторов перехода и выхода. В версии ТУРБО ПАСКАЛЬ 7.0 определены ст андартные процедуры Bre ak и Continue . Процедура Break выполняет безу словный выход из цикла . Процедура Continue обеспечивает переход к началу новой итерации цикла. Перечисляемый тип пред ставляет собой ограниченную упорядоченную послед овательность скалярных констант , составляющих данный тип . Значение каждой константы задае тся ее именем . Имена отдельных констант от деляются друг от друга запятыми , а вся совокупность констант , составляющих данный пере числяемый тип , заключается в круглые скобки. Программист объединяет в одну группу в соответствии с каким - либо признаком всю совокупность значений , составляющих пере числяемый тип . Например , перечисляемый тип Rainbow (РАДУГА ) объединяет скалярные значения RED , ORANGE , YELLOW , GREEN , LIGHT _ BLUE , BLUE , VIOLET (КРАСНЫЙ , ОРАНЖ ЕВЫЙ , ЖЕЛТЫЙ , ЗЕЛ ЕНЫЙ , ГОЛУБОЙ , СИНИЙ , ФИ ОЛЕТОВЫЙ ). Перечисляемый тип Traffic _ Light (СВЕТОФОР ) объединяет скаля рные значения RED , YELLOW , GREEN (КРАСНЫЙ , ЖЕЛТЫЙ , ЗЕЛЕНЫЙ ). Перечисляемый тип описывается в разделе описания типов , который начинается со слу жебного слова type , например : type Rainbow = (RED, ORANGE, YELLOW, GREEN, LIGHT_BLUE, BLUE, VIOLET); Каждое значение является константой своего типа и может принадлежать только одному из перечисляемых типов , заданных в программе . Например , переч исляемый тип Traffic _ Light не может быть опред елен в одной программе с типом Rainbow , так как оба типа содержат одинаковые константы. Описание переменных , принадлежащих к скал ярным типам , которые объявлены в разделе о писания типов , производится с помощью имен типов . Например : type Tra ffic_Light= (RED, YELLOW, GREEN); var Section: Traffic_Light; Это означает , что переменная Section может принимать значения RED , YELLOW или GREEN . Переменные перечисляемого типа могут быть описаны в разделе описания переменных , на пример : var Section: (RE D, YELLOW, GREEN); При этом имена типов отсутствуют , а переменные определяются совокупностью значений , составляющих данный перечисляемый тип. К переменным перечисляемого типа может быть применим оператор присваивания : Section := YELLOW ; Упорядоченная пос ледовательность значе ний , составляющих перечисляемый тип , автоматически нумеруется , начиная с нуля и далее че рез единицу . Отсюда следует , что к перечис ляемым переменным и константам могут быть применены операции отношения и стандартные функции Pred , Succ , Ord . Переменные и константы перечисляемого тип а не могут быть элементами списка ввода или вывода. Отрезок любого поря дкового типа может быть определен как инт ервальный или ограниченный тип . Отрезок задае тся диапазоном от минимального до максимально го зна чения констант , разделенных двумя точками . В качестве констант могут быть использованы константы , принадлежащие к целому , символьному , логическому или перечисляемому типам . Скалярный тип , на котором строится отрезок , называется базовым типом. Минимальное и максимальное значения констант называются нижней и верхней грани цами отрезка , определяющего интервальный тип . Нижняя граница должна быть меньше верхней. Над переменными , относящимися к интерваль ному типу , могут выполняться все операции и применяться вс е стандартные функции , которые допустимы для соответствующего базовог о типа. При использовании в программах интервальн ых типов данных может осуществляться контроль за тем , чтобы значения переменных не выходили за границы , введенные для этих пе ременных в оп исании интервального типа . 23. М А С С И В Ы Массивы представляют собой ограниченную упорядоченную совокупность однотипных величин . Каждая отдельная величина называется компонентой массива . Тип компонент может быть любым , принятым в языке ПАСКАЛЬ , кроме ф айлового типа . Тип компонент называется базов ым типом. Вся совокупность компонент определяется о дним именем . Для обозначения отдельных компон ент используется конструкция , называемая переменн ой с индексом или с индексами : A[5] S[k+1] B[3,5]. В качестве ин декса может быть использовано выражение . Тип индексов может быть только интервальным или перечисляемым . Действительный и целый типы недопустимы . Ин дексы интервального типа , для которого базовы м является целый тип , могут принимать отри цательные , нулевое и п оложительные з начения. В операторной части программы один ма ссив может быть присвоен другому , если их типы идентичны , например : R1:=Z. Для ввода или вывода массива в список ввода или вывода помещается переменная с индексом , а операторы ввода или выв ода выполняются в цикле . Первый индекс определяет номер строки , второй - номер столбца . Двумерные массивы хр анятся в памяти ЭВМ по строкам. Инициализация массивов (присвоение начальных значений всем компонентам массивов ) осуществ ляется двумя способами. Пер вый способ - с использованием т ипизированных констант , например : type Dim10= Array[1..10] of Real; const raM10: Dim10 = ( 0, 2.1, 4, 5.65, 6.1, 6.7, 7.2, 8, 8.7, 9.3 ); При инициализации двумерных массивов з начения компонент каждого из входящих в н его о дномерных массивов записывается в скобках : type Dim3x2= Array[1..3,1..2] of Integer; const iaM3x2: Dim3x2= ( (1, 2) (3, 4) (5, 6) ); Второй способ инициализации - использование разновидности процедуры FillChar: FillChar( var V; NBytes: Word; B: Byte ); Эта процедура заполняет участок памяти однобайтовым значением . Например , для обнуления массива A[1..10] of Real можно записать : FillChar(A, 40, 0); или FillChar(A, SizeOf(A), 0); Особое место в языке ПАС КАЛЬ занимают массивы символов . Стандартный П АСК АЛЬ допускает два способа хранения символьных массивов в памяти ЭВМ : распакова нный и упакованный . Распакованные массивы сим волов хранятся в памяти ЭВМ по одному символу в машинном слове , упакованные - по одному символу в байте . При описании уп акованного м а ссива символов использую т служебное слово PACKED, например : var MAS: Packed Array[1..20] of Char; Описание распакованного массива символов имеет вид : var M: Array[1..20] of char; Для преобразования символьного массива из распакованной формы в упакованну ю и наоборот , из упакованной в распакованную , в язык ПАСКАЛЬ введены две стандартные функции Pack, UnPack. Упакованный массив символов образует симв ольную строку . Символьная строка может быть либо строковой константой , либо строковой п еременной . Строковая константа , или строка , представляет собой совокупность символов , закл юченную в апострофы . Строка - это элементарная конструкция языка ПАСКАЛЬ . Строковые констан ты могут входить в состав выражений . Как и числовые константы , они могут быть описаны в разделе описания констант. Строковые переменные - это одномерные упак ованные массивы символов , для описания которы х в TURBO PASCAL введен тип String. Например , если строка содержит до 30 сим волов , ее тип будет определен как type s= String[30]; Длина строки не мо жет содержат ь более , чем 255 символов. В TURBO PASCAL определено понятие строки переменно й длины , в этом случае ее описание зад ается как type s= String; Тип String без указания длины совместим со всеми типами строк. Особенностью строковых переменных явля ется то , что к ним можно обращатьс я как к скалярным переменным , так и к массивам . Во втором случае применяется ко нструкция "переменная с индексом ", что обеспечи вает доступ к отдельным символам строки . П ри этом нижняя граница идекса равна 1. Отде льный симв о л строки совместим с типом Char. В памяти ЭВМ строка занимает количест во байтов , на единицу большее ее длины . Нулевой байт строки содержит ее длину. Для строк определены операции присваивани я , слияния (конкатенации ) и сравнения. Для сравнения строк примен яются все операции отношения . Сравнение строк про исходит посимвольно , начиная с первого символ а . Строки равны , если имеют одинаковую дли ну и посимвольно эквивалентны. Строки могут быть элементами списка в вода - вывода , при этом записывается имя ст роки без индекса. При вводе строковых переменных количество вводимых символов может быть меньше , чем длина строки . В этом случае вводимые символы размещаются с начала строки , а ост авшиеся байты заполняются пробелами . Если кол ичество вводимых символов превышает длин у строки , лишние символы отбрасываются. Инициализация строк может производиться к ак с помощью типизированных констант : const sName: String[9]= 'IBM PC/AT'; так и с использованием второй разнови дности функции FillChar: FillChar( var V; NBytes: Word; C: Ch ar ); например : FillChar(A, SizeOf(A), '0'); Для работы со строками в TURBO PASCAL включе ны процедуры и функции , которые обеспечивают редактирование и преобразование строк . Алгоритм решения задачи про ектируется путем декомпозиции всей задачи в отдельн ые подзадачи . Обычно подзадачи реализуются в виде подпрограмм. Подпрограмма - это последовательность оператор ов , которые определены и записаны только в одном месте программы , однако их можно вызвать для выполнения из одной или не скольких точек программы . К аждая подпрогр амма определяется уникальным именем . В языке ПАСКАЛЬ существуют два типа подпрограмм - процедуры и функции. Процедура и функция - это именованная последовательность описаний и операторов . При использовании процедур или функций ПАСКАЛЬ - п рогр амма должна содержать текст процедуры или функции и обращение к процедуре или функции . Тексты процедур и функций пом ещаются в раздел описаний процедур и функ ций . Процедура может содержать такие - же р азделы описаний , что и ПАСКАЛЬ - программа , а именно : разделы описания модулей , ме ток , констант , типов , переменных , процедур и функций . ПЕРЕДАЧА ИМЕН ПРОЦЕДУР И ФУНКЦИЙ В КАЧЕСТВЕ ПАРАМЕТРОВ . Во многих задачах , особ енно в задачах вычислительной математики , нео бходимо передавать имена процедур и функций в качестве параметров . Для этого в TURBO PASCAL введен новый тип данных - процедурный или функциональный , в зависимости от того , что описывается. Описание процедурных и функциональных тип ов производится в разделе описания типов : type FuncType = Function(z: R eal): Real; ProcType = Procedure (a,b: Real; var x,y: Real); Функциональный и процедурный тип опред еляется как заголовок процедуры и функции со списком формальных параметров , но без имени . Можно определить функциональный или процедурный тип без параметров , например : type Proc = Procedure; После объявления процедурного или функ ционального типа его можно использовать для описания формальных параметров - имен процеду р и функций. Кроме того , необходимо написать те реа льные процедуры или функции , имена которых будут передаваться как фактические пар аметры . Эти процедуры и функции должны ком пилироваться в режиме дальней адресации с ключом $F+ . Пример . Составить программу для вычислени я определенного интеграла tk 2t I= S--------------- dt sqrt(1-sin2t) tn по ме тоду Симпсона . Вычисление подинтегральной функции реализовать с помощью функции , имя которой передается как парамет р . Значение определенного интеграла по формул е Симпсона вычисляется по формуле : ISimps=2*h/3*(0.5*F(A)+2*F(A+h)+F(A+2*h)+2*F(A+3*h)+... +2*F (B-h)+0.5*F(B)) где A и B - нижняя и верхняя границы и нтервала интегрирования, N - число разбиений интервала интегрирования, h=(B-A)/N, причем N должно быть четным. Program INTEGRAL; type Func= function(x: Real): Real; var I,TN,TK:Real; N:Integer; $F+ Fu nction Q(t: Real): Real; begin Q:=2*t/Sqrt(1-Sin(2*t)); end; $F- Procedure Simps(F:Func; a,b:Real; N:Integer; var INT:Real); var sum, h: Real; j:Integer; begin if Odd(N) then N:=N+1; h:=(b-a)/N; sum:=0.5*(F(a)+F(b)); for j:=1 to N-1 do sum:=sum+(j mod 2+1)*F(a+j*h); INT:=2*h*sum/3 end; begin WriteLn(' ВВЕДИ TN,TK,N'); Read(TN,TK,N); Simps(Q,TN,TK,N,I); WriteLn('I=',I:8:3) end. Для завершения работы прогр амм , процедур и функций без предварительного перехода по меткам к закрывающему end в TURBO PASCAL введены процедуры Exit и Halt. Вызов Exit завершает работу своего программн ого блока и передает управление вызывающей программе . Если Exit выполняется в подпрограмме , то выполнение этой подпрограммы прекратится , и далее будет выполняться сле дующий за вызовом этой подпрограммы оператор . Если Exit выполняется в основной программе , выход из нее будет эквивалентен ее нормальному завершению. Вызов процедуры Halt, где бы она не на ходилась , завершает работу программы и переда ет управление операционн ой системе. Процедура Halt имеет структуру Halt(n), где n - код возврата , который может быть проанализирован операционной системой с помощью команды IF ERRORLEVEL. Значение n=0 соответствует нормальному завершению работы программы . Вызов процедуры Halt без параметра эквивалентен вызову Halt(0). Модуль (UNIT) в TURBO PASCAL - это особым образом оформленная библиотека подпрограмм . Мод уль в отличие от программы не может б ыть запущен на выполнение самостоятельно , он может только участвовать в построении пр огр амм и других модулей. Модули позволяют создавать личные библиот еки процедур и функций и строить программ ы практически любого размера. Модуль в TURBO PASCAL представляет собой отдельно хранимую и независимо компилируемую программ ную единицу. В общем случае модуль - это совок упность программных ресурсов , предназначенных для использования другими программами . Под прогр аммными ресурсами понимаются любые элементы я зыка TURBO PASCAL: константы , типы , переменные , подпрограммы . Модуль сам по себе не является выпол н яемой программой , его элементы ис пользуются другими программными единицами. Все программные элементы модуля можно разбить на две части : - программные элементы , предназначенные для использования другими программами или модуля ми , такие элементы называют види мыми в не модуля ; - программные элементы , необходимые только для работы самого модуля , их называют н евидимыми или скрытыми. В соответствии с этим модуль , кроме заголовка , содержит две основные части , назы ваемые интерфейсом и реализацией. В общем случае моду ль имеет с ледующую структуру : unit <имя модуля >; заголовок модуля interface описание видимых программных элементов модуля описание скрытых программных элементов модуля begin операторы инициализации элементов модуля end. В частном случае модуль может не содержать части реализации и части инициализации , тогда структура модуля будет т акой : unit <имя модуля >; заголовок модуля interface описание видимых программных элементов модуля implementation end. Использование в модулях процеду р и функций имеет свои особенности . Заголовок подпрограммы содержит все сведения , необходи мые для ее вызова : имя , перечень и тип параметров , тип результата для функций , э та информация должна быть доступна для др угих программ и модулей . С другой стороны , т е кст подпрограммы , реализующий ее алгоритм , другими программами и модулями не может быть использован . Поэтому заголово к процедур и функций помещают в интерфейс ную часть модуля , а текст - в часть реа лизации. Интерфейсная часть модуля содержит только видимые (доступные для других програм м и модулей ) заголовки процедур и функций (без служебного слова forward). Полный текст про цедуры или функции помещают в часть реали зации , причем заголовок может не содержать список формальных параметров. Исходный текст модуля д олжен быть откомпилирован с помощью директивы Make подменю Compile и записан на диск . Результатом компиляц ии модуля является файл с расширением .TPU (Turbo Pascal Unit). Основное имя модуля берется из заголов ка модуля. Для подключения модуля к программе не обходимо указать его имя в разделе описания модулей , например : uses CRT, Graph; В том случае , если имена переменных в интерфейсной части модуля и в прог рамме , использующей этот модуль , совпадают , обр ащение будет происходить к переменной , описан ной в прог рамме . Для обращения к п еременной , описанной в модуле , необходимо прим енить составное имя , состоящее из имени мо дуля и имени переменной , разделенных точкой. Например , пусть имеется модуль , в кото ром описана переменная К : unit M; interface var K: Integer; implementation ................. end. Пусть программа , использующая этот моду ль , также содержит переменную К : Program P; uses M; var K: Char; begin ............. end. Для того , чтобы в программе P иметь доступ к переменной K из модуля M, необходим о зада ть составное имя M.K. Использование составных имен применяется не только к именам переменных , а ко вс ем именам , описанным в интерфейсной части модуля. Рекурсивное использование модулей запрещено. Если в модуле имеется раздел инициали зации , то операторы из этого раздела будут выполнены перед началом выполнения п рограммы , в которой используется этот модуль. Понятие множества в языке ПАСКАЛЬ основывается на математическом предста влении о множествах : это ограниченная совокуп ность различных элементов . Для пост роения конкретного множественного типа используется перечисляемый или интервальный тип данных . Тип элементов , составляющих множество , называется базовым типом. Множественный тип описывается с помощью служебных слов Set of, например : type M= Set of B; Здес ь М - множественный тип , В - базовый тип. Пример описания переменной множественного типа : type M= Set of 'A'..'D'; var MS: M; Принадлежность переменных к множественному типу может быть определена прямо в р азделе описания переменных : var C: Set of 0..7; Константы множественного типа записываются в виде заключенной в квадратные скобки последовательности элементов или интервалов ба зового типа , разделенных запятыми , например : ['A', 'C'] [0, 2, 7] [3, 7, 11..14]. Константа вида [ ] означает пустое подмноже ство. Множество включает в себя набор элеме нтов базового типа , все подмножества данного множества , а также пустое подмножество . Е сли базовый тип , на котором строится множе ство , имеет К элементов , то число подмноже ств , входящих в это множество , равно 2 в ст епени К . Пусть имеется переменная Р интервального типа : var P: 1..3; Эта переменная может принимать три различных значения - либо 1, либо 2, либо 3. Переменн ая Т множественного типа var T: Set of 1..3; может принимать восемь различных значений : [ ] [1, 2] [1] [1,3] [2] [2,3] [3] [1,2,3] Порядок перечисления элементов базового типа в константах безразличен. Значение переменной множественного типа м ожет быть задано конструкцией вида [T], где T - переменная базового типа. К переменным и константам множеств енного типа применимы операции присваиван ия (:=), объединения (+), пересечения (*) и вычитания (-): ['A','B'] + ['A','D'] даст ['A','B','D'] ['A'] * ['A','B','C'] даст ['A'] ['A','B','C'] - ['A','B'] даст ['C']. Результат выполнения этих операций ест ь величи на множественного типа. К множественным величинам применимы опера ции : тождественность (=), нетождественность (<>), содержится в (<=), содержит (>=). Результат выполнения этих операций имеет логический тип , например : ['A','B'] = ['A','C'] даст FALSE ['A',' B'] <> ['A','C'] даст TRUE ['B'] <= ['B','C'] даст TRUE ['C','D'] >= ['A'] даст FALSE. Кроме этих операций для работы с величинами множественного типа в языке ПАС КАЛЬ используется операция in проверяющая принадлежность элемента базового типа , стоящего сл ева от знака опе рации , множеству , стоящему справа от знака операции . Результат выполнения этой операции - булевский . Операция проверки принадлежности элеме нта множеству часто используется вместо опера ций отношения , например : A in ['A', 'B'] даст TRUE, 2 i n [1, 3, 6] даст FALSE. При использовании в программах данных множественного типа выполнение операций происх одит над битовыми строками данных . Каждому значению множественного типа в памяти ЭВМ соответствует один двоичный разряд . Например , множество ['A', 'B','C','D'] представлено в памяти ЭВМ битовой стр окой 1 1 1 1. Подмножества этого множества представлены строками : ['A','B','D'] 1 1 0 1 ['B','C'] 0 1 1 0 ['D'] 0 0 0 1 Величины множественного типа не могут быть элементами списка ввода - вывода. В кажд ой конкретной реализации тр анслятора с языка ПАСКАЛЬ количество элементо в базового типа , на котором строится множе ство , ограничено . В TURBO PASCAL количество базовых элем ентов не должно превышать 256. Инициализация величин множественного типа производится с помощью типизированных ко нстант : const seLit: Set of 'A'..'D'= []; Проиллюстрируем применение данных множествен ного типа на примере. Пример . Составить программу , которая выраб атывает и выводит на экран дисплея наборы случайных чисел для игры в "Спортло то 5 из 36". Для заполнения каждой карточки спортлото необходимо получить набор из пяти псевдо случайных чисел . К этим числам предъявляются два требования : -числа должны находиться в диапазоне 1..36; -числа не должны повторяться. Program Lotto; var nb, k: Set of 1..36; kol, l, i, n: Integer; begin Randomize; WriteLn('ВВЕДИ kol'); ReadLn(kol); nb:=[1..36]; for i:=1 to kol do begin k:=[]; for l:=1 to 5 do begin repeat n:=Random(36) until (n in nb) and not (n in k); k:=k+[n]; Write(n:4) end; WriteLn end end. Запись представляет собой с овокупность ограниченного числа логически связан ных компонент , принадлежащих к разным типам . Компоненты записи называются полями , каждое из которых определяется именем . Поле записи содержит имя поля , вслед за которым ч ерез двое точие указывается тип этого поля . Поля записи могут относиться к любом у типу , допустимому в языке Паскаль , за исключением файлового типа. Описание записи в языке ПАСКАЛЬ осуще ствляется с помощью служебного слова RECORD, вслед за которым описываются компоне нты за писи . Завершается описание записи служебным с ловом END. Например , записная книжка содержит фамили и , инициалы и номера телефона , поэтому отд ельную строку в записной книжке удобно пр едставить в виде следующей записи : type Row=Record FIO: String[20]; T EL: String[7] end; var str: Row; Описание записей возможно и без ис пользования имени типа , например : var str: Record FIO: String[20]; TEL: String[7] end; Обращение к записи в целом допуска ется только в операторах присваивания , где слева и справа от знака присваивания используются имена записей одинакового типа . Во всех остальных случаях оперируют отде льными полями записей . Чтобы обратиться к отдельной компоненте записи , необходимо задать имя записи и через точку указать имя нужного поля , например : str.FI O, str.TEL Такое имя называется составным . Компоне нтой записи может быть также запись , в таком случае составное имя будет содержать не два , а большее количество имен. Обращение к компонентам записей можно упростить , если воспользоваться оператором прис оед инения with. Он позволяет заменить составные имена , характеризующие каждое поле , просто на имен а полей , а имя записи определить в опе раторе присоединения : with M do OP; Здесь М - имя записи , ОР - оператор , простой или составной . Оператор ОР представ ляет собой область действия оператора п рисоединения , в пределах которой можно не использовать составные имена. Иногда содержимое отдельной записи зависи т от значения одного из ее полей . В языке ПАСКАЛЬ допускается описание записи , состоящей из общей и вариантно й часте й . Вариантная часть задается с помощью кон струкции case P of, где Р - имя поля из общей части записи . Возможные значения , принимаемые этим полем , перечисляются так же , как и в операторе варианта . Однако вместо указания выполняемого действия , как это делается в операторе варианта , указываются поля вариан та , заключенные в круглые скобки . Описание вариантной части завершается служебным словом end. Тип поля Р можно указать в заголо вке вариантной части , например : case P: Integer of Инициализация записей осуществляется с помощью типизированных констант : type RecType= Record x,y: Word; ch: Char; dim: Array[1..3] of Byte end; const Rec: RecType= ( x: 127; y: 255; ch: 'A'; dim: (2, 4, 8) ); 30. Ф А Й Л Ы Введение файлового типа в язык ПАС КАЛЬ вызвано н еобходимостью обеспечить во зможность работы с периферийными (внешними ) ус тройствами ЭВМ , предназначенными для ввода , вы вода и хранения данных. Файловый тип данных или файл определя ет упорядоченную совокупность произвольного числ а однотипных компонент. Обще е свойство массива , множества и записи заключается в том , что количество их компонент определено на этапе написан ия программы , тогда как количество компонент файла в тексте программы не определяется и может быть произвольным. Понятие файла достаточно широк о . Э то может быть обычный файл на диске , к оммуникационный порт ЭВМ , устройство печати , к лавиатура или другие устройства. При работе с файлами выполняются опер ации ввода - вывода . Операция ввода означает перепись данных с внешнего устройства (из входного фа йла ) в основную память Э ВМ , операция вывода - это пересылка данных из основной памяти на внешнее устройство ( в выходной файл ). Файлы на внешних устройствах часто на зывают физическими файлами . Их имена определя ются операционной системой . В программах на язы ке Паскаль имена файлов задаются с помощью строк . Например , имя файла на диске может иметь вид : 'A:LAB1.DAT' 'c:\ABC150\pr.pas' 'lab3.pas'. Операционная система MS-DOS не делает особого различия между файлами на дисках и л ентах и устройствами ЭВМ и порта ми коммуникаций . В TURBO PASCAL могут использоваться имена устройств и портов , определенные в MS-DOS, напр имер : 'CON', 'LPT1', 'PRN', 'COM1', 'AUX', 'NUL'. С файловой системой TURBO PASCAL связано понятие буфера ввода вывода . Ввод и вывод данны х осуществ ляется через буфер . Буфер - э то область в памяти , которая выделяется дл я каждого файла . При записи в файл вся информация сначала направляется в буфер и там накапливается до тех пор , пока в есь объем буфера не будет заполнен . Только после этого или после сп е циа льной команды сброса происходит передача данн ых на внешнее устройство . При чтении из файла данные вначале считываются в буфер , причем данных считывается не столько , сколь ко запрашивается , а сколько поместится в б уфер. Механизм буферизации позволяет боле е быстро и эффективно обмениваться информацией с внешними устройствами. Для работы с файлами в программе необходимо определить файловую переменную . TURBO PASCAL под держивает три файловых типа : текстовые файлы , компонентные файлы , бестиповые файлы. Описание файловых переменных текстового типа производится с помощью служебного с лова Text, например : var tStory: Text; Описание компонентных файлов имеет вид : var fComp: File of T; где T - тип компоненты файла . Примеры описания файловой переменной компонентног о типа : type M= array[1..500] of Longint; var f1: File of Real; f2: File of Integer; fLi: File of M; Бестиповые файлы описываются с помощью служебного слова File: var f: File; Файловые переменные , которые описаны в программе , называют логическими файл ами . Все основные процедуры и функции , обеспечив ающие ввод - вывод данных , работают только с логическими файлами . Физический файл должен быть связан с логическим до выполнения процедур открытия файлов. TURBO PASCAL вводит ряд процедур и функций , п рименимых для любых типов файлов : Assign, Reset, Rewrite, Close, Rename, Erase, Eof, IOResult. Процедура Assign( var f; FileName: String ) связывает логический файл f с физическим файлом , полное имя которого задано в строке FileName. Процедура Reset( var f ) открыв ает логический фа йл f для последующего чтения данных или , ка к говорят , открывает входной файл . После у спешного выполнения процедуры Reset файл готов к чтению из него первого элемента. Процедура Rewrite( var f ) открывает логический файл f для последующей з аписи данных (открывает выходной файл ). После успешного выполнения этой процедуры файл готов к записи в него первого элемента. Процедура Close( var f ) закрывает открытый до этого логический файл . Вызов процедуры Close необходим при завершении работы с фай лом . Е сли по какой-то причине процедура Close не буд ет выполнена , файл все-же будет создан на внешнем устройстве , но содержимое последнего буфера в него не будет перенесено . Дл я входных файлов использование оператора закр ытия файла необязательно. Логическа я функция EOF( var f ): Boolean возвращает з начение TRUE, когда при чтении достигнут конец файла . Это означает , что уже прочитан по следний элемент в файле или файл после открытия оказался пуст. Процедура Rename( var f; NewName: String ) позволяет переимено ват ь физический файл на диске , связанный с логическим файлом f. Переименование возможно пос ле закрытия файла. Процедура Erase( var f ) уничтожает физический файл на диске , который был связан с файловой переменной f. Файл к моменту вызова процедур ы Erase до лжен быть закрыт. Функция IOResult: Integer возвращает целое число , соотв етствующее коду последней ошибки ввода - вывод а . При нормальном завершении операции функция вернет значение 0. Значение функции IOResult необходи мо присваивать какой - либо переменной , т ак как при каждом вызове функция обнуляет свое значение . Функция IOResult работает только при выключенном режиме проверок ошибок ввода - вывода или с ключом компиляции $I- . Особое место в языке ПАСКАЛЬ занимают текстовые файлы , компоненты которых име ют символьный тип . Для описания тексто вых файлов в языке определен стандартный тип Т ext: var TF1, TF2: Text; Текстовые файлы представляют собой пос ледовательность строк , а строки - последовательност ь символов . Строки имеют переменную длину , каждая строка завершается признаком конца строки. С признаком конца строки связана функ ция EOLn(var T:Text):Boolean, где Т - имя текстового файла . Эта функция принимает значение TRUE, если достигнут конец строки , и значение FALSE, если конец строки не достигнут. Для оп ераций над текстовыми файла ми , кроме перечисленных , определены также опер аторы обращения к процедурам : ReadLn(T) - пропускает строку до начала следующ ей ; WriteLn(T) - завершает строку файла , в которую производится запись , признаком конца строки и переход ит к началу следующей. Для работы с текстовыми файлами введе на расширенная форма операторов ввода и в ывода . Оператор Read(T,X1,X2,...XK) эквивалентен группе операторов begin Read(T,X1); Read(T,X2); ........... Read(T,XK) end; Здесь Т - текстовый файл , а пер еменные Х 1, Х 2,...ХК могут быть либо перем енными целого , действительного или символьного типа , либо строкой . При чтении значений переменных из файла они преобразуются из текстового представления в машинное. Оператор Write(T,X1,X2,...XK) эквивалентен группе операторов begin Write(T,X1); Write(T,X2); ........... Write(T,XK) end; Здесь Т - также текстовый файл , но переменные Х 1,Х 2,...ХК могут быть целого , действительного , символьного , логического типа или строкой . При записи значений переменных в файл они преобразуются из внутренне го представления в текстовый. К текстовым файлам относятся стандартные файлы INPUT, OUTPUT. Рассмотренные ранее операторы ввода - выво да являются частным случаем операторов обмена с текстовыми файлами , когда используются станд артные файлы ввода - вывода INPUT, OUTPUT. Работа с этими файлами имеет особенно сти : -имена этих файлов в списках ввода - вывода не указываются ; -применение процедур Reset, Rewrite и Close к стандартным файлам ввода - вывода запрещено ; -для работы с файлам и INPUT, OUTPUT введена разновидность функции EOLn без параметров. TURBO PASCAL вводит дополнительные процедуры и ф ункции , применимые только к текстовым файлам , это SetTextBuf, Append, Flush, SeekEOLn, SeekEOF. Процедура SetTextBuf( var f: Text; var Buf; B ufSize: Word ) служит для уве личения или уменьшения буфера ввода - вывода текстового файла f. Значение размера буфера для текстовых файлов по умолчанию равно 128 байтам . Увеличение размера буфера сокращает к оличество обращений к диску . Рекомендуется из мен я ть разиер буфера до открытия файла . Буфер файла начнется с первого байта переменной Buf. Размер буфера задается в необязательном параметре BufSize, а если этот п араметр отсутствует , размер буфера определяется длиной переменной Buf. Процедура Append( var f: Text ) служит для специально го открытия выходных файлов . Она применима к уже существующим физическим файлам и открывает из для дозаписи в конец файла. Процедура Flush( var f: Text ) применяется к открытым вы ходным файлам . Она принудительно записывает д анн ые из буфера в файл независимо от степени его заполнения. Функция SeekEOLn( var f: Text ): Boolean возвращает значение True, если до конца строки остались только пробелы. Функция SeekEOF( var f: Text ): Boolean возвращает значение True, если до конца файла остались строки , запол ненные пробелами. Компонентный или типизированный файл - это файл с объявленным типом его компонент . Компонентные файлы состоят из машинных пре дставлений значений переменных , они хранят да нные в том же виде , что и память Э ВМ. Описан ие величин файлового типа и меет вид : type M= File Of T; где М - имя файлового типа , Т - тип компоненты . Например : type FIO= String[20]; SPISOK=File of FIO; var STUD, PREP: SPISOK; Здесь STUD, PREP - имена файлов , компонентами кот орых являются строки. Оп исание файлов можно задавать в разделе описания переменных : var fsimv: File of Char; fr: File of Real; Компонентами файла могут быть все скалярные типы , а из структурированных - массив ы , множества , записи . Практически во всех к онкретных реализациях языка ПАСКАЛЬ констру кция "файл файлов " недопустима. Все операции над компонентными файлами производятся с помощью стандартных процедур : Reset, Rewrite, Read, Write, Close. Для ввода - вывода используются процедур ы : Read(f,X); Write(f,X); где f - имя логиче ского файла , Х - либо переменная , либо массив , либо строка , либо множество , либо запись с таким же описанием , какое имеет компонента файла. Выполнение процедуры Read(f,X) состоит в чтении с внешнего устройства одной компоненты ф айла и запись ее в X. Повтор ное при менение процедуры Read(f,X) обеспечит чтение следующей компоненты файла и запись ее в X. Выполнение процедуры Write(f,X) состоит в записи X на внешнее устройство как одной компоне нты . Повторное применение этой процедуры обес печит запись X как следую щей компоненты файла. Для работы с компонентными файлами вв едена расширенная форма операторов ввода и вывода : Read(f,X1,X2,...XK) Write(f,X1,X2,...XK) Здесь f - компонентный файл , а переменные Х 1, Х 2,...ХК должны иметь тот-же тип , что и объявленный тип компонент файла f. Бестиповые файлы позволяют записывать на диск произвольные участки пвмяти ЭВМ и считывать их с диска в память . Операц ии обмена с бестиповыми файлами осуществляетс я с помощью процедур BlokRead и BlockWrite. Кроме того , вводится расширен ная форма процедур Reset и Rewrite. В остальном принципы работы остаются такими же , как и с компонентными файлами. Перед использованием логический файл var f: File; должен быть связан с физическим с помощью процедуры Assign. Далее файл должен бы ть открыт для чтения или для записи процедурой Reset или Rewrite, а после окончания раб оты закрыт процедурой Close. При открытии файла длина буфера устан авливается по умолчанию в 128 байт . TURBO PASCAL позволяет изменить размер буфера ввода - вывода , для чего следу ет открывать файл расширен ной записью процедур Reset(var f: File; BufSize: Word ) или Rewrite(var f: File; BufSize: Word ) Параметр BufSize задает число байтов , считыва емых из файла или записываемых в него за одно обращение . Минимальное значение BufSi ze - 1 байт , максимальное - 64 К байт. Чтение данных из бестипового файла ос уществляется процедурой BlockRead( var f: File; var X; Count: Word; var QuantBlock: Word ); Эта процедура осуществляет за одно об ращение чтение в переменную X количества блоко в , заданное параметром Count, при этом длина блока равна длине буфера . Значение Count не может быть меньше 1. За одно обращение не льзя прочесть больше , чем 64 К байтов. Необязательный параметр QuantBlock возвращает число блоков (буферов ), прочитанных текущей оп ерацией BlockRead. В случае успешного завершения опер ации чтения QuantBlock = Count, в случае аварийной ситуации параметр QuantBlock будет содержать число удачно прочитанных блоков . Отсюда следует , что с помощью параметра QuantBlock можно контролировать правильность выполнения операции чтения. Запись данных в бестиповой файл выпол няется процедурой BlockWrite( var f: File; var X; Count: Word; var QuantBlock: Word ); которая осуществляет за одно обращение запись из переменной X количества блоков , заданное параметром Count, при этом длина бл ока равна длине буфера. Необязательный параметр QuantBlock возвращает число блоков (буферов ), записанных успешно текущей операцией BlockWrite. Смысл последовательного доступа заключается в том , что в каждый момент врем ени доступна лишь одна компонента из всей последовательности . Для того , чтобы обратиться (получить доступ ) к компоненте с номером К , необходимо просмотреть от начала файла К -1 предшествующую компоненту . После обращения к компоненте с номером К мож но обращ а ться к компоненте с номером К +1. Отсюда следует , что процессы фо рмирования (записи ) компонент файла и просмотр а (чтения ) не могут произвольно чередоваться . Таким образом , файл вначале строится при помощи последовательного добавления компонент в конец , а з а тем может последо вательно просматриваться от начала до конца. Рассмотренные ранее средства работы с файлами обеспечивают последовательный доступ. TURBO PASCAL позволяет применять к компонентным и бестиповым файлам , записанным на диск , с пособ прямого доступ а . Прямой доступ о значает возможность заранее определить в файл е блок , к которому будет применена операци я ввода - вывода . В случае бестиповых файло в блок равен размеру буфера , для компонент ных файлов блок - это одна компонента файл а. Прямой доступ предпол агает , что фа йл представляет собой линейную последовательност ь блоков . Если файл содержит n блоков , то они нумеруются от 1 через 1 до n. Кроме того , вводится понятие условной границы между блоками , при этом условная граница с номер ом 0 расположена перед б л оком с номером 1, граница с номером 1 расположена пер ед блоком с номером 2 и , наконец , условная граница с номером n находится после блока с номером n. Реализация прямого доступа осуществляется с помощью функций и процедур FileSize, FilePos, Seek и Truncate. Функция FileSize( var f ): Longint возвращает количество блоков в открытом файле f. Функция FilePos( var f ): Longint возвращает текущую позицию в файле f. Позиция в файле - это номер условной границы . Для только что открытого файла текущей позицией буде т граница с номером 0. Это значит , что можно записа ть или прочесть блок с номером 1. После чтения или записи первого блока текущая п озиция переместится на границу с номером 1, и можно будет обращаться к ьлоку с н омером 2. После прочтения последней записи з начение FilePos равно значению FileSize. Процедура Seek( var f; N: Longint) обеспечивает назначение теку щей позиции в файле (позиционирование ). В п араметре N должен быть задан номер условной границы , предшествующей блоку , к которому бу дет производиться пос ледующее обращение . Например , чтобы работать с блоком 4, необходимо задать значение N, равное 3. Процедура Seek работает с открытыми файлами. Процедура Truncate( var f ) устанавливает в текущей по зиции признак конца файла и удаляет (стира ет ) все последующи е блоки. Пример . Пусть на НМД имеется текстовый файл ID.DAT, который содержит числовые значения действительного типа по два числа в ка ждой строке - значения аргумента и функции соответственно . Количество пар чисел не более 200. Составить программу , котора я читает файл , значения аргумента и функции записывает в одномерные массивы , подсчитывает их кол ичество , выводит на экран дисплея и записы вает в файл компонентного типа RD.DAT. Program F; var rArg, rF: Array[1..200] of Real; inf: Text; outf: File of Real; n, l: Integer; begin Assign(inf,'ID.DAT'); Assign(outf,'RD.DAT'); Reset(inf); Rewrite(outf); n:=0; while not EOF(inf) do begin n:=n+1; ReadLn(inf,rArg[n],rF[n]) end; for l:=1 to n do begin WriteLn(l:2,rArg[l]:8:2,rF[l]:8:2); Write(outf,rArg[l], rF[l]); en d; close(outf) end. Операционная система MS - DOS все адресуемое пр остранство делит на сегменты . Сегмент - это участок памяти размером 64 К байт . Для за дания адреса необходимо определить адрес нача ла сегмента и смещение относительно начала сегмента. В TUR BO PASCAL определен адресный тип Pointer - ук азатель . Переменные типа Pointer var p: Pointer; содержат адрес какого - либо элемента программы и занимают 4 байта , при этом ад рес хранится как два слова , одно из ни х определяет сегмент , второе - смещение. Пе ременную типа указатель можно о писать другим способом. type NameType= ^T; var p: NameType; Здесь p - переменная типа указатель , связанн ая с типом Т с помощью имени типа NameType. Описать переменную типа указатель можно не посредственно в разделе описания переменных : var p: ^T; Необходимо различать переменную типа указ атель и переменную , на которую этот указат ель ссылается . Например если p - ссылка на пе ременную типа Т , то p^ - обозначение этой сам ой переменной. Для переменных типа указатель введено стан дартное значение NIL, которое означает , что указатель не ссылается ни к какому объекту . Константа NIL используется для любых указателей. Над указателями не определено никаких операций , кроме проверки на равенство и неравенство. Переменные типа указатель мо гут б ыть записаны в левой части оператора прис ваивания , при этом в правой части может находиться либо функция определения адреса Addr(X), либо выражение @ X, где @ - унарная операция вз ятия адреса , X - имя переменной любого типа , в том числе процедурного. Переменные типа указатель не могут бы ть элементами списка ввода вывода. Статической переменной (статически размещенно й ) называется описанная явным образом в пр ограмме переменная , обращение к ней осуществл яется по имени . Место в памяти для раз мещения стати ческих переменных определяется при компиляции программы. В отличие от таких статических переме нных в программах , написанных на языке ПАС КАЛЬ , могут быть созданы динамические перемен ные . Основное свойство динамических переменных заключается в том , что они с оздаютс я и память для них выделяется во врем я выполнения программы . Размещаются динамические переменные в динамической области памяти (heap - области ). Динамическая переменная не указывается яв но в описаниях переменных и к ней нел ьзя обратиться по имени . Д оступ к таким переменным осуществляется с помощью ука зателей и ссылок. Работа с динамической областью памяти в TURBO PASCAL реализуется с помощью процедур и функций New, Dispose, GetMem, FreeMem, Mark, Release, MaxAvail, MemAvail, SizeOf. Процедура New( va r p: Pointer ) выделяет место в динамической области памяти для размещения ди намической переменной p^ и ее адрес присваивает указателю p. Процедура Dispose( var p: Pointer ) освобождает участок памяти , выделенный для размещения динамической перемен ной проц едурой New, и значение указателя p становится неопределенным. Проуедура GetMem( var p: Pointer; size: Word ) выделяет участок памяти в heap - области , присваивает адрес его начала указателю p, размер участка в байтах задаетс я параметром size. Процедура Fre eMem( var p: Pointer; size: Word ) освобождает участок памяти , адрес начала которого определен ука зателем p, а размер параметром size. Значение указа теля p становится неопределенным. Процедура Mark( var p: Pointer ) записывает в указатель p а дрес начала уч астка свободной динамическо й памяти на момент ее вызова. Процедура Release( var p: Pointer ) освобождает участок динамиче ской памяти , начиная с адреса , записанного в указатель p процедурой Mark, то-есть , очищает ту динамическую память , которая была занята после вызова процедуры Mark. Функция MaxAvail: Longint возвращает длину в байтах самого длинного свободного участка динамическо й памяти. Функция MemAvail: Longint полный объем свободной динам ической памяти в байтах. Вспомогательная функция SizeOf( X ): Word возвращает объем в байтах , занимаемый X, причем X может быть либо именем переменной любого типа , л ибо именем типа. Структурированные типы данных , такие , как массивы , множества , записи , представляют собой статические структуры , так как и х размеры неизменны в течение всего времени выполнения программы. Часто требуется , чтобы структуры данных меняли свои размеры в ходе решения зад ачи . Такие структуры данных называются динами ческими , к ним относятся стеки , очереди , сп иски , деревья и другие . Описание динамиче ских структур с помощью массивов , записей и файлов приводит к неэкономному использовани ю памяти ЭВМ и увеличивает время решения задач. Каждая компонента любой динамической стру ктуры представляет собой запись , содержащую п о крайней мере два поля : одно поле типа указатель , а второе - для размещения данных . В общем случае запись может сод ержать не один , а несколько укзателей и несколько полей данных . Поле данных может быть переменной , массивом , множеством или за писью. Стеком называется динами че ская структура данных , добавление компоненты в которую и исключение компоненты из кото рой производится из одного конца , называемого вершиной стека . Стек работает по принципу LIFO (Last-In, First-Out) поступивший последним , обслуживается первым. Обычно н ад стеками выполняется тр и операции : -начальное формирование стека (запись перв ой компоненты ); -добавление компоненты в стек ; -выборка компоненты (удаление ). Очередью называется динамическая структура данных , добавление компоненты в которую про изводится в один конец , а выборка ос уществляется с другого конца . Очередь работае т по принципу : FIFO (First-In, First-Out) поступивший первым , обслуживается первым. Для формирования очереди и работы с ней необходимо иметь три переменные типа указатель , первая из кот орых определяет начало очереди , вторая - конец очереди , тре тья - вспомогательная. Описание компоненты очереди и переменных типа указатель дадим следующим образом : type PComp=^Comp; Comp=record D:T; pNext:PComp end; var pBegin, pEnd, pAux: PComp; где pBegi n - указатель начала очереди , pEnd - указатель конца очереди , pAux - вспомогательный указат ель. Тип Т определяет тип данных компонент ы очереди. В стеки или очереди компоненты можно добавлять только в какой либо один к онец структуры данных , это относится и к извлечению компонент. Связный (линейный ) список является структу рой данных , в произвольно выбранное место которого могут включаться данные , а также изыматься оттуда. Каждая компонента списка определяется клю чом . Обычно ключ - либо число , либо строка сим волов . Ключ располагается в поле данных компоненты , он может занимать как отдельное поле записи , так и быть часть ю поля записи. Основные отличия связного списка от с тека и очереди следующие : -для чтения доступна любая компонента списка ; -новые компоненты м ожно добавлять в любое место списка ; -при чтении компонента не удаляется из списка. Над списками выполняются следующие операц ии : -начальное формирование списка (запись пер вой компоненты ); -добавление компоненты в конец списка ; -чтение компоненты с заданным ключом ; -вставка компоненты в заданное место с писка (обычно после компоненты с заданным ключом ); -исключение компоненты с заданным ключом из списка. Для формирования списка и работы с ним необходимо иметь пять переменных типа указатель , первая из которых определяет начало списка , вторая - конец списка , остал ьные - вспомогательные. Описание компоненты списка и переменных типа указатель дадим следующим образом : type PComp= ^Comp; Comp= record D:T; pNext:PComp end; var pBegin, pEnd, pCKey, pPreComp, pAux: PCo mp; где pBegin - указатель начала списка , pEnd - указател ь конца списка , pCKey, pPreComp, pAux - вспомогательные указатели. Пример . Составить программу , которая форми рует список , добавляет в него произвольное количество компонент , выполняет вставку и у дал ение компоненты по ключу , а затем читает и выводит весь список на экра н дисплея . В качестве данных взять строку символов . Ввод данных - с клавиатуры диспл ея , признак конца ввода - строка символов END. Program LISTLINKED; uses Crt; type Alfa= String[10]; PComp= ^Comp; Comp= record sD:Alfa; pNext:PComp end; var pBegin, pEnd, pAux, pCKey, pPreComp: PComp; sC, sKey: Alfa; bCond: Boolean; Procedure CreateLL(var pBegin,pEnd: PComp; var sC: Alfa); begin New(pBegin); pBegin^.pNext:=NIL; pBegin^.sD:=sC; pEnd:=pBeg in end; Procedure AddLL(var pEnd: PComp; var sC: Alfa); var pAux: PComp; begin New(pAux); pAux^.pNext:=NIL; pEnd^.pNext:=pAux; pEnd:=pAux; pEnd^.sD:=sC end; Procedure Find(var sKey: Alfa; var pBegin,pCKey,pPreComp: PComp; var bCond: Boolean); begin pCKey:=pBegin; while (pCKey <> NIL) and (sKey <> pCKey^.D) do begin pPreComp:=pCKey; pCKey:=pCKey^.pNext end; if (pCKey = NIL) and (sKey <> pCKey^.sD) then bCond:=FALSE else bCond:=TRUE end; Procedure InsComp(var sKey,sC: Alfa); var pAux:PComp; begin Find( sKey,pBegin,pCKey,pPreComp,bCond); New(pAux); pAux^.sD:=sC; pAux^.pNext:=pCKey^.pNext; pCKey^.pNext:=pAux end; Procedure DelComp(var sKey: Alfa; var pBegin: PComp); begin Find(sKey,pBegin,pCKey,pPreComp,bCond); pPreComp^.pNext:=pCKey^.pNext end; begin ClrS cr; writeln(' ВВЕДИ СТРОКУ '); readln(sC); CreateLL(pBegin,pEnd,sC); repeat writeln('ВВЕДИ СТРОКУ '); readln(sC); AddLL(pEnd,sC) until sC='END'; writeln (' ***** ВЫВОД ИСХОД НОГО СПИСКА *****'); pAux:=pBegin; repeat writeln(pAux^.sD); pAux:=pAux^.pNext; until pAux=NIL; writeln ; writeln ('ВВ ЕДИ КЛЮЧ ДЛЯ ВСТАВКИ СТРОКИ '); readln ( sKey ); writeln ('ВВ ЕДИ ВСТАВЛЯЕМУЮ СТРОКУ '); readln(sC); InsComp(sKey,sC); writeln; writeln('ВВЕДИ КЛЮЧ УДАЛЯЕМОЙ СТРОКИ '); readln(sKey); DelComp(sKey,pBegin); writeln ; writeln (' **** * ВЫВОД ИЗМЕНЕННОГО СПИСКА *****'); pAux:=pBegin; repeat writeln(pAux^.sD); pAux:=pAux^.pNext; until pAux=NIL end.
1Архитектура и строительство
2Астрономия, авиация, космонавтика
 
3Безопасность жизнедеятельности
4Биология
 
5Военная кафедра, гражданская оборона
 
6География, экономическая география
7Геология и геодезия
8Государственное регулирование и налоги
 
9Естествознание
 
10Журналистика
 
11Законодательство и право
12Адвокатура
13Административное право
14Арбитражное процессуальное право
15Банковское право
16Государство и право
17Гражданское право и процесс
18Жилищное право
19Законодательство зарубежных стран
20Земельное право
21Конституционное право
22Конституционное право зарубежных стран
23Международное право
24Муниципальное право
25Налоговое право
26Римское право
27Семейное право
28Таможенное право
29Трудовое право
30Уголовное право и процесс
31Финансовое право
32Хозяйственное право
33Экологическое право
34Юриспруденция
 
35Иностранные языки
36Информатика, информационные технологии
37Базы данных
38Компьютерные сети
39Программирование
40Искусство и культура
41Краеведение
42Культурология
43Музыка
44История
45Биографии
46Историческая личность
47Литература
 
48Маркетинг и реклама
49Математика
50Медицина и здоровье
51Менеджмент
52Антикризисное управление
53Делопроизводство и документооборот
54Логистика
 
55Педагогика
56Политология
57Правоохранительные органы
58Криминалистика и криминология
59Прочее
60Психология
61Юридическая психология
 
62Радиоэлектроника
63Религия
 
64Сельское хозяйство и землепользование
65Социология
66Страхование
 
67Технологии
68Материаловедение
69Машиностроение
70Металлургия
71Транспорт
72Туризм
 
73Физика
74Физкультура и спорт
75Философия
 
76Химия
 
77Экология, охрана природы
78Экономика и финансы
79Анализ хозяйственной деятельности
80Банковское дело и кредитование
81Биржевое дело
82Бухгалтерский учет и аудит
83История экономических учений
84Международные отношения
85Предпринимательство, бизнес, микроэкономика
86Финансы
87Ценные бумаги и фондовый рынок
88Экономика предприятия
89Экономико-математическое моделирование
90Экономическая теория

 Анекдоты - это почти как рефераты, только короткие и смешные Следующий
Когда друзья предают - это ничего, такое случается регулярно. А вот когда бумага в туалете заканчивается - вот это проблема!
Anekdot.ru

Узнайте стоимость курсовой, диплома, реферата на заказ.

Обратите внимание, реферат по программированию "Алгоритмический язык Паскаль", также как и все другие рефераты, курсовые, дипломные и другие работы вы можете скачать бесплатно.

Смотрите также:


Банк рефератов - РефератБанк.ру
© РефератБанк, 2002 - 2016
Рейтинг@Mail.ru