Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Основы программирования на языке Pascal (Теоретическая часть. Изучение возможностей записей в языке Паскаль))

Содержание:

Введение

Язык программирования ПАСКАЛЬ (PASCAL) является одним из наиболее популярных и активно используемых языков программирования в мире. Поэтому изучение его представляется весьма актуальным.

Язык программирования ПАСКАЛЬ получил свое название не от сокращения каких-то слов, как другие языки: он назван так в честь великого французского математика и физика Блеза Паскаля, который в 1642 г. изобрел счетную машину для арифметических операций – паскалево колесо, как назвали её современники. История создания языка начинается с 1965г., когда Международная федерация по обработке информации (IFIP) предложила нескольким специалистам в области информатики принять участие в разработке нового языка программирования – преемника АЛГОЛа-60. Среди них был швейцарский ученый, работавший в то время доцентом на факультете информатики Стэнфордского университета Никалаус Вирт, который принял участие в разработке проекта языка под названием
АЛГОЛ-W.

И хотя IFIP отклонила этот проект, Никалаус Вирт по возвращению в Швейцарию в 1967 г. не прекратил работу по созданию нового языка. В результате этой работы в конце 1968 г. профессор Вирт и его сотрудники из Швейцарского федерального института технологии (ETH) в Цюрихе разработали первую версию ПАСКАЛЯ, а спустя два года – первый вариант компилятора. В 1971 г. Н. Вирт выпустил описание своего языка. В связи с появившимся интересом у широкого круга пользователей, а также с учетом первых оценок и апробаций 1974 г. разработана новая версия языка ПАСКАЛЬ. В следующем году опубликовано руководство для пользователей ПАСКАЛЯ, которое по словам Н. Вирта, вполне можно рассматривать как
стандартное определение языка.

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

Как и всякий преемник, ПАСКАЛЬ наследовал многие черты основного предшественника и некоторых других. Как и АЛГОЛ-60, он имеет блочную структуру, т. е. программы составляются из блоков, которые начинаются и оканчиваются словами BEGIN и END соответственно. Операторы языка ПАСКАЛЬ, как и в АЛГОЛе-60, разделяются между собой точкой с запятой. Аналогично АЛГОЛу и ФОРТРАНу в языке имеется оператор перехода, а оператор варианта выполняет те же функции, что и переключатель в АЛГОЛе или вычисляемый оператор перехода в ФОРТРАНе. Простые и гибкие операторы цикла WHILE и REPEAT и оператор варианта CASE, отмечает Вирт, обладают переработанной версией оператора цикла FOR (также заимствованным из АЛГОЛа) они позволяют программисту выразить все, что ему нужно путем использования вложенных иерархических структур, представляющих композиции этих операторов.

Одним из достоинств языка ПАСКАЛЬ является то, что он воплотил в себе идею структурного программирования, суть которой заключается в том, что с помощью нескольких конструкций можно выразить в принципе любые алгоритмы. «Структурное программирование нацелено на алгоритмический аспект написания программ», – пишет К. Кристиан.

Другие достоинства языка были предопределены двумя основополагающими статьями профессора Ч. Хоара, опубликованными на рубеже 60-70-х годов: «О структурной организации данных» и «Аксиоматическая основа программирования для вычислительных машин».

Суть первой состоит в том, что «данные прежде всего представляют собой абстракции реальных объектов и их предпочтительно рассматривать как некоторые абстрактные образования со структурами, не обязательно предусмотренными в общераспространенных языках программирования». Язык ПАСКАЛЬ, воплотивший концепции данной статьи, содержат богатый набор различных типов данных и является первым языком, имеющим в этом наборе не числовой тип данных – тип перечисления.

Во второй статье показано, что «программы поддаются точному анализу, основанному на строгих математических рассуждениях». В 1973 г. Хоар и Вирт создали аксиоматическое описание для большей части семантически языка ПАСКАЛЬ. Следуя аксиоматической системе Хоара, язык ПАСКАЛЬ, очевидно, явился первым языком, для которого имеются программные средства, позволяющие доказывать правильность написанных программ.

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

При создании и совершенствовании языка ПАСКАЛЬ Н. Вирт ввел много новшеств, в частности: изобрел синтаксические диаграммы, с помощью которых удобно представлять конструкции языка; ввел, очевидно, первый в алфавит языка квадратные скобки; высказал идею решения проблемы переносимости программ в виде пи-систем (P-system), которая заключается в том, что написанные на ПАСКАЛЕ программы транслируются в пи-код (p-code) – в машинный язык некоторой идеальной машины а затем интерпретируется на реальных машинных языках.

Опыт использования языка ПАСКАЛЬ выявил ряд недостатков. В языке отсутствовали многие известные конструкции, такие, как: динамические массивы; возможность задания локальных переменных; понятие отдельно транслируемого модуля, затруднившие тем самым создание больших программ; операция возведения в степень; возможность включения в программу участков, написанных на машинном языке, и т. д. Одни программисты могли продолжить список недостатков ПАСКАЛЯ, другие возразить, что некоторые недостатки в их реализации отсутствуют. Такой разнобой мнений, как пишет О. Перминов, свидетельствует о том, что долгое время отсутствовал документ, который бы точно фиксировал состав и правила выполнения и правила выполнения языка. Такой документ появился только в 1982 г. – международный стандарт ISO на язык ПАСКАЛЬ. Этот стандарт соответствует авторскому «стандартному определению» язык, изложенному в книге Йенсена и Вирта «ПАСКАЛЬ. Руководство для пользователя и описание языка» [1], но дает более полное и строгое описание некоторых деталей, опущенных в руководстве.

Первый компилятор с языка ПАСКАЛЬ был реализован в ЕТН для ЭВМ семейства CDC-6000. В дальнейшем появились компиляторы ПАСКАЛЯ для других типов ЭВМ, и к начале 80-х годов число этих типов (зарубежных и отечественных) достигло сотни.

Особую популярность на микро-ЭВМ и персональных ЭВМ время получило семейство ПАСКАЛЬ-систем, названное Турбо-ПАСКАЛЬ (Turbo-PASCAL) и разработанное фирмой Borland. Фирма Borland создала несколько версий Турбо-ПАСКАЛЯ, среди последних версия, которая включает пакет стандартной графики, позволяющий работать с различными графическими адаптерами IBM PC, и Турбо-ПАСКАЛЬ версий 5.0 ,6.0 и 7.0, назначением которых является объектно-ориентированное программ-мирование.

Дальнейшее развитие язык получил в системе Delphi. Delphi (Дельфи) — среда программирования, использующая язык Object Pascal, разработанный фирмой Borland и изначально реализованный в её пакете Borland Delphi, от которого и получил в 2003 году своё нынешнее название. По сути является наследником языка Pascal с объектно-ориентированными расширениями.

Одной из удачных конструкций языка Паскаль, которой не было у его предшественников, является запись (record).

ГЛАВА 1.

Теоретическая часть. Изучение возможностей записей в языке Паскаль

1.1 Объединение разнородных элементов (Запись)

Как известно, массивы объединяют однородные единицы информации – элементы одного и того же типа. Но многообразие информации нельзя свести только к какому-то одному типу данных. Например, указывая положение точки в пространстве, мы можем воспользоваться одним и тем же типом для указания ее координат, но, описывая человека, мы должны указать его имя, рост, цвет глаз и волос, то есть в одном описании объединим разнородную информацию. Точно так же, описывая автомобиль, мы укажем не только его марку, но и год выпуска, модификацию, да и цвет кузова может нас заинтересовать. Составляя автоматизированный каталог книгохранилища, мы для каждой книги должны указать ее название, имя автора, область знания, количество страниц, год издания, а также, возможно, признак нахождения на руках или в хранилище.

Данные такого рода, описывающие существенные стороны того или иного объекта путем включения в описание нескольких, часто разнотипных, элементов, называют записью (record). В языке Паскаль запись определяется путем указания служебного слова record и перечисления входящих в запись элементов с указанием типов этих элементов.

Запись Паскаля – структурированный комбинированный тип данных, состоящий из фиксированного числа компонент (полей) разного типа.

На рис. 1 – рис. 4 приводятся синтаксические схемы определения записи из [1].

Рис.1 Синтаксическая диаграмма для типа запись

Рис.2 Синтаксическая диаграмма для списка полей

Рис. 3 Синтаксическая диаграмма для Фиксированной части

Рис. 4 Синтаксическая диаграмма для Секции записи.

Операции над записями Паскаля

Единственная операция, которую можно произвести над однотипными записями Паскаля – это присваивание.

Все другие операции производятся над отдельными полями записи.

Например, телефонный справочник содержит фамилии и номера телефонов, поэтому отдельную строку в таком справочнике удобно представить в виде следующей записи:

type TRec = Record

FIO: String[20];

TEL: String[7]

end;

var rec: Trec;

Описание записей возможно и без использования имени типа, например:

var rec: Record

FIO: String[20];

TEL: String[7]

end;

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

rec.FIO, rec.TEL

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

1.2 Запись с вариантами

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

Рис. 5. Синтаксическая диаграмма для вариантной части.

Рис. 6. Синтаксическая диаграмма для Варианта.

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

type

TFigure = record

type_of_figure: string[10];

color_of_figure: byte;

...

case integer of

1: (x1,y1,x2,y2: integer);

2: (a1,a2,b1,b2,c1,c2: integer);

3: (x,y: integer; radius: word);

end;

var figure: TFigure;

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

Заметим, что индивидуальные поля для каждого из типов фигур занимают тем не менее одно адресное пространство памяти, а это означает, что одновременное их использование невозможно.

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

1.3 Оператор присоединения With, или как избавиться от префикса

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

with <имя_записи> do <действие с полем записи>;

Следует обратить внимание на то, что после служебного слова do может стоять только один оператор, но он может быть составным (любая последовательность операторов, заключенная в операторные скобки begin end ).

<действие с полем записи> представляет собой область действия оператора присоединения, в пределах которой можно не использовать составные имена. Например, для примера с телефонным справочником:

with rec do begin

FIO:='Абылай.';

TEL:='87750277715';

end;

Такая алгоритмическая конструкция полностью идентична следующей:

rec.FIO:='Абылай.';

rec.TEL:='87750277715';

Инициализация записей может производиться с помощью типизированных констант:

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) );

ГЛАВА 2.

ПРАКТИЧЕСКАЯ ЧАСТЬ ИЗУЧЕНИЯ ЗАПИСЕЙ

2.1 Комплексные числа

Одним из простейших примеров использования записи является работа с комплексными числами. Комплексные числа, числа вида х + iy, где х и у — действительные числа, а i — так называемая мнимая единица (число, квадрат которого равен -1). х называют действительной частью, а у — мнимой частью комплексного числа. z = х +iy (обозначают х =Rez, у=Imz).

Как известно в Паскале нет комплексных чисел. Но, используя запись можно сделать новый тип, и с помощью процедур определить основные операции над комплексными числами, такие как:

- инициализация,

- сложение,

-вычитание,

- умножение.

- деление,

- вывод на экран.

Итак, прежде всего определяем новый тип данных:

Type complex= record {определяем тип complex как запись}

re,im:real; { поля записи - вещественная часть и мнимая часть}

end;

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

procedure initc(var c:complex;r,i:real); {создание комплексного числа}

begin

c.re:=r;c.im:=i

end;

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

procedure addc(c1,c2:complex;var r:complex); {сложение}

begin

r.re:=c1.re+c2.re;

r.im:=c1.im+c2.im

end;

procedure subtrc(c1,c2:complex;var r:complex); {вычитание}

begin

r.re:=c1.re-c2.re;

r.im:=c1.im-c2.im

end;

Немного сложнее производится умножение комплексных чисел. Если у нас есть два комплексных числа и то

procedure multc(c1,c2:complex;var r:complex); {умножение}

begin

r.re:=c1.re*c2.re-c1.im*c2.im;

r.im:=c1.re*c2.im+c1.im*c2.re

end;

И, наконец, – деление комплексных чисел. Если у нас есть два комплексных числа и , то

Разумеется операция деления определена, если .

procedure divc(c1,c2:complex;var r:complex); {деление}

begin

if (c2.re=0) and (c2.im=0) then writeln('Деление невозможно') else

begin

r.re:=(c1.re*c2.re+c1.im*c2.im)/(c2.re*c2.re+c2.im*c2.im);

r.im:=(c2.re*c1.im-c1.re*c2.im)/(c2.re*c2.re+c2.im*c2.im);

end;

end;

Чтобы выводить на экран комплексные числа также нужна процедура.

procedure writec(c:complex); {вывод на экран комплексного числа}

var s:char;

begin

if c.im>0 then s:='+' else s:=' ';

writeln('z=',c.re:8:3,' ',s,c.im:8:3,' i');

end;

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

1+2i и 3+4i.

var c1,c2,c3:complex;

begin

initc(c1,1,2);

writec(c1);

initc(c2,3,4);

writec(c2);

addc(c1,c2,c3);

writec(c3);

subtrc(c1,c2,c3);

writec(c3);

multc(c1,c2,c3);

writec(c3);

divc(c1,c2,c3);

writec(c3);

end.

После запуска программы получаем результат:

Рис.7. Результат работы программы

Тип complex, вместе с указанными выше процедурами, можно оформить в виде модуля в Turbo Pascal (unit). Затем транслировать отдельно. После этого такой модуль можно включать, также как и любой стандартный модуль, с помощью оператора Uses в любую программу, где требуется работа с комплексными числами.

2.2 Работа с персональными данными.

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

Обычно анкетные данные о каждой персоне могут быть обширны и иметь много полей. Мы ограничимся всего 4 полями. Но одно из них – дата рождения будет составным, и, в свою очередь состоять из трех полей – число, месяц и год рождения.

type

date =record {Создаем тип дата (запись)}

year:integer;

month:1..12;

day:1..31;

end;

Для работы создаем новый тип данных, который называем Chel

chel = {тип человек - (запись)}

record

nam:string[30];

d:date;

pol:char;

rost:integer;

end;

В поле nam храним фамилию, имя и отчество, в поле d – дату рождения, далее – пол и рост. Разумеется, если есть необходимость, можно создать и многие другие поля записи chel.

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

Иванов Иван Петрович

1959

12

11

М

1975

Аналогичным образом записываются данные обо всех персонах, которые мы храним в этом файле.

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

type narod=array[1..100] of chel; {тип народ }

var s:narod;

Опишем теперь работу программы. Листинг ее приводится в приложении.

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

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

Каждая запись при этом выводится на экран. Параллельно ведется подсчет введенных записей.

После ввода всех записей, которые хранятся в файле, осуществляется их сортировка. Сортировка производится по полю -год рождения. Она реализована в виде процедуры sort. Используется не самый эффективный, но, пожалуй, наиболее простой метод – метод Пузырька.

Разумеется, если есть необходимость, то сортировку можно производить по любому из полей нашей записи.

Затем результаты – отсортированный массив информации, выводится на экран в виде таблицы. На рис. 8 приводится результат работы программы:

Рис. 8 Результат работы программы

ЗАКЛЮЧЕНИЕ

Рассмотренные выше примеры показывают простоту и удобство работы с записями как в простейших случаях, (пример с комплексными числами), так и в более сложные случаях (пример с обработкой персональных данных). Следует отметить также удобство использования оператора With. Что касается возможностей работы с записями типа вариант, то на практике данной возможностью пользуются сравнительно редко.

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

Более того, дальнейшее развитие самого Паскаля и его объектно-ориентированной версии, просто невозможно без понятия записи. Новое понятие объект, которое было введено в язык, фактически является обобщением понятия запись.

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

  1. Йенсен К., Вирт Н., Паскаль: руководство для пользователя. М., 1989.,256 с.
  2. Фаронов В.В.,Turbo Pascal 7.0. Начальный курс. - Нолидж, 1998. -620 с.
  3. Грызлов В.И., Грызлова Т.П., Турбо Паскаль 7.0. - М.: "ДМК", 2000. - 416 с.
  4. Прайс Д., Программирование на языке Паскаль. - М., "Мир", 1987. -232с.
  5. Эрбс Х.-Э., Штольц О., Введение в программирование на языке Паскаль. - М., "Мир", 1989. -300с.
  6. Джонс Ж., Харроу К.,Решение задач в системе Турбо-Паскаль. - М., 1991.
  7. Зуев Е.А. ,Программирование на языке Turbo Pascal 6.0, 7.0. - М., Радио и связь, 1993. -380с.
  8. Зубов В.С. Программирование на языке TURBO PASCAL. Версии 6.0 и 7.0. - М., "Филинъ", 1997. -320с.
  9. Лукин С.Н. TURBO PASCAL 7.0. Самоучитель для начинающих. - М., "Диалог-МИФИ", 1999. -400с
  10. Марченко А.И., Марченко Л.М., Программирование в среде Turbo Pascal 7.0. - Киев, "Век+", 1999. -506с.

ПРИЛОЖЕНИЕ

Листинг программы для работы с персональными данными.

program person;

type

date =record {Создаем тип дата (запись)}

year:integer;

month:1..12;

day:1..31;

end;

chel = {тип человек - (запись)}

record

nam:string[30];

d:date;

pol:char;

rost:integer;

end;

type narod=array[1..100] of chel; {тип народ }

var s:narod;

i,n:integer;

f:text;

str:string;

procedure sort(var a:narod;n:integer); { сортировка записей методом пузырька}

var i,j:integer;r:chel; { только по годам рождения }

begin

for i:=1 to n do

for j:=i+1 to n do

if a[i].d.year>a[j].d.year then begin

r:=a[j];

a[j]:=a[i];

a[i]:=r;

end;

end;

begin

write('Имя файла ');readln(str); {файл, где хранятся записи }

assign(f,str);

reset(f);

{ rewrite(f); }

if ioresult<>0 then begin

writeln('ошибка открытия');halt;

end;i:=1;

while not eof(f) do

begin

{ Заполнение полей записи }

{Фамилия,имя, отчество}

with s[i] do begin

readln(f,nam);

{Год рождения}

readln(f,d.year);

{Месяц:}

readln(f,d.month);

{Число: }

readln(f,d.day);

readln(f,pol); {пол}

readln(f,rost); {рост}

{выводим текущую запись на экран}

writeln('|',nam:30,'| ',d.year:5,'| ',d.month:3,

'| ',d.day:3,'| ',pol,'|',rost:4,'|');

end;

i:=i+1;

end;

n:=i-1;

writeln;

sort(s,n);

writeln('После сортировки ');

{выводим записи, упорядоченные по годам рождения}

for i:=1 to n do

writeln('|',s[i].nam:30,'| ',s[i].d.year:5,'| ',s[i].d.month:3,

'| ',s[i].d.day:3,'| ',s[i].pol,'|',s[i].rost:4,'|');

close(f); {закрываем файл}

end.