Казахстан, г. Актобе
Актюбинский технический колледж
Преподаватель информатики и спец.дисциплин
Кушкенова Г.А
Раздел 1. Основы алгоритмизации.
Тема 1.1. Этапы подготовки решения задачи на компьютере.
Основные понятия алгоритмического языка.
СОСТАВ ЯЗЫКА. Обычный разговорный язык состоит из четырех основных элементов: символов, слов, словосочетаний и предложений. Алгоритмический язык содержит подобные элементы, только слова называют элементарными конструкциями, словосочетания - выражениями, предложения - операторами. Символы, элементарные конструкции, выражения и операторы составляют иерархическую структуру, поскольку элементарные конструкции образуются из последовательности символов, выражения - это последовательность элементарных конструкций и символов, а оператор-последовательность выражений, элементарных конструкций и символов.
ОПИСАНИЕ ЯЗЫКА есть описание четырех названных элементов. Описание символов заключается в перечислении допустимых символов языка. Под описанием элементарных конструкций понимают правила их образования. Описание выражений - это правила образования любых выражений, имеющих смысл в данном языке. Описание операторов состоит из рассмотрения всех типов операторов, допустимых в языке. Описание каждого элемента языка задается его СИНТАКСИСОМ и СЕМАНТИКОЙ. Синтаксические определения устанавливают правила построения элементов языка. Семантика определяет смысл и правила использования тех элементов языка, для которых были даны синтаксические определения.
СИМВОЛЫ языка - это основные неделимые знаки, в терминах которых пишутся все тексты на языке.
ЭЛЕМЕНТАРНЫЕ КОНСТРУКЦИИ - это минимальные единицы языка, имеющие самостоятельный смысл. Они образуются из основных символов языка.
ВЫРАЖЕНИЕ в алгоритмическом языке состоит из элементарных конструкций и символов, оно задает правило вычисления некоторого значения.
ОПЕРАТОР задает полное описание некоторого действия, которое необходимо выполнить. Для описания сложного действия может потребоваться группа операторов. В этом случае операторы объединяются в СОСТАВНОЙ ОПЕРАТОР или БЛОК.
Действия, заданные операторами, выполняются над ДАННЫМИ. Предложения алгоритмического языка, в которых даются сведения о типах данных, называются ОПИСАНИЯМИ или неисполняемыми операторами. Объединенная единым алгоритмом совокупность описаний и операторов образует ПРОГРАММУ на алгоритмическом языке. В процессе изучения алгоритмического языка необходимо отличать алгоритмический язык от того языка, с помощью которого осуществляется описание изучаемого алгоритмического языка. Обычно изучаемый язык называют просто языком, а язык, в терминах которого дается описание изучаемого языка - МЕТАЯЗЫКОМ. Синтаксические определения могут быть заданы формальными или неформальным способами. Существуют три формальных способа: -металингвистическая символика, называемая Бэкуса-Наура формулами; -синтаксические диаграммы; -скобочные конструкции.
Этапы решения задач на ЭВМ.
Решение задачи на ЭВМ представляет собой получение результатной информации на основе обработки необходимой исходной с помощью программы, составленной из команд системы управления работой отдельных устройств вычислительной машины.
Создание такой программы решения задач предполагает реализацию ряда последовательных этапов:
В зависимости от специфических особенностей конкретной задачи, профессионального уровня подготовки специалистов и ряда других факторов, некоторые этапы могут быть объединены в более крупные этапы:
I этап: Представляет собой постановку задачи, на этом этапе раскрывается организационно-экономическая сущность.
II этап: Определение способов и методов решения поставленных задач. Конкретно решается, как могут быть получены требуемые результаты.
IV этап: Состоит в подборе и упорядочении действий для организации ввода-вывода информации.
V этап: В процессе составления программы конкретизируется тип и структура используемых данных, отражается посредством языка программирования.
VI этап: Основная цель отладки — выявление и исправление ошибок, связанных с нарушением правил написания программы. Тестирование представляет собой проверку правильности логики работы программы.
Тема 1.2. Способы представления алгоритмов
Алгоритм и его свойства.
Алгоритм– понятное и точное предписание исполнителю совершить последовательность действий, направленных на достижение указанной цели.
Термин алгоритм происходит от имени узбекского учёного IX века Аль - Хорезми, который в своём труде «Арифметический трактат», переведённом в XII веке с арабского на латынь, изложил правила арифметических действий над числами в позиционной десятичной системе счисления.
Алгоритм применительно к вычислительной машине — точное предписание, т.е. набор операций и правил их чередования, при помощи которого, начиная с некоторых исходных данных, можно решить любую задачу фиксированного типа.
Свойства алгоритма — набор свойств, отличающих алгоритм от любых предписаний и обеспечивающих его автоматическое исполнение.
Дискретность — выполнение команд алгоритма последовательно, с точной фиксацией моментов окончания выполнения одной команды и начала выполнения следующей.
Определённость (точность) — точные сведения о том, что после выполнения каждой очередной команды завершено выполнение алгоритма, либо о том, какая следующая команда должна выполняться.
Результативность (конечность) — либо завершение решения задачи после выполнения алгоритма, либо вывод о невозможности продолжения решения по какой-либо из причин.
Массовость — единообразное применение алгоритма к любой конкретной формулировке задачи, для решения которой он разработан.
Способы представления алгоритмов.
Существует различные формы представления алгоритмов. Основными из них являются:
Имеет минимум ограничений и является наименее формализованным. Словесное описание отражает содержание выполняемых действий средствами естественного языка.
Построчная запись алгоритма.
Это запись на естественном языке, но с соблюдением некоторых дополнительных правил. Построчная запись не требует специальных знаний при использовании, нагляден, обеспечивает обработку навыков логически строгого изложения хода решения задачи.
Изображение алгоритма в виде блок-схемы
Отличается высокой степенью наглядности. Блок-схема состоит из соединенных между собой стрелками (линиями потока) блоков различного вида таблица 5 и необходимого количества комментариев.
Выполнение алгоритмов начинается с блока начала и оканчивается при попадании на блок конца. Проверка условия изображается с помощью блока принятия решения, внутри которого записывается это условие. В результате проверки выбирается одна из двух стрелок, определяющая направление дальнейших вычислений.
Внутри блока ввода пишется (необязательно) слово «Ввод» или «Вывод» и перечисляются переменные, значения которых должны быть введены или выведены в данном месте схемы.
Основные алгоритмические конструкции.
Основные структуры алгоритмов — это ограниченный набор стандартных способов соединение блоков (этапов) алгоритма для выполнения последовательностей действий. Структурный подход к разработки алгоритма и программы предполагает использование только нескольких основных структур, комбинация, которых дает все многообразие алгоритмов и программ.
К основным структурам относится:
Линейный алгоритм — набор команд (указание), выполняемых последовательно во времени друг за другом.
Циклический алгоритм — алгоритм, предусматривающий многократное повторение одного и того же действия (одних и тех же действий) над новыми исходными данными Ветвление — применяется в тех случаях, когда в зависимости от условий нужно выполнить либо одно, либо другой действие. Действие 1 или действие 2 может в свою очередь содержать несколько этапов.
Раздел 2. Данные и операторы языка программирования.
Тема 2.1. Концепция данных
В математике принято классифицировать переменные в соответствии с некоторыми важными характеристиками. Производится строгое разграничение между вещественными, комплексными и логическими переменными, между переменными, представляющими отдельные значения и множество значений и так далее. При обработке данных на ЭВМ такая классификация еще более важна. В любом алгоритмическом языке каждая константа, переменная, выражение или функция бывают определенного типа. В языке ПАСКАЛЬ существует правило: тип явно задается в описании переменной или функции, которое предшествует их использованию. Концепция типа языка ПАСКАЛЬ имеет следующие основные свойства: -любой тип данных определяет множество значений, к которому принадлежит константа, которые может принимать переменная или выражение, или вырабатывать операция или функция; -тип значения, задаваемого константой, переменной или выражением, можно определить по их виду или описанию; -каждая операция или функция требует аргументов фиксированного типа и выдает результат фиксированного типа. Отсюда следует, что транслятор может использовать информацию о типах для проверки вычислимости и правильности различных конструкций. Тип определяет: -возможные значения переменных, констант, функций, выражений, принадлежащих к данному типу; -внутреннюю форму представления данных в ЭВМ; -операции и функции, которые могут выполняться над величинами, принадлежащими к данному типу. Обязательное описание типа приводит к избыточности в тексте программ, но такая избыточность является важным вспомогательным средством разработки программ и рассматривается как необходимое свойство современных алгоритмических языков высокого уровня. В языке ПАСКАЛЬ существуют скалярные и структурированные типы данных. К скалярным типам относятся стандартные типы и типы, определяемые пользователем. Стандартные типы включают целые, действительные, символьный, логические и адресный типы. Типы, определяемые пользователем, - перечисляемый и интервальный. Структурированные типы имеют четыре разновидности: массивы, множества, записи и файлы. Кроме перечисленных, TURBO PASCAL включает еще два типа - процедурный и объектный. Из группы скалярных типов можно выделить порядковые типы, которые характеризуются следующими свойствами: -все возможные значения порядкового типа представляют собой ограниченное упорядоченное множество; -к любому порядковому типу может быть применена стандартная функция Ord, которая в качестве результата возвращает порядковый номер конкретного значения в данном типе; -к любому порядковому типу могут быть применены стандартные функции Pred и Succ, которые возвращают предыдущее и последующее значения соответственно; -к любому порядковому типу могут быть применены стандартные функции Low и High, которые возвращают наименьшее и наибольшее значения величин данного типа. В языке ПАСКАЛЬ введены понятия эквивалентности и совместимости типов. Два типа Т1 и Т2 являются эквивалентными (идентичными), если выполняется одно из двух условий: -Т1 и Т2 представляют собой одно и то же имя типа; -тип Т2 описан с использованием типа Т1 с помощью равенства или последовательности равенств. Например:
type
T1 = Integer;
T2 = T1;
T3 = T2;
Менее строгие ограничения определены совместимостью типов. Например, типы являются совместимыми, если: -они эквивалентны; -являются оба либо целыми, либо действительными; -один тип - интервальный, другой - его базовый; -оба интервальные с общим базовым; один тип - строковый, другой - символьный. В ТУРБО ПАСКАЛЬ ограничения на совместимость типов можно обойти с помощью приведения типов. Приведение типов позволяет рассматривать одну и ту же величину в памяти ЭВМ как принадлежащую разным типам. Для этого используется конструкция
Имя Типа(переменная или значение).
Например,
Integer('Z')
представляет собой значение кода символа 'Z' в двухбайтном представлении целого числа, а Byte(534)
даст значение 22, поскольку целое число 534 имеет тип Word и занимает два байта, а тип Byte занимает один байт, и в процессе приведения старший байт будет отброшен.
Тема 2.2. Классификация операторов.
Простые операторы языка Паскаль.
Предложение на языке Паскаль, позволяющее выполнить различные действия с использованием переменных, констант и чисел, входящие в программу, называется оператором, а на алгоритмическом языке — командой. К простым операторам языка Паскаль относятся операторы присваивания, безусловного перехода, операторы ввода и вывода, пустой оператор и оператор вызова процедур. К составным операторам относятся: оператор условного перехода, оператор цикла, оператор выбора и др.
Составной оператор
Этот оператор, строго говоря, оператором не является. Дело в том, что также как арифметические действия иногда бывает необходимо заключать в скобки, последовательности команд (операторов) тоже иногда требуют объединения. Это позволяют сделать так называемые операторные скобки. Формат (общий вид) составного оператора таков:
Begin
<Оператор 1>;
<Оператор 2>;
......
<Оператор N>
End;
Возможно, такая структура напоминает вам основную структуру программы. Действительно, отличие только в том, что после End в конце составного оператора ставится точка с запятой, а в конце программы - точка. По своей сути вся программа представляет собой большой составной оператор.
Обратите внимание на то, что точка с запятой перед End может не ставиться.
Составной оператор предоставляет возможность выполнить произвольное количество команд там, где подразумевается использование только одного оператора. Как вы узнаете потом, такая необходимость встречается довольно часто.
Приведём простейший пример программы, единственная цель которой — вывести на экран какое-нибудь приветствие:
program Hello;
begin
writeln('Hello, world!');
readln;
end.
Первая строка ничего не делает, она просто содержит название программы. Затем, после слова begin начинаются собственно действия. В нашей программе их два: первое — это вывод строчки «Hello, world» на экран, а второе — ожидание нажатия клавиши «Enter», оно нужно для того, чтобы можно было увидеть результат программы, а затем уже нажать «Enter» и вернуться в Турбо-Паскаль. И, наконец, слово end с точкой в последней строке говорит о том, что программа закончилась. Действия, из которых состоит программа, называются операторами, они отделяются друг от друга точкой с запятой.
А теперь приведём пример, в котором программа уже не «глухая», то есть может запрашивать какие-либо данные у пользователя. Пусть требуется спросить у пользователя два числа, после этого вывести на экран их произведение:
program AxB;
var a,b: integer;
begin
writeln('Введите a и b');
readln(a,b);
writeln('Произведение равно ',a*b);
readln;
end;
В этой программе перед словом begin появляется новая строчка, начинающаяся словом var. В ней мы указываем, что программе понадобится две переменные (a и b), в которых можно хранить целые числа (слово integer).
О том, что делает первый оператор, нам известно: он выводит на экран строчку 'Введите a и b'. При выполнении второго оператора программа будет ждать, пока пользователь не введет число с клавиатуры и не нажмёт «Enter»; это число программа запишет в переменную a, затем то же самое делается для переменной b. Третьим оператором выводим на экран сначала надпись «Произведение равно », а потом значение выражения a×b («*» — знак умножения). Четвёртый оператор пояснений не требует.
А теперь рассмотрим структуру программы в общем виде. Любая программа на Турбо-Паскале состоит из трех блоков: блока объявлений, блока описания процедур и функций и блока основной программы. Ниже эти блоки расписаны более подробно.
Блок объявлений:
program … (название программы)
uses … (используемые программой внешние модули)
const … (объявления констант)
type … (объявления типов)
var … (объявления переменных)
Блок описания процедур и функций:
procedure (function)
begin
…
end;
…
Блок основной программы:
begin
… (операторы основной программы) …
end;
Рассмотрим наиболее важные части вышеописанных блоков. Под заголовком программы понимается имя, помогающее определить её назначение. Имя, или идентификатор, строится по следующим правилам: оно может начинаться с большой или малой буквы латинского алфавита или знака «_», далее могут следовать буквы, цифры или знак «_»; внутри идентификатора не может стоять пробел. После имени программы следует поставить «;», этот знак служит в Паскале для разделения последовательных инструкций. Заметим, что имя программы может не совпадать с именем соответствующего файла на диске.
После слова const помещаются описания постоянных, которые будут использованы в программе, например:
const Zero = 0;
pi = 3.1415926;
my_const = -1.5;
Hello = 'Привет !';
За словом var следуют объявления переменных, которые понадобятся нам при написании программы. Переменные Паскаля могут хранить данные различной природы: числа, строки текста, отдельные символы и т. п. Ниже приводится часть типов переменных, которые можно применять.
Объявления переменных записываются в следующей форме: var <переменная> : <тип>;
Если описываются несколько переменных одного типа, то достаточно записать их имена через запятую, а после двоеточия поставить общий тип.
Примеры объявления:
var Number: integer;
d,l: real;
Name: string[20];
Line: string;
Key1,Key2: char;
Идентификаторы используются для определения переменных, констант, типов данных, вводимых пользователем, функций, процедур, модулей, программ и полей в записях. Идентификатор может иметь любую длину, однако только первые его 63 символа являются значимыми. Идентификатор должен начинаться с буквы и не может содержать пробелов. После первого символа идентификатора можно использовать буквы, цифры и символы подчеркивания.
Тема 2.3 Простые типы данных и их обработка
К простым типам относятся порядковые и вещественные типы. Порядковые типы отличаются тем, что каждый из них имеет конечное число возможных значений. Эти значения можно определенным образом упорядочить (отсюда -название типов) и, следовательно, с каждым из них можно сопоставить некоторое целое число - порядковый номер значения.
Вещественные типы, строго говоря, тоже имеют конечное число значений, которое определяется форматом внутреннего представления вещественного числа. Однако количество возможных значений вещественных типов настолько велико, что сопоставить с каждым из них целое число (его номер) не представляется возможным.
Порядковые типы.
К порядковым типам относятся (см. рис.4.1) целые, логический, символьный, перечисляемый и тип-диапазон. К любому из них применима функция ORD(X), которая возвращает порядковый номер значения выражения X. Для целых типов функция ORD(X) возвращает само значение X, т.е. ORD(X) = X для X, принадлежащего любому шелому типу. Применение ORD(X) к логическому, символьному и перечисляемому типам дает положительное целое число в диапазоне от 0 до 1 (логический тип), от 0 до 155 (символьный), от 0 до 65535 (перечисляемый). Тип-диапазон сохраняет все свойства базового порядкового типа, поэтому результат применения к нему функции ORD(X) зависит от свойств этого типа.
К порядковым типам можно также применять функции:
PRED (X) - возвращает предыдущее значение порядкового типа (значение, которое соответствует порядковому номеру ORD(X)- 1), т.е.
ORD(PRED(X)) = ORD(X) - 1;
SUCC (X) - возвращает следующее значение порядкового типа, которое соответствует порядковому номеру ORD(X) +1, т.е.
ORD(SUCC(X)) = ORD(X) + 1.
Например, если в программе определена переменная
var
с : Char;
begin
с := '5' ;
end.
то функция PRED(C) вернет значение '4', а функция SUCC(C) - значение '6'.
Если представить себе любой порядковый тип как упорядоченное множество значий, возрастающих слева направо и занимающих на числовой оси некоторый отрезок, то функция PRED(X) не определена для левого, a SUCC(X) - для правого конца этого отрезка.
Целые типы. Диапазон возможных значений целых типов зависит от их внутреннего представления, которое может занимать один, два или четыре байта. В табл. 4.1 приводится название целых типов, длина их внутреннего представления в байтах и диапазон возможных значений.
При использовании процедур и функций с целочисленными параметрами следует руководствоваться «вложенностью» типов, т.е. везде, где может использоваться WORD, допускается использование BYTE (но не наоборот), в LONGINT «входит» INTEGER, который, в свою очередь, включает в себя SHORTINT.
Перечень процедур и функций, применимых к целочисленным типам, приведен в табл.4.2. Буквами b, s, w, i, l обозначены выражения соответственно типа BYTE, SHORTINT, WORD, INTEGER и LONGINT, x - выражение любого из этих типов; буквы vb, vs, vw, vi, vl, vx обозначают переменные соответствующих типов. В квадратных скобках указывается необязательный параметр.
При действиях с целыми числами тип результата будет соответствовать типу операндов, а если операнды относятся к различным целым типам, - типу того операнда, который имеет максимальную мощность (максимальный диапазон значений). Возможное переполнение результата никак не контролируется, что может привести к недоразумениям, например:
var
а : Integer;
х, у : Real;
begin
а := 32767; {Максимально возможное значение типа INTEGER}
х := а + 2; {Переполнение при вычислении этого выражения!}
у := LongInt(а)+2; {Переполнения нет после приведения переменной к более мощному типу}
WriteLn(x:10:0, у:10:0)
end.
В результате прогона программы получим
-32767 32769
Логический тип. Значениями логического типа может быть одна из предварительно объявленных констант FALSE (ложь) или TRUE (истина). Для них справедливы правила:
ord(False) = 0;
ord(True) = 1;
False < True;
succ(False)= True;
pred(True) = False.
Поскольку логический тип относится к порядковым типам, его можно использовать в операторе счетного типа, например:
var
1 : Boolean;
begin
for 1 := False to True do ....
Символьный тип. Значением символьного типа является множество всех символов ПК. Каждому символу приписывается целое число в диапазоне 0…255. Это число служит кодом внутреннего представления символа, его возвращает функция ORD.
Для кодировки используется код ASCII (American Standard Code for Information Interchange - американский стандартный код для обмена информацией). Это 7-битный код, т.е. с его помощью можно закодировать лишь 128 символов в диапазоне от 0 до 127. В то же время в 8-битном байте, отведенном для хранения символа в Турбо Паскале, можно закодировать в два раза больше символов в диапазоне от 0 до 255. Первая половина символов ПК с кодами 0…127 соответствует стандарту ASCII (табл. 4.3). Вторая половина символов с кодами 128…255 не ограничена жесткими рамками стандарта и может меняться на ПК разных типов (в прил.2 приведены некоторые распространенные варианты кодировки этих символов).
Символы с кодами 0…31 относятся к служебным кодам. Если эти коды используются в символьном тексте программы, они считаются пробелами. При использовании их в операциях ввода-вывода они могут иметь следующее самостоятельное значение:
К типу CHAR применимы операции отношения, а также встроенные функции: СНR(В) - функция типа CHAR; преобразует выражение В типа BYTE в символ и возвращает его своим значением;
UPCASE(CH) - функция типа CHAR; возвращает прописную букву, если СН -строчная латинская буква, в противном случае возвращает сам символ СН, например:
var
cl,c2: Char;
begin
cl := UpCase('s') ;
c2 := UpCase ('Ф') ;
WriteLn(cl,' ',c2)
end.
Так как функция UPCASE не обрабатывает кириллицу, в результате прогона этой
программы на экран будет выдано S.
Перечисляемый тип. Перечисляемый тип задается перечислением тех значений, которые он может получать. Каждое значение именуется некоторым идентификатором и располагается в списке, обрамленном круглыми скобками, например:
typе
colors =(red, white, blue);
Применение перечисляемых типов делает программы нагляднее. Если, например, в программе используются данные, связанные с месяцами года, то такой фрагмент программы:
type
ТипМесяц=(янв,фев,мар,апр,май,июн,июл,авг,сен,окт,ноя,дек);
var
месяц : ТипМесяц;
begin
if месяц = авг then WriteLn('Хорошо бы поехать к морю!');
end.
был бы, согласитесь, очень наглядным. Увы! В Турбо Паскале нельзя использовать кириллицу в идентификаторах, поэтому мы вынуждены писать так:
type
TypeMonth=(jan,feb,mar,may,jun,jul,aug,sep,oct,nov,dec);
var
month: TypeMonth;
begin
.......
if month = aug then WriteLn('Хорошо бы поехать к морю!');
.......
end.
Соответствие между значениями перечисляемого типа и порядковыми номерами этих значений устанавливается порядком перечисления: первое значение в списке получает порядковый номер 0, второе - 1 и т.д. Максимальная мощность перечисляемого типа составляет 65536 значений, поэтому фактически перечисляемый тип задает некоторое подмножество целого типа WORD и может рассматриваться как компактное объявление сразу группы целочисленных констант со значениями О, 1 и т.д.
Использование перечисляемых типов повышает надежность программ благодаря возможности контроля тех значений, которые получают соответствующие переменные. Пусть, например, заданы такие перечисляемые типы:
type
colors = (black, red, white);
ordenal= (one, two, three);
days = (monday, tuesday, Wednesday);
С точки зрения мощности и внутреннего представления все три типа эквивалентны:
ord(black)=0, …, ord(white)=2,
ord(one)=0, …ord(three)=2,
ord(monday)=0, …ord(Wednesday)=2.
Однако, если определены переменные
var
col :colors; num :ordenal;
day : days;
то допустимы операторы
col := black;
num := succ(two);
day := pred(tuesday);
но недопустимы
col := one;
day := black;
Как уже упоминалось, между значениями перечисляемого типа и множеством целых чисел существует однозначное соответствие, задаваемое функцией ORD(X). В Турбо Паскале допускается и обратное преобразование: любое выражение типа WORD можно преобразовать в значение перечисляемого типа, если только значение целочисленного выражения не превышает мощное1™ перечисляемого типа. Такое преобразование достигается применением автоматически объявляемой функции с именем перечисляемого типа (см. п. 4.4). Например, для рассмотренного выше объявления типов эквивалентны следующие присваивания:
col := one;
col := colors(0);
Разумеется, присваивание
col := 0;
будет недопустимым.
Переменные любого перечисляемого типа можно объявлять без предварительного описания этого типа, например:
var
col: (black, white, green);
Тип-диапазон. Тип-диапазон есть подмножество своего базового типа, в качестве которого может выступать любой порядковый тип, кроме типа-диапазона. Тип-диапазон задается границами своих значений внутри базового типа:
<мин.знач.>..<макс.знач.>
Здесь <мин.знач. > - минимальное значение типа-диапазона;
<макс.знач.> - максимальное его значение.
Например:
type
digit = '0'..'9';
dig2= 48..57;
Тип-диапазон необязательно описывать в разделе TYPE, а можно указывать непосредственно при объявлении переменной, например:
var
date : 1..31;
month: 1. .12;
Ichr : 'A'..'Z';.
При определении типа-диапазона нужно руководствоваться следующими правилами:
два символа «..» рассматриваются как один символ, поэтому между ними недопустимы пробелы;
левая граница диапазона не должна превышать его правую границу. Тип-диапазон наследует все свойства своего базового типа, но с ограничениями, связанными с его меньшей мощностью. В частности, если определена переменная
type
days = (mo,tu,we,th,fr,sa,su);
WeekEnd = sa .. su;
var
w : WeekEnd;
begin
.....
w := sa;
.....
end;
ORD(W) вернет значение 5 , в то время как PRED(W) приведет к ошибке.
В стандартную библиотеку Турбо Паскаля включены две функции, поддерживающие работу с типами-диапазонами:
НIGН(Х) - возвращает максимальное значение типа-диапазона, к которому принадлежит переменная X;
LOW(X) -возвращает минимальное значение типа-диапазона.
Следующая короткая программа выведет на экран строку
-32768…32767
var
k: Integer;
begin
WriteLn(Low(k),'..',High(k))
end.
Тема 2.4 Оператор присваивания . Ввод — вывод данных.
Оператор присваивания заменяет текущее значение переменной новым значением, которое определяется выражением, или определяет выражение, значение которого должно возвращаться функцией. Выражение должно быть совместимо по присваиванию с типом переменной или типом значения, возвращаемого функцией в качестве результата (см. раздел "Совместимость типов" в Главе 4).
Приведем некоторые примеры операторов присваивания:
X := Y + Z
Done := (I >= 1) and (I < 100);
Huel := [blue, Succ(C)];
I := Sqr(J) - I * K;
Присваивания объектного типа.
Правила совместимости по присваиванию объектных типов позволяют присваивать экземпляру объекта экземпляр любого из его дочерних типов. Такое присваивание представляет собой проекцию потомка на пространство его предка. В примере исходного кода в
Главе 4 с учетом экземпляра F типа TField и экземпляра Z типа TZipField присваивание F := Z копирует только поля X, Y, Len и
Name.
Присваивание экземпляру объектного типа не инициализирует экземпляр. Например, в предыдущем примере присваивание F := Z означает, что вызов конструктора для F можно опустить.
Файловый ввод-вывод
Файловая переменная в Паскале - это любая переменная файлового типа. В Паскале имеются три класса файлов: типизированный файл, текстовый файл и нетипизированный файл.
Примечание: Синтаксис записи типов файлов представлен в Главе 4, в разделе "Структурные типы".
Перед использованием файловой переменной она должна быть связана с внешним файлом с помощью вызова процедуры Assign. Внешним файлом обычно является поименованный файл на диске, но он также может представлять собой устройство, например, клавиатуру или дисплей. Во внешних файлах сохраняется записанная в файл информация, или они служат источниками информации, которая считывается из файла.
Когда связь с внешним файлом установлена, для подготовки ее к операции ввода или вывода файловая переменная должна быть "открыта". Существующий файл можно открыть с помощью процедуры Reset, а новый файл можно создать и открыть с помощью процедуры Rewrite.
Текстовые файлы, открытые с помощью процедуры Reset доступны только по чтению, а текстовые файлы, открытые с помощью процедуры Rewrite, доступны только по записи. Типизированные и нетипизированные файлы всегда допускают как чтение, так и запись, независимо от того были они открыты с помощью процедуры Reset или с помощью процедуры Rewrite.
Любой файл, представляет собой линейную последовательность элементов, каждый из которых имеет тип элемента (или тип записи) файла. Каждый элемент файла имеет номер. Первый элемент файла считается нулевым элементом.
Обычно доступ к файлам организуется последовательно, то есть, когда элемент считывается с помощью стандартной процедуры
Read или записывается с помощью стандартной процедуры Write, текущая позиция файла перемещается к следующему по порядку элементу файла. Однако к типизированным и нетипизированным файлам можно организовать прямой доступ с помощью стандартной процедуры Sееk, которая перемещает текущую позицию файла к заданному элементу.
Для определения текущей позиции в файле и текущего размера файла можно использовать стандартные функции FilePоs и Filesize.
Когда программа завершает обработку файла, он должен закрываться с помощью стандартной процедуры Close. После полного закрытия файла связанный с ним внешний файл обновляется. Затем файловая переменная может быть связана с другим внешним файлом.
По умолчанию при всех обращениях к стандартным функциям и процедурам ввода-вывода автоматически производится проверка на наличие ошибок. При обнаружении ошибки программа прекращает работу и выводит на экран сообщение об ошибке. С помощью директив компилятора {$I+} и {$I-} эту автоматическую проверку можно включить или выключить. Когда автоматическая проверка отключена, то есть когда процедура или функция была скомпилирована с директивой {$I-}, ошибки ввода-вывода, возникающие при работе программы, не приводят к ее останову. При этом, чтобы проверить результат выполнения операции ввода-вывода, нужно использовать стандартную функцию IОResult.
Для очистки ошибки, которая может произойти, вы можете вызвать функцию IOResult. Если вы этого не сделаете, и текущим состоянием является {$I+}, то из-за оставшейся ошибки IOResult следующая операция ввода-вывода завершится с ошибкой. Примечание: Если вы пишете программу дл Windows и не хотите, чтобы Windows обрабатывала за вас ошибки ввода-вывода на диск или другие ошибки ввода-вывода, вызовите SetErrorMode(1).
Тема 2.5 Условный оператор и оператор выбора
Условные операторы позволяют выбрать для выполнения один из составных операторов (или не выбрать ни одного).
Оператор условия (if) Синтаксис оператора if можно представить следующим образом:
В выражении должен получаться результат, имеющий стандартный булевский тип. Если результатом выражения является истинное значение (True), то выполняется оператор, следующий за ключевым словом then.
Если результатом выражения является значение False и присутствует ключевое слово else, то выполнятся оператор, следующий за ключевым словом else. Если ключевое слово else отсутствует, то никакой оператор не выполняется.
Синтаксическая неоднозначность, возникающая в конструкции:
if e1 then e2 else e3
разрешается путем следующей интерпретации этой конструкции:
if e1 then
begin
if e2 then s1
else
s2
end
Примечание: В предшествующем операторе else двоеточие не указывается.
В общем случае ключевое слово else связывается с ближайшим ключевым словом if, которое еще не связано с ключевым словом else.
Приведем два примера оператора if:
if X < 1.5 then
Z := X+Y
else
Z := 1.5;
if P1 <> nil then
P1 := P1^.father;