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

сновы программирования на языке Pascal

Содержание:

ВВЕДЕНИЕ

Язык Паскаль получил свое название в честь французского философа и математика Блеза Паскаля. Создали его в период с 68-го по 71-й. Создателем стал некий швейцарский ученый Никлаус Вирт, который преподавал на кафедре информатики в Стэндфордском университете. 

Изначально Паскаль создавался как учебный язык программирования, однако со временем он превратился в более обширный инструмент. Свою славу он получил благодаря появлению пакета Турбо Паскаль (Turbo Pascal). Язык популярен среди программистов из-за своей доступности (простоты в понимании), структурности и понятных средств создания и настройки утилит.

Объект исследования: Язык программирования Pascal.

Предмет исследования: Использование циклов в языке программирования Pascal.

Цель: Выявить особенности использования циклов в языке программирования Pascal.

Задачи:

  1. Изучить и проанализировать методическую, специальную литературу по теме исследования.
  2. Охарактеризовать язык программирования Pascal.
  3. Раскрыть особенности использования циклов в языке программирования Pascal.
  4. Разработать сборник задач с использованием циклов в языке программирования Pascal

Методы исследования: анализ, синтез, изучение литературы, абстрагирование, обобщение.

Практическая значимость. Материалы курсовой работы помогут студентам и преподавателям в изучении темы «Работа с циклическими процессами в среде Pascal». Разработанный сборник задач поможет организовать практические и лабораторные работы по данной теме.

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

1.1. Знакомство с системой программирования в Pascal

Первая версия языка Паскаль была разработана в 1968 году. Ее разработчиком является швейцарский ученый Никлаус Вирт. Свое название язык получил в честь создателя первой механической вычислительной машины француза Блеза Паскаля. На основе языка Паскаль в 1985 г. фирма Borland выпустила версию Turbo Pascal версии 3.0. С этого времени язык Паскаль используется во всем мире в учебных заведениях в качестве первого изучаемого языка программирования[11].

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

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

Компилятор Pascal является компилятором переднего плана (front-end). Это означает, что он не генерирует исполняемый код в виде .exe-файла, а создает в результате компиляции дерево программы в памяти, которое затем выполняется с помощью встроенного интерпретатора.

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

Проверяемые задания реализованы в виде электронного задачника по программированию Programming Taskbook, содержащего 1000 задач по программированию разного уровня сложности (от простейших задач до задач на файлы, указатели и рекурсию) а также в виде исполнителей Робот

Чертежник, предназначенных для быстрого обучения основам программирования школьников младших и средних классов[4].

В свободно распространяемую версию Pascal & Programming Taskbook Mini Edition входит мини-версия электронного задачника (200 задач) и урезанный комплект задач для исполнителей Робот и Чертежник. Версия Pascal & Programming Taskbook Complete Edition содержит полный комплект задач.

Все авторские права программного комплекса Pascal 3.0 & Programming Taskbook 4.5 Mini Edition (называемого в дальнейшем системой PABC-PT ME) принадлежат только авторам: С.С.Михалковичу и М.Э.Абрамяну.

Система PABC-PT ME является бесплатной и распространяется свободно при условии, что настоящий дистрибутив не изменен. Ни одно частное лицо или организация не может брать плату за распространение системы PABC-PT ME.

Скачать программный комплекс можно в интернете совершенно бесплатно и установить на свой компьютер[7].

В скачанном пакете для установки запустите файл PABCInstall и в появившемся окне нажмите кнопку «Установка».

После установки автоматически запускается программа регистрации и настройки PABCSetup. В дальнейшем эту программу можно запустить повторно с помощью команды «PABC Setup - Регистрация и настройка» пункта «Pascal» в группе «Программы» главного меню Windows.

1.2. Знакомство с элементами языка программирования Pascal

Любой естественный язык строится из элементарных составляющих — букв, образующих алфавит языка. Буквы используются для построения слов, слова складываются в предложения, а предложения образуют текст. Всякий язык программирования организован примерно так же. Имеется алфавит языка, то есть набор символов, которые можно использовать в программе[9].

Алфавит языка Pascal идентичен языку программирования Турбо Паскаль и включает буквы, цифры, шестнадцатеричные цифры, специальные символы и зарезервированные слова.

Буквы - это буквы латинского алфавита от а до z и от А до Z. В Турбо Паскале нет различия между прописными и строчными буквами алфавита, если только они не входят в символьные и строковые выражения.

Цифры - арабские цифры от 0 до 9.

Каждая шестнадцатеричная цифра имеет значение от 0 до 15. Первые 10 значений обозначаются арабскими цифрами 0...9, остальные шесть - латинскими буквами A...F или a...f.

Специальные знаки ABC Паскаля - это символы: + - * / = , ' . : ; < > [ ] ( ) { } ^ @ $ #

К специальным знакам относятся также следующие пары символов: ; < > <= >= := (* *) (..)

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

Особое место в алфавите языка занимают пробелы, к которым относятся любые символы ASCII в диапазоне кодов от 0 до 32. Эти символы рассматриваются как ограничители идентификаторов, констант, чисел, зарезервированных слов. Несколько следующих друг за другом пробелов считаются одним пробелом (последнее не относится к строковым константам).

В математике ведётся знакомство с понятием величина. С этим же понятием работают и в языке программирования ABC Паскаль. Величина имеет следующие характеристики:

1. Имя (идентификатор).

2. Тип.

3. Значение.

Идентификаторы в ABC Паскале - это имена констант, переменных, меток, типов, объектов, процедур, функций, модулей, программ, полей в записях, файлов. Идентификаторы могут иметь произвольную длину, не значащими (уникальными в области определения) являются только первые 63 символа.

Идентификатор всегда начинается буквой или знаком подчеркивания, за которым могут следовать буквы, цифры и знак подчеркивания (код; 95 в ASCII). Пробелы, буквы русского алфавита и специальные символы алфавита не могут входить в идентификатор.

Таблица 1

Арифметические операции и стандартные функции, используемые в ABC Паскаль[8]

Математическая запись

В языке программирования ТР

Сложение

+

Вычитание

-

Умножение

*

Деление

/

Больше

>

Меньше

<

Больше или равно

>=

Меньше или равно

<=

Неравно

<>

X2

Sqr (x)

√x

Sqrt (x)

Cos x

Cos (x)

Sin x

Sin (x)

Tg x

Tg (x)

Модуль числа

Abs (x)

Экспонента

Exp (x)

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

Ln (x)

Целая часть от деления

x div y

Остаток от деления

x mod y

Приоритет выполнения операций:

1. Действия в скобках.

2. Вычисление значений функции.

3. Умножение и деление.

4. Сложение и вычитание.

5. Операции отношения.

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

1.3. Особенности организации решения задач на языке Pascal

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

После запуска ярлыка на рабочем столе открывается окно[19]:

Создать новый файл

Запустить программу на выполнение

Остановить программу

Рисунок 1. Запуск программы Pascal

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

Окно редактирования предназначено для ввода и редактирования текста программы. Место ввода информации обозначено курсором. В верхней левой части окна редактирования выводится служебное имя редактируемого файла, например: Program1.pas

  1. Найдите строку Меню (сверху) и строку-подсказку (снизу).
  2. Поочередно войдите в указанные ниже разделы Меню (активизируйте Меню мышью).
  3. Найдите следующие команды:

В меню Файл

Новый – создать новый фал

Oткрыть – открыть файл

Сохранить – сохранить файл

Сохранить как… – сохранить под новым именем

Выход – выйти из Паскаля

В меню Правка

Отменить – отменить изменение

Восстановить – вернуть изменение

В меню Программа

Выполнить – выполнить программу

Остановить – остановить программу.

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

Рисунок 2. Пример ошибки, обнаруженной Паскаль[6]

После исправления всех ошибок и появления в новом окне начала работы программы, необходимо ввести нужные данные (если в программе подразумевается ввод нескольких переменных, то это следует делать через Enter или пробел), получить результат работы и провереть его на правильность. Так как текст программы и ее работа показываются в разных окнах (если подключен модуль Crt), можно сопоставить программные строки и ее выполнение.

Рисунок 3. Пример работы программы

Структура программы

Программа на языке Pascal имеет следующий вид:

program имя программы;

раздел подключения модулей

раздел описаний

begin
операторы
end.

Первая строка называется заголовком программы и не является обязательной.

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

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

Раздел подключения модулей и раздел описаний могут отсутствовать.

Операторы отделяются один от другого символом «точка с запятой»[21].

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

Комментарии предназначены для пояснения задачи и для временного исключения из текста программы некоторых операторов. В тексте они выделяются фигурными скобками { } или отделяются двумя косыми чертами //. Комментарии игнорируются компьютером при выполнении, однако при выводе текста программы – печатаются.

В Паскале имеется особая группа слов, таких как, например: begin, for, end, program и другие, за которыми закреплены специальные смысловые значения. Такие слова называются служебными (зарезервированными) и должны употребляться в строгом соответствии с заложенным в них смыслом.

Существует и другая группа имен, имеющих стандартно определенный смысл, например, integer, writeln и другие. Их так и называют – стандартные или предопределенные имена.

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

За декларативной частью следует исполнительная часть программы, обрамляемая словами-ограничителями (логическими скобками): begin и end. Между указанной парой слов и размещаются предложения, выполняющие в программе те или иные действия. Исполнительную часть программы называют телом программы.

Все операторы языка ABC Паскаль можно разбить на две группы: простые и структурированные.

Простые операторы:

  1. Оператор присваивания. С помощью этого оператора переменной или функции присваивается значение выражения. Формат записи: <переменная>:=<выражение>.
  2. Оператор безусловного перехода – GOTO, позволяет изменить стандартный последовательный порядок выполнения операторов и перейти к выполнению программы, начиная с заданного оператора. Формат записи: GOTO <метка>.
  3. Оператор обращения к подпрограмме. Для вызова подпрограммы из основной программы следует записать оператор, состоящий из имени подпрограммы и списка фактических параметров, которые должны совпадать по количеству и типам с формальными параметрами процедуры. Формат записи:<Имя подпрограммы>(<список фактических параметров>).

Структурированные операторы:

  1. Условный оператор. Реализует алгоритмическую конструкцию развилка и изменяет порядок выполнения операторов в зависимости от истинности или ложности некоторого условия. Имеет 2 формы записи: полную и краткую. Формат записи (полная): If <условие> then <оператор 1> else <оператор 2>. Формат записи (краткая): If <условие> then <оператор>.
  2. Оператор множественного выбора – Case, обеспечивает организацию разветвлений путём выбора одного из нескольких операторов. Формат записи:

Case <параметр выбора> of

c1:=<оператор1>;

c2:=<оператор2>;

c3:=<оператор3>;

…………………

cn:=<операторn>;

else <оператор> end;

  1. Операторы цикла. В ABC Паскале имеется 3 вида операторов цикла: с параметром, с предварительным условием, с последующим условием.

Вычислительный процесс с многократным повторением однотипных вычислений для различных значений обрабатываемых величин (переменных) называет - циклическим. Цикл – повторяемая последовательность действий. Операторы цикла задают повторение некоторых действий до тех пор, пока определённое условие остаётся истинным. Операторы цикла имеют заголовок и тело. В заголовке записано условие продолжения или завершения, а в теле – оператор (операторы), выполнение которого повторяется. Количество повторений цикла может быть заранее заданным или определяться во время выполнения цикла с помощью условия продолжения или завершения.

Для организации циклов необходимо предусмотреть:

  1. задание начальных значений переменным цикла перед первым его выполнением;
  2. действия, повторяемые в цикле для различных значений переменных цикла (тело цикла);
  3. изменение (модификацию) переменных цикла перед каждым новым его повторением;
  4. проверку условия продолжения работы цикла и переход на начало тела цикла или окончание работы цикла и выход из него.

Вход в цикл возможен только через его начало. Различают циклы с заданным и заранее, неизвестным числом повторений. Если заранее известно количество необходимых повторений, то цикл называется арифметическим. Если же количество повторений заранее неизвестно, то говорят об итерационном цикл.

В Паскале имеется три вида операторов цикла:

  1. оператор цикла с параметром;
  2. оператор цикла с предварительным условием;
  3. оператор цикла с последующим условием.

Таким образом, язык программирования Pascal является средством:

  • для привлечения практической пользы из общения с ЭВМ;
  • записи обдумывания и понимания алгоритмов, средство общения в информатике;
  • объект изучения, расширяющий знания учащегося в области инструментария информатики.

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

Название «Pascal» относится к интерактивной системе программирования, состоящей из компилятора языка и объединенного с ним экранного редактора. Интерактивность системы проявляется в основном в удобстве редактирования и обработки ошибок, обнаруженных в исходных текстах программ. Запуск программ в этой системе происходит на уровне исходных текстов. Высокая скорость компиляции приводит к тому, что переход от исходного текста к исполняемой программе происходит очень быстро. Это значительно сокращает цикл трансформации программ от редактирования к компиляции и исполнению программ.

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

ГЛАВА 2. ОСОБЕННОСТИ ИСПОЛЬЗОВАНИЯ ЦИКЛОВ В ЯЗЫКЕ ПРОГРАММИРОВАНИЯ PASCAL

2.1. Этапы решения задач с использованием циклов

При решении задач на языке программирования Pascal можно выделить несколько этапов, соблюдение которых приводит к конечному результату (программа для решения поставленной задачи):

  • Анализ условия задачи.

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

Чаще всего анализ условия задачи проводится в форме фронтального устного опроса.

  • Разработка словесного алгоритма (математической модели).

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

  • Графическое изображение решения задачи (блок-схема).

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

Обозначение блока

Пояснение

Вычислительное действие

( операция присваивания)

Проверка условия

(условный переход)

Начало, конец

Ввод исходных данных,

Вывод результатов

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

  • Разработка программного кода, трассировка программного кода.

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

  • Набор программы в среде программирования.

После написания программного кода его необходимо перенести в редактор программного кода (поле ввода программного кода) среды программирования. В результате получается исходная программа.

  • Отладка и компиляция.

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

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

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

  • Запуск программы на исполнение.

На этом этапе учащиеся получают предполагаемый результат с использованием запуска программного кода в среде программирования.

Таким образом, при решении задач ученики должны понимать назначение каждого этапа разработки программного кода и четко соблюдать их.

2.2. Методические рекомендации по решению задач с использованием цикла с параметром

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

Рисунок 4. Типы циклических конструкций

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

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

Существует две формы записи этого цикла:

Первая форма

for <счетчик1> := <значение1> to <конечное_значение> do <оператор1>;

После каждой итерации значение <счетчик1> будет увеличиваться на 1.

<значение1> — это начальное значение счетчика.

Это может быть переменная или число.

<конечное_значение>: как только значение <счетчик1> станет больше <конечное_значение>, выполнение цикла прекратится.

Если требуется написать несколько операторов в теле цикла, используем begin и end.

И <счетчик1>, и <конечное_значение>, и <значение1> - переменные целого типа.

Чаще всего в качестве счетчика используется переменная i.

Вторая форма

for <счетчик2> := <значение2> downto <конечное_значение> do <оператор1>;

После каждой итерации значение <счетчик2> будет уменьшатся на 1.

<значение2> — это начальное значение счетчика.
<конечное_значение> : как только значение <счетчик2> станет меньше <конечное_значение>, выполнение цикла прекратится.

Два важных примечания:

  1. Цикл повторяется, пока значение значение счетчика лежит в отрезке [значение ; конечное_значение].
  2. Изменять значение счетчика внутри тела нельзя.  

Оператору цикла с параметром соответствует следующая блок – схема:

Для i от m1 до m2

Оператор(ы)

Оператор(ы) после выполнения цикла

Рисунок 5. Блок –схема цикла с параметром

 Пример 1.

Задача: Составьте программу, которая считает среднее арифметическое чисел в интервале от 150 до 340.

Решение:

1.Анализ условия задачи.

Если дан ряд величин, то величина, заключённая между наименьшей и наибольшей из данных, называется «средней».

Средняя арифметическая (или среднее арифметическое)- получается от сложения данных величин и деление суммы на число этих величин.

Ср.ар.= a1+a2+…+an

n

где, a1,a2,…….,an – данные величины, а n-их число.

Пусть S-сумма слагаемых, n- их число, S1-среднее арифметическое.

S=150+151+152+…+338+339+340.

150-первое слагаемое.

151-второе слагаемое.

153-третье слагаемое.

………………………

338- (n-2) слагаемое.

339- (n-1) слагаемое.

340- n слагаемое.

S1=S/n.

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

2.Разработка словесного алгоритма (математической модели).

В начале необходимо найти сумму чисел в интервале, причём точное количество суммирования слагаемых нам известно. Так же можно подсчитать количество таких слагаемых. А затем используя формулу Sl=S/n найдём среднее арифметическое.

3.Графическое изображение решения задачи (блок-схема).

s:=0

n:=0

Для i от 150 до 340

s:=s+i

n:=n+1

s1

Рисунок 6. Решение задачи с помощью блок - схемы

4.Разработка программного кода, трассировка программного кода.

Program Sum1;

Var s, i, n: integer;

s1:real;

Begin

s:=0; n:=0;

For i:=150 to 340 do begin

s:=s+i;

n:=n+1;

end;

s1:=s/n;

Writeln (‘Среднее арифметическое чисел равно ’, s1:5:2);

end.

Трассировка:

s:=0; n:=0;

Для i от 150 до 340

i=150 i=151 i=152 …………… i=340

s=0+150 s=150+151 s=131+152 …………… s= +340

n=o+1 n=1+1 n=2+1 …………... n= +1

s1=/

вывод s1.

5.Набор программы в среде программирования.

Рисунок 7. Набор программы в Pascal

6.Отладка и компиляция.

Осуществляется нажатием клавиши F9.

7.Запуск программы на исполнение.

Выполняется нажатием комбинации клавиш Ctrl-F9.

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

Пример 2.

Задача: Вывести на экран буквы от Z до A.

Решение:

1.Анализ условия задачи.

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

2.Разработка словесного алгоритма (математической модели).

Число общего вывода букв известно. Вывод осуществляется в обратном порядке, поэтому приращение параметра равное -1,и начальное значение больше конечного (т.е. m1>m2).При нахождении каждой буквы вывод на экран осуществляется сразу.

3.Графическое изображение решения задачи (блок-схема).

Для i от Z до A

i

Рисунок 8. Решение задачи с помощью блок - схемы

4.Разработка программного кода, трассировка программного кода.

Program ;

Var i:=char;

Begin

For i:=’Z’ to ‘A’ do

Write (i);

Writeln;

End.

Трассировка:

Для i от Z до A

Вывод Z

Вывод W

Вывод V

……………….

Вывод B

Вывод A

5.Набор программы в среде программирования.

6.Отладка и компиляция.

Осуществляется нажатием клавиши F9.

7.Запуск программы на исполнение.

Выполняется нажатием комбинации клавиш Ctrl-F9.

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

2.3 Примеры применения регулярных выражений

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

Будем считать, что исходная строка содержится в переменной s типа string.

В классе string имеется специальный метод Split, предназначенный для разбиения строки, однако при его использовании для решения поставленной задачи вы получим сложный для восприятия код:

foreach s0: string in s.Split(new char[1](' '), StringSplitOptions.RemoveEmptyEntries) do

Writeln(s0);

Для того чтобы данный фрагмент откомпилировался, необходимо поместить в начало программы директиву uses System.

Заметим, что если использовать более простой вариант метода Split с единственным символьным параметром - пробелом (s.Split(' ')), то в результирующий массив будут записаны не только «настоящие» слова, но и пустые строки (они считаются «словами», расположенными между соседними пробелами).

Теперь решим эту же задачу с использованием регулярных выражений (в начале программы надо указать директиву uses System.Text.RegularExpressions):

foreach s0: string in Regex.Split(s, ' +') do

Writeln(s0);

В данном случае мы вызвали метод Split класса Regex – основного класса библиотеки .NET, связанной с регулярными выражениями. В этом методе вначале указывается обрабатываемая строка, а затем – регулярное выражение, которое определяет вид разделителя между словами. Метод возвращает массив строк, содержащий слова, на которые была разделена исходная строка. В приведенном фрагменте мы использовали регулярное выражение, состоящее из двух символов: пробела и знака «+». На языке регулярных выражений знак «+» означает, что предшествующий символ может повторяться один или более раз. Именно благодаря знаку «+» (одному из так называемых квантификаторов) несколько подряд расположенных пробелов считаются одним разделителем.

Обратите внимание на то, что метод Split вызывается не для объекта, а для класса Regex, т. е. этот метод является классовым. Все основные методы класса Regex реализованы в двух вариантах: классовом и экземплярном. Классовые методы проще использовать, тогда как экземплярные позволяют добиться большей эффективности, если одно и то же регулярное выражение надо применять к различным строкам (экземплярные методы класса Regex мы рассмотрим в одном из последующих примеров).

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

foreach m: Match in Regex.Matches(s, '\w+') do

Write(m.Index); 

Например, при обработке строки

Каучук   барабан  алгебра  диафрагма

на экран будет выведен следующий текст (символы строки индексируются от 0):

0 9 18 27

Обсудим приведенный фрагмент программы. В нем был использован метод Matches, который позволяет найти все фрагменты исходной строки, удовлетворяющие указанному регулярному выражению. В данном случае в регулярном выражении, кроме уже известного нам квантификатора «+», была использована специальная директива \w, обозначающая любой словообразующий (т. е. алфавитно-цифровой) символ. Найденные вхождения возвращаются в виде коллекции типа MatchCollection, элементы которой можно перебрать с помощью цикла foreach. Каждый элемент коллекции имеет тип Match. Набор свойств этого типа позволяет получить не только строковое значение найденного вхождения (свойство Value), но и дополнительную информацию о нем, в частности, индекс, начиная с которого это вхождение содержится в исходной строке (свойство Index), а также длину найденного вхождения (свойство Length).

В рассмотренных примерах мы использовали квантификатор «+», означающий одно или более вхождений ранее указанного символа (или одного из элементов указанного множества символов). Все квантификаторы по умолчанию являются «жадными», т. е. они «пытаются захватить» как можно больше символов из исходной строки. Квантификатор перестанет захватывать символы только в том случае, если захват очередного символа приведет к тому, что результат не будет удовлетворять регулярному выражению. Так, в последнем примере квантификатор захватит все символы первого слова и попытается захватить следующий за ним пробел, однако при этом результат не будет удовлетворять регулярному выражению, поэтому квантификатор «вернет обратно» захваченный пробел и «удовлетворится» ранее захваченным первым словом.

В классе Regex имеются еще два метода, предназначенных для поиска в строке и имеющих те же параметры, что и метод Matches: это IsMatch и Match. Метод IsMatch проверяет, имеются ли в исходной строке требуемые вхождения, и в зависимости от результата поиска возвращает значение True или False. Метод Match возвращает первое найденное вхождение в виде объекта типа Match (если ни одно вхождение на найдено, то свойство Success возвращенного объекта будет равно False). Заметим, что, имея объект типа Match, мы можем продолжить поиск в текущей строке, используя для этого его метод NextMatch.

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

Текст   Клавиатура  Поле    Монитор

должна быть преобразована в следующую:

<Текст>   Клавиатура  <Поле>    Монитор.

Метод класса Regex, предназначенный для замены, имеет имя Replace. Он имеет больше параметров, чем рассмотренные ранее методы, так как, помимо исходной строки и регулярного выражения, определяющего, что надо искать, требуется указать, как именно изменять найденные вхождения. В простых случаях достаточно указать строку - выражение замены, в более сложных ситуациях можно определить функцию, обрабатывающую каждое найденное вхождение и возвращающую строку, которая должна его заменить. В выражениях замены можно указывать, помимо обычных символов, специальные управляющие последовательности (подстановки), соответствующие исходной строке или ее фрагментам. Одной из таких подстановок является $0, означающая текущее найденное вхождение. Метод Replace возвращает строку, в которой выполнены все требуемые замены.

При решении задачи нам надо использовать особый квантификатор, который явно определяет количество повторений требуемых символов. Если допускается ровно N повторений, то подобный квантификатор имеет вид {N}; если число повторений может меняться от M до N, то надо использовать вариант {M,N}.

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

Writeln(Regex.Replace(s, '\w{1,5}', '<$0>'));

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

<Текст>   <Клави><атура>  <Поле>    <Монит><ор>

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

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

В нашем случае проще всего воспользоваться директивой \b, обозначающей границу слова, т. е. позицию в строке, разделяющую начало/конец слова и предшествующий/следующий пробел (или другой символ-разделитель) или начало/конец строки. Для того чтобы регулярное выражение выделяло из строки полные слова, достаточно добавить директиву \b в его начало и конец:

Writeln(Regex.Replace(s, '\b\w{1,5}\b', '<$0>'));

С использованием данного варианта регулярного выражения задача будет решена правильно.
Иногда требуется выполнить замену только для некоторого количества начальных вхождений нужных подстрок. Например, в нашей задаче можно дополнительно потребовать, чтобы в угловые скобки было заключено только первое из слов, имеющих длину не более 5 символов. Такая возможность отсутствует в классовом методе Replace, однако имеется в одноименном экземплярном методе. Таким образом, для решения задачи надо создать экземпляр класса Regex и вызвать для него метод Replace:

var r := new Regex('\b\w{1,5}\b');

Writeln(r.Replace(s, '<$0>', 1));

В результате будет выведена строка

<Текст>   Клавиатура  Поле    Монитор.

Для объекта r типа Regex можно вызывать все ранее рассмотренные методы класса Regex: Split, IsMatch, Match, Matches и Replace. При этом само регулярное выражение не указывается, так как оно определяется в конструкторе объекта, однако можно указать дополнительные параметры, отсутствующие в одноименных классовых методах (например, можно дополнительно указать индекс символа исходной строки, начиная с которого нужно выполнять требуемое действие).

Довольно часто при замене приходится выполнять преобразования, которые нельзя описать в виде выражения замены, даже если использовать в нем специальные подстановки. Предположим, что нам требуется добавить к каждому слову исходной строки информацию о его длине, заключив ее в круглые скобки (например, строку Текст надо заменить на Текст(5). Для выполнения подобных «сложных» замен предусмотрен вариант метода Replace, в котором в качестве параметра, определяющего способ замены, указывается не строка, а делегат (процедурная переменная). Этот делегат должен указывать на функцию, которая определяет, каким образом надо преобразовывать каждое найденное вхождение в исходной строке. Единственным параметром данной функции должно быть текущее найденное вхождение (типа Match), а возвращаемым значением является строка, на которую надо заменить найденное вхождение.

Воспользуемся данным вариантом метода Replace, предварительно описав требуемую функцию:

function AddLength(m: Match): string;

begin

result := m.Value + '(' + IntToStr(m.Length) + ')';

end;

...

Writeln(Regex.Replace(s, '\w+', AddLength));

При обработке приведенной ранее тестовой строки будет выведена строка

Текст(5)   Клавиатура(10)  Поле(4)    Монитор(7)

Заметим, что без предварительного описания функции AddLength можно обойтись, если воспользоваться соответствующим лямбда-выражением, указав его в качестве третьего параметра метода Replace:

Writeln(Regex.Replace(s, '\w+',(m: Match) -> m.Value + '(' + IntToStr(m.Length) + ')'));

Еще одним важным элементом языка регулярных выражений являются группы. Группу образует часть регулярного выражения, заключенная в круглые скобки. Приведем простейший пример использования группы: (ab)+. Данное выражение означает строку, в которой текст ab повторяется один или более раз (например, ababab). Понятно, что без группирования символов смысл выражения будет другим: ab+ означает строку, начинающуюся с символа a, за которым следует один или более символов b (например, abbb).

Однако простой группировкой роль групп в языке регулярных выражений не ограничивается. Каждая группа в регулярном выражении получает свой порядковый номер и может быть использована в последующих фрагментах регулярного выражения с помощью специальной директивы \N, где N - порядковый номер группы (можно также присваивать некоторым группам имена-идентификаторы - см. третью часть статьи). Порядок нумерации групп определяется по расположению их открывающих скобок. Нумерация групп начинается от 1 (все найденное вхождение также считается группой; этой особой группе присваивается номер 0).

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

foreach a: match in Regex.Matches(s, '\b(\w)\w*\1\b') do

write(a.Value, ' ');

Если строка s содержит текст Каучук   барабан  алгебра  диафрагма, то на экран будет выведено слово алгебра.
Обсудим смысл элементов регулярного выражения. В начале и конце выражения указываются директивы нулевой длины \b, обеспечивающие поиск полных слов (если не указывать эти директивы, то при обработке этой же строки мы получим следующий результат: учу бараб алгебра афрагма). Далее указывается один словообразующий символ, заключенный в скобки и тем самым превращенный в первую группу нашего регулярного выражения. После этого указывается словообразующий символ, снабженный квантификатором «*»; этот квантификатор означает, что предшествующий элемент регулярного выражения может повторяться 0 или более раз. Наконец, указывается специальная директива \1, означающая, что на данной позиции должен находится текст, совпадающий с текстом ранее найденной первой группы.

Приведенное решение имеет два недочета. Первый недочет очевиден: при подобном поиске естественно было бы включить в список найденных слов и слово «Каучук», несмотря на то что оно начинается с заглавной буквы. Для исправления этого недочета достаточно в методе Matches указать в качестве последнего параметра соответствующую опцию поиска:

foreach a: match in Regex.Matches(s, '\b(\w)\w*\1\b', RegexOptions.IgnoreCase) do

Write(a.Value, ' ');

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

foreach a: match in Regex.Matches(s, '(?i)\b(\w)\w*\1\b') do

Write(a.Value, ' ');

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

(?i)\b(\w)\w*\1\b|\b\w\b

Нетрудно заметить, что в начале и конце любого из двух вариантов содержатся директивы \b. Чтобы не указывать эту пару директив дважды, ее можно вынести за знак операции |:

(?i)\b((\w)\w*\2|\w)\b

Обратите внимание на то, что теперь группа (\w) стала второй по счету группой регулярного выражения, поэтому необходимо соответствующим образом откорректировать директиву обращения к этой группе.

Следующий пример демонстрирует дополнительные возможности, которые предоставляет использование групп при замене подстрок. Предположим, что имеется строка, содержащая несколько дат в «американском» формате: «месяц/день/год», причем в качестве разделителя может использоваться как косая черта «/», так и точка «.». Значения месяцев и дней могут указываться одной или двумя цифрами, а значения лет - четырьмя цифрами. Будем считать, что все даты в указанном формате, содержащиеся в исходной строке, являются правильными и отделяются от предшествующих и последующих слов по крайней мере одним пробелом (либо находятся в начале или конце строки). Требуется преобразовать все подобные даты к «российскому» формату «день/месяц/год», сохранив тот же разделитель, который использовался в исходной дате.

Чтобы получить наиболее простой вариант решения данной задачи, нам необходимо познакомиться еще с тремя элементами языка регулярных выражений. Первые два из них относятся к директивам, определяющим множество символов (подобным ранее рассмотренной директиве \w): это директива \d, означающая любую десятичную цифру, и «универсальная» директива для определения множества, имеющая вид [символы], где в квадратных скобках указываются все символы, допустимые для данного множества (более подробное описание данной директивы и ее вариантов приводится в третьей части статьи).

Третий элемент относится к подстановкам, используемым в выражениях замены: это подстановка вида $N, где N - некоторое положительное целое число. Данная подстановка заменяется на группу номер N, содержащуюся в текущем найденном вхождении (или на пустую строку, если группа номер N в текущем вхождении отсутствует).

С использованием этих новых средств языка регулярных выражений решение задачи примет следующий вид:

Writeln(Regex.Replace(s, '\b(\d{1,2})([./])(\d{1,2})\2(\d{4})\b', '$3$2$1$2$4'));

Если строка s равна '12/30/1998  1.3.2001  обычный текст  10/2/2002', то в результате выполнения указанного оператора на экран будет выведена строка

30/12/1998  3.1.2001  обычный текст  2/10/2002

В использованном регулярном выражении были определены четыре группы: первая связана с месяцем, вторая - с символом-разделителем, третья - с днем и четвертая - с годом. Все эти группы, только в другом порядке, используются в третьем параметре, определяющем выражение замены.
Завершая обсуждение возможностей, связанных с группами, отметим, что в классе Match имеется свойство Groups типа GroupCollection, доступное только для чтения и позволяющее получить информацию обо всех группах, связанных с найденным вхождением (группы индексируются от 0, причем группа номер 0 совпадает со всем найденным вхождением). 

ЗАКЛЮЧЕНИЕ

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

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

Основным компонентом системы программирования Turbo Pascal является компилятор языка. Кроме него в систему входят средства для создания софта, его редактирования и средства для поиска ошибок, так называемые инструменты отладки. 

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

Недостатки Паскаль

Несмотря на все достоинства, есть у него и слабые стороны. Их не так много, но они могут оттолкнуть современных программистов:

  1. Этот язык создали в 60-х годах. Соответственно, в наше время он считается уже устаревшим.
  2. Используется в основном только в странах бывшего Советского Союза. 
  3. В действительности очень мало реального ПО. 

СПИСОК ЛИТЕРАТУРЫ

1. PASCAL-XSC. Язык численного программирования / Р. Клатте и др. - М.: НИЦ «Регулярная и хаотическая динамика», 2016. - 352 c.

2. Абрамов, В. Г. Введение в язык паскаль / В.Г. Абрамов, Н.П. Трифонов, Г.Н. Трифонова. - М.: Наука, 2013. - 320 c.

3. Андреева, Т. А. Программирование на языке Pascal / Т.А. Андреева. - М.: Интернет-университет информационных технологий, Бином. Лаборатория знаний, 2013. - 240 c.

4. Арсак, Ж. Программирование игр и головоломок / Ж. Арсак. - М.: Главная редакция физико-математической литературы издательства «Наука», 2016. - 224 c.

5. Аручиди, Н. А. Компьютер в работе бухгалтера / Н.А. Аручиди. - М.: Феникс, 2016. - 368 c.

6. Гагарина, Л. Г. Компьютерный практикум для менеджеров / Л.Г. Гагарина, Е.М. Портнов, И.С. Холод. - М.: Финансы и статистика, 2014. - 352 c.

7. Грызлов, В. И. Турбо Паскаль 7.0 / В.И. Грызлов, Т.П. Грызлова. - М.: ДМК, 2016. - 416 c.

8. Епанешников, А. М. Программирование в среде Turbo Pascal 7.0 / А.М. Епанешников, В.А. Епанешников. - М.: Диалог-Мифи, 2011. - 368 c.

9. Зеленяк, О. П. Современный задачник по Турбо Паскалю / О.П. Зеленяк. - М.: ДМК Пресс, 2014. - 312 c.

10. Карпов, Александр Постановка и автоматизация управленческого учета / Александр Карпов. - М.: Результат и качество, 2011. - 504 c.

11. Касторнова, В. А. Структуры данных и алгоритмы их обработки на языке программирования Паскаль / В.А. Касторнова. - М.: БХВ-Петербург, 2016. - 304 c.

12. Кашаев, С. М. Паскаль для школьников. Подготовка к ЕГЭ (+ CD-ROM) / С.М. Кашаев, Л.В. Шерстнева. - М.: БХВ-Петербург, 2011. - 336 c.

13. Кашаев, С. М. Паскаль для школьников. Подготовка к ЕГЭ / С.М. Кашаев, Л.В. Шерстнева. - М.: БХВ-Петербург, 2011. - 336 c.

14. Кетков, А. Практика программирования Бейсик, Си, Паскаль / А. Кетков, Ю. Кетков. - М.: БХВ-Петербург, 2011. - 480 c.

15. Кетков, Александр Практика программирования: Бейсик, Си, Паскаль. Самоучитель (+ дискета) / Александр Кетков , Юлий Кетков. - М.: БХВ-Петербург, 2013. - 480 c.

16. Кетков, Ю. Л. Свободное программное обеспечение. FREE PASCAL для студентов и школьников (+ CD) / Ю.Л. Кетков, А.Ю. Кетков. - М.: БХВ-Петербург, 2011. - 376 c.

17. Кетков, Ю. Л. Свободное программное обеспечение. FREE PASCAL для студентов и школьников / Ю.Л. Кетков, А.Ю. Кетков. - М.: БХВ-Петербург, 2011. - 384 c.

18. Климова, Л. М. Pascal 7.0. Практическое программирование. Решение типовых задач / Л.М. Климова. - М.: КУДИЦ-Образ, 2014. - 528 c.

19. Кореневская, О. В. Турбо Паскаль 7.0 / О.В. Кореневская. - М.: НТ Пресс, 2014. - 144 c.

20. Культин, Н. Turbo Pascal в задачах и примерах / Н. Культин. - М.: БХВ-Петербург, 2012. - 256 c.

21. Культин, Н. Программирование в Turbo Pascal 7.0 и Delphi / Н. Культин. - М.: БХВ-Петербург, 2011. - 400 c.

22. Культин, Никита Программирование в Turbo Pascal 7.0 и Delphi (+ CD-ROM) / Никита Культин. - М.: БХВ-Петербург, 2012. - 390 c.

23. Малыхина, М. П. Программирование на языке высокого уровня Turbo Pascal / М.П. Малыхина. - М.: БХВ-Петербург, 2012. - 544 c.

24. Моргун, А. Н. Решение задач средствами языка Turbo Pascal 7.0 / А.Н. Моргун. - М.: Юниор, 2011. - 216 c.

25. Перминов, О.Н. Язык программирования Паскаль. Справочник / О.Н. Перминов. - М.: Радио и связь, 2015. - 128 c.

26. Рапаков, Г. Turbo Pascal для студентов и школьников / Г. Рапаков, С. Ржеуцкая. - М.: БХВ-Петербург, 2012. - 352 c.

27. Семашко, Г. Л. Программирование на языке паскаль / Г.Л. Семашко, А.И. Салтыков. - М.: Главная редакция физико-математической литературы издательства «Наука», 2015. - 128 c.