Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Безусловного перехода,

Читайте также:
  1. Экономическая наука и экономическая политика в период трансформации (различные программы перехода, проблема новых институтов, государство и его роль).

метки

В языке Паскаль представлены три основных вида циклов. Рассмотрим параллельно варианты этих циклов на Паскале и соответствующие им циклы на псевдокоде, и отметим особенности реализации на Паскале.

Цикл с предусловием:

 

while L do S пока L повторять S конец_пока

здесь S, как и в инструкциях ветвления, – это единственная инструкция тела цикла, но зато она может быть простой или структурной.

Цикл с постусловием:

 

repeat S1; … SN until L повторять S1; … SN до L

здесь S1, …, SN – это цепочка из одной или нескольких инструкций (простых или структурных), составляющих тело цикла. В отличие от цикла с предусловием тело обязательно выполняется хотя бы один раз.

Цикл со счётчиком является частным случаем цикла с предусловием и имеет общий вид при шаге K3=1:

 

for K:= K1 to K2 do S для K от K1 до K2 шаг K3 повторять S конец_для

При шаге K3 = -1 ключевое слово to заменяется словом downto:

for K := K1 downto K2 do

S

В первом случае в цикле будет выполнено 0 итераций, если значение выражения K1 больше значения выражения K2. Во втором же случае будет выполнено 0 итераций, если K1 меньше K2. При других соотношениях K1 и K2 в обоих циклах выполняется |K2-K1|+1 итераций, если в теле S не оказывается влияние на счётчик K (например с помощью присваивания, ввода или другого вложенного цикла с одноимённым счётчиком).

Тип K, K1, K2 – любой порядковый. Все три параметра – однотипные.

Крайне нежелательно передавать управление внутрь тела цикла и вообще любой структурной инструкции с помощью инструкции безусловного перехода goto – этим разрушается логическая целостность сложной инструкции, что может привести к неправильной работе программы. Управление, в случае необходимости, можно передавать на заголовок структурной инструкции. В концепции структурного программирования была доказана возможность вообще обходиться без инструкции goto. Однако иногда удобно использовать goto, например, для прерывания сразу нескольких вложенных циклов. Помеченная инструкция S имеет вид:

M: S

Метка M обязательно объявляется в разделе label и задаётся либо именем, либо целой неотрицательной константой.

 

Лекция 6. Перечислимый и ограниченный

типы. Строки

Перечислимый тип задаётся следующим образом:

Type

T = (W1, W2, …, WN);

здесь T – произвольное имя типа, а W1, W2, …, WN – произвольные имена констант, составляющих этот тип. Далее имя T можно использовать при описании переменных этого типа как обычно.

Если любой тип создаётся только для разового применения, то его можно задать неименованным (безымянным) сразу при описании переменных. Например, для перечислимого типа:

Var

V1, V2, …, VM: (W1, W2, …, WN);

Теперь переменные V1, V2, …, VM смогут принимать значения любой из констант W1, W2, …, WN.

К данным перечислимого типа, как и к данным других порядковых типов, применяются функции Ord, Succ и Pred и стандартные процедуры Inc и Dec. Данные перечислимого типа могут присваиваться однотипным переменным, использоваться в качестве параметра цикла со счётчиком, индексов элементов массивов, их можно сравнивать между собой. Однако их нельзя вводить с клавиатуры и выводить на экран.

Ограниченный тип (тип-диапазон) задаётся следующим образом:

Type

T = Min .. Max;

здесь T – имя типа, а Min и Max – константы базового порядкового типа, задающие диапазон значений этого типа: Min, Min+1, …, Max-1, Max. Чаще всего безымянный тип-диапазон используется при задании типа индекса массива в силу его наглядности.

 

Строка – это фактически массив символов, но с более широким набором действий и операций, чем для обычного массива. Строковая константа – это нуль или более любых символов клавиатуры, заключённых в апостр о фы. Например: ' школа ' – строка из 5 символов, ''пустая строка из 0 символов.

Переменные строкового типа могут объявляться двумя способами:

Var

A: string [N];

B: string;

В первом случае: N – положительная целочисленная константа не более 255, а переменная A может хранить строки длиной не более N. Во втором случае: переменная B может хранить строки длиной не более 255. Обе переменных – аналоги массивов array [0 .. N] of Char и array [0 .. 255] of Char, поэтому к отдельному символу строки возможен прямой доступ: A[K], B[L].

Переменные строкового типа имеют специальную внутреннюю структуру: само значение в виде цепочки кодов символов размещается с первого байта, а в нулевом байте располагается текущая длина строки. Длина автоматически корректируется при присваивании или вводе значения для переменной. Если длина значения превышает максимально возможную длину N, то лишние символы в правой части строки отбрасываются.

Типизированная константа-строка – задаётся единой строковой константой или константным выражением, например:

Const

A: string [10] = ' космос ';

Из действий и операций со строками разрешены: присваивание, ввод с клавиатуры (желательна инструкция ReadLn, а не Read), вывод на экран, сцепление (конкатенация) строк (+), сравнения строк (=, <>, >, <, >=, <=). Остальные операции реализуются стандартными процедурами (Delete, Insert, Str, Val) и стандартными функциями (Copy, Length, Pos, UpCase).

Лекция 7. Массивы

 

Тип "массив" характеризуется следующими особенностями:

1) Переменная типа "массив" (или просто массив) является совокупностью компонентов одного и того же типа, называемых элементами массива.

2) Каждый элемент массива может быть явно обозначен, и к нему имеется прямой доступ.

3) Число элементов массива определяется при его описании и в дальнейшем не меняется – массив является статическим.

Определение типа "массив" имеет вид:

Type

TA = array [TIndex] of TE;

здесь TA – имя типа, TIndex – тип индекса, TE – тип элементов массива. TIndex фактически определяет число элементов массива. В качестве TIndex обычно указывается тип-диапазон. TE может быть любым простым или сложным типом.

Элемент массива обозначается как A[I], где A – переменная типа TA (то есть типа "массив"), а I – индексное выражение или индекс, тип которого – TIndex. Сам элемент A[I] – это переменная типа TE, его часто также называют индексированной переменной.

В приведённом описании тип "массив" является аналогом вектора в алгебре. Также можно создавать многомерные массивы, то есть аналоги матриц и объектов б о льших размерностей. В краткой форме многомерные массивы объявляются следующим образом:

Type

TA = array [T1, T2, …, TD] of TE;

здесь D называется размерностью массива, а каждое TK задаёт тип индекса по K-му измерению массива. Элемент многомерного массива обозначается как A[I1, I2, …, ID], где IK – это индексное выражение типа TK по K-му измерению. Таким образом, для матрицы A с двумя измерениями

Var

A: array [K .. M, L .. N] of Real;

элементы A[I, J] будут переменными вещественного типа, I – это номер строки, J – это номер столбца; индексы должны удовлетворять неравенствам: K_≤_I_≤_M и L_≤_J_≤_N.

Типизированные константы-массивы позволяют задать начальные значения, например:

Const

A: array [0 .. 3] of Integer = (10, 15, 20, 25);

B: array [0 .. 1, 1 .. 3] of Byte = ((5, 6, 7), (2, 4, 8));

здесь заданы начальные значения для вектора A и матрицы B из четырёх и шести элементов соответственно. В матрице B – две строки по три элемента.

Из действий и операций с массивами разрешено присваивание однотипных массивов друг другу. Значения переменной-массива не разрешается вводить с клавиатуры и выводить на экран – это можно делать только поэлементно. Поэтому в таких случаях обычно используют циклы.

 

Лекция 8. Файлы

 

Файловый тип характеризуется следующими особенностями:

1) Переменная типа "файл" (файловая переменная) позволяет получить доступ к элементам совокупности одного и того же типа, расположенным, обычно, на внешнем носителе (диске).

2) Элементы файла располагаются в последовательном порядке, и поэтому к ним, как правило, возможен последовательный доступ. Файл имеет начальную и конечную позицию. Одна позиция в файле является текущей. Из элемента, следующего за этой позицией, читается или в этот элемент записывается новое значение.

3) Число элементов файла может изменяться и ограничено только ёмкостью внешнего носителя. Файл может быть пуст.

В зависимости от способа описания и внутренней структуры различают три вида файлов: текстовые, типизированные, нетипизированные (бестиповые). Соответствующие переменные описываются следующим образом:

Var

F: Text; {текстовой файл}

G: file of TE; {типизированный файл}

H: file; {нетипизированный файл}

здесь TE – имя типа элементов файла. Тип элементов может быть любым, но только не файловым или объектным. По внутренней структуре текстовые файлы Турбо Паскаля являются текстовыми файлами в DOS и Windows, типизированные и нетипизированные – двоичными (нетекстовыми) файлами.

Обычно действия с файловыми переменными производятся стандартными процедурами и функциями. Выделим шесть основных видов действий с файлами и подпрограмм, их осуществляющих:

1) Получение доступа (подсоединение) к файлу или связывание с файлом (процедура Assign).

2) Открытие файла (процедуры Reset, Rewrite, Append).

3) Закрытие файла (процедура Close).

4) Ввод из файла (процедуры Read, ReadLn, BlockRead).

5) Вывод в файл (процедуры Write, WriteLn, BlockWrite).

6) Позиционирование в файле (функции Eof, SeekEof, FileSize, FilePos, процедура Seek).

При получении доступа к файлу происходит связывание файловой переменной с конкретным файлом или устройством. Далее эта переменная будет посредником между файлом и программой – имя файла больше указываться не будет. При подсоединении надо учитывать особенности работающей операционной системы, в частности, в DOS и Windows имена con, prn, lpt1, lpt2, …, aux, com1, com2, …, nul задают логические устройства и именами файлов быть не могут.

Открытие файла означает указание для него направления передачи данных: Reset – чтение (ввод с самого начала файла), Rewrite – запись (разрушающая существующий файл), Append – дозапись (вывод в конец существующего файла, то есть его расширение). Здесь имеется тонкость: Append применима только к текстовым файлам, для дозаписи в типизированные и нетипизированные файлы их необходимо открывать с помощью Reset, которая, на самом деле, открывает и на чтение, и на запись.

В Турбо Паскале две стандартные переменные типа Text по умолчанию подсоединены к устройствам ввода/вывода и открыты: Input – для ввода с клавиатуры, Output – для вывода на экран.

Закрытие файла с помощью Close необходимо всегда по завершении вывода в него, иначе "хвост" файла может быть не записан на диск и пропадёт после окончания программы. Закрытие не означает отсоединения – закрытый файл всегда можно снова открыть, не прибегая к процедуре Assign.

Ввод/вывод элемента любого файла всегда производится с текущей позиции, и элемент вводится/выводится целиком. После каждого ввода или вывода текущая позиция смещается к следующему элементу, в направлении от начала к концу файла. Для ввода характерен эффект присваивания: вводимые значения стирают старые значения переменных из списка ввода.

Текстовой файл – это набор строк символов клавиатуры переменной длины. Его легко создавать, просматривать, корректировать и вне программы – с помощью простого редактора текста. Действие текстовых инструкций ввода (Read, ReadLn) и вывода (Write, WriteLn) аналогично вводу с клавиатуры и выводу на экран.

Типизированный файл – это набор элементов типа TE, указанного в описании файловой переменной. Компилятор жёстко проверяет, совпадает ли тип переменных в списках ввода/вывода с этим типом TE. Значения в файле хранятся не в виде символов, а во внутримашинном представлении. По этой причине их обычно нельзя просматривать с помощью редактора текста, но зато данные хранятся более компактно, и ввод/вывод производится быстрее. Типизированные инструкции ввода и вывода – Read и Write. Поскольку размер всех элементов файла одинаковый, то к типизированному файлу возможен не только последовательный, но и произвольный (а фактически – прямой) доступ.

Нетипизированный файл – это набор записей (блоков) одинаковой длины, которая устанавливается при открытии файла. Для него контроль типов не производится – это делает его совместимым с другими видами файлов и позволяет организовать высокоскоростной обмен данными между переменной-буфером в программе и диском. Нетипизированные инструкции BlockRead и BlockWrite осуществляют ввод/вывод записями.

Функция Eof(F) возвращает True, если следующий за текущей позицией элемент файла уже есть конец файла. Это позволяет задать типичный цикл для обработки любого файла F:

 

while not Eof(F) do

Begin

ReadLn(F, …); {или Read(F, …); или BlockRead(F, …); }

…{обработка введённых данных}…

End

При этом для текстовых файлов иногда предпочтительнее функция SeekEof(F): она игнорирует пробельные символы и пустые строки, случайно оказавшиеся в самом конце файла.

Функции FileSize, FilePos и процедура Seek применяются только для типизированных и бестиповых файлов, но не для текстовых. FileSize возвращает количество элементов или записей в файле. FilePos возвращает номер элемента или записи в файле, следующей за текущей позицией (нумерация начинается с 0). Seek – устанавливает в файле новую текущую позицию, обеспечивая тем самым прямой доступ к элементам файла.

 

Лекция 9. Записи

Множественный тип является аналогом математического понятия "множество" и характеризуется следующими особенностями:

1) Переменная типа "множество" (или просто множество) является совокупностью компонентов одного и того же типа, называемых элементами множества.

2) Повторение одного и того же элемента множества равносильно однократному вхождению этого элемента. Порядок размещения элементов отсутствует, поэтому для множества возможна только проверка принадлежности ему какого-то значения, а не доступ к элементу.

3) Число элементов (мощность) множества может изменяться в пределах от 0 до 256. Множество, не содержащее элементов, называется пустым.

Определение типа "множество" имеет вид:

Type

TS = set of TE;

здесь TS – имя типа, TE – тип элементов множества. TE может быть только любым порядковым однобайтовым типом с диапазоном значений, не выходящим за пределы от 0 до 255.

Для задания множества используется так называемый конструктор множества: [E1, E2, …, EN], где EK – это константа или диапазон констант типа TE. Любой элемент EK может быть даже выражением или диапазоном выражений типа TE. Конструктор [ ] обозначает пустое множество.

Типизированная константа-множество – задаётся константным конструктором, например:

Const

S: set of Char = [ '! ', '? ', ' 0 '..' 9 ', ' A '..' Z ' ];

Совместимые по типу элементов TE множества можно присваивать друг другу, но переменную-множество не разрешается вводить с клавиатуры и выводить на экран – это можно делать только поэлементно. Операции, разрешённые над множествами, аналогичны таким же математическим операциям. Их обозначения: *, +, -, =, <>, <=, >=, in. Также имеются стандартные высокоэффективные процедуры Include и Exclude.

 

Тип "запись" характеризуется следующими особенностями:

1) Переменная типа "запись" (или просто запись) является совокупностью компонентов, возможно, различных типов, называемых полями записи.

2) Каждое поле записи обозначается именем, и поэтому к нему имеется прямой доступ.

3) Количество полей записи определяется при её описании и в дальнейшем не меняется.

Определение типа "запись" имеет вид:

Type

TZ = record

P1; P2; …; PN

End;

здесь TZ – имя типа, P1; P2; …; PN – описания полей записи, причём их типы могут быть любыми простыми или сложными.

Для доступа к полю записи используется составное (уточнённое) имя Z. V, где Z – имя переменной типа TZ (то есть типа "запись"), а V – имя поля. Z. V является переменной того типа, который задан при описании поля V.

Типизированная константа-запись позволяет задать начальные значения, например:

Const

Z: record

D, M: Byte;

Y: Word

end = (D: 18; M: 3; Y: 1871);

здесь заданы значения для полей записи Z.

Из действий и операций с записями разрешено присваивание однотипных записей друг другу. Значения переменной-записи не разрешается вводить с клавиатуры и выводить на экран – это можно делать только для отдельных полей. Чтобы упростить доступ к полям, используется структурная инструкция присоединения (withdo).

В записях можно применять так называемую вариантную часть (case of), которая позволяет "накладывать" друг на друга разнотипные значения.

Лекция 10. Подпрограммы-процедуры.

Локальность имён.

Параметры процедуры

Подпрограмма – это вспомогательный алгоритм, имеющий имя и определённый отдельно от основного алгоритма. С помощью имени к подпрограмме можно обратиться (вызвать её) – смотри выше обращения к стандартным функциям и процедурам. Управление при этом передаётся в начало подпрограммы, а когда её выполнение завершается, управление возвращается в точку вызова и выполнение продолжается с этой точки. Данные между программой и подпрограммой обычно передаются с помощью параметров. В самой подпрограмме – формальные параметры, а в обращении к ней – фактические параметры. Между фактическими и формальными параметрами обычно должно соблюдаться строгое соответствие по типу, количеству и порядку следования. В языке Паскаль имеется два вида подпрограмм – функции и процедуры. Помимо стандартных подпрограмм можно создавать свои – их определения располагаются среди разделов описаний программы.

Процедура – это подпрограмма, не возвращающая значение либо возвращающая несколько значений. Общий вид определения процедуры:

procedure Имя_процедуры(S);

Разделы описаний

Begin

Основной блок процедуры

End;

Здесь S обозначает список описаний формальных параметров, который может отсутствовать – тогда опускаются и скобки. Разделы описаний и основной блок аналогичны таким же разделам главной программы – нельзя указывать только раздел uses. Таким образом, как вспомогательный алгоритм, – процедура является программой в миниатюре, только заголовок процедуры является обязательным. Поэтому самая короткая процедура выглядит так:

procedure Имя_процедуры;

Begin

End;

Область видимости имени – это та часть текста программы, где это имя может использоваться.

Имя (константы, типа, переменной, подпрограммы) называется локальным, если оно описано в какой-то процедуре. Область его видимости простирается вниз, от места описания до конца тела этой процедуры (end;). Для локальных переменных область видимости совпадает с областью их существования, задавая тем самым время существования: в начале выполнения процедуры память для переменных автоматически захватывается, а при выходе из процедуры – автоматически освобождается. Это означает, что при новом вызове процедуры эти переменные будут не определены, как и при первом вызове.

Имя (константы, типа, переменной, подпрограммы) называется глобальным, если оно описано в главной программе. Область его видимости простирается вниз, от места описания до конца тела всей программы (end.), включая подпрограммы, определённые в этой же области. Но здесь имеется одно исключение: если в области видимости глобального имени встретится описание такого же локального имени, то локальное имя в своей области "перекрывает" глобальное, глобальное же имя будет "видно" всюду за пределами данной локальной области. В случае одноимённых глобальных и локальных переменных и констант они, к тому же, будут занимать разные ячейки памяти.

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

Использование глобальных переменных делает программу более компактной и быстрой, но и более уязвимой для ошибок, поэтому рекомендуется только при крайней необходимости. Например, если в процедуре используется цикл с глобальной переменной-счётчиком, а обращение к этой процедуре находится в теле цикла с одноимённым счётчиком, то выполнение внешнего цикла будет нарушено.

Общий вид списка описаний формальных параметров: R1; R2; …; RL, где каждый элемент RJ – это группа однотипных формальных параметров. Каждая группа может быть представлена в одном из трёх вариантов:

 

V1, V2, …, VK: TJ, или var V1, V2, …, VK: TJ, или var V1, V2, …, VK

 

которые задают вид передачи параметров: в первом случае – по значению, во втором и третьем случае – по ссылке. Здесь VI обозначают имена формальных параметров, а TJимя их типа. Формальные параметры являются переменными в процедуре и могут использоваться только в ней, то есть их область видимости простирается до её конца (end;). В первом случае они называются параметрами-значениями, во втором случае – параметрами-переменными, в третьем случае – бестиповыми (нетипизированными) параметрами-переменными.

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

Во втором и в третьем случае данные могут передаваться как в процедуру, так и из процедуры – "копироваться" из фактического параметра в формальный и наоборот. Поэтому в обращении фактические параметры могут быть только переменными.

Первым видом передачи пользуются для защиты фактических параметров от изменений при выполнении процедуры, но он может быть неэффективным, поскольку для формального параметра автоматически захватывается столько же памяти, каков размер фактического параметра. Вторым видом передачи пользуются для возврата каких-то значений из процедуры. Он обычно эффективнее первого, поскольку в процедуру копируется не значение фактического параметра, а ссылка на него (его адрес). При третьем виде передачи параметры обрабатываются или стандартными подпрограммами, или с помощью встроенного языка Ассемблера, или на них можно "накладывать" локальные переменные с помощью стандартной директивы absolute.

В Турбо Паскале обычно запрещены формальные параметры неименованных (безымянных) типов, будь то сложные типы, обозначаемые несколькими словами и специальными символами, или простые – перечислимый и тип-диапазон. Для этого необходимо заранее именовать требуемые типы в разделе type.

 


Дата добавления: 2015-07-15; просмотров: 187 | Нарушение авторских прав


Читайте в этой же книге: Глоссарий | Краткий курс лекций | Хранение информации | Классификация структур данных | Операции над структурами данных | Операции. Выражения | Interface | Лекция 13. Ссылочный тип. | Лекция 14. Алгоритмы поиска и выборки. | Бинарный поиск |
<== предыдущая страница | следующая страница ==>
Лекция 3 Структура программы.| Лекция 11. Подпрограммы-функции.

mybiblioteka.su - 2015-2024 год. (0.028 сек.)