Файл: "Программирование на языке Pascal".pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 18.06.2023

Просмотров: 170

Скачиваний: 6

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

ВВЕДЕНИЕ

ГЛАВА1. ИЗУЧЕНИЕ ОСНОВНЫХ СЕМАНТИК ЯЗЫКА

1.1 ОПЕРАЦИИ

1.1.1 АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ

1.1.2 ЛОГИЧЕСКИЕ ОПЕРАЦИИ

1.1.3 ОСТАЛЬНЫЕ ОПЕРАЦИИ

1.2 ОПЕРАТОРЫ

1.2.1 ОПЕРАТОР ПРИСВАИВАНИЯ

1.2.2 ОПЕРАТОР ПРОЦЕДУРЫ

1.2.3 ОПЕРАТОР БЕЗУСЛОВНОГО ПЕРЕХОДА

1.2.4 СОСТАВНЫЕ ОПЕРАТОРЫ

1.2.5 УСЛОВНЫЙ ОПЕРАТОР

1.2.6 ОПЕРАТОРЫ ПОВТОРЕНИЙ

1.2.7 ОПЕРАТОР ВЫБОРА

1.3 ИДЕНТИФИКАТОРЫ

1.3.1 ПОРЯДКОВЫЕ ТИПЫ

1.3.1.1 ЦЕЛОЧИСЛЕННЫЙ ТИП

1.3.1.2 СИМВОЛЬНЫЙ ТИП

1.3.1.3 ПОЛЬЗОВАТЕЛЬСКИЙ ПЕРЕЧИСЛЯЕМЫЙ ТИП

1.3.1.4 ТИП-ДИАПАЗОН

1.3.2 ВЕЩЕСТВЕННЫЕ ТИПЫ

1.3.3 СТРУКТУРИРОВАННЫЕ ТИПЫ

1.3.3.1 МАССИВЫ

1.3.3.2 ЗАПИСИ

1.3.3.3 МНОЖЕСТВА

1.3.3.4 СТРОКИ

1.3.4 ФАЙЛЫ

ГЛАВА 2. ОСНОВНЫЕ АЛГОРИТМЫ ЯЗЫКА

2.1 МЕТОД ГРАНИЦ

2.2 МЕТОД ГОРНЕРА

2.3 МЕТОД ЛОГИЧЕСКОЙ ПЕРЕСТАНОВКИ ЭЛЕМЕНТОВ

2.4 МЕТОДЫ СОРТИРОВКИ МАССИВОВ

ГЛАВА 3. РАЗРАБОТКА ПРИКЛАДНЫХ ПРОГРАММ В СРЕДЕ FREE PASCAL

ЗАКЛЮЧЕНИЕ

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

Символ

Код

Значение

BEL

7

Звуковой сигнал

HT

9

Горизонтальная табуляция

LF

10

Перевод строки

VT

11

Вертикальная табуляция

FF

12

Прогон страницы. Формирование страницы при выводе на принтер.

CR

13

Возврат каретки

SUB

26

Конец файла

ESC

27

Конец работы

Таблица 4. Примеры служебных кодов

К символьному типу применимы операции отношения и некоторые встроенные функции:

CHR(BYTE)-преобразует байт в символ

Upcase(char)-возвращает заглавную букву, соответствующую прописной латинской букве из входного аргумента. [7]

1.3.1.3 ПОЛЬЗОВАТЕЛЬСКИЙ ПЕРЕЧИСЛЯЕМЫЙ ТИП

Данный тип задаётся указанием пользователем всех тех значений, которое он может получать, причём каждое такое значение называется идентификатором перечисляемого типа и должно быть описано в списке, обрамлённым круглыми скобками. (например, colors=(red,green,blue);). Соответствие каждого элемента списка с его порядковым номером однозначно определяется через порядок объявления этого типа. Нумерация начинается с нулевого элемента. Максимальное количество элементов такого множества -65536. [7]

1.3.1.4 ТИП-ДИАПАЗОН

Такой тип можно задать с помощью следующей записи: [минимальное значение]..[максимальное значение], причём должно удовлетворяться равенство [максимальное значение]>=[минимальное значение]. [7] Такой тип наследует все свойства обычного перечисляемого типа, но с возможными ограничениями. Существуют также 2 отдельные функции для работы с перечисляемыми типами: High(X) –который возвращает максимальный элемент диапазона и Low(X)-который возвращает минимальный элемент диапазона.

1.3.2 ВЕЩЕСТВЕННЫЕ ТИПЫ

Все вещественные числа имеют следующую структуру представления данных:

S

E

M

Таблица 5. Представление вещественного числа

Где S-знаковый разряд числа, 1 бит со значениями 0 при положительных значениях и 1 при отрицательных. [8] E-экспоненциальная составляющая, которая содержит двоичный порядок представления числа и m-мантиса числа, которая имеет длину от 23 (Single) до 63 (Extended) двоичных разрядов, что и обуславливает определённую точность числа. Так же следует отметить, что все вычисления для чисел с плавающей запятой в арифметическом сопроцессоре сопроцессоре обрабатываются в формате EXTENDED, а все прочие вещественные типы получаются простым усечением этого типа и применяются в основном для экономии памяти. Исключением является тип Real, который оптимизирован для работы без сопроцессора, поэтому использование типа Real на компьютере оснащённым сопроцессором приводит к дополнительным преобразованием Real к Extended (что вызывает дополнительные вычисления, а значит требует дополнительного времени и сводит на нет все выигрыши в памяти). [8] Также сильно выделяется на общем фоне тип Comp –вещественное число без экспоненциальной и дробной части. Грубо говоря, Comp- это просто большое целое число со знаком, которое хранит в себе до 20 значащих цифр. [8] Тем не менее, этот тип обладает всеми свойствами других вещественных типов и может являться аргументом для любых функций, требующих вещественное число в качестве входного аргумента. Для ознакомления с основными функциями, принимающие вещественные типы составим таблицу:


Вызов

Входной параметр

Результат

Действие

Abs(x)

Целый или вещественный

Тип аргумента

Модуль аргумента

Arctan(x)

Вещественный

x

Арктангенс (в радианах)

Cos(x)

Вещественный

x

Косинус (в радианах)

Exp(x)

Вещественный

X

Экспонента

Frac(x)

Вещественный

X

Дробная часть числа

Int(x)

Вещественный

X

Целая часть числа

Ln(x)

Вещественный

X

Натуральный логарифм

Random()

-

Вещественный

Псевдослучайное число в диапазоне 0..1

Sin(x)

Вещественный

X

Синус в радианах

Sqr(x)

Целочисленный или вещественный

X

Квадрат аргумента

Sqrt(x)

Целочисленный или вещественный

Вещественный

Корень квадратный.

Таблица 6. Вещественные функции

На основании вышеприведённой таблицы можно сделать вывод, что наиболее активное применение вещественных чисел в программе сопряжено с математическими вычислениями с заданной точностью. [9]

1.3.3 СТРУКТУРИРОВАННЫЕ ТИПЫ

Каждый структурированный тип (а их можно подразделить на 4 категории: записи, множества, файлы и массивы) выделяется тем, что образован из нескольких элементов, каждый из которых также считается структурированным типом, в следствии чего можно говорить о вложенности типов. Глубина вложения определяется параметрами компиляции, однако, по умолчанию, она не должна превышать 65520 байт. [9] Для экономии памяти (и совместимости с более строгим стандартом) можно указать компилятору по возможности экономить место, отводимое под структурированные типы (зарезервированное слово Packed), если компилятор не делает это по умолчанию.

1.3.3.1 МАССИВЫ

Массивы – это упорядоченная цепочка данных одного типа. Стандартные средства языка позволяют управлять элементами массива с помощью оператора индексации («[]»), входным аргументом которого является порядковый номер элемента. Описание массивного типа в общем виде выглядит так: [имя типа]=Array [{список одного или нескольских индексных типов}] of {любой тип Паскаль}. [9] В качестве индексных типов могут быть использованы любые порядковые типы, кроме Longint (в некоторых компиляторах) и типов-диапазонов содержащие тип longint (в некоторых компиляторах). Показательно, что типом после ключевого слова of может служить также массив – на этом факте основано описание многомерных массивов. В памяти компьютера все элементы массива расположены последовательно таким образом, что при переходе от младших адресов памяти к более старшим быстрее меняется самый правый индекс массива. Этот факт считается очень важным при использовании стандартных приёмов копирования массива. Над полем массивных типов определены операция присваивания (но не сравнения). Для задания динамических массивов пользуются функцией SetLength([переменная массива],[размерность массива]), что совершенно не меняет логику работы с массивами, но позволяет более эффективно расходовать память. [10]


1.3.3.2 ЗАПИСИ

Под записью понимают структуру даннах, отличительной особенностью которой является фиксированность числа компонентов (которые называются полями записи). Поля записи могут располагаться не последовательно, и быть разными типами данных. Всю работу по расположению записей в памяти компьютера берёт на себя компилятор. [10] Для обращения к полям записи они должны иметь определённое имя, которое выступает своеобразным указателем на область памяти, содержащее значение поля записи. Сама по себе структура объявления этого типа выглядит следующим образом:

[имя типа]=Record {список полей} End.

Над полем этого типа также определён оператор присваивания, а для обращения к конкретному полю записи используется оператор с одноимённым названием – «.». Для более удобного обращения к полям записи существует оператор With (хотя на сегодняшний день он объявлен устаревшим и небезопасным и в прикладном программировании используется другая конструкция). Все современные компиляторы Паскаля поддерживают так называемые вариантные поля, с помощью оператора Case of, отличительной особенностью таких полей служит то, что каждому варианту такой записи отводится одна и та же область памяти, что открывает дополнительные возможности для преобразования типов. [10]

1.3.3.3 МНОЖЕСТВА

Тип данных множество очень напоминает его соответствующий аналог в математике. Это также некоторый набор логически связанных объектов. Элементам множества предъявляются требования уникальности, а порядок следования не играет никакой роли. [2] В зависимости от компилятора мощность множества ограничено определённым числом (чаще всего – это диапазон от 0 до 256). Запись объявления множества имеет следующий вид:

[имя типа]=set of {базовый тип элементов множества}.

В качестве базового типа могут выступать любые перечисляемые типы, кроме word,integer и longint (в некоторых компиляторах). Над этим типом данных определены операция пересечения (перегрузка оператора *), операция объединения (перегрузка оператора +), операции исключения (перегрузка оператора -), проверка включения одного множества в другое с помощью операторов сравнения, а также проверка принадлежности элемента множеству с помощью оператора in. [6] Для работы с множеством также существуют функции Include([имя множества],[имя типа совпадающего с базовым типом множества]) и Exclude([имя множества],[имя типа совпадающего с базовым типом множества]), которые соответственно включают или исключают элемент или множество из исходного. Отличие от соответствующих операторов заключаются только в лучшей оптимизации этих функций над полем одиночных элементов.


1.3.3.4 СТРОКИ

Наиболее широкоупотребимый контейнер для работы с текстом – тип String. Он по структуре напоминает обычный массив из элементов символьного типа, однако имеет ряд отличий. [3] В частности, тип String имеет динамическую структуру хранения информации (т.е способность увеличиваться в процессе компиляции программы), но не может содержать более 255 элементов (хотя, в некоторых современных компиляторах есть возможность увеличить этот диапазон), также в отличие от массива у строк нет возможности задания произвольной индексации, а в элементе с индексом 0 –всегда содержится текущее количество элементов в строке. Определена операция конкатенации (причём, при условии превышения диапазона значений, лишние символы будут отсечены), а также ряд специализированных функций, которые принимают входным параметром только строки (количество таких функций даже в стандартной библиотеки Паскаль достаточно велико, поэтому, они не будут подробно рассмотрены в ходе этой работы.). Также определены операторы сравнения, причём в реализации происходит посимвольное сравнение строк. [3]

1.3.4 ФАЙЛЫ

Формально файлы являются объектным типом данных в языке pascal, однако, данная тема является столь обширной, что одной её было бы достаточно, чтобы сделать полноценную курсовую работу, поэтому в рамках текущей работы файлы будут рассмотрены лишь ключевые моменты по работе с файлами, упуская значительную часть теоретических сведений. Под файлом понимают какую-то именованную область внешней памяти компьютера, средствами языка можно получить доступ к этим отделам памяти и прочитать или записать информацию. [7] Не вдаваясь в подробности об устройстве файлах в различных файловых системах можно сказать, что у любого файла есть 3 характерные особенности (очень упрощёно). В первую очередь имя, что позволяет однозначно ссылаться на него и работать с несколькими файлами, также вся информация записанная в файле интерпретируется языком pascal однотипно, и наконец, размер файла ограничен лишь ёмкостью внешней памяти. [1] Для обращения к файловой переменной существуют три конструкции:

1)[имя]=file of [тип];

2)[имя]=Text;

3)[имя]=file;

Отличие в этих объявлениях в том, что первый вариант используют для задания типизированных файлов, чья отличительная черта заключается в том, что компилятор ожидает, что каждая лексема встреченная в файле имеет объявленный тип, в следствии чего, повышается скорость работы с файлом, упрощается разделение файла на лексемы и уменьшается количество кода, необходимого для обработки информации. [4] Второй вариант предполагает наличие текстового файла –т.е работа считается, что неделимым элементом такого файла является символ char. Третий вариант –объявление нетипизированного файла, тип каждого элемента такого файла заранее неопределён. Для того, чтобы связать переменную с именем файла используется стандартная процедура assign([файловая переменная],[имя файла]), в случае если задаётся пустое имя файла, то переменная связывается со стандартными файлами для ввода или вывода информации input или output. [6] Для начала работы с файловыми переменными необходимо инициировать файл т.е указать направление передачи данных. Для этих целей служит функция Reset([файловая переменная]); которая подготавливает файл для чтения и процедуры rewrite([файловая переменная]) и Append([файловая переменная])–которые подготавливают файл для записи. После этого обычно следует проверка файла на открытие, во-избежании ошибок на этапе выполнения программы. После завершения работы с любым файлом его необходимо закрыть, для обеспечения безопасности содержащихся на нём данных, делается это с помощью процедуры Close([файловая переменная]). [5] Для удаления файла используют процедуру erase([файловая переменная]), для переименования используют функцию rename([файловая переменная],[новое имя]). Для чтения и записи данных используют перегрузку стандартных функций read,readln,write,writeln, которые первым аргументом принимают файловую переменную, а весь остальной синтаксис остаётся без изменений. Чтобы получить информацию достигнут ли конец файла используют функцию EOF([файловая переменная]):Boolean. Чаще всего этих наборов инструментов достаточно, чтобы обработать алгоритм, не акцентирующий своё внимание на файловой структуре (т.е просто прочитать информацию с файла или записать информацию на файл). [9]


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

ГЛАВА 2. ОСНОВНЫЕ АЛГОРИТМЫ ЯЗЫКА

2.1 МЕТОД ГРАНИЦ

Очень часто в процессе работы программы необходимо разбить какую-то строку на лексемы. Т.е выделить необходимую в строке информацию. Для этих целей служит стандартный алгоритм, который называется «Метод границ». [2] Одна из возможных реализаций этого алгоритма (вариация, когда в строке ищется вхождение числа и записывается в элемент массива, без дополнительных проверок) представлена ниже:

Program m_granic;

Type TintMassiv=array of integer

Var intmassiv:tintmassiv

s:string;

c_:char;

Count,I,a:integer;

Begin

Readln(s);

C_:=’ ‘;

count:=0;

a:=0;

setlength(intmassiv,count+1);

For i:=1 to length(s) do

Begin

If ((ord (s[i])>=48)and(ord(s[i])<=57)) then

A:=a*10+ord(s[i])-48;

Else if ((ord(c_)>=48)and (ord(c_)<=57)) then

Begin

Intmassiv[count]:=a;

Inc(count);

Setlength(intmassiv,count+1);

A:=0;

End;

C_:=s[i];

End;

End.

Сложность этого алгоритма линейна, и он выполняет свою функцию –вычленяет из переменной s все целочисленные аргументы. На практике, это является часто употребимым алгоритмом, поскольку очень часто данные представлены в виде неструктурированных цепочек, которые необходимо обработать. [10] Представленная реализация не очень безопасна, поскольку не контролирует переполнение контейнера а, однако её можно усовершенствовать, применив следующий рассмотренный алгоритм:

2.2 МЕТОД ГОРНЕРА

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

Function gorner10(var S:string; Base:integer;):integer;

Var I,a:integer;

Begin

A:=0;

For i:=1 to length(s) do

If ((ord(s[i])>=48) and (ord(s[i]<=57)) then

A:=a*Base+ord(s[i])-48;

Else if ((ord(s[i])>=65) and (ord(s[i])<=91)) then A:=a*Base+ord(s[i])-65+10;

Gorner:=a;

End;

Данный алгоритм переводит число, представленное в строке в любой системе счисления в систему счисления с основанием 10. [10] Данный алгоритм также имеет линейную сложность и достаточно мощный, чтобы сделать проверку на корректность ввода. Обратный алгоритм Горнера (на жаргоне «анти-горнер») выглядит так: