Язык программирования Паскаль

Материал из ПИЭ.Wiki

Перейти к: навигация, поиск
Язык программирования Pascal
Год создания: 1974
Автор(ы): Никлаус Вирт (Niklaus Wirth)

Содержание

История создания

Основные концепции языка были разработаны в 1967-1968 г. профессором Николаусом Виртом (Niklaus Wirth) и опубликованы в 1971 году (The Programming Language Pascal Acta Informatica, 1 (Jun 1971), 35-63). Стандарт языка был разработан им в 1974 г. (PASCAL — User Manual and Report, ISO Pascal Standard Kathleen Jensen and Niklaus Wirth) совместно с Кетлин Йенсен (Kathleen Jensen). Паскаль достаточно быстро превратился из средства, предназначенного для обучения студентов программированию, в инструмент, который стали использовать для создания больших программных проектов. Заметим, что ни один из последующих языков, разработанных автором (а Вирт является создателем Модулы и Оберона), не получил такого распространения. Трудно сказать, с чем это связано. Возможно, с тем, что язык удачно сочетает простоту с выразительностью и силой. Возможно, что просто он оказался в нужный момент на нужном месте, поскольку на момент создания языка, получившего свое имя в честь великого французского математика, в распоряжении программистов было весьма и весьма немного языков высокого уровня. И что самое главное, все они были разработаны для решения конкретных прикладных задач и во многом являлись продуктом «творческого акта», а не результатом серьезного научного труда. Фортран, названный одним из пионеров программирования Дейкстрой (Edsger Dijkstra) инфантильным дезорганизатором, предназначался только для математических расчетов и не выдерживал никакой критики с точки зрения ограничения доступа к данным и отсутствия поддержки структурного программирования. Об интерпретаторе Бейсик (тогда еще без приставки Visual) нельзя было говорить без слез. Кобол был ориентирован на решение экономических задач, a PL/1 — чрезмерно сложен и принадлежал скорее к области проблем, чем к области решений. И вот тут появляется язык, на порядок отличающийся от них своим качеством. Основное, что привлекало к нему, — логичность, поддержка концепций структурного и процедурного программирования, работа с динамической памятью, возможность создания своих типов данных. Все это стало теперь настолько привычным, что трудно представить, как можно программировать без использования этих жизненно необходимых возможностей.

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

Еще одной причиной, которая позволила языку перейти в категорию бестселлеров, стала поддержка разработчиков коммерческого ПО. И тут мы не можем пройти мимо фирмы Borland (ныне Inprise). Разработанный ею Turbo Pascal во всех его модификациях является в России одним из самых популярных продуктов. Интегрированная оболочка, которая включает в себя редактор, компилятор, компоновщик и отладчик, вместе с интерактивной справочной системой сделали разработку программ на Паскале делом простым и понятным практически любому человеку.

Кроме создания интегрированной оболочки, Borland ввел в Pascal поддержку модульного программирования, а начиная с версии 5, и поддержку объектно-ориентированного программирования.

Стандарты языка Паскаль

В настоящее время действуют три стандарта языка. Первый из них — нерасширенный Паскаль (unextended Pascal) был разработан в 1983 году (Смотрите стандарты ANSI/IEEE 770Х3 97-1993 и ISO 7185:1983. Стандарты ISO доступны по адресу http://www.iso.ch) и практически полностью совпадает с описанием языка в нотации Йенсен-Вирта. Второй — Extended Pascal — содержит расширения, касающиеся модульного программирования (раздельная компиляция модулей, импорт-экспорт подпрограмм, интерфейсная часть и реализация), и дополнен рядом процедур и функций (прямой доступ к файлам, работа со строками и т д.) (Смотрите стандарты ANSI/IEEE 770Х3.160-1989 и ISO/IEC 10206:1991). Последний — объектный Паскаль (Object-Oriented Extensions to Pascal), в отличие от первых двух, формально не утвержден, но оформлен в виде отчета (ANSI Technical Report) в 1993 г. (Смотрите ANSI/X3-TR-13-1994) Объектный Паскаль поддерживает классы, обладающие свойствами и методами, наследование классов, переопределение методов у потомков (полиморфизм) и ряд других атрибутов объектно-ориентированного программирования.

Основные элементы языка Паскаль

Типы данных. Ввод-Вывод

Операторы

Процедуры и функции

Структурированные типы данных. Строки

Множества и записи

Файлы

                        Работа с файлами в Pascal    

Введение файлового типа в язык ПАСКАЛЬ вызвано необходимостью обеспечить возможность работы с периферийными (внешними) устройствами ЭВМ, предназначенными для ввода, вывода и хранения данных. Файловый тип данных или файл определяет упорядоченную совокупность произвольного числа однотипных компонент. Общее свойство массива, множества и записи заключается в том, что количество их компонент определено на этапе написания программы, тогда как количество компонент файла в тексте программы не определяется и может быть произвольным. Понятие файла достаточно широко. Это может быть обычный файл на диске, коммуникационный порт ЭВМ, устройство печати, клавиатура или другие устройства.

Задание файловой переменной

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

        <имя> = FILE OF <тип> 

<имя> - имя файлового типа (правильный идентификатор); FILE OF - зарезервированные слова; <тип> - любой тип Turbo Pascal кроме файлов. В зависимости от способа объявления можно выделить три вида файлов: типизированные файлы (задаются предложением FILE OF); текстовые файлы (определяются типом TEXT); нетипизированные файлы (определяются типом FILE).


Доступ к файлам

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

ASSIGN (<ф. п.>, <имя файла или л. у.>);

Здесь <ф. п.> - файловая переменная; <имя файла или л. у.> - текстовое выражение, содержащее имя файла или логическое устройство. Если имя файла задается в виде пустой строки, например, ASSIGN(f, ), то в зависимости от направления обмена данными файловая переменная связывается со стандартным файлом INPUT или OUTPUT.

Имена файлов

Имя может содержать до 8 символов, расширение - до трех. Могут использоваться следующие символы:

        &nbspA - z 0 - 9 ( ) { } @ # $ 1 0% ^ & ! - _ / ' ~ 

Полное имя файла в MS DOS содержит весь путь по дереву от корневой директории к нужному файлу. Например, C:\ST\LAB\work.pas, где C - имя диска, ST - имя директории на диске, LAB - имя поддиректории директории ST, work.pas - имя программы на Паскале.

Инициализация файла

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

Инициализация файла для чтения:

RESET (ф. п.);

Здесь RESET - стандартная процедура Паскаля <ф. п.> - файловая переменная, связанная ранее процедурой ASSIGN с уже существующим файлом или логическим устройством - приемником информации.

Инициализация файла для записи:

REWRITE (ф. п.);

Здесь REWRITE - стандартная процедура Паскаля

                                        Текстовые файлы   
   Особое место в языке ПАСКАЛЬ занимают текстовые файлы, компоненты которых имеют символьный тип.
   Для описания текстовых файлов в языке определен стандартный тип Тext: 
  var TF1, TF2: Text;
   Текстовые файлы представляют собой последовательность строк, а строки - последовательность символов. Строки имеют переменную длину, каждая строка завершается признаком конца строки. 
   С признаком конца строки связана следующая функция: 
 &nbspEOLn(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 без параметров.

  &nbspTURBO PASCAL вводит дополнительные процедуры и функции, применимые только к текстовым файлам, это SetTextBuf, Append, Flush, SeekEOLn, SeekEOF. 

Процедура SetTextBuf( var f: Text; var Buf; BufSize: 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 до конца файла остались строки, заполненные пробелами.

                                      Типизированные файлы     
   Типизированный ( или компонентный) файл - это файл с объявленным типом его компонент.
   Компонентные файлы состоят из машинных представлений значений переменных они хранят данные в том же виде, что и память ЭВМ.
   Описание величин файлового типа имеет вид: 
              &nbsptype 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;


   Компонентами файла могут быть все скалярные типы, а из структурированных - массивы, множества, записи. Практически во всех конкретных реализациях языка ПАСКАЛЬ конструкция "файл файлов" недопустима. 
   Все операции над компонентными файлами производятся с помощью стандартных процедур: 
              &nbspReset, Rewrite, Read, Write, Close. 

Для ввода - вывода используются процедуры:

              &nbspRead(f,X); 
              &nbspWrite(f,X); 

где f - имя логического файла, Х - либо переменная, либо массив, либо строка, либо множество, либо запись с таким же описанием, какое имеет компонента файла.

   Выполнение процедуры Read(f,X) состоит в чтении с внешнего устройства одной компоненты файла и запись ее в X. Повторное применение процедуры Read(f,X) обеспечит чтение следующей компоненты файла и за пись ее в X. 
   Выполнение процедуры Write(f,X) состоит в записи X на внешнее устройство как одной компоненты. Повторное применение этой процедуры обеспечит запись X как следующей компоненты файла. 
   Для работы с компонентными файлами введена расширенная форма операторов ввода и вывода: 
              &nbspRead(f,X1,X2,...XK) 
              &nbspWrite(f,X1,X2,...XK) 
   Здесь f - компонентный файл, а переменные Х1, Х2,...ХК должны иметь тот-же тип, что и объявленный тип компонент файла f.
                                       Нетипизированные файлы        
   Нетипизированные (или бестиповые) файлы позволяют записывать на диск произвольные участки пвмяти ЭВМ и считывать их с диска в память. Операции обмена с бестиповыми файлами осуществляется с помощью процедур BloсkRead и BlockWrite. Кроме того, вводится расширенная форма процедур Reset и Rewrite. В остальном принципы работы остаются такими же, как и с компонентными файлами. 
   Перед использованием логический файл 
              &nbspvar f: File; 

должен быть связан с физическим с помощью процедуры Assign. Далее файл должен быть открыт для чтения или для записи процедурой Reset или Rewrite, а после окончания работы закрыт процедурой Close.

   При открытии файла длина буфера устанавливается по умолчанию в 128 байт. TURBO PASCAL позволяет изменить размер буфера ввода - вывода, для чего следует открывать файл расширенной записью процедур: 
              &nbspReset(var f: File; BufSize: Word) 

или

              &nbspRewrite(var f: File; BufSize: Word) 
   Параметр BufSize задает число байтов, считываемых из файла или записываемых в него за одно обращение.

Минимальное значение BufSize - 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.
                         Файловые процедуры и функции  

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

Процедура CLOSE Закрывает файл, однако связь файловой переменной с именем файла, установленная ранее процедурой ASSIGN, сохраняется. Формат обращения:

CLOSE (<ф. п.>) При создании нового или расширении старого файла процедура обеспечивает сохранение в файле всех новых записей и регистрацию файла в каталоге.

Процедура RENAME Переименовывает файл. Формат обращения:

RENAME (<ф. п.>, <новое_имя>) Здесь <новое_имя> - строковое выражение, содержащее новое имя файла. Перед выполнением процедуры необходимо закрыть файл, если он ранее был открыт процедурами RESET, REWRITE или APPEND.

Процедура ERASE Уничтожает файл. Формат обращения:

ERASE (<ф. п.>) Перед выполнением процедуры необходимо закрыть файл, если он ранее был открыт процедурами RESET, REWRITE или APPEND.

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

FLUSH (<ф. п.>) В ходе выполнения процедуры FLUSH все новые записи будут действительно записаны на диск. Процедура игнорируется, если файл был инициирован для чтения процедурой RESET.

Функция EOF (<ф. п.>) : boolean Логическая функция, тестирующая конец файла. Возвращае TRUE, если файловый указатель стоит в конце файла. При записи это означает, что очередной компонент будет добавлен в конец файла, при чтении - что файл исчерпан.

Процедура CHDIR Изменение текущего каталога. Формат обращения:

CHDIR (<путь>) Здесь <путь> - строковое выражение, содержащее путь к устанавливаемому по умолчанию каталогу.

Процедура GETDIR Позволяет определить имя текущего каталога (каталога по умолчанию). Формат обращения:

GETDIR (<устройство>, <каталог>) Здесь <устройство> - выражение типа WORD, содержащее номер устройства: 0 - устройство по умолчанию, 1 - диск А, 2 - диск В и т.д.

Процедура MKDIR Создает новый каталог на указанном диске.Формат обращения:

MKDIR(<каталог>) Здесь <каталог> - выражение типа STRING, задающее путь к каталогу. Последним именем в пути, т. е. именем вновь создаваемого не может быть имя уже существующего каталога.

Процедура RMDIR Удаляет каталог.Формат обращения:

RMDIR(<каталог>) Удаляемый каталог должен быть пустым, т. е. не содержать файлов или имен каталогов нижнего уровня.

Функция IORESULT : word Возвращает условный признак последней операции ввода-вывода. Если операция завершилась успешно, функция возвращает ноль. В противном случае - код ошибочной операции.

ФункцияFSEARCH: PATHSTR Ищет файл в списке каталогов. Формат вызова:

FSEARCH(<имя> < список каталогов>) Здесь <имя> - имя отсыкиваемого файла (строковое выражение или переменная типа PATHSTR; имени может предшествовать путь); <список каталогов> - список каталогов, в которых отыскивается файл (строковое выражение или переменная типа STRING); имена каталогов разделяются точкой с запятой.

Динамические структуры данных

Просмотры
Инструменты

Besucherzahler russian mail order brides
счетчик посещений
Rambler's Top100
Лингафонные кабинеты  Интерактивные доски  Интерактивная приставка Mimio Teach