188
Содержание Введение ………………………………………………………………………………………..1 1. Основные принципы алгоритмизации и программирования …………………………….1 1.1. Основные понятия алгоритма……………………………………………………………..1 1.2. Языки и системы программирования. Методы программирования……………………5 2. Язык программирования Delphi………………………………………………………..….13 2.1. Основные составляющие среды программирования Delphi…………………………...13 2.2. Разработка программ с разветвлениями………………………………………………...23 2.3. Инструкции цикла. Массивы…………………………………………………………….25 2.4. Процедуры и функции……………………………………………………………………38 2.5 Модули…………………………………………………………………………………………..44 2.6 Символы и строки…………………………………………………………………………..46 2.7. Структурированные типы данных……………………………………………………..…52 2.8. Файлы…………………………………………………………………………………………...55 2.9. Классы и объекты………………………………………………………………………....60 Список использованных источников………………………………………………………....64

dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

  • Upload
    others

  • View
    18

  • Download
    0

Embed Size (px)

Citation preview

Page 1: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Содержание

Введение ………………………………………………………………………………………..1

1. Основные принципы алгоритмизации и программирования …………………………….1

1.1. Основные понятия алгоритма……………………………………………………………..1

1.2. Языки и системы программирования. Методы программирования……………………5

2. Язык программирования Delphi………………………………………………………..….13

2.1. Основные составляющие среды программирования Delphi…………………………...13

2.2. Разработка программ с разветвлениями………………………………………………...23

2.3. Инструкции цикла. Массивы…………………………………………………………….25

2.4. Процедуры и функции……………………………………………………………………38

2.5

Модули…………………………………………………………………………………………..44

2.6 Символы и строки…………………………………………………………………………..46

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

2.8.

Файлы…………………………………………………………………………………………...55

2.9. Классы и объекты………………………………………………………………………....60

Список использованных источников………………………………………………………....64

Page 2: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Введение

Изучение основ программирования является важным при подготовке

квалифицированных технических специалистов. В конспекте лекций приводятся

принципы алгоритмизации и программирования, основы языка программирования Delphi.

При этом в ходе освоения студентами языка Delphi сложным для понимания нередко

оказывается материал по структурированным типам данных. Существует необходимость в

подробном описании таких структурированных типов данных языка Delphi, как строки,

множества, записи и файлы. Отдельный раздел посвящен объектно-ориентированному

программированию. О них и идет речь в лекционном материале – каждый из разделов

посвящен определенному типу данных; кроме теоретических сведений приведены

примеры программ.

Раздел 1. Основные принципы алгоритмизации и программирования

Тема 1.1. Основные понятия алгоритма

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

процессов.

Алгоритм – совокупность действий, приводящих к достижению результата за

конечное число шагов. Свойства алгоритмов:

1. Дискретность (от лат. discretus — разделенный,

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

(шагов).

2. Детерминированность (от лат. determinate —

определенность, точность) - любое действие алгоритма должно быть строго и

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

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

конкретный номер маршрута 5. Кроме того, необходимо указать точное количество

остановок, которое надо проехать, скажем, три.

3. Конечность – каждое действие в отдельности и алгоритм в

целом должны иметь возможность завершения.

4. Массовость – один и тот же алгоритм можно использовать

с разными исходными данными.

5.Результативность – алгоритм должен приводить к достоверному решению.

Основная цель алгоритмизации – составление алгоритмов для ЭВМ с дальнейшим

решением задачи на ЭВМ. Существует несколько способов записи алгоритмов. На

практике наиболее распространены следующие формы представления алгоритмов:

Page 3: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

1. словесная (запись на естественном языке);

2. псевдокоды (полуформализованные описания алгоритмов на условном

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

фразы естественного языка, общепринятые математические обозначения и др.);

3. графическая (изображения из графических символов – блок-схема);

4. программная (тексты на языках программирования – код программы).

Словесный способ не имеет широкого распространения, так как такие описания:

строго не формализуемы; страдают многословностью записей; допускают

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

Псевдокод занимает промежуточное место между естественным и формальным

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

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

псевдокоде используются некоторые формальные конструкции и математическая

символика, что приближает запись алгоритма к общепринятой математической записи. В

псевдокоде не приняты строгие синтаксические правила для записи команд, присущие

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

возможность использовать более широкий набор команд, рассчитанный на абстрактного

исполнителя. Однако в псевдокоде обычно имеются некоторые конструкции, присущие

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

на формальном языке.

Виды алгоритмических процессов. Одним из свойств алгоритма является

дискретность – возможность расчленения процесса вычислений, предписанных

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

определенной структурой. Можно выделить и наглядно представить графически три

простейшие структуры: последовательность двух или более операций, выбор

направления, повторение. Любой вычислительный процесс может быть представлен как

комбинация этих элементарных алгоритмических структур. Вычислительные процессы,

выполняемые на ЭВМ по заданной программе, можно разделить на три основных вида:

линейные, разветвляющиеся, циклические.

Линейным принято называть вычислительный процесс, в котором операции

выполняются последовательно, в порядке их записи.

Вычислительный процесс называется разветвляющимся, если для его реализации

предусмотрено несколько направлений (ветвей).

Циклическими называются алгоритмы, содержащие циклы. Цикл – это многократно

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

Page 4: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

названными выше типами блоков. К примеру, в линейном алгоритме могут

присутствовать все блоки, кроме блока условия. В разветвляющемся и циклическом

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

является блок условия. Внутри блока условия записывается условие, про которое можно

однозначно ответить, истинно оно или ложно. Если условие истинно, то выполняются

действия, соответствующие стрелке "да", иначе стрелке "нет".

Понятие блок-схемы. Основные виды блоков. Блок-схема – это графическая

реализация алгоритма. Блок-схема представляет собой удобный и наглядный способ

записи алгоритма. Блок-схема состоит из функциональных блоков разной формы,

связанных между собой стрелками. В каждом блоке описывается одно или несколько

действий. Основные виды блоков представлены на рисунке 1.

Рисунок 1

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

– блока и дополняется словесным описанием. Блоки в блок-схемах соединяются линиями

потока информации. Направление потока информации указывается стрелкой. В случае

потока информации сверху вниз и слева направо стрелку ставить не обязательно. Блоки в

блок-схеме имеют только один вход и один выход (за исключением логического блока –

блока с условием).

Тема 1.2. Языки и системы программирования. Методы программирования

1.2.1 Эволюция языков программирования. Классификация языков

программирования. Эволюция языков программирования. Классификация языков

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

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

Page 5: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Методы программирования: структурный, модульный, объектный. Достоинства и

недостатки методов программирования. Общие принципы разработки программного

обеспечения. Жизненный цикл программного обеспечения.

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

обеспечения (т.е. программного обеспечения, служащего для создания программных

средств в любой проблемной области) рассматривают пять поколений языков

программирования (ЯП). ЯП первого поколения представляли собой набор машинных

команд в двоичном (бинарном) или восьмеричном формате, который определялся

архитектурой конкретной ЭВМ. Каждый тип ЭВМ имел свой ЯП, программы на котором

были пригодны только для данного типа ЭВМ. Второе поколение ЯП характеризуется

созданием языков ассемблерного типа (ассемблеров, макроассемблеров), позволяющих

вместо двоичных и других форматов машинных команд использовать их мнемонические

символьные обозначения (имена). Являясь существенным шагом вперед, ассемблерные

языки все еще оставались машинно-зависимыми, а программист все также должен был

быть хорошо знаком с организацией и функционированием аппаратной среды

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

для чтения, трудоемки при отладке и требуют больших усилий для переноса на другие

типы ЭВМ. Однако и сейчас ассемблерные языки используются при необходимости

разработки высокоэффективного программного обеспечения (минимального по объему и

с максимальной производительностью). Третье поколение ЯП начинается с появления в

1956 г. первого языка высокого уровня — Fortran, разработанного под руководством Дж.

Бэкуса в фирме IBM. За короткое время Fortran становится основным ЯП при решении

инженерно-технических и научных задач. Первоначально Fortran обладал весьма

ограниченными средствами обеспечения работы с символьной информацией и с системой

ввода-вывода. Однако постоянное развитие языка сделало его одним из самых

распространенных ЯВУ на ЭВМ всех классов — от микро- до суперЭВМ, а его версии

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

Вскоре после языка Fortran появились такие ныне широко известные языки, как Algol,

Cobol, Basic, PL/1, Pascal, APL, ADA, C, Forth, Lisp, Modula и др. В настоящее время

насчитывается свыше 2000 различных языков высокого уровня. Языки четвертого

поколения носят ярко выраженный непроцедурный характер, определяемый тем, что

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

формируются скорее соотношения, а не последовательности шагов выполнения

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

используемые для задач искусственного интеллекта (например, Prolog, Langin). Так как

Page 6: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

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

значительно более пригодны для применения непрофессионалами в области

программирования. Второй тенденцией развития ЯП четвертого поколения являются

объектно-ориентированные языки, базирующиеся на понятии программного объекта,

впервые использованного в языке Simula-67 и составившего впоследствии основу

известного языка SmallTalk. Программный объект состоит из структур данных и

алгоритмов, при этом каждый объект знает, как выполнять операции со своими

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

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

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

и в традиционных ЯП третьего поколения, но при этом проще в использовании. Среди

языков запросов фактическим стандартом стал язык SQL (StructuredQueryLanguage). И,

наконец, четвертым направлением развития являются языки па- раллельного

программирования (модификация ЯВУ Fortran, языки Occam, SISAL, FP и др.), которые

ориентированы на создание программного обеспечения для вычислительных средств

параллельной архитектуры (многомашинные, мультипроцессорные среды и др.), в

отличие от языков третьего поколения, ориентированных на традиционную

однопроцессорную архитектуру. К интенсивно развивающемуся в настоящее время

пятому поколению относятся языки искусственного интеллекта, экспертных систем, баз

знаний (InterLisp, ExpertLisp, IQLisp, SAIL и др.), а также естественные языки, не

требующие освоения какого-либо специального синтаксиса (в настоящее время успешно

используются естественные ЯП с ограниченными возможностями — Clout, Q&A, HAL и

др.).

Основными элементами языков программирования являются: символы - неделимые

знаки;

элементарные конструкции – минимальные единицы, имеющие определенный смысл 

(имена, числа, метки, директивы и т.д.); выражения – задают правило вычисления

некоторого значения; описания – сведения о данных; операторы – предписания о

выполнении конкретных действий.

Система программирования - программная система, предназначенная для

разработки программ на конкретном языке программирования. Система

программирования предоставляет пользователю специальные средства разработки

программ: транслятор, (специальный) редактор текстов программ, библиотеки

стандартных подпрограмм, программную документацию, отладчик и др.

Page 7: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Программа, подготовленная на языке высокого уровня, проходит несколько этапов:

1. этап. В текстовом редакторе пишется исходный код программы на алгоритмическом языке (source code) и сохраняется в файле с расширением *.pas.

2 этап. Трансляция, происходит преобразование исходного кода программы (source code) в объектный код(object code), т.е. происходит проверка синтаксиса написания операторов, и если ошибок в написании нет, осуществляется перевод на язык машинных кодов. Файл объектного кода имеет расширение *.obj;

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

Трансляторы делятся на два класса: компиляторы (compiler) и интерпретаторы (interpreter). Компиляторы транслируют всю программу, но без ее выполнения. Интерпретаторы, в отличие от компиляторов, выполняют пооператорный перевод на машинный языки выполнение всей программы.

3. этап. Компоновка, когда происходит обработка объектного кода редактором связей, специальной программой осуществляющей построение загрузочного модуля (load module), пригодного к выполнению (рис 16.).

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

Методы программирования: структурный, модульный, объектный. Достоинства и

недостатки методов программирования. Общие принципы разработки программного

обеспечения. Жизненный цикл программного обеспечения. Модульное программирование

— это такой способ программирования, при котором вся программа разбивается на группу

компонентов, называемых модулями, причем каждый из них имеет свой контролируемый

размер, четкое назначение и детально проработанный интерфейс с внешней средой.

Page 8: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Единственная альтернатива модульности — монолитная программа. Определения модуля

и его примеры. Модуль — это совокупность команд, к которым можно обратиться по

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

элементы и идентификатор (возможно агрегатный).

Функциональная спецификация модуля должна включать:

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

на используемом языке программирования синтаксически правильное обращение к нему;

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

Разновидности модулей. Существуют три основные разновидности модулей:

1) "Маленькие" (функциональные) модули, реализующие, как правило, одну

какую-либо определенную функцию. Основным и простейшим модулем практически

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

a)"Средние" (информационные) модули, реализующие, как правило, несколько

операций или функций над одной и той же структурой данных (информационным

объектом), которая считается неизвестной вне этого модуля.

2) "Большие” (логические) модули, объединяющие набор "средних" или "маленьких"

модулей. Примеры "больших" модулей в языках программирования:

Набор характеристик модуля предложен Майерсом. Он состоит из следующих

конструктивных характеристик:

1) размера модуля;

В модуле должно быть 7 (+/-2) конструкций (например, операторов для функций

или функций для пакета). Модуль (функция) не должен превышать 60 строк. В

результате его можно поместить на одну страницу распечатки или легко просмотреть на

экране монитора.

2) прочности (связности) модуля;

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

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

оператора безусловного перехода goto. Локальность данных дает возможность легко

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

(прочность) модуля (cohesion) — мера независимости его частей. Чем выше связность

модуля — тем лучше, тем больше связей по отношению к оставшейся части программы

он упрятывает в себе. Можно выделить типы связности, приведенные ниже.

Функциональная связность. Модуль с функциональной связностью реализует одну

какую-либо определенную функцию и не может быть разбит на 2 модуля с теми же

типами связностей.

Page 9: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Последовательная связность. Модуль с такой связностью может быть разбит на

последовательные части, выполняющие независимые функции, но совместно

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

использован сначала для оценки, а затем для обработки данных.

Информационная (коммуникативная) связность. Модуль с информационной

связностью — это модуль, который выполняет несколько операций или функций над

одной и той же структурой данных (информационным объектом), которая считается

неизвестной вне этого модуля. Эта информационная связность применяется для

реализации абстрактных типов данных.

3) сцепления модуля с другими модулями;

Сцепление (coupling) — мера относительной независимости модуля от других

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

модулей. Чем слабее сцепление модуля, тем лучше. Рассмотрим различные типы

сцепления.

Независимые модули — это идеальный случай. Модули ничего не знают друг о

друге. Организовать взаимодействие таких модулей можно, зная их интерфейс и

соответствующим образом перенаправив выходные данные одного модуля на вход

другого. Достичь такого сцепления сложно, да и не нужно, поскольку сцепление по

данным (параметрическое сцепление) является достаточно хорошим.

Сцепление по данным (параметрическое) — это сцепление, когда данные

передаются модулю, как значения его параметров, либо как результат его обращения к

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

в языках программирования при обращении к функциям (процедурам). Две

разновидности этого сцепления определяются характером данным.

-сцепление по простым элементам данных.

-сцепление по структуре данных. В этом случае оба модуля должны знать о

внутренней структуре данных.

4) рутинности (независимость от предыдущих обращений) модуля.

Рутинность — это независимость модуля от предыдущих обращений к нему (от

предыстории). Будем называть модуль рутинным, если результат его работы зависит

только от количества переданных параметров (а не от количества обращений).

Структурное программирование возникло как вариант решения проблемы

уменьшения сложности разработки программного обеспечения. Цель структурного

программирования - повышение надежности программ, обеспечение сопровождения и

модификации, облегчение и ускорение разработки. Методология структурного

Page 10: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

программирования — подход, заключающийся в задании хорошей топологии императивных

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

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

независимости от других модулей. Подход базируется на двух основных принципах:

последовательная декомпозиция алгоритма решения задачи сверху вниз, использование

структурного кодирования. Методы и концепции, лежащие в основе структурного

программирования.

Метод алгоритмической декомпозиции сверху вниз — заключается в пошаговой

детализации постановки задачи, начиная с наиболее общей задачи. Данный метод

обеспечивает хорошую структурированность. Метод поддерживается концепцией

алгоритма.

Метод модульной организации частей программы — заключается в разбиении

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

концепцией модуля.

Метод структурного кодирования — заключается в использовании при кодировании

трех основных управляющих конструкций. Метки и оператор безусловного перехода

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

поддерживается концепцией управления.

При использовании для построения программы метода, известного под названием

структурное программирование, программа конструируется иерархически - сверху вниз

(от главной программы к подпрограммам самого нижнего уровня), с употреблением на

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

последовательностей инструкций, циклов и некоторых видов условных разветвлений. При

последовательном проведении этого метода структуру результирующих алгоритмов легко

понимать, отлаживать и модифицировать.

Теорема о структурировании: Всякую правильную программу (т.е. программу с

одним входом и одним выходом без зацикливаний и недостижимых веток) можно

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

и повторение цикла

Следствие 1: Всякую программу можно привести к форме без оператора goto.

Следствие 2: Любой алгоритм можно реализовать в языке, основанном на трех

управляющих конструкциях -последовательность, цикл, повторение.

Следствие 3: Сложность структурированных программ ограничена, даже в случае их

неограниченного размера.

Page 11: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Метод структурного программирования оказался эффективен при написании

программ «ограниченной сложности». Однако с возрастанием сложности реализуемых

программных проектов и, соответственно, объема кода создаваемых программ,

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

Основной причиной возникших проблем можно считать то, что в программе не

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

ними. При попытке анализа и модификации текста программы программист вынужден

был оперировать искусственными категориями. Чтобы писать все более сложные

программы, необходим был новый подход к программированию. В итоге были

разработаны принципы объектно-ориентированного программирования. OOП

аккумулирует лучшие идеи, воплощённые в структурном программировании, и сочетает

их с мощными новыми концепциями, которые позволяют по-новому организовывать ваши

программы. Надо сказать, что теоретические основы ООП были заложены еще в 70-х

годах прошлого века, но практическое их воплощение стало возможно лишь в середине

80-х, с появлением соответствующих технических средств.

Методология ООП использует метод объектной декомпозиции, согласно которому

структура системы (статическая составляющая) описывается в терминах объектов и

связей между ними, а поведение системы (динамическая составляющая) - в терминах

обмена сообщениями между объектами. Сообщения могут быть как реакцией на события,

вызываемые как внешними факторами, так и порождаемые самими объектами. Объектно-

ориентированные программы называют «программами, управляемыми от событий», в

отличие от традиционных программ, называемых «программам, управляемыми от

данных». Основные методы и концепции ООП. Метод объектно-ориентированной

декомпозиции – заключается в выделении объектов и связей между ними. Метод

поддерживается концепциями инкапсуляции, наследования и полиморфизма. Метод

абстрактных типов данных – метод, лежащий в основе инкапсуляции. Поддерживается

концепцией абстрактных типов данных. Метод пересылки сообщений – заключается в

описании поведения системы в терминах обмена сообщениями между объектами.

Поддерживается концепцией сообщения.

В объектно-ориентированном программировании определяют три основных свойства:

Инкапсуляция. Это сокрытие информации и комбинирование данных и функций

(методов) внутри объекта.

Наследование. Построение иерархии порожденных объектов с возможностью для

каждого такого объекта-наследника доступа к коду и данным всех порождающих

Page 12: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

объектов-предков. Построение иерархий является достаточно сложным делом, так как при

этом приходится выполнять классифицирование.

Полиморфизм (полиморфизм включения) — присваивание действию одного имени,

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

иерархии выполняет это действие способом, подходящим именно ему.

Методология проектирования программного обеспечения описывает процесс создания

и сопровождения систем в виде жизненного цикла (ЖЦ), представляя его как некоторую

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

определяются состав и последовательность выполняемых работ, получаемые результаты,

методы и средства, необходимые для выполнения работ, роли и ответственность

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

системой в процессе ее создания и использования.

Модель жизненного цикла отражает различные состояния системы, начиная с момента

возникновения необходимости в данного ПО и заканчивая моментом полного выхода из

употребления. Модель жизненного цикла - структура, содержащая процессы, действия и

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

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

завершения ее использования.

В настоящее время известны и используются следующие модели жизненного цикла:

Каскадная модель) предусматривает последовательное выполнение всех этапов

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

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

Разработка ведется итерациями с циклами обратной связи между этапами. Межэтапные

корректировки позволяют учитывать реально существующее взаимовлияние результатов

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

период разработки. Спиральная модель. На каждом витке спирали выполняется создание

очередной версии продукта, уточняются требования проекта, определяется его качество и

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

разработки - анализу и проектированию, где реализуемость тех или иных технических

решений проверяется и обосновывается посредством создания прототипов

(макетирования).

На практике наибольшее распространение получили две основные модели жизненного

цикла: каскадная модель (характерна для периода 1970-1985 гг.); спиральная модель

(характерна для периода после 1986.г.).

Page 13: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

2. Язык программирования Delphi

2.1 Основные составляющие среды программирования Delphi.

Характеристика проекта: состав проекта, параметры проекта. Язык

программирования Delphi: алфавит, словарь языка, структура программы. Простые типы

данных. Выражения и операции. Константы. Переменные. Приемы работы в среде

программирования Delphi. Delphi – интегрированная среда разработки (Integrated

Development Environment – IDE). Delphi дает возможность создавать программы в стиле

визуального конструирования формы, разместив на ней какие-либо визуальные элементы.

Delphi имеет сложный интерфейс.

В Delphi имеются 10 окон, но после загрузки появляются четыре окна:

главное окно Delphi - <имя проекта>;

окно с формой для проектирования приложения Form1 (окно проектировщика

формы);

окно инспектора объектов Object Inspector;

окно редактора кода Unit1.pas.

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

программы. Главное управляющее окно системы Delphi обычно располагается в

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

выглядит наиболее загруженным из всех окон.

Это окно содержит:

строку заголовка;

строку меню;

панель инструментов;

палитру компонентов.

Строка заголовка главного окна отображает имя открытого в данный момент

проекта Project1. Под строкой заголовка окна системы располагается строка меню,

содержащая команды системы Delphi. Строка меню содержит команды, необходимые для

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

Windows. Строка меню — это очень важный элемент управления любой программы или

системы. Кроме строки меню программы обычно содержат и другие элементы

управления: командные кнопки, кнопки инструментов и прочие. Кнопками удобно

пользоваться для исполнения операций, но не для всякой операции есть кнопка, а только

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

любую команду, на которую система способна.

Page 14: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Под строкой меню располагаются панели инструментов с кнопками. Во многих про-

граммах имеется только одна такая панель, но в системе Delphi их несколько. Панели

инструментов предназначены для выполнения некоторых команд, реализуемых главным

меню. Кнопки панелей инструментов обеспечивают доступ к наиболее часто

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

навести на нее указатель мыши и подождать, пока рядом с ним появится всплывающая

подсказка. На этой панели есть, в частности, кнопка сохранения проекта на диске, кнопка

открытия проекта, кнопка запуска программы на выполнение.

Одна из панелей инструментов, имеющихся в главном окне системы Delphi, заметно

отличается от остальных. Это палитра компонентов. Палитра компонентов устроена в виде

набора пиктограмм. Палитра компонентов содержит множество вкладок. Каждая из них

содержит свой набор компонентов. Общее число компонентов достигает нескольких сотен.

Совокупность наборов составляет библиотеку визуальных компонентов (Visual

Components Library - VCL). Имеется несколько категорий компонентов, каждая из

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

экземпляры компонентов (объекты) на форме.

Окно инспектора объектов (Object Inspector) отображает свойства какого-либо

компонента, активизированного щелчком мышью, или самой формы. Имя активизированного

компонента находится под заголовком окна. Именно с помощью инспектора объектов

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

выбора и настройки событий, на которые будут реагировать объекты нашей программы.

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

Окно проектировщика формы – главное место, где происходит сборка

программы из компонентов, содержащихся в палитре компонентов. Сама форма – это

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

программу, в указанное место формы добавляются объекты – экземпляры компонента

выбранного типа. Сетка из точек в окне формы поможет разместить объекты ровно и

аккуратно. При работе программы ее не видно.

Форма — это заготовка окна будущей программы. Каждая программа содержит

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

окно формы мы видим на экране всегда. Заготовка первого окна называется Form1. Если

в программе будет два окна, то заготовка второго будет называться Form2 и так далее.

Возможна замена стандартного названия более подходящим для программы. Последнее из

открытых окон содержит код программы. Часть программы система Delphi формирует

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

Page 15: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

операторов языка Pascal. Добавлять нужные операторы система Delphi начинает еще до

того, как программист приступил к созданию своей программы.

Добавляются операторы именно в этом окне. Некоторые операторы система Delphi

добавит сама, другие мы введем вручную. Именно поэтому окно кода никогда не бывает

пустым.

Для системы Delphi каждая незавершенная программа – это проект. Проект

включает в себя множество файлов. Наиболее важными являются три файла: файл

формы, файл кода и файл проекта.

Проект, состоит из:

файла проекта Project1.dpf,

файла параметров проекта Project1.dof,

файла ресурсов проекта Project.res,

файла настроек проекта Project1.cfg,

файла описания формы Unit1.dfm,

файла модуля формы Unit1.pas.

Файл модуля формы доступен для редактирования, именно он отображается в

Редакторе Кода. Остальные файлы создаются Delphi автоматически. В процессе

компиляции программы файлы преобразуются в исполняемый exe-файл, который, по

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

В проекте могут быть задействованы несколько форм, а также дополнительные

модули и файлы ресурсов, при этом схема компиляции остается похожей.

Для сохранения проекта нужно воспользоваться пунктом главного меню Save

Project As…

Чтобы не смешивать файлы разных проектов, желательно каждый новый проект

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

затем имя проекта.

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

выберается пункт главного меню File → New Application.

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

загрузить старую программу, нужно выбрать в главном меню Open Project либо

воспользоваться кнопкой на панели инструментов и загрузить соответствующий файл

проекта.

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

Интернете можно найти тысячи. Они отличаются по своему внешнему виду, функциям,

Page 16: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

способам реализации, требованиям к аппаратной части и т.п., но, тем не менее, все они

построены на едином фундаменте, единой объектной основе.

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

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

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

элементы управления.

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

на форму: это кнопки, поля ввода, картинки, панели и т.д. Те из них, что предназначены

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

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

доступа к определенным функциям системы. При добавлении их на форму на ней

появляется иконка с изображением компонента, невидимая во время исполнения

программы. В этом и заключается их «невизуальность». Несмотря на это, некоторые из

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

относятся компоненты меню и диалоги.

Визуальные компоненты составляют интерфейс программы. Визуальные

компоненты имеют много общих свойств и событий, связанных, прежде всего, с их

визуальным отображением на форме.

Часть свойств отвечает за положение на форме: отступ слева, отступ сверху,

высота, ширина, выравнивание.

Некоторые определяют внешний вид: цвет, шрифт, заголовок. Некоторые задают

поведение компонента во время исполнения программы: доступен, виден, курсор,

подсказка.

Механизм событий позволяет связать действия пользователя с необходимыми

действиями программы. События определяют всю структуру программы, поскольку

фактически весь код, то есть, собственно работа программиста, пишется в обработчиках

событий.

В Windows действия пользователя обычно сводятся к нажатиям мыши в

определенных местах экрана, нажатию клавиш клавиатуры, переключению между окнами

и компонентами. В соответствии с этим существуют и события, реагирующие на нажатие

мыши и клавиатуры, переключение фокуса, активацию окон.

Кроме того, для каждого компонента могут существовать характерные для него

события, на которые может потребоваться реакция и обработка, например, событие

изменения текста в поле ввода.

Некоторые конкретные компоненты и их предназначение.

Page 17: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Для вывода надписей предназначен компонент Label.

Для ввода текста пользователем используется компонент Edit.

Для работы с несколькими строками используют Memo. Строки хранятся в

свойстве Lines.

Кнопка реализуется компонентом Button.

Для работы с пунктами используется CheckBox.

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

ComboBox. Альтернативы хранятся в свойстве Items, аналогичном свойству Lines у

компонента Memo.

Для множественного выбора используется RadioGroup. Чтобы добавить в него

пункты, щелкните на кнопку свойства Items и введите названия пунктов. Номер

выделенного пункта соответствует свойству ItemIndex, нумерация с нуля.

Простейшим контейнером компонентов может служить компонент Panel. На

него можно поместить другой компонент, например, кнопку. При перемещении

контейнера передвигаются все находящиеся в нем компоненты.

Для работы с картинкой используется компонент Image. Картинку можно

загрузить, щелкнув на кнопку свойства Picture и выбрав сохраненную картинку. Если

загруженная картинка не совпадает по размерам с размерами компонента, ее можно

масштабировать, установив свойство Stretch, либо изменить размеры компонента,

установив свойство AutoSize. Задний фон картинки можно убрать, используя свойство

Transparent.

Для графического оформления используется компонент Bevel. Его вид можно

настроить с помощью свойства Shape.

Ввод целых чисел с помощью мыши можно обеспечить с помощью компонента

TrackBar. Его основное свойство – Position.

А для отображения процесса длительных расчетов можно использовать

компонент ProgressBar. Его свойство Position отображает процент выполненной работы.

Структура программы. Модуль кода (unit) делится на две части – интерфейс

(interface) и реализацию (implementation).

Раздел interface:

uses: подключаемые модули, в которых содержатся используемые процедуры,

функции, классы и т.п. Их список формируется автоматически в зависимости от

добавленных в форму компонентов.

type: описания типов. Автоматически в этом разделе описан класс вашей формы.

Page 18: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

var: описание глобальных переменных. Автоматически тут описана переменная

типа описанного класса формы. В этой переменной во время работы программы хранится

указатель на экземпляр формы.

const: описание констант. Этот раздел автоматически не создается, однако может

быть легко добавлен.

Раздел implementation: Здесь также можно добавить uses.

С помощью {$R} подключаются файлы ресурсов. Автоматически подключен файл

dfm, имеющий то же имя, что и файл модуля и потому подключаемый как *.dfm. В этом

файле хранится информация о форме – расположение и настройки компонентов,

помещенных в форму, и т.п. 

Раздел содержит описание реализаций процедур и функций. Автоматически тут

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

программе процедур, функций и методов классов.

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

констант, процедур, типов, классов и т.п., должно быть описано в разделе interface. В этой

части программы, которая создается автоматически, в разделе uses перечисляются

используемые модули, в разделе type описывается класс формы – потомок класса TForm, а

в разделе var описывается глобальная переменная, в которой будет храниться указатель на

объект-экземпляр формы. Соответственно, если надо подключить какой-то свой модуль,

то необходимо добавить его в раздел uses. При описани нового типа его добавляют в

раздел type до или после класса формы. Если нужно описать глобальную переменную, то

ее добавляют в раздел var, а если нужна константа – создается дополнительно раздел

const. В свою очередь, в разделе implementation сначала указывается ссылка на файлы

ресурсов, а затем описываются реализации процедур и функций – как создаваемых

автоматически обработчиков событий, так и добавляемых по необходимости. Вначале эта

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

При добавлении компонента в форму автоматически модифицируется код модуля –

в описании класса формы появляется переменная, хранящая ссылку на добавленный

компонент.

При создании обработчика события (при нажатии на компонент, помещенный в

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

Инспектора Объектов) в коде происходят следующие изменения:

в разделе implementation создается пустой обработчик, который вы потом

заполняете;

Page 19: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

в классе вашей формы создается описание этого метода (обработчики событий

являются методами);

если не создавать обработчик через страницу Events Инспектора Объектов (или

двойным щелчком по компоненту), а просто написать в коде процедуру-

обработчик, то он не будет должным образом связан с компонентом, и событие не

сработает.

Если изменить имя компонента, то изменятся имена и обработчиков событий,

которые с ним связаны.

Если необходимо изменить название обработчика, то надо воспользоваться

Инспектором Объектов. Переименовывая здесь имя процедуры обработчика, корректно

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

Если необходимо удалить какой-то обработчик, то удалите весь код внутри

процедуры. При следующем запуске программы все пустые процедуры автоматически

корректно удаляются. Компилятор автоматически удаляет пустые процедуры при запуске.

При удалении всей процедуры описание и ссылки на нее останутся, а удаление их всех

требует времени и аккуратности.

При удалении компонента не удаляются процедуры-обработчики его событий. Это

связано с тем, что один и тот же обработчик может использоваться для разных

компонентов. В случае, если нужно удалить эти оставшиеся обработчики, удалите код

внутри них и запустите программу.

Проблема обеспечения гарантированного выполнения некоторых действий

решается наличием специального события OnCreate. Это событие формы. Оно возникает

тогда, когда форма создается, а поскольку главная форма создается в самом начале работы

приложения, то и код, описанный в обработчике данного события, выполнится один раз и

в самом начале. В обработчике события OnCreate можно описать процедуры и функции

инициализации, присваивать нужные значения глобальным переменным и т.п.

Раздел implementation предназначен не только для обработчиков событий. В этот

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

что они должны идти раньше процедур и обработчиков, из которых вызываются, или

объявить их в разделе interface. В последнем случае эти функции и процедуры будут

доступны для вызова из других модулей.

Существует также важная тонкость использования собственных функций: все

обработчики событий имеют в своем названии имя формы:

procedure TForm1.FormCreate(Sender: TObject);

Page 20: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Это указывает на то, что работают с классом формы TForm1 и описывают методы для нее.

Из обработчика просто обращаются к компонентам формы (класс формы «знает» о

наличии компонентов на ней и имеет к ним непосредственный доступ), например:

MyGrid.RowCount := Num;

Когда описывается собственная процедура, то она «ничего не знает» о компонентах

формы, и поэтому нужно обращаться к компонентам через форму, а, не минуя ее.

Алфавит языка. Константы. Переменные. Типы данных: целый, вещественный, логический.

Delphi – это среда разработки программ, ориентированных на работу в

операционной системе Windows. В основе Delphi лежит технология визуального

проектирования, которая базируется на идеях объектно-ориентированного

программирования. Программы в Delphi пишутся на языке Object Pascal, который

является развитием языка Turbo Pascal. Слово “Object” особо подчёркивает, что язык

поддерживает концепцию объектно-ориентированного программирования. Основной

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

использованием возможностей визуального программирования. Однако Delphi

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

оперативную память используются процедуры read и readln, а для вывода

результатов на экран монитора – процедуры write и writeln. Такие приложения

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

основ языка Object Pascal на примерах создания консольных приложений. Алфавит

языка Object Pascal состоит из букв, цифр, специальных символов и неиспользуемых

символов.

К буквам относятся большие и малые буквы латинского алфавита. При этом

Object Pascal не различает одноимённые большие и малые буквы, если только они

не входят в символьное или строковое выражение. Буквой является также знак

подчёркивания « _ ».

К цифрам относятся арабские цифры от 0 до 9 и шестнадцатеричные цифры.

Перед шестнадцатеричным числом ставят знак $ .

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

операций и зарезервированные слова. В качестве разделителей можно использовать

пробел, управляющие символы (символы с кодами от 0 до 32), комментарий.

Комментарием называется любая последовательность символов, заключённая в

фигурные скобки: {это комментарий}. Комментарий во время выполнения

программы игнорируется, его основное назначение – пояснения к тексту программы.

Page 21: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

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

которые начинаются с пары символов {$, рассматриваемых как одно целое.

Знаки операций:

+ – * / = < > <= >=

Знаки пунктуации:

, . : ; // := .. “ ^ @ $ # ( ) (* *) [ ] (. .) { }

Зарезервированные слова нельзя использовать в качестве имён, которые задаёт

программист. Примеры зарезервированных слов: begin, end, var, program, uses.

Неиспользуемые символы, к которым, в частности относятся буквы русского

алфавита, могут быть использованы в комментариях, а также символьных и

строковых константах.

Идентификаторы (имена) используются для обозначения констант, типов,

переменных, процедур, функций, классов, модулей, программ и т.д. Идентификаторы

состоят из букв и цифр и должны начинаться с буквы. Длина идентификатора

может быть произвольной, но значащими являются только первые 64 символа. Знак

подчёркивания может входить в идентификатор. Специальные символы и

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

правильного идентификатора: pr_1_3. Примеры недопустимых идентификаторов: 5p

сумма var sum.6 x 5

Консольное приложение состоит из заголовка (правильного идентификатора) и

следующих разделов (структура консольного приложения): program p1;

{$APPTYPE CONSOLE}uses SysUtils;

Список подключаемых модулей начинается словом uses и содержит имена

модулей, содержимое которых может использовать данное консольное приложение.

Раздел меток начинается словом label, за которым следует список меток,

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

Метки позволяют пометить любой оператор, чтобы на него можно было передать

управление из любого места программы.

Page 22: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Раздел констант начинается словом const, за которым идут конструкции вида <имя константы> = <значение>. Константами называют любые неизменяемые в процессе выполнения программы данные.

Раздел описания типов начинается словом type, за которым идут конструкции вида <имя типа> = <описание>, позволяющие программисту создавать собственные типы.

Раздел описания переменных начинается со слова var. Здесь должны быть указаны все переменные, используемые в разделе операторов программы, а также их тип: <имя переменной > : <тип>;

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

Раздел операторов начинается служебным словом begin и заканчивается словом

end, после которого ставится точка – признак конца программы. Раздел операторов

содержит последовательность действий, которую должен выполнить компьютер

const n = 10;

var t : boolean; x, i : integer; Данные, независимо от типа, имеют некоторое значение и в

программе предстают как константы или переменные. Данные, которые получили

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

константами. Константами, например, являются скорость света в вакууме и соотношение

единиц измерения (метр, сантиметр, ярд, фут, дюйм), которые имеют научно

обоснованные или традиционно принятые постоянные значения. Константы описываются

с помощью зарезервированного слова const. За ним идет список имен констант, каждому

из которых с помощью знака равенства присваивается значение. Одно присваивание

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

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

констант:

После такого описания для обращения к нужному значению достаточно указать лишь имя

соответствующей константы. Значение константы можно задавать и выражением. Эту

возможность удобно использовать для комплексного представления какого-либо понятия.

При объявлении константы можно указать ее тип. Такие константы называются

Page 23: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

типизированными; их основное назначение — объявление константных значений

составных типов данных.

Простыми являются порядковые, вещественные типы и тип дата-время.

Порядковые типы характеризуются тем, что соответствующие им значения

образуют конечное упорядоченное множество и каждое значение имеет свой

порядковый номер. К порядковым типам относятся целые (табл. 1), логические

(табл.2), символьные, перечислимые типы и тип-диапазон. Для выражений

порядкового типа определены следующие функции:

ord(x) – возвращает порядковый номер значения данного выражения. Для

целых типов возвращает само значение x, для логического 0 или 1, для

символьного – значение в диапазоне от 0 до 255, для перечислимого – значение в

диапазоне от 0 до 65535. Для типа-дипазона результат зависит от свойств базового

порядкового типа.

pred(x) – возвращает значение, предшествующее значению данного выражения

x.

succ(x) – возвращает значение, следующее за значением данного выражения

x.

high(x) – возвращает максимальное возможное значение для аргумента x.

low(x) – возвращает минимальное возможное значение для аргумента x.

Таблица 1 - Целые типыТип Диапазон значений Размер (в байтах)

integer -2147483648..2147483647 4

cardinal 0..4294967295 4

shortint -128..127 1

smallint -32768..32767 2

longint -2147483648..2147483647 4

int64 -263..263-1 8

Byte 0..255 1

word 0..65535 2

longword 0..4294967295 4

Целые типы данных предназначены для представления целых чисел.

Наибольшая производительность процессора и операционной системы достигается

при использовании типов integer и cardinal.

К переменным целого типа можно применять операции целочисленного деления

div и mod. Если a и b – переменные целого типа, то

Page 24: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

a div b – это целая часть частного от деления a на b;

a mod b – это остаток от деления a на b.

Например, 9 div 2 = 4 9 mod 2 = 1

При применении к данным целого типа операций

* div mod + –

полученный результат будет также целого типа. То же можно сказать и о

стандартных функциях abs и sqr. Операция деления / над целочисленными

операндами даёт результат вещественного типа. Если в арифметическом выражении

используются значения только какого-нибудь одного из целых типов, то результат

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

разных типов, то результат будет иметь тип integer. Для данных целого типа

определены процедуры:

inc(i, k) – увеличивает значение i на k единиц; если k не задано, то на 1;

dec(i, k) – уменьшает значение i на k единиц; если k не задано, то на 1.

2.2. Разработка программ с разветвлениями

В Delphi данные логического (булева) типа могут принимать одно из двух значений: true (истина) или false (ложь). Логические типы, определённые в Object Pascal: Таблица 2 - Логические типы

Тип Размер (в байтах)

Boolean 1

ByteBool 1

WordBool 2

LongBool 4

Основным логическим типом в Delphi 7 является Boolean. Остальные типы

нужны для совместимости с логическими данными, используемыми в Windows и

некоторых других системах программирования, например Visual C.

В логических выражениях можно использовать логические операции: not

(отрицание), and (логическое И), or (логическое ИЛИ), xor (логическое исключающее

ИЛИ). Результат применения этих операций к операндам логического типа

представлен в следующей таблице.

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

операция not, затем and, потом or и xor. Операции отношения выполняются в

последнюю очередь.

Page 25: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Логические поразрядные операции предназначены для поразрядной обработки

целочисленных операндов, представленных в двоичном виде. Такими операциями

являются поразрядные отрицание (not), и (and), или (or), исключающее или (xor), а

также поразрядные сдвиг влево (shl) и сдвиг вправо (shr). Расмотрим пример. Пусть

переменные a и b типа byte имеют значения 3 и 5 соответственно. В двоичном

представлении эти числа будут иметь вид : 00000011 и 00000101. Вычислим a xor

b. Операция xor будет применяться поразрядно, т.е. к каждой паре чисел, стоящих в

одинаковых позициях. Результат можно определить при помощи приведённой выше

таблицы, если мысленно заменить 0 словом false, а 1 – словом true. Получим

00000110 = 6 (10). Операции shl и shr сдвигают значение переменной влево или

вправо на указанное количество битов (например a shl 1 – сдвиг влево на 1 бит).

При этом начальные или конечные биты теряются, а вновь появившиеся биты

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

количеству разрядов смещения.

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

: Таблица 3 - Вещественные типыТип Диапазон значений Размер (в байтах)

real 5.0*10–324 .. 1.7*10308 8

real48 2.9*10–39 .. 1.7*1038 6

single 1.5*10–45 .. 3.4*1038 4

double 5.0*10–324 .. 1.7*10308 8

extended 3.6*10–4951 .. 1.1*104932 10

comp –263 +1 .. 263–1 8

currency –922337203685477.5808 ..922337203685477.5807 8

Наибольшая производительность процессора достигается при использовании

типа real. В Delphi 7 ему эквивалентен тип double.

При условии, что хотя бы один из операндов вещественного типа, операции

* , / , + , – дают вещественный результат. К данным вещественного типа применимы

все вышеперечисленные стандартные математические функции.

Вещественные значения могут изображаться в форме с фиксированной точкой (

например, 7.32 456.721 0.015), а также в форме с плавающей точкой, т.е. в виде

Page 26: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

<мантисса>Е<порядок>. Точка в мантиссе плавает – отсюда название.

Вещественные числа выводятся на экран в форме с плавающей точкой, если не

используется вывод с форматом.

2.3 Инструкции цикла. Массивы.

Основная часть программы на языке Delphi представляет собой последовательность

операторов, выполняющих некоторое действие над данными, объявленными в секции

описания данных. Операторы выполняются строго последовательно в том порядке, в

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

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

простые и структурные. Простые операторы не содержат в себе никаких других

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

перехода. Структурные операторы содержат в себе простые или другие структурные

операторы и подразделяются на составной оператор, условные операторы и операторы

повтора.

Оператор присваивания (:=) вычисляет выражение, заданное в его правой части, и

присваивает результат переменной, идентификатор которой расположен в левой части.

Например:

X := 4;

Y := 6;

Z := (X + Y) / 2;

Во избежании ошибок присваивания необходимо следить, чтобы тип выражения был

совместим с типом переменной. Под совместимостью типов данных понимается

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

другого типа данных. Например, все целочисленные типы данных совместимы с

вещественными (но не наоборот!).

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

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

широким диапазоном значений. Например, выражение с типом данных Byte можно

присвоить переменной с типом данных Integer, а выражение с типом данных Integer

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

выражение принадлежит 32-разрядному целочисленному типу данных (например, Integer),

а переменная — 64-разрядному целочисленному типу данных Int64. Для того, чтобы на

32-разрядных процессорах семейства x86 вычисление выражения происходило правильно,

Page 27: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

необходимо выполнить явное преобразование одного из операндов выражения к типу

данных Int64. Следующий пример поясняет сказанное:

var

I: Integer;

J: Int64;

begin

I := MaxInt; // I = 2147483647 (максимальное целое)

J := I + 1; // J = -2147483648 (неправильно: ошибка переполнения!)

J := Int64(I) + 1; // J = 2147483648 (правильно: вычисления в формате Int64)

end.

Пусть, например, переменной x присвоено значение 13, а переменной y –

значение 25. Чтобы x и y поменялись значениями, можно, используя

вспомогательную (буферную) переменную t, записать следующую последовательность

операторов присваивания:

x:=13; y:=25; t:=x; x:=y; y:=t;

В результате получим x=25 y=13.

Условный оператор IF.

Оператор if предназначен для реализации разветвляющегося вычислительного

процесса. В общем виде условный оператор записывается следующим образом:

if <логическое выражение> then <оператор1> else <оператор2>;

Вначале оператор if вычисляет значение логического выражения. Если значение

логического выражения равно true, то выполняется оператор1, в противном случае –

оператор2. В качестве оператора1 и оператора2 может быть использован составной

оператор (группа операторов, заключённых в операторные скобки begin end) или

другой условный оператор (вложенный условный оператор).

Оператор if может быть записан в сокращённой форме:

if <логическое выражение> then <оператор> ;

Пример . Даны два различных вещественных числа. Вывести на экран большее из

них.

var x, y : real;

begin

readln(x, y);

if x>y then writeln(x:7:2) else writeln(y:7:2);

readln

end.

Page 28: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Один оператор if может входить в состав другого оператора if. В таком случае говорят о

вложенности операторов. При вложенности операторов каждое else соответствует тому

then, которое непосредственно ему предшествует. Например:

2.3 Инструкции цикла. Массивы

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

последовательность действий. Такие повторяющиеся действия называются циклами.

В языке Object Pascal возможна организация 3-х видов циклов.

1. С параметром (оператор for)

2. С предусловием (оператор while)

3. С постусловием (оператор repeat)

Оператор цикла for организует выполнение последовательности операторов

заранее известное число раз. Существуют два варианта оператора:

1. С увеличением счётчика:

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

2. С уменьшением счётчика:

for <счётчик>:=<начальное значение>downto <конечное значение>do <оператор>;

Здесь

<счётчик> – переменная порядкового типа – параметр цикла;

<начальное значение> и <конечное значение> – выражения, которые должны быть

совместимы с параметром цикла;

<оператор> – это оператор, который выполняется в цикле – тело цикла.

Если в цикле необходимо выполнить группу операторов, то её следует заключить в

операторные скобки begin…end.

Оператор for действует следующим образом. Вначале вычисляются начальное и

конечное значения счётчика. Далее счётчику присваивается начальное значение.

Затем значение счётчика сравнивается с конечным значением. Далее, пока счётчик

меньше или равен конечному значению ( в первом варианте ) или больше или равен

( во втором варианте ), выполняется очередная итерация цикла. В противном случае

происходит выход из цикла. Выполнение очередной итерации включает в себя

сначала выполнение тела цикла, а затем присвоение счётчику следующего большего

значения (в первом варианте ) или следующего меньшего значения ( во втором

варианте ). Если параметр цикла целого типа, то это означает увеличение либо

уменьшение его на 1. В первом варианте начальное значение должно быть меньше

конечного, а во втором варианте – больше конечного. В противном случае тело

цикла не будет выполнено ни разу.

Page 29: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Пример . Напечатать столбиком все целые числа от 30 до 45.

var i : integer;

begin

for i:=30 to 45 do writeln(i);

readln

end.

Пример. Найти сумму всех целых чисел от 10 до 50.

var i, s : integer;

begin

s:=0;

for i:=10 to 50 do s:=s+i;

writeln(s);

readln

end.

Рассмотрим выполнение этой программы по шагам:

i s

10 0 + 10 = 10

11 10 + 11 = 21

12 21 + 12 = 33

…………………………..

50 1230

Пример . Вычислить сумму 22 + 23 + 24 + … + 210

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

сумме? Слагаемые – это степени двойки от 2ой до 10ой. Следовательно, имеем 9

слагаемых. Каждое следующее слагаемое получается из предыдущего умножением на

2. Пусть a – очередное слагаемое, s – сумма. Используя эти соображения, запишем

решение:

var i, a, s : integer;

begin

a:=2; s:=0;

for i:=1 to 9 do

begin a:=a*2; s:=s+a end;

writeln(s);

Page 30: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

readln

end.

Пример . Подсчитать количество двузначных чисел, кратных 7.

Решение. Двузначные числа – это все целые числа от 10 до 99. k – счётчик

двузначных чисел, кратных 7.

var i, k : integer;

begin

k:=0;

for i:=10 to 99 do

if i mod 7=0 then inc(k);

writeln(k);

readln;

end.

Пример . Дана последовательность из 10 действительных чисел, которые вводятся с

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

var i : integer; a, max : real;

begin

read(max);

for i:=2 to 10 do

begin

read(a);

if a>max then max:=a

end;

writeln(max:5:2);

readln; readln

end.

Рассмотрим выполнение этой программы по шагам, считая, что последовательность

чисел та же, что и в предыдущем примере:

i a max

6.5

2 -0.4 6.5

3 2.01 6.5

4 12.8 12.8

5 -9.2 12.8

Page 31: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

6 -0.15 12.8

………………………………

В результате получим ответ 12.8.

При решении некоторых задач бывает необходимо организовать вычисление циклов

в другом цикле. Т.е. необходимо создавать вложенные циклы. Довольно часто работа с

вычислениями многомерных массивов требует этого.

Операторы Break и Continue

Оператор Break может быть размещен в теле цикла. При его выполнении цикл прекращает

работу и считается выполненным.

Пример.

s:= 0;

i:=0;

Repeat

Inc (i);

s:= s + z[i];

if (s > 14) then Break;

Until (i = 44);

В этом примере цикл будет выполняться до тех пор, пока не выполнится условие i = 44

или если в операторе if переменная s превысит значение 14.

Оператор Continue также может быть размещен в теле цикла. При его выполнении

управление независимо от того, где он расположен, сразу передается в начало цикла для

выполнения следующего шага.

Пример.

s:= 0;

i:=0;

Repeat

Inc (i);

s:= s + z[i];

if (s > 20) then Continue;

if (s > 14) then Break;

Until (i = 44);

В этом примере если в первом операторе if выполнится условие s > 20, то сработает

оператор Continue. Он сразу передаст управление на первый оператор в теле цикла – Inc

(i), предотвратив тем самым выполнение ниже-следующих операторов – второго if и Until.

Page 32: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Вложенные циклы

В теле оператора цикла могут быть размещены другие операторы цикла. Такие структуры

называются вложенными циклами. Язык допускает любую глубину вложенности циклов.

При использовании вложенных циклов необходимо иметь в виду следующее:

все вложенные циклы For – Do должны иметь различные счетчики (иначе это

противоречило бы требованию на запрет изменения значения счетчика внутри

цикла);

нет никаких ограничений на досрочный выход из внутреннего цикла наружу;

недопустим вход во внутренний цикл For – Do, минуя его заголовок, что

соответствует общему требованию о корректном входе в цикл.

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

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

Пример.

Const

n = 15;

m = 24;

Var

i,j: Byte;

R,Tau,s: Real;

z: array[1..n, 1..m] of Real;

{заполнение массива z с использованием вложенных циклов}

Tau:= Pi/m;

For i:=1 to n do begin

R:=4.0*Pi*Sin(i*Tau); {первый оператор в теле цикла по i}

For j:=1 to m do z[i, j] := R+j; {второй оператор в теле  цикла по i}

end {i};

{вычисление суммы положительных элементов массива z с использованием вложенных

циклов }

s:=0;

For i:=1 to n do

For j:=1 to m do

  if ( z[i, j] > 0) then s:= s + z [i, j];

Приведенный пример содержит две структуры вложенных циклов. Первая структура

предназначена для заполнения элементов двумерного массива z с помощью

Page 33: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

математической формулы

Наружный цикл со счетчиком i в теле цикла содержит два оператора – оператор

присваивания (вычисление значения вспомогательной переменной R с целью сокращения

времени вычислений) и оператор внутреннего цикла со счетчиком j. Поскольку наружный

цикл в своем теле содержит несколько операторов, то они заключены в операторные

скобки begin … end.

Эта структура работает следующим образом. После входа в наружный цикл переменная i

(счетчик этого цикла) примет значение 1. Далее будет вычислено значение переменной R

при i = 1. После этого будет выполнен внутренний цикл со счетчиком j, где j на каждом

шаге будет последовательно принимать значения 1, 2, 3, … m (i при этом остается

неизменным и равным 1). В результате будут вычислены элементы z11, z12, …, z1m первой

строки массива. Затем будет выполнен возврат к заголовку наружного цикла, где значение

счетчика i будет увеличено на 1 (т. е. i станет равно 2) и вновь будет выполнены

операторы, расположенные в его теле. В результате будут определены элементы z21, z22, …,

z2m второй строки массива и т.д.

Вторая структура вложенных циклов предназначена для вычисления суммы

положительных элементов массива z. Для этого сначала переменной s будет присвоено

значение 0, а затем во вложенных циклах будет накоплена требуемая сумма в ячейку s.

При работе со вложенными циклами мы должны помнить, что процедуры Continue и

Break воздействуют только на ближайший оператор цикла и следовательно прекратить

выполнение всех вложенных циклов с их помощью нельзя.

Для прекращения выполнения вложенных циклов, а также функции в которой он

расположен необходимо воспользоваться оператором Exit

Оператор цикла с предусловием WHILE имеет следующий формат:

while <логическое выражение> do <оператор>;

Выполняется оператор следующим образом. Вначале вычисляется значение

логического выражения. Если это значение равняется true, то выполняется тело

цикла – оператор, стоящий после слова do. После этого снова вычисляется значение

логического выражения и процесс повторяется. Цикл прекращается, если при

очередном вычислении логического выражения его значение окажется равным false.

Если при первом вычислении значения логического выражения окажется, что оно

равно false, то тело цикла не выполнится ни разу. В качестве оператора тела цикла

Page 34: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

может быть использован составной оператор, заключённый в операторные скобки

begin .. end.

Пример . Дано натуральное число n ( n0 ). Подсчитать количество цифр данного

числа.

var n : longint; k : byte;

begin

readln(n); k0;

while n0 do

begin inc(k); nn div 10 end;

writeln(k);

readln

end.

Пример . Даны действительные числа a1, a2, a3, … . Известно, что a1>0 и что

среди a2 ,a3 . . . есть хотя бы одно отрицательное число. Пусть a1, a2, … , an элементы

данной последовательности, предшествующие первому отрицательному элементу (n

заранее неизвестно). Получить a1 + a2 + … + an .

var a, s : real;

begin

s:=0; read(a);

while a>=0 do

begin

s:=s + a; read(a)

end;

writeln(s:6:1);

readln; readln

end.

Пример . Дано 10 натуральных чисел. Проверить, что среди них есть хотя бы одно,

кратное 3.

const n = 10;

var t : boolean; x, i : integer;

begin

t:=true; i:=0;

while t and (i<n) do

Page 35: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

begin read(x); inc(i); t:=x mod 3<>0 end;

writeln( not(t) );

readln; readln

end.

Пример . Даны натуральные числа n и m. Получить все натуральные числа из

диапазона от m до n, сумма цифр которых равна 12.

var i, n, m, s, a : integer;

begin

readln(m, n);

for i:=m to n do

begin

s:=0; a:=i;

while a<>0 do

begin s:=s + a mod 10; a:=a div 10 end;

if s=12 then writeln(i);

end;

readln;

end.

Сложные типы данных. Одномерные и многомерные массивы. Алгоритмы

сортировки массивов и их программная реализация.

В Delphi 7 массивы могут быть статическими, т.е. иметь фиксированное число

элементов, либо динамическими, когда количество элементов задаётся в процессе

выполнения программы.

Статические массивы.

Статический тип-массив (далее просто тип-массив) представляет собой

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

снабжённых индексами. Массив может быть одномерным или многомерным.

Описание типа массив выглядит следующим образом:

type <имя типа>=array[<тип индекса (индексов)>] of <тип компонентов>;

Если в качестве типа компонентов взят другой массив, образуется структура,

которую называют многомерным массивом.

Например:

type vector = array[1..3] of real;

Page 36: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

table = array[1..4] of array[1..5] of integer;

Здесь vector – одномерный массив, состоящий из трёх вещественных чисел, table –

двумерный массив (матрица), состоящий из четырёх строк и пяти столбцов целых

чисел. Описание типа table можно также записать следующим образом:

type table = array[1..4, 1..5] of integer;

Размерность массива может быть любой, компоненты массива также могут быть

любого типа, индексы могут быть любого порядкового типа, кроме типов LongWord

и Int64.

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

var m1, m2 : vector; matr : table;

Массив можно описать и непосредственно в разделе описания переменных:

var m1, m2 : array[1..3] of real;

matr : array[1..4, 1..5] of integer;

В Object Pascal одним оператором присваивания можно передать все элементы

одного массива другому массиву того же типа, например:

m1:=m2;

Однако, объявление

var a : array[1..6] of integer;

b : array[1..6] of integer;

создаст разные типы массивов, поэтому оператор a:=b вызовет ошибку.

Доступ к компонентам массива осуществляется указанием имени массива, за

которым в квадратных скобках помещается значение индекса (индексов) компонента.

Индекс компонента может быть задан выражением соответствующего типа.

Например:

m1[2] matr[3,4] m2[i+1]

Если статический массив используется в качестве параметра процедуры или

функции, то нужно учитывать, что типом любого формального параметра может

быть только стандартный или ранее объявленный тип. Поэтому нельзя, например,

объявить следующую процедуру:

procedure S(a : array[1..10] of integer);

Правильно будет сначала описать тип массива в разделе type основной программы.

Например:

const n = 10;

type lin = array[1..n] of integer;

procedure S(a : lin);

Page 37: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

……………………………….

Одномерный массив. Инициализация. Работа с элементами. Рассмотрим

процедуры инициализации и распечатки одномерного массива, считая, что тип

массива описан следующим образом:

const n = 10;

type lin = array[1..n] of integer;

Заполнение массива числами, введёнными с клавиатуры:

procedure init1(var x : lin);

var i : integer;

begin

for i:=1 to n do read(x[i]);

end;

Заполнение массива случайными числами с помощью генератора случайных

чисел:

procedure init2(var x:lin);

var i:integer;

begin

randomize;

for i:=1 to n do x[i]:=-50 + random(101);

end;

Функция random(t) берёт случайное целое число из отрезка [0, t-1]. Таким образом,

массив будет заполнен случайными числами от -50 до 50.

Распечатка массива (вывод элементов массива на экран)

procedure print(x : lin);

var i : integer;

begin

for i:=1 to n do write(x[i]:4);

writeln

end;

Пример . Заполнить массив случайными числами от -25 до 25. Распечатать массив.

Заменить отрицательные элементы массива на противоположные по знаку.

Распечатать преобразованный массив.

const n = 10;

type lin = array[1..n] of integer;

Page 38: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

var a : lin;

procedure init2(var x : lin);

var i : integer;

begin

randomize;

for i:=1 to n do x[i]:=-25 + random(51);

end;

procedure print(x : lin);

var i : integer;

begin

for i:=1 to n do write(x[i]:4);

writeln

end;

procedure sign1(var x : lin);

var i : integer;

begin

for i:=1 to n do

if x[i]<0 then x[i]:=-x[i]

end;

begin

init2(a); print(a);

sign1(a); print(a);

readln

end.

Сортировка одномерного массива.

Для решения многих задач необходимо упорядочить данные по определённому

признаку. Процесс упорядочения заданного множества объектов по определённому

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

возрастанию a[1]<a[2]<…<a[n], по неубыванию a[1]a[2]…a[n], по убыванию

a[1]>a[2]>…>a[n], по невозрастанию a[1]a[2]…a[n]. Научившись выполнять одну

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

Page 39: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

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

Объявление процедур и функций. Вызов процедур и функций. Способы передачи

параметров в процедурах и функциях. Формальные и фактические параметры. Локальные

и глобальные переменные. Рекурсивные подпрограммы побочные эффекты применения.

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

Если в программе возникает необходимость частого обращения к некоторой

группе операторов, то рационально выделить такую группу операторов в

самостоятельный блок, к которому можно обращаться, указывая его имя. Такие

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

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

Процедуры.

Формат описания процедуры:

procedure имя (формальные параметры);

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

begin

операторы

end;

Описание процедуры включает заголовок и тело процедуры. Заголовок состоит

из зарезервированного слова procedure , идентификатора имя процедуры и списка

формальных параметров с указанием типа параметра (список параметров может

отсутствовать). Имя процедуры – идентификатор, уникальный в пределах

программы. Тело процедуры представляет собой блок, по структуре аналогичный

программе.

Рассмотрим пример процедуры, которая вычисляет an , где a и n – это данные

целые числа (n0).

procedure degree( a,n:integer; var step:integer);

var i:integer;

begin

step1;

for i1 to n do stepstepa;

end;

Page 40: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

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

Рассмотрим пример процедуры, меняющей местами значения двух переменных x и

y.

procedure swap(var x, y:integer);

var z:integer;

begin

zx; xy; yz

end;

Функции.

Формат описания функции:

function имя (формальные параметры) : тип результата;

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

begin

операторы

end;

Функция состоит из заголовка и тела функции. В отличие от процедуры

результатом выполнения функции может быть только одно значение. В теле

функции обязательно должен быть хотя бы один оператор присваивания, где в

левой части стоит имя стандартной переменной result, а в правой – вычисленное

значение функции.

Рассмотрим пример функции, которая вычисляет факториал числа n.

n! 123… n

function fact(n:integer):integer;

var i:integer; f:integer;

begin

f1; for i1 to n do ff i;

resultf

end;

Вызов подпрограмм.

Описание процедур и функций в основной программе занимает место в конце

раздела описаний, до начала блока операторов. При вызове процедуры или функции

её формальные параметры заменяются фактическими. Число и тип формальных и

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

должны располагаться в том же порядке, что и формальные.

Page 41: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Пример . Рассмотрим пример применения процедуры degree для решения следующей

задачи: Вычислить y8x5 3x4 2x3.

var x:integer; y, z:integer;

procedure degree( a, n:integer; var step:integer);

var i:integer;

begin

step1;

for i1 to n do stepstepa;

end;

begin

readln(x);

degree(x, 5, z); y8z;

degree(x, 4, z); yy – 3z;

degree(x, 3, z); yy 2z;

writeln(y);

readln

end.

Вызов процедуры – это оператор, состоящий из имени процедуры, за которым в

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

соответствующим формальным параметрам.

1ый вызов xa 5n zstep

2ой вызов xa 4n zstep

3ий вызов xa 3n zstep

Вызов и выполнение функции производятся при вычислении значения указателя

функции

<имя функции>(<список фактических параметров>),

который входит в некоторое выражение в вызывающей программе.

Локализация имён.

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

они как бы «невидимы» снаружи подпрограммы. Такие переменные называются

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

глобальными. Они доступны в любой части программы, в том числе и в любой

подпрограмме.

Например, в последнем рассмотренном примере переменные x, y, z – глобальные,

переменные a, n, step, i – локальные, они недоступны основной программе. Локальные

Page 42: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

переменные существуют только тогда, когда работает подпрограмма: появляются при

её вызове и исчезают при завершении её работы.

Имена переменных, локализованных в подпрограмме, могут совпадать с ранее

объявленными глобальными именами. В этом случае локальное имя «закрывает»

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

пример:

var i:integer;

procedure P;

var i:integer;

begin writeln(i) end;

begin i7; P end.

Что напечатает эта программа? Всё, что угодно: значение локальной

переменной i при входе в процедуру P не определено, хотя одноимённая глобальная

переменная имеет значение 7. Локальная переменная «закроет» глобальную и на

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

переменной i. Если убрать описание var i:integer; из процедуры P, то на экран

будет выведено значение глобальной переменной i, т.е. 7.

Параметры.

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

формальных параметров подпрограммы может быть параметром-значением или

параметром-переменной. Кроме того, в Delphi 5 имеются ещё параметры-константы и

так называемые выходные параметры. Перед параметром-переменной в списке

формальных параметров ставится служебное слово var, а перед параметром-

значением служебное слово var не ставится.

Параметру-переменной должен соответствовать при вызове подпрограммы

фактический параметр в виде переменной нужного типа. Если же формальный

параметр объявлен как параметр-значение, то при вызове ему может соответствовать

произвольное выражение.

Например, пусть описана процедура M:

var b,c,res : real;

procedure M(x:real; var r,y:real);

begin y:=3x r end;

Рассмотрим варианты вызова этой процедуры.

1). M(5, 1, res);

Вызов процедуры осуществлён неправильно. Правильно сделать так:

Page 43: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

b1; M(5, b, res);

2). M(5, 2b–1, res);

Вызов процедуры осуществлён неправильно. Правильно сделать так:

c2b–1; M(5, c, res);

3). M(6b–7, c, res);

Вызов процедуры осуществлён правильно.

Если параметр определён как параметр-значение, то перед вызовом

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

временную память и передаётся подпрограмме. Любые возможные изменения

параметра-значения в подпрограмме никак не воспринимаются основной программой,

так как в этом случае изменяется копия фактического параметра. Сами же

фактические параметры, какими были до вызова процедуры, такими же и останутся

после завершения её работы.

Если параметр определён как параметр-переменная, то при вызове

подпрограммы передаётся адрес переменной в оперативной памяти (ссылка).

Изменения параметра-переменной приводит к изменению самого фактического

параметра в вызывающей программе. Поэтому результаты работы процедуры

должны передаваться через параметр-переменную.

После введения чисел 5 и 7 на экран будет выведено:

исходные: 5 7

удвоенные: 10 14

результат: 10 7

Параметры-переменные используются как средство связи подпрограммы и

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

своей работы вызывающей программе. В распоряжении программиста всегда есть и

другой способ передачи результатов подпрограммы – через глобальные переменные.

Однако, злоупотребление глобальными переменными делает программу запутанной,

трудной в понимании и сложной в отладке. Поэтому рекомендуется там, где это

возможно, использовать передачу результатов через параметры-переменные. С другой

стороны, описание всех формальных параметров как параметры-переменные

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

подпрограммы с фактическими параметрами в виде выражений. Во-вторых, в

подпрограмме возможно случайное использование формального параметра, т.е.

существует опасность испортить непреднамеренно фактическую переменную. Чем

меньше параметров объявлено параметрами-переменными и чем меньше в

Page 44: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

подпрограмме используются глобальные переменные, тем меньше опасность

непредусмотренных побочных эффектов, связанных с вызовом подпрограмм.

При использовании параметра-константы перед ним в списке формальных

параметров должно стоять слово const. Параметр-константа передаётся по ссылке,

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

При описании выходного параметра перед ним в списке формальных

параметров следует поставить слово out. Выходной параметр подобен параметру-

переменной. Но его можно использовать только для возврата результата, поскольку

память, занимаемая соответствующим фактическим параметром, в момент обращения

к процедуре очищается.

В Delphi 5 имеются параметры, значения которых можно не указывать при

вызове процедуры или функции. Их называют параметрами со значениями по

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

<имя параметра>:<тип>=<значение>.

Умалчиваемые параметры должны находиться в конце списка формальных

параметров. Если при вызове процедуры или функции фактический параметр,

соответствующий умалчиваемому параметру, не указан, то в подпрограмму

передаётся заданное для умалчиваемого параметра значение.

Перегрузка функций.

В Object Pascal имеется возможность использовать подпрограммы с

одинаковыми именами, но отличающиеся количеством и типом параметров. В

заголовках таких подпрограмм должно быть указано слово overload. При вызове

таких подпрограмм компилятор анализирует количество и тип фактических

параметров и вызывает соответствующую подпрограмму. Например, в программе

могут быть описаны две функции с именем min. Первая для определения

минимального из двух действительных чисел, а вторая для определения символа с

минимальным порядковым номером.

function min(a, b : real) : real; overload;

begin if a>b then result:=b else result:=a end;

function min(a, b : char) : char; overload;

begin if a>b then result:=b else result:=a end;

Page 45: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

При вызове этой функции с фактическими параметрами, являющимися

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

параметров, являющихся символами, – вторая.

Процедурные типы.

Существуют два процедурных типа: тип-процедура и тип-функция. Описание

процедурного типа имеет вид:

type <имя процедурного типа> =

<заголовок процедуры или функции без имени>;

Например:

type funcl = function (a, b : real) : real;

Процедурные типы широко применяются в Object Pascal при использовании

классов.

Структура модулей. Интерфейсная и исполняемая части модулей. Создание и

подключение модуля. Библиотеки подпрограмм: понятие, виды. Статическое и

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

2.5 Модули

Модуль – это автономно компилируемая программная единица, включающая в

себя различные компоненты раздела описаний (типы, константы, переменные,

процедуры и функции) и, возможно, некоторые исполняемые операторы

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

модуля, которая может быть скрыта от пользователя. Роль модулей в Delphi не

исчерпывается только механизмом раздельной компиляции. Delphi связывает с

каждым включаемым в программу окном собственный модуль и таким способом

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

далее, основная программа оконного приложения (файл проекта DPR) содержит

перечень всех используемых в приложении модулей и несколько исполняемых

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

Вся основная работа приложения управляется кодом, содержащимся в модулях.

Модуль имеет следующую структуру

unit <имя>;

interface

<интерфейсная часть>

implementation

Page 46: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

<исполняемая часть>

initialization

<инициирующая часть>

finalization

<завершающая часть>

end.

Таким образом, модуль состоит из заголовка и четырёх составных частей,

любая из которых может быть пустой.

Для правильной работы среды Delphi имя модуля должно совпадать с именем

дискового файла, в который помещается исходный текст модуля. Если, например,

имеем заголовок модуля unit vector, то исходный текст соответствующего модуля

должен размещаться в дисковом файле vector.pas. Связь модуля с другими

модулями и основной программой устанавливается специальным предложением

uses <список модулей>;

Например,

uses SysUtils, vector;

Объявление uses должно открывать раздел описаний основной программы.

В интерфейсной части содержатся объявления всех глобальных объектов

модуля (типов, констант, переменных и подпрограмм), которые должны стать

доступны основной программе или другим модулям. При объявлении глобальных

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

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

могут объявляться локальные для модуля объекты: вспомогательные типы,

константы, переменные и подпрограммы. Описанию подпрограммы, объявленной в

интерфейсной части модуля, в исполняемой части должен предшествовать заголовок,

в котором можно опускать список формальных параметров (и тип результата для

функции). Но если заголовок подпрограммы приводится в полном виде, то есть со

списком формальных параметров и объявлением типа результата, он должен

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

Инициирующая и завершающая части чаще всего отсутствуют вместе с

начинающими их словами initialization и finalization. В инициирующей части

размещаются операторы, которые исполняются до передачи управления основной

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

указываются операторы, выполняющиеся после завершения работы основной

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

Page 47: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Пример . Дано два целочисленных вектора размера n. Найти их скалярное

произведение. Для решения задачи создать и использовать модуль, содержащий

следующие подпрограммы: процедуру заполнения одномерного массива с клавиатуры,

функцию для нахождения скалярного произведения двух векторов.

unit vector;

interface

const n=5;

type lin=array[1..n] of integer;

procedure init(var x:lin);

function scal(x,y:lin):integer;

implementation

procedure init;

var i:integer;

begin

for i:=1 to n do read(x[i]);

end;

function scal;

var i:integer;

begin

result:=0;

for i:=1 to n do result:=result + x[i]*y[i];

end;

end.

Чтобы создать такой модуль, следует выбрать команду File�New�Unit. Текст

модуля следует сохранить в файле vector.pas. Приведём текст основной программы

(консольного приложения), использующей модуль vector.

program p56;

{$APPTYPE CONSOLE}

uses

SysUtils, vector;

var a,b:lin; rez:integer;

begin

init(a); init(b); rez:=scal(a,b);

writeln(rez:6);

readln; readln

Page 48: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

end.

2.6 Символы и строки

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

Например: abcdef Иванов И.И. 10.0 S =

Константа типа char представляет собой символьную строку единичной длины.

Используемые в Object Pascal строковые типы приведены в следующей таблице:

Тип строки Максимальная длина Нулевой символ в конце

ShortString 255 байт Нет

AnsiString 2 Гб Есть

String 255 байт / 2 Гб Нет / Есть

WideString 1 Гб Есть

Значение типа ShortString – это так называемые короткие строки, длина

которых не превышает 255 символов. Каждый символ занимает один байт, самый

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

порядковый номер. Первый байт, содержащий длину строки, имеет номер 0. По

номеру символа можно получить доступ к его значению, указав номер символа в

квадратных скобках после имени строки.

Например, для строки st , имеющей тип shortstring и значение st =

Object , получим:

ord(st[0])=6, st[1]=O, st[2]=b, st[3]=j, st[4]=e, st[5]=c, st[6]=t.

Длина строки, хранящаяся в нулевом байте, представлена в символьном виде,

поэтому для преобразования в число следует воспользоваться стандартной функцией

ord, а обратно – функцией chr.

Короткая строка размещается компилятором в памяти компьютера до начала

выполнения программы, т.е. статически.

Строка типа AnsiString располагается в памяти иначе. Сама переменная типа

AnsiString занимает в памяти 4 байта и является указателем, т.е. содержит адрес

той ячейки памяти, начиная с которой будет фактически располагаться символьная

строка. Выделение места в памяти происходит на этапе выполнения программы, т.е.

динамически. Программа сама определяет необходимую длину строки по заданному

количеству символов, и операционная система выделяет нужный участок памяти. В

Page 49: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

конце строки размещается терминальный (завершающий ) нуль – символ #0 и так

называемый счётчик ссылок, занимающий 4 байта. Счётчик ссылок позволяет

экономить память. Например, если в программе имеется фрагмент:

……………………………………

var s1, s2 : ansistring;

……………………………………

s1 stroka ;

s2 s1;

…………………………………..

то память для размещения переменной s2 не выделяется, а в переменную s2

помещается значение указателя из переменной s1. Счётчик ссылок в области

памяти, связанной с переменной s1, увеличивает своё значение на 1 и станет

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

ту же строку. Счётчик ссылок равняется количеству ссылающихся на строку

переменных. Если одна из ссылающихся на строку типа AnsiString переменных

изменит своё значение, то в памяти будет выделено место для новой строки. Число

ссылок в прежней строке уменьшится на 1, а в новой строке становится равным 1.

Если число ссылок на строку станет равным 0, то строка уничтожается и

освобождает место в памяти. Нумерация символов в строке типа AnsiString

начинается с 1. Процедура SetLength, которую мы использовали для установления

длины динамического массива, может быть также использована для установления

длины строки типа AnsiString.

Тип String интерпретируется компилятором Object Pascal по-разному, в

зависимости от значения директивы компилятора $H. Если она включена –

{$H+} – то тип String интерпретируется как AnsiString, если нет – {$H-} – то как

ShortString. По умолчанию действует директива {$H+}.

Если в разделе описаний указано, например String[10], то независимо от

директив компилятора тип трактуется как ShortString с указанным числом символов.

Тип WideString также представляет собой динамически размещаемые в памяти

компьютера строки, длина которых ограничена только объёмом свободной памяти

компьютера. Однако в отличие от строки типа AnsiString каждый символ является

Unicode-символом, т.е. кодируется 2 байтами.

Пример . В строке Ivanov I. дописать полностью имя (Ivan).

var s : ansistring;

Page 50: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

begin

s:='Ivanov I.';

setlength(s, 12);

s[9]:='v'; s[10]:='a'; s[11]:='n'; s[12]:='.';

writeln(s);

readln;

end.

Стандартные подпрограммы для строк.

function AnsiCompareStr(const S1, S2 : string): integer;

Сравнивает две строки S1 и S2 в кодировке Ansi с учётом регистра. Возвращает

значение меньше 0, если S1<S2, 0, если S1=S2, и больше 0, если S1>S2. В

русифицированных версиях Widows может быть применена к строкам, содержащим

русские буквы.

function AnsiCompareText(const S1, S2 : string): integer;

Полностью аналогична предыдущей функции за исключением того, что сравнение

символов осуществляется без учёта регистра.

function AnsiLowerCase(const S : string): string;

Возвращает в кодировке Ansi строку S, преобразованную к нижнему регистру. В

русифицированных версиях может быть применена к строкам, содержащим русские

буквы.

function AnsiPos(const Substr, S : string): integer;

Возвращает позицию (индекс) первого вхождения Substr в S. Если Substr не входит

в S, то возвращается 0. В русифицированных версиях Windows может быть

применена к строкам, содержащим русские буквы.

function AnsiUpperCase(const S : string): string;

Возвращает строку S в кодировке Ansi, преобразованную к верхнему регистру. В

русифицированных версиях Windows может быть применена к строкам, содержащим

русские буквы.

function Concat(S1, S2…SN : string): string;

Возвращает строку, представляющую сцепление строк S1, S2… SN. Идентична

операции + для строк.

function Copy(S; Index, Count: integer): string;

Параметр S – это строка типа string или динамический массив. Функция Copy

возвращает подстроку строки S, начинающуюся с символа с номером Index и

содержащую Count символов.

Page 51: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

procedure Delete(var S : string; Index, Count : integer);

Удаляет из S подстроку, начинающуюся с символа с номером Index и содержащую

Count символов.

procedure Insert(Substr : string; S : string; Index : integer);

Вставляет строку Substr в S, начиная с символа с номером Index.

function Length(S : string): integer;

Возвращает число символов в строке S.

function Pos(Substr, S : string): integer;

Возвращает позицию (индекс) первого вхождения подстроки Substr в строку S. Если

Substr нет в S, то возвращается 0.

procedure SetLength(var S; NewLength : integer);

Параметр S является строкой или динамическим массивом. Процедура устанавливает

новую длину NewLength строки S. Если строка имеет тип ShortString, то значение

параметра NewLength должно находиться в диапазоне 0..255. Для длинных строк

значение параметра NewLength ограничено лишь размерами доступной памяти

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

сохраняются, а во вновь добавленных позициях находятся неопределённые значения.

function StringOfChar(Ch : char; Count : integer): string;

Создаёт строку, состоящую из Count раз повторяющегося символа Ch.

function Trim(const S : string): string;

Удаляет из строки S начальные и завершающие пробелы и управляющие символы.

Строковые выражения.

Над строками определены операции отношения. Строки сравниваются по кодам

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

ASCII, а для оконных – ANSI. При сравнении двух строк последовательно

сравниваются коды символов, стоящих в одинаковых позициях. Символы в строках

просматриваются слева направо. Если в очередной паре оказываются различные

символы, то большей считается та строка, символ которой имеет больший код. На

этом сравнение прекращается. Если сравниваются строки разной длины, причём

одна строка совпадает с началом другой, то большей будет более длинная строка.

Например,

муха < слон

слон < слоник

2 > 123

Page 52: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Кроме операций отношения над строками определена операция сцепления

(конкатенации), которая обозначается знаком + . Например,

Object + Pascal = Object Pascal

Строки разных типов могут смешиваться в одном выражении, переменным

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

Компилятор при этом осуществляет автоматическое приведение типов. Если

переменной типа ShortString присваивается в качестве значения строка, длина

которой больше 255, то лишние символы отбрасываются.

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

read. Это объясняется тем, что в конце каждой символьной строки, вводимой с

клавиатуры, стоит так называемый разделитель строк EOLN (end of line) –

последовательность кодов #13(CR – перевод каретки) и #10(LF – переход на начало

строки). Разделитель строк вставляется во вводимый текст при нажатии на клавишу

Enter. Процедура readln считывает все символы, расположенные до разделителя

строк, а затем и символы разделителя строк (#13 и #10), которые являются

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

Пример . Используя стандартные функции для строк, получить из строки

'grammofon' строку fonogramma.

var t, s : string; i, j : integer; Комментарий

begin

s:='grammofon';

i:=pos('o', s); i = 6

t:=copy(s, 1, i-1); t = gramm

delete(s, 1, i); s = fon

j:=length(s); j = 3

s:= s + t + 'a'; s = fongramma

insert('o', s, j+1); s = fonogramma

writeln(s); readln

end.

Преобразование строк в числовые типы и обратно.

Задача преобразования строк в числовые типы и обратно для консольных

приложений не актуальна, так как процедуры read, readln, write, writeln выполняют

эти преобразования автоматически. Основная область применения этих подпрограмм

Page 53: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

– оконные приложения, при создании которых программист сам должен

предусматривать преобразование типов.

procedure Str(x; var s:string);

Преобразует целое или действительное значение x в строку s (параметр x может

иметь указание формата вывода).

procedure Val(s:string; var v; var code:integer);

Преобразует строку s в целую или вещественную переменную v. Параметр code

равен нулю, если преобразование прошло успешно, в противном случае он равен

номер позиции в строке s, где обнаружен ошибочный символ. Например: если

s:='95'; , то в результате выполнения val(s,x,d); x = 95, d=0. Если s=a4, то x=0, d=1.

function StrToInt(s:string):integer;

Возвращает целое число, изображением которого является строка s.

function StrToFloat(s:string):extended;

Возвращает вещественное число, изображением которого является строка s.

function IntToStr(n:integer):string;

Возвращает строку, являющуюся изображением целого числа n.

function FloatToStr(n:extended):string;

Возвращает строку, являющуюся изображением вещественного числа n.

function FloatToStrF(n:extended; format; k, m:integer):string; – строка, являющаяся

изображением вещественного n в различных форматах;

при вызове функции указываются:

format – формат (способ изображения);

k – общее количество цифр;

m – количество цифр после десятичной точки.

Значениями параметра format могут быть следующие константы:

ffFixed – число представляется в формате с фиксированной десятичной точкой.

ffExponent – научный формат (экспоненциальная форма записи).

ffGeneral – общий цифровой формат.

ffNumber – аналогичен ffFixed, но в изображении числа используется разделитель

групп разрядов.

ffCurrency – денежный формат.

Например: если x=3.587 и s:=floattostrf(x, ffFixed, 7, 3); , то s = 3,587 (используется

десятичная запятая).

Page 54: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

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

Запись – это структура данных, состоящая из фиксированного числа

компонентов, называемых полями записи. Компоненты (поля) записи могут быть

различного типа.

Описание типа запись:

имя типа record список полей end;

Здесь имя типа – правильный идентификатор. Список полей представляет собой

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

Каждый раздел записи состоит из одного или нескольких идентификаторов полей,

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

описание типа поля.

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

структуры данных:

type tel = record

number : integer;

fio : string[40];

adr : string[60]

end;

var m, v : tel;

Обращение к значению поля осуществляется с помощью идентификатора переменной

записи и идентификатора поля, разделённых точкой. Например:

m.number; m.fio; m.adr;

Поля записи используются в программе как обычные переменные соответствующего

типа. Например, можно написать

m.numberm.number 1; или m.fio[1]<>Ф

Допускается применение оператора присваивания к записи в целом. Например,

vm; После выполнения этого оператора значения полей записи v станут равны

значениям соответствующих полей записи m. Логические операции сравнения для

записей не определены. Тип запись нельзя использовать для описания типа

функции.

Обращение к полям записи имеет несколько громоздкий вид. Для решения этой

проблемы в языке Паскаль предназначен оператор присоединения with , который

имеет следующий формат:

with переменная типа запись do оператор;

Page 55: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Один раз указав переменную типа запись в операторе with , можно далее работать

с именами полей без указания перед идентификатором поля имени записи.

Например:

with m do begin number1364; fioПетров end;

Пример 50. Описать тип point для точки на плоскости со следующими полями:

буква, обозначающая точку, координата x, координата y. Даны две точки. Найти

длину отрезка, соединяющего эти две точки.

type point = record

name : 'A' .. 'Z';

x : real;

y : real

end;

var a, b : point; ab : real;

begin

readln(a.name, a.x, a.y);

with b do

readln(name, x, y);

ab:=sqrt(sqr(b.x – a.x) + sqr(b.y – a.y));

writeln(a.name, b.name, ' = ', ab:5:2); readln

end.

Множественный тип представляет собой конечный набор значений некоторого

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

тип, кроме word, integer, longint, int64.

Описание множественного типа имеет вид:

<имя типа > = set of <базовый тип>;

Например:

type mn1 = set of A . . Z;

mn2 = set of 1 . . 5;

Значениями переменных множественного типа являются любые подмножества

базового множества. Для задания множества используется конструктор множества,

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

и обрамлённый квадратными скобками.

Пример.

type digitChar set of 0 .. 9;

Page 56: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

digit set of 0 .. 9;

var s1, s2 : digitChar; s3, s4, s5 : digit;

begin

s1[1, 2, 3]; s2[3, 2, 1];

s3[0..3, 6]; s4[4, 5]; s5[3..9]

end.

[] – пустое множество. Над множествами определены операции:

– пересечение множеств.

s3s4=[]; s3s5=[3, 6];

– объединение множеств.

s3+s4=[0 .. 6];

– – разность множеств.

s5 – s4=[3, 6 .. 9];

= – проверка эквивалентности множеств, возвращает true, если множества

эквивалентны.

s1=s2

<> – проверка неэквивалентности.

<= – проверка вложения.

s4<=s5 результат true.

in – проверка принадлежности.

7 in s5 результат true.

Стандартные процедуры для работы с множествами:

include(s, i) – включает элемент i базового типа в множество s.

exclude(s, i) – исключает элемент i из множества s.

Использование множеств позволяет сделать программы более эффективными за

счёт уменьшения количества различных проверок.

Пример . Используя метод Решето Эратосфена напечатать все простые числа из

диапазона 1..30.

Суть метода – вычёркиваем из исходного множества [1..30] те числа, которые

не являются простыми.

var n : set of 1..30; k, s : integer;

begin

n:=[1..30];

for s:=2 to 15 do

if s in n then

Page 57: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

for k:=s+1 to 30 do

if k mod s=0 then exclude(n, k);

for s:=1 to 30 do

if s in n then write(s:3);

readln

end.

Программа работает следующим образом. Вначале s=2. Это значение

принадлежит n, поэтому, начиная с числа 3, вычёркиваем все числа, кратные 2.

Теперь s=3. Это значение принадлежит n, поэтому, начиная с числа 4,

вычёркиваем все числа, кратные 3. Теперь s=4. Это значение уже вычеркнуто из n.

Переходим к s=5 и так далее. Вывод на экран элементов полученного множества

осуществляем следующим образом: перебираем все элементы базового множества и

отбираем для печати те из них, которые принадлежат n.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

2.8. Файлы

Object Pascal располагает средствами создания и обработки файлов различных

типов. Доступ к файлу осуществляется с помощью переменных файлового типа. В

Object Pascal существует три файловых типа:

TextFile – текстовый файл, представляющий собой набор символьных

строк переменной длины;

File of < тип > – типизированный файл, представляющий собой набор

данных указанного типа;

File – нетипизированный файл, представляющий собой набор

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

Примеры описания файловых переменных:

var f1: textfile; f2: file of integer; f3: file of char; f4: file;

Здесь f1 – текстовый файл, f2 и f3 – типизированные файлы, f4 – нетипизированный

файл.

Стандартные подпрограммы для доступа к файлам.

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

чтобы указать, с каким элементом будет производиться очередная операция чтения

или записи, существует понятие указателя на доступный элемент файла. После

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

Page 58: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Перед использованием файловой переменной она должна быть связана с

внешним файлом ( файлом на диске) с помощью вызова процедуры

AssignFile(< файловая переменная>, < имя файла>);

здесь <файловая переменная> – имя переменной файлового типа, объявленной в

программе; <имя файла> – символьная строка, содержащая имя файла. Если файл

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

только имя файла, в противном случае надо указать полный путь к файлу,

например:

c:\files\z1.txt

Когда связь с внешним файлом установлена, его можно открыть для ввода или

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

Reset(<файловая переменная>);

Процедура reset открывает существующий внешний файл, имя которого было

связано с файловой переменной. Если внешний файл с указанным именем

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

открыт, то он сначала закрывается, а затем открывается вновь. Файловый указатель

устанавливается на элемент файла с порядковым номером 0.

Текстовый файл, открытый процедурой reset, доступен только для чтения. Для

типизированных и нетипизированных файлов, открытых процедурой reset,

допускается выполнять операции чтения и записи в файл.

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

Rewrite(<файловая переменная>);

Процедура rewrite создаёт новый файл, имя которого связано с файловой

переменной. Если файл с указанным именем уже существует, то он удаляется и на

его месте создаётся новый пустой файл. Текущая позиция в файле устанавливается

на начало файла, т.е. указатель будет указывать на элемент с порядковым номером

0.

Если процедура rewrite открывает текстовый файл, то он становится доступным

только для записи. Для типизированных и нетипизированных файлов, открытых

процедурой rewrite, допускается выполнять операции чтения и записи в файл.

Текстовый файл может быть открыт процедурой

Append(<файловая переменная>);

Процедура append открывает уже существующий внешний файл, связанный с

файловой переменной, для добавления новой информации. Если файла с указанным

именем не существует, то возникает ошибка. Если файл уже открыт, то он сначала

Page 59: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

закрывается, а затем открывается заново. Указатель будет указывать на конец

файла. В результате обращения к append текстовый файл становится доступным

только для записи.

Когда программа завершает обработку файла, он должен быть закрыт с

помощью стандартной процедуры

CloseFile(<файловая переменная>);

Процедура closefile закрывает открытый файл. При этом обеспечивается

сохранение в файле всех новых записей и регистрация файла в папке. Процедура

closefile не разрывает связь файла с файловой переменной, поэтому файл можно

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

Текстовые файлы.

Текстовый файл представляет собой последовательность символов,

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

маркером конца строки – EOLN (end of line), состоящим из двух символов: CR=#13 и

LF=#10. Заканчивается файл символом конца файла EOF (end of file, код #26).

Чтение данных из произвольного текстового файла можно осуществить с

помощью процедур read и readln. При этом в списке их параметров первой должна

стоять соответствующая файловая переменная. Например, процедура read(f, x, y, z);

осуществляет чтение из файла, связанного с файловой переменной f, значения

переменных x, y, z. Процедура readln(f, a);

прочитает из файла, связанного с переменной f, значение переменной a и перейдёт

в этом файле к следующей строке.

Вывод данных в текстовый файл производится процедурами write и writeln, у

которых первой в списке параметров указана соответствующая файловая переменная.

Например, процедура write(f, s = , s) осуществляет запись в файл, связанный с

переменной f, символьной строки s = и значения переменной s. Процедура

writeln(f) запишет в файл, связанный с переменной f, пустую строку.

При работе с текстовыми файлами используются логические функции

eof(<файловая переменная>) и eoln(<файловая переменная >). Функция eof

возвращает значение true, если достигнут конец файла, и false в противном случае.

Функция eoln возвращает значение true, если достигнут конец строки в текстовом

файле, и false в противном случае.

Текстовый файл можно создать в среде Delphi, выбрав в меню команду

File�New�Text. В открывшемся окне нужно набрать содержимое текстового файла и

сохранить файл с помощью команды File�Save. Текстовый файл можно также

Page 60: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

создать программным способом. Рассмотрим несколько возможных вариантов

программы для создания текстового файла.

Типизированные файлы.

Типизированный файл содержит элементы одного типа. Тип элементов может

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

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

должна осуществляться программным путём. Напомним, что описание файловой

переменной, соответствующей типизированному файлу имеет вид:

var <имя файловой переменной> : file of <тип>;

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

Список ввода процедуры read должен содержать переменные того же типа, что и

элементы файла. Для записи в типизированный файл используется процедура write,

список вывода которой должен содержать переменные того же типа, что и

элементы файла. Процедуры readln и writeln для типизированных файлов не

применяются.

Доступ к текстовым файлам возможен только последовательно, то есть, когда

элемент считывается или записывается, указатель файла перемещается к

следующему по порядку элементу файла. К типизированным файлам можно

организовать прямой доступ с помощью стандартной процедуры

procedure seek( var f; n:longint);

которая перемещает файловый указатель в типизированном файле, связанном с

файловой переменной f, на элемент с номером n. Нумерация элементов в файле

начинается с нуля. Для определения текущей позиции в файле используется

функция

function filepos( var f):longint;

Для определения размера файла используется функция

function filesize( var f):integer;

Например, для установки файлового указателя на последний элемент файла f

достаточно записать

seek(f, filesize(f)–1);

на первый элемент файла

seek(f, 0);

вернуться на один элемент назад

seek(f, filepos(f)–1);

Page 61: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Применение процедур assignfile и closefile для типизированных файлов не

отличается от текстовых файлов. Процедура reset, в отличие от текстовых файлов,

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

Процедура rewrite, в отличие от текстовых файлов, допускает не только запись, но

и чтение из файла. Процедура append и функция eoln для типизированных файлов

не работают.

Нетипизированные файлы.

С точки зрения Object Pascal, нетипизированный файл представляет собой

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

Основное назначение нетипизированных файлов – обеспечение совместимости с

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

внешними запоминающими устройствами и оперативной памятью. Описание

нетипизированного файла f имеет вид:

var f : file;

В процедурах reset и rewrite для нетипизированных файлов указывается

дополнительный параметр RecSize, чтобы задать размер записи, используемой при

передаче файла:

procedure reset (var f : file {; RecSize : word});

procedure rewrite (var f : file {; RecSize : word});

Если параметр RecSize не указан, то принимаемая по умолчанию длина

записи равна 128 байтам. Длина записи измеряется в байтах и может быть задана

произвольным целым числом – от 1 байта до 2 Гбайт. Если задать длину записи,

кратную 512 байт, то это позволит выполнять операции чтения-записи для

нетипизированного файла с максимальной скоростью.

За исключением процедур read и write для нетипизированных файлов

можно использовать все стандартные процедуры, которые допускается использовать

для типизированных файлов. Вместо процедур read и write используются

процедуры blockread и blockwrite, позволяющие пересылать данные с высокой

скоростью:

procedure blockread( var f : file; var buf; count : integer; {var at : integer});

procedure blockwrite( var f : file; var buf; count : integer; {var at : integer});

Здесь f – имя файловой переменной, связанной с нетипизированным файлом,

buf – переменная, в которую будут помещаться данные при чтении из файла или из

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

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

Page 62: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

за одно обращение к файлу. Переменная buf должна иметь длину равную

count�RecSize байт. Необязательный параметр at содержит количество реально

прочитанных или записанных записей.

2.9. Классы и объекты

Объектно-ориентированное программирование (ООП) – это методика разработки

программ, в основе которой лежит понятие объекта, как некоторой структуры,

описывающей объект реального мира, его поведение. Задача, решаемая с

использованием методики ООП, описывается в терминах объектов и операций над

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

между ними.

Строго говоря, для разработки оконного приложения в Delphi на базе

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

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

более глубокого понимания того, как программа взаимодействует с компонентами,

что и почему Delphi добавляет в текст программы.

Язык Object Pascal, поддерживая концепцию объектно-ориентированного

программирования, даёт возможность определять классы. Описание типа class

напоминает описание типа record (запись), но тип class кроме описания полей

данных содержит ещё методы (процедуры и функции).

Объект в Object Pascal – это конкретный экземпляр класса. Переменная-объект

понимается как динамическая структура, то есть содержит не данные, а ссылку на

данные объекта. Выделение памяти под эти данные осуществляется при помощи

специального метода – конструктора (constructor).

Пример объявления простого класса:

type tPerson = class

fname : string[15];

faddress : string[45];

fage : byte;

procedure show;

end;

var boy1 : tPerson;

В основе объектно-ориентированного программирования лежат три основных

принципа: инкапсуляция, наследование и полиморфизм.

Page 63: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Инкапсуляцией называется объединение в классе данных и подпрограмм для их

обработки. Данные содержатся в полях класса, а процедуры и функции называются

методами. В соответствии с правилами объектно-ориентированного

программирования прямой доступ к полям нежелателен. В связи с этим в Object

Pascal предусмотрены специальные конструкции, называемые свойствами, которые

осуществляют чтение или запись в поля при помощи вызова соответствующих

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

буквы t. Например:

type tPerson = class;

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

type tStudent = class(tPerson);

Принцип наследования заключается в том, что порождённый класс-потомок

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

может дополнять их новыми.

В Object Pascal все классы являются потомками класса tObject. Этот класс не

включает в себя полей и свойств, зато его методы позволяют создавать,

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

являющийся непосредственным потомком класса tObject, то имя класса-родителя в

этом случае можно не указывать, т.е. следующие строки являются эквивалентными:

type tNewClass = class(tObject);

type tNewClass = class;

Использование принципа наследования в Delphi привело к созданию

разветвлённого дерева классов. В верхней части этого дерева находятся так

называемые абстрактные классы, для которых нельзя создать полноценные

работающие объекты. Но вместе с тем абстрактные классы являются

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

объекты.

Полиморфизм позволяет использовать одинаковые имена для методов,

входящих в различные классы. Принцип полиморфизма обеспечивает в случае

обращения к одноимённым методам выполнение того из них, который соответствует

классу объекта.

В общем виде класс объявляется в разделе type следующим образом:

Page 64: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

type < имя класса > = class(< имя класса-родителя >)

public

< описание общедоступных элементов >

published

< описание элементов, доступных в Инспекторе Объектов >

protected

< описание элементов, доступных в классах-потомках >

private

< описание элементов, доступных только в модуле >

end;

Секции public, published, protected, private могут содержать описания полей, методов,

свойств, событий.

Следующий пример иллюстрирует создание объекта типа tPerson, обращение к

его полям и методам.

type tPerson = class

private

fname : string[15];

faddress : string[45];

fage : byte;

public

procedure show;

end;

var boy1 : tPerson;

procedure tPerson.show;

begin

writeln('Surname?'); writeln(fname);

writeln('Address?'); writeln(faddress);

writeln('Age?'); writeln(fage);

end;

begin

boy1:=tPerson.Create; boy1.fname:='Ivanov';

boy1.faddress:='Kolzovskaja, 59-45';

boy1.fage:=16; boy1.show;

readln;

end.

Page 65: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

После описания типа класса tPerson следует описание реализации методов. В

заголовке имя метода дополняется именем класса, к которому данный метод

относится (procedure tPerson.show;). В теле метода обращение к полям класса

происходит без указания имени класса. Создание объекта boy1 происходит в

результате применения конструктора Create к имени класса. Для того чтобы

обратиться к полю объекта, нужно написать имя объекта и имя поля, разделённые

точкой (boy1.fage). Аналогично записывается вызов метода объекта (boy1.show).

Классы, созданные разработчиками Delphi, образуют сложную иерархическую

структуру, называемую Библиотекой визуальных компонентов (Visual Component

Library –VCL). Количество входящих в VCL классов составляет несколько сотен. На

следующем рисунке изображены базовые классы, являющиеся родоначальниками

всех остальных классов.

Во время проектирования формы приложения Delphi автоматически добавляет в

текст программы необходимые объекты. Если сразу после запуска Delphi

просмотреть содержимое окна редактора кода, то там можно обнаружить следующее

описание класса исходной, пустой формы приложения и объявление объекта –

формы приложения:

type

TForm1 = class(TForm)

private

{ Private declarations }

TObject

TObjectTObject TPersistent

TObject TComponent

TObject TControl

TGraphicControl TWinControl

Page 66: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

public

{ Public declarations }

end;

var

Form1: TForm1;

Когда программист, добавляя необходимые компоненты, создаёт нужную

форму, Delphi формирует описание класса формы. Когда программист создаёт

процедуру обработки события формы или её компонента, Delphi добавляет

объявление метода в описание класса формы приложения.

Список использованных источников

1. Бобровский С.И. Delphi 7. Учебный курс – СПб: Питер, 2008 – 736 с.

2. Голицына О.Л., Попов И.И. Основы алгоритмизации и программирования: Учебное

пособие. – 2 издание – М.: ФОРУМ: ИНФРА – М, 2006

3. Поган А.М. Delphi. Руководство программиста. – М.: ЭКСМО, 2006

4. Фаронов В.В. Delphi. Программирование на языке высокого уровня: Учебник для

вузов – СПб.: Питер, 2007.

5. Хомоненко А.Д. и др. Delphi 7. – СПб.: БХВ – Петербург, 2005.

Интернет-ресурсы:

1. Delphi программирование. – URL: http://www.delphisources.ru/index.html.

2. Иллюстрированный самоучитель по Delphi 7 для начинаюших. – URL:

http://www.realcoding.net/teach/Delphi_7.

3. Программирование на Delphi 7. - URL: http://gluk.webhost.ru/delphi.html.

Дополнительные источники:

1. Архангельский А.Я. Программирование в Delphi. Учебник по классическим версиям

Delphi – М.: Бином, 2006 – 1152 с.

2. Культин Н.Б. Delphi 7 в задачах и примерах. – СПб.: БХВ – Петербург, 2004

3. Фленов М.В. Библия Delphi 7.0. - Издательство: БХВ-Петербург, 2011. - 686 c.

4. Чиртик А.А., Борисок В.В., Корвель Ю.И. Delphi. Трюки и эффекты. – СПб.: Питер,

2007.

Page 67: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИПЕНЗЕНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

МНОГОПРОФИЛЬНЫЙ КОЛЛЕДЖ

УТВЕРЖДАЮ:

Ректор ___________ А.Д Гуляков«____» ________________ 2015 г.

КОНСПЕКТ ЛЕКЦИЙ

общепрофессиональной дисциплины

ОП.05 ОСНОВЫ ПРОГРАММИРОВАНИЯ

Специальность 09.02.03 Программирование в компьютерных системах

Квалификация выпускника – Техник-программист

Форма обучения – Очная

2015 г.

Page 68: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Содержание

Введение ………………………………………………………………………………………..1

1. Основные принципы алгоритмизации и программирования …………………………….1

1.1. Основные понятия алгоритма……………………………………………………………..1

1.2. Языки и системы программирования. Методы программирования……………………5

2. Язык программирования Delphi………………………………………………………..….13

2.1. Основные составляющие среды программирования Delphi…………………………...13

2.2. Разработка программ с разветвлениями………………………………………………...23

2.3. Инструкции цикла. Массивы…………………………………………………………….25

2.4. Процедуры и функции……………………………………………………………………38

2.5

Модули…………………………………………………………………………………………..44

2.6 Символы и строки…………………………………………………………………………..46

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

2.8.

Файлы…………………………………………………………………………………………...55

2.9. Классы и объекты………………………………………………………………………....60

Список использованных источников………………………………………………………....64

Page 69: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Введение

Изучение основ программирования является важным при подготовке

квалифицированных технических специалистов. В конспекте лекций приводятся

принципы алгоритмизации и программирования, основы языка программирования Delphi.

При этом в ходе освоения студентами языка Delphi сложным для понимания нередко

оказывается материал по структурированным типам данных. Существует необходимость в

подробном описании таких структурированных типов данных языка Delphi, как строки,

множества, записи и файлы. Отдельный раздел посвящен объектно-ориентированному

программированию. О них и идет речь в лекционном материале – каждый из разделов

посвящен определенному типу данных; кроме теоретических сведений приведены

примеры программ.

Раздел 1. Основные принципы алгоритмизации и программирования

Тема 1.1. Основные понятия алгоритма

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

процессов.

Алгоритм – совокупность действий, приводящих к достижению результата за

конечное число шагов. Свойства алгоритмов:

6. Дискретность (от лат. discretus — разделенный,

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

(шагов).

7. Детерминированность (от лат. determinate —

определенность, точность) - любое действие алгоритма должно быть строго и

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

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

конкретный номер маршрута 5. Кроме того, необходимо указать точное количество

остановок, которое надо проехать, скажем, три.

8. Конечность – каждое действие в отдельности и алгоритм в

целом должны иметь возможность завершения.

9. Массовость – один и тот же алгоритм можно использовать

с разными исходными данными.

10. Результативность – алгоритм должен приводить к

достоверному решению.

Page 70: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Основная цель алгоритмизации – составление алгоритмов для ЭВМ с дальнейшим

решением задачи на ЭВМ. Существует несколько способов записи алгоритмов. На

практике наиболее распространены следующие формы представления алгоритмов:

5. словесная (запись на естественном языке);

6. псевдокоды (полуформализованные описания алгоритмов на условном

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

фразы естественного языка, общепринятые математические обозначения и др.);

7. графическая (изображения из графических символов – блок-схема);

8. программная (тексты на языках программирования – код программы).

Словесный способ не имеет широкого распространения, так как такие описания:

строго не формализуемы; страдают многословностью записей; допускают

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

Псевдокод занимает промежуточное место между естественным и формальным

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

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

псевдокоде используются некоторые формальные конструкции и математическая

символика, что приближает запись алгоритма к общепринятой математической записи. В

псевдокоде не приняты строгие синтаксические правила для записи команд, присущие

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

возможность использовать более широкий набор команд, рассчитанный на абстрактного

исполнителя. Однако в псевдокоде обычно имеются некоторые конструкции, присущие

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

на формальном языке.

Виды алгоритмических процессов. Одним из свойств алгоритма является

дискретность – возможность расчленения процесса вычислений, предписанных

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

определенной структурой. Можно выделить и наглядно представить графически три

простейшие структуры: последовательность двух или более операций, выбор

направления, повторение. Любой вычислительный процесс может быть представлен как

комбинация этих элементарных алгоритмических структур. Вычислительные процессы,

выполняемые на ЭВМ по заданной программе, можно разделить на три основных вида:

линейные, разветвляющиеся, циклические.

Линейным принято называть вычислительный процесс, в котором операции

выполняются последовательно, в порядке их записи.

Page 71: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Вычислительный процесс называется разветвляющимся, если для его реализации

предусмотрено несколько направлений (ветвей).

Циклическими называются алгоритмы, содержащие циклы. Цикл – это многократно

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

названными выше типами блоков. К примеру, в линейном алгоритме могут

присутствовать все блоки, кроме блока условия. В разветвляющемся и циклическом

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

является блок условия. Внутри блока условия записывается условие, про которое можно

однозначно ответить, истинно оно или ложно. Если условие истинно, то выполняются

действия, соответствующие стрелке "да", иначе стрелке "нет".

Понятие блок-схемы. Основные виды блоков. Блок-схема – это графическая

реализация алгоритма. Блок-схема представляет собой удобный и наглядный способ

записи алгоритма. Блок-схема состоит из функциональных блоков разной формы,

связанных между собой стрелками. В каждом блоке описывается одно или несколько

действий. Основные виды блоков представлены на рисунке 1.

Рисунок 1

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

– блока и дополняется словесным описанием. Блоки в блок-схемах соединяются линиями

потока информации. Направление потока информации указывается стрелкой. В случае

потока информации сверху вниз и слева направо стрелку ставить не обязательно. Блоки в

блок-схеме имеют только один вход и один выход (за исключением логического блока –

блока с условием).

Тема 1.2. Языки и системы программирования. Методы программирования

Page 72: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

1.2.1 Эволюция языков программирования. Классификация языков

программирования. Эволюция языков программирования. Классификация языков

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

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

Методы программирования: структурный, модульный, объектный. Достоинства и

недостатки методов программирования. Общие принципы разработки программного

обеспечения. Жизненный цикл программного обеспечения.

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

обеспечения (т.е. программного обеспечения, служащего для создания программных

средств в любой проблемной области) рассматривают пять поколений языков

программирования (ЯП). ЯП первого поколения представляли собой набор машинных

команд в двоичном (бинарном) или восьмеричном формате, который определялся

архитектурой конкретной ЭВМ. Каждый тип ЭВМ имел свой ЯП, программы на котором

были пригодны только для данного типа ЭВМ. Второе поколение ЯП характеризуется

созданием языков ассемблерного типа (ассемблеров, макроассемблеров), позволяющих

вместо двоичных и других форматов машинных команд использовать их мнемонические

символьные обозначения (имена). Являясь существенным шагом вперед, ассемблерные

языки все еще оставались машинно-зависимыми, а программист все также должен был

быть хорошо знаком с организацией и функционированием аппаратной среды

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

для чтения, трудоемки при отладке и требуют больших усилий для переноса на другие

типы ЭВМ. Однако и сейчас ассемблерные языки используются при необходимости

разработки высокоэффективного программного обеспечения (минимального по объему и

с максимальной производительностью). Третье поколение ЯП начинается с появления в

1956 г. первого языка высокого уровня — Fortran, разработанного под руководством Дж.

Бэкуса в фирме IBM. За короткое время Fortran становится основным ЯП при решении

инженерно-технических и научных задач. Первоначально Fortran обладал весьма

ограниченными средствами обеспечения работы с символьной информацией и с системой

ввода-вывода. Однако постоянное развитие языка сделало его одним из самых

распространенных ЯВУ на ЭВМ всех классов — от микро- до суперЭВМ, а его версии

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

Вскоре после языка Fortran появились такие ныне широко известные языки, как Algol,

Cobol, Basic, PL/1, Pascal, APL, ADA, C, Forth, Lisp, Modula и др. В настоящее время

насчитывается свыше 2000 различных языков высокого уровня. Языки четвертого

поколения носят ярко выраженный непроцедурный характер, определяемый тем, что

Page 73: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

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

формируются скорее соотношения, а не последовательности шагов выполнения

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

используемые для задач искусственного интеллекта (например, Prolog, Langin). Так как

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

значительно более пригодны для применения непрофессионалами в области

программирования. Второй тенденцией развития ЯП четвертого поколения являются

объектно-ориентированные языки, базирующиеся на понятии программного объекта,

впервые использованного в языке Simula-67 и составившего впоследствии основу

известного языка SmallTalk. Программный объект состоит из структур данных и

алгоритмов, при этом каждый объект знает, как выполнять операции со своими

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

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

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

и в традиционных ЯП третьего поколения, но при этом проще в использовании. Среди

языков запросов фактическим стандартом стал язык SQL (StructuredQueryLanguage). И,

наконец, четвертым направлением развития являются языки па- раллельного

программирования (модификация ЯВУ Fortran, языки Occam, SISAL, FP и др.), которые

ориентированы на создание программного обеспечения для вычислительных средств

параллельной архитектуры (многомашинные, мультипроцессорные среды и др.), в

отличие от языков третьего поколения, ориентированных на традиционную

однопроцессорную архитектуру. К интенсивно развивающемуся в настоящее время

пятому поколению относятся языки искусственного интеллекта, экспертных систем, баз

знаний (InterLisp, ExpertLisp, IQLisp, SAIL и др.), а также естественные языки, не

требующие освоения какого-либо специального синтаксиса (в настоящее время успешно

используются естественные ЯП с ограниченными возможностями — Clout, Q&A, HAL и

др.).

Основными элементами языков программирования являются: символы - неделимые

знаки;

элементарные конструкции – минимальные единицы, имеющие определенный смысл 

(имена, числа, метки, директивы и т.д.); выражения – задают правило вычисления

некоторого значения; описания – сведения о данных; операторы – предписания о

выполнении конкретных действий.

Система программирования - программная система, предназначенная для

разработки программ на конкретном языке программирования. Система

Page 74: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

программирования предоставляет пользователю специальные средства разработки

программ: транслятор, (специальный) редактор текстов программ, библиотеки

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

этапов:1. этап. В текстовом редакторе пишется исходный код программы на

алгоритмическом языке (source code) и сохраняется в файле с расширением *.pas.2 этап. Трансляция, происходит преобразование исходного кода программы

(source code) в объектный код(object code), т.е. происходит проверка синтаксиса написания операторов, и если ошибок в написании нет, осуществляется перевод на язык машинных кодов. Файл объектного кода имеет расширение *.obj;

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

Трансляторы делятся на два класса: компиляторы (compiler) и интерпретаторы (interpreter). Компиляторы транслируют всю программу, но без ее выполнения. Интерпретаторы, в отличие от компиляторов, выполняют пооператорный перевод на машинный языки выполнение всей программы.

3. этап. Компоновка, когда происходит обработка объектного кода редактором связей, специальной программой осуществляющей построение загрузочного модуля (load module), пригодного к выполнению (рис 16.).

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

Методы программирования: структурный, модульный, объектный. Достоинства и

недостатки методов программирования. Общие принципы разработки программного

обеспечения. Жизненный цикл программного обеспечения. Модульное программирование

Page 75: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

— это такой способ программирования, при котором вся программа разбивается на группу

компонентов, называемых модулями, причем каждый из них имеет свой контролируемый

размер, четкое назначение и детально проработанный интерфейс с внешней средой.

Единственная альтернатива модульности — монолитная программа. Определения модуля

и его примеры. Модуль — это совокупность команд, к которым можно обратиться по

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

элементы и идентификатор (возможно агрегатный).

Функциональная спецификация модуля должна включать:

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

на используемом языке программирования синтаксически правильное обращение к нему;

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

Разновидности модулей. Существуют три основные разновидности модулей:

3) "Маленькие" (функциональные) модули, реализующие, как правило, одну

какую-либо определенную функцию. Основным и простейшим модулем практически

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

a)"Средние" (информационные) модули, реализующие, как правило, несколько

операций или функций над одной и той же структурой данных (информационным

объектом), которая считается неизвестной вне этого модуля.

4) "Большие” (логические) модули, объединяющие набор "средних" или "маленьких"

модулей. Примеры "больших" модулей в языках программирования:

Набор характеристик модуля предложен Майерсом. Он состоит из следующих

конструктивных характеристик:

5) размера модуля;

В модуле должно быть 7 (+/-2) конструкций (например, операторов для функций

или функций для пакета). Модуль (функция) не должен превышать 60 строк. В

результате его можно поместить на одну страницу распечатки или легко просмотреть на

экране монитора.

6) прочности (связности) модуля;

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

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

оператора безусловного перехода goto. Локальность данных дает возможность легко

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

(прочность) модуля (cohesion) — мера независимости его частей. Чем выше связность

модуля — тем лучше, тем больше связей по отношению к оставшейся части программы

он упрятывает в себе. Можно выделить типы связности, приведенные ниже.

Page 76: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Функциональная связность. Модуль с функциональной связностью реализует одну

какую-либо определенную функцию и не может быть разбит на 2 модуля с теми же

типами связностей.

Последовательная связность. Модуль с такой связностью может быть разбит на

последовательные части, выполняющие независимые функции, но совместно

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

использован сначала для оценки, а затем для обработки данных.

Информационная (коммуникативная) связность. Модуль с информационной

связностью — это модуль, который выполняет несколько операций или функций над

одной и той же структурой данных (информационным объектом), которая считается

неизвестной вне этого модуля. Эта информационная связность применяется для

реализации абстрактных типов данных.

7) сцепления модуля с другими модулями;

Сцепление (coupling) — мера относительной независимости модуля от других

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

модулей. Чем слабее сцепление модуля, тем лучше. Рассмотрим различные типы

сцепления.

Независимые модули — это идеальный случай. Модули ничего не знают друг о

друге. Организовать взаимодействие таких модулей можно, зная их интерфейс и

соответствующим образом перенаправив выходные данные одного модуля на вход

другого. Достичь такого сцепления сложно, да и не нужно, поскольку сцепление по

данным (параметрическое сцепление) является достаточно хорошим.

Сцепление по данным (параметрическое) — это сцепление, когда данные

передаются модулю, как значения его параметров, либо как результат его обращения к

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

в языках программирования при обращении к функциям (процедурам). Две

разновидности этого сцепления определяются характером данным.

-сцепление по простым элементам данных.

-сцепление по структуре данных. В этом случае оба модуля должны знать о

внутренней структуре данных.

8) рутинности (независимость от предыдущих обращений) модуля.

Рутинность — это независимость модуля от предыдущих обращений к нему (от

предыстории). Будем называть модуль рутинным, если результат его работы зависит

только от количества переданных параметров (а не от количества обращений).

Page 77: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Структурное программирование возникло как вариант решения проблемы

уменьшения сложности разработки программного обеспечения. Цель структурного

программирования - повышение надежности программ, обеспечение сопровождения и

модификации, облегчение и ускорение разработки. Методология структурного

программирования — подход, заключающийся в задании хорошей топологии императивных

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

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

независимости от других модулей. Подход базируется на двух основных принципах:

последовательная декомпозиция алгоритма решения задачи сверху вниз, использование

структурного кодирования. Методы и концепции, лежащие в основе структурного

программирования.

Метод алгоритмической декомпозиции сверху вниз — заключается в пошаговой

детализации постановки задачи, начиная с наиболее общей задачи. Данный метод

обеспечивает хорошую структурированность. Метод поддерживается концепцией

алгоритма.

Метод модульной организации частей программы — заключается в разбиении

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

концепцией модуля.

Метод структурного кодирования — заключается в использовании при кодировании

трех основных управляющих конструкций. Метки и оператор безусловного перехода

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

поддерживается концепцией управления.

При использовании для построения программы метода, известного под названием

структурное программирование, программа конструируется иерархически - сверху вниз

(от главной программы к подпрограммам самого нижнего уровня), с употреблением на

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

последовательностей инструкций, циклов и некоторых видов условных разветвлений. При

последовательном проведении этого метода структуру результирующих алгоритмов легко

понимать, отлаживать и модифицировать.

Теорема о структурировании: Всякую правильную программу (т.е. программу с

одним входом и одним выходом без зацикливаний и недостижимых веток) можно

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

и повторение цикла

Следствие 1: Всякую программу можно привести к форме без оператора goto.

Page 78: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Следствие 2: Любой алгоритм можно реализовать в языке, основанном на трех

управляющих конструкциях -последовательность, цикл, повторение.

Следствие 3: Сложность структурированных программ ограничена, даже в случае их

неограниченного размера.

Метод структурного программирования оказался эффективен при написании

программ «ограниченной сложности». Однако с возрастанием сложности реализуемых

программных проектов и, соответственно, объема кода создаваемых программ,

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

Основной причиной возникших проблем можно считать то, что в программе не

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

ними. При попытке анализа и модификации текста программы программист вынужден

был оперировать искусственными категориями. Чтобы писать все более сложные

программы, необходим был новый подход к программированию. В итоге были

разработаны принципы объектно-ориентированного программирования. OOП

аккумулирует лучшие идеи, воплощённые в структурном программировании, и сочетает

их с мощными новыми концепциями, которые позволяют по-новому организовывать ваши

программы. Надо сказать, что теоретические основы ООП были заложены еще в 70-х

годах прошлого века, но практическое их воплощение стало возможно лишь в середине

80-х, с появлением соответствующих технических средств.

Методология ООП использует метод объектной декомпозиции, согласно которому

структура системы (статическая составляющая) описывается в терминах объектов и

связей между ними, а поведение системы (динамическая составляющая) - в терминах

обмена сообщениями между объектами. Сообщения могут быть как реакцией на события,

вызываемые как внешними факторами, так и порождаемые самими объектами. Объектно-

ориентированные программы называют «программами, управляемыми от событий», в

отличие от традиционных программ, называемых «программам, управляемыми от

данных». Основные методы и концепции ООП. Метод объектно-ориентированной

декомпозиции – заключается в выделении объектов и связей между ними. Метод

поддерживается концепциями инкапсуляции, наследования и полиморфизма. Метод

абстрактных типов данных – метод, лежащий в основе инкапсуляции. Поддерживается

концепцией абстрактных типов данных. Метод пересылки сообщений – заключается в

описании поведения системы в терминах обмена сообщениями между объектами.

Поддерживается концепцией сообщения.

В объектно-ориентированном программировании определяют три основных свойства:

Page 79: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Инкапсуляция. Это сокрытие информации и комбинирование данных и функций

(методов) внутри объекта.

Наследование. Построение иерархии порожденных объектов с возможностью для

каждого такого объекта-наследника доступа к коду и данным всех порождающих

объектов-предков. Построение иерархий является достаточно сложным делом, так как при

этом приходится выполнять классифицирование.

Полиморфизм (полиморфизм включения) — присваивание действию одного имени,

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

иерархии выполняет это действие способом, подходящим именно ему.

Методология проектирования программного обеспечения описывает процесс создания

и сопровождения систем в виде жизненного цикла (ЖЦ), представляя его как некоторую

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

определяются состав и последовательность выполняемых работ, получаемые результаты,

методы и средства, необходимые для выполнения работ, роли и ответственность

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

системой в процессе ее создания и использования.

Модель жизненного цикла отражает различные состояния системы, начиная с момента

возникновения необходимости в данного ПО и заканчивая моментом полного выхода из

употребления. Модель жизненного цикла - структура, содержащая процессы, действия и

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

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

завершения ее использования.

В настоящее время известны и используются следующие модели жизненного цикла:

Каскадная модель) предусматривает последовательное выполнение всех этапов

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

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

Разработка ведется итерациями с циклами обратной связи между этапами. Межэтапные

корректировки позволяют учитывать реально существующее взаимовлияние результатов

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

период разработки. Спиральная модель. На каждом витке спирали выполняется создание

очередной версии продукта, уточняются требования проекта, определяется его качество и

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

разработки - анализу и проектированию, где реализуемость тех или иных технических

решений проверяется и обосновывается посредством создания прототипов

(макетирования).

Page 80: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

На практике наибольшее распространение получили две основные модели жизненного

цикла: каскадная модель (характерна для периода 1970-1985 гг.); спиральная модель

(характерна для периода после 1986.г.).

2. Язык программирования Delphi

2.1 Основные составляющие среды программирования Delphi.

Характеристика проекта: состав проекта, параметры проекта. Язык

программирования Delphi: алфавит, словарь языка, структура программы. Простые типы

данных. Выражения и операции. Константы. Переменные. Приемы работы в среде

программирования Delphi. Delphi – интегрированная среда разработки (Integrated

Development Environment – IDE). Delphi дает возможность создавать программы в стиле

визуального конструирования формы, разместив на ней какие-либо визуальные элементы.

Delphi имеет сложный интерфейс.

В Delphi имеются 10 окон, но после загрузки появляются четыре окна:

главное окно Delphi - <имя проекта>;

окно с формой для проектирования приложения Form1 (окно проектировщика

формы);

окно инспектора объектов Object Inspector;

окно редактора кода Unit1.pas.

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

программы. Главное управляющее окно системы Delphi обычно располагается в

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

выглядит наиболее загруженным из всех окон.

Это окно содержит:

строку заголовка;

строку меню;

панель инструментов;

палитру компонентов.

Строка заголовка главного окна отображает имя открытого в данный момент

проекта Project1. Под строкой заголовка окна системы располагается строка меню,

содержащая команды системы Delphi. Строка меню содержит команды, необходимые для

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

Windows. Строка меню — это очень важный элемент управления любой программы или

системы. Кроме строки меню программы обычно содержат и другие элементы

управления: командные кнопки, кнопки инструментов и прочие. Кнопками удобно

Page 81: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

пользоваться для исполнения операций, но не для всякой операции есть кнопка, а только

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

любую команду, на которую система способна.

Под строкой меню располагаются панели инструментов с кнопками. Во многих про-

граммах имеется только одна такая панель, но в системе Delphi их несколько. Панели

инструментов предназначены для выполнения некоторых команд, реализуемых главным

меню. Кнопки панелей инструментов обеспечивают доступ к наиболее часто

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

навести на нее указатель мыши и подождать, пока рядом с ним появится всплывающая

подсказка. На этой панели есть, в частности, кнопка сохранения проекта на диске, кнопка

открытия проекта, кнопка запуска программы на выполнение.

Одна из панелей инструментов, имеющихся в главном окне системы Delphi, заметно

отличается от остальных. Это палитра компонентов. Палитра компонентов устроена в виде

набора пиктограмм. Палитра компонентов содержит множество вкладок. Каждая из них

содержит свой набор компонентов. Общее число компонентов достигает нескольких сотен.

Совокупность наборов составляет библиотеку визуальных компонентов (Visual

Components Library - VCL). Имеется несколько категорий компонентов, каждая из

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

экземпляры компонентов (объекты) на форме.

Окно инспектора объектов (Object Inspector) отображает свойства какого-либо

компонента, активизированного щелчком мышью, или самой формы. Имя активизированного

компонента находится под заголовком окна. Именно с помощью инспектора объектов

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

выбора и настройки событий, на которые будут реагировать объекты нашей программы.

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

Окно проектировщика формы – главное место, где происходит сборка

программы из компонентов, содержащихся в палитре компонентов. Сама форма – это

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

программу, в указанное место формы добавляются объекты – экземпляры компонента

выбранного типа. Сетка из точек в окне формы поможет разместить объекты ровно и

аккуратно. При работе программы ее не видно.

Форма — это заготовка окна будущей программы. Каждая программа содержит

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

окно формы мы видим на экране всегда. Заготовка первого окна называется Form1. Если

в программе будет два окна, то заготовка второго будет называться Form2 и так далее.

Page 82: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Возможна замена стандартного названия более подходящим для программы. Последнее из

открытых окон содержит код программы. Часть программы система Delphi формирует

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

операторов языка Pascal. Добавлять нужные операторы система Delphi начинает еще до

того, как программист приступил к созданию своей программы.

Добавляются операторы именно в этом окне. Некоторые операторы система Delphi

добавит сама, другие мы введем вручную. Именно поэтому окно кода никогда не бывает

пустым.

Для системы Delphi каждая незавершенная программа – это проект. Проект

включает в себя множество файлов. Наиболее важными являются три файла: файл

формы, файл кода и файл проекта.

Проект, состоит из:

файла проекта Project1.dpf,

файла параметров проекта Project1.dof,

файла ресурсов проекта Project.res,

файла настроек проекта Project1.cfg,

файла описания формы Unit1.dfm,

файла модуля формы Unit1.pas.

Файл модуля формы доступен для редактирования, именно он отображается в

Редакторе Кода. Остальные файлы создаются Delphi автоматически. В процессе

компиляции программы файлы преобразуются в исполняемый exe-файл, который, по

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

В проекте могут быть задействованы несколько форм, а также дополнительные

модули и файлы ресурсов, при этом схема компиляции остается похожей.

Для сохранения проекта нужно воспользоваться пунктом главного меню Save

Project As…

Чтобы не смешивать файлы разных проектов, желательно каждый новый проект

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

затем имя проекта.

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

выберается пункт главного меню File → New Application.

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

загрузить старую программу, нужно выбрать в главном меню Open Project либо

воспользоваться кнопкой на панели инструментов и загрузить соответствующий файл

проекта.

Page 83: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

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

Интернете можно найти тысячи. Они отличаются по своему внешнему виду, функциям,

способам реализации, требованиям к аппаратной части и т.п., но, тем не менее, все они

построены на едином фундаменте, единой объектной основе.

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

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

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

элементы управления.

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

на форму: это кнопки, поля ввода, картинки, панели и т.д. Те из них, что предназначены

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

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

доступа к определенным функциям системы. При добавлении их на форму на ней

появляется иконка с изображением компонента, невидимая во время исполнения

программы. В этом и заключается их «невизуальность». Несмотря на это, некоторые из

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

относятся компоненты меню и диалоги.

Визуальные компоненты составляют интерфейс программы. Визуальные

компоненты имеют много общих свойств и событий, связанных, прежде всего, с их

визуальным отображением на форме.

Часть свойств отвечает за положение на форме: отступ слева, отступ сверху,

высота, ширина, выравнивание.

Некоторые определяют внешний вид: цвет, шрифт, заголовок. Некоторые задают

поведение компонента во время исполнения программы: доступен, виден, курсор,

подсказка.

Механизм событий позволяет связать действия пользователя с необходимыми

действиями программы. События определяют всю структуру программы, поскольку

фактически весь код, то есть, собственно работа программиста, пишется в обработчиках

событий.

В Windows действия пользователя обычно сводятся к нажатиям мыши в

определенных местах экрана, нажатию клавиш клавиатуры, переключению между окнами

и компонентами. В соответствии с этим существуют и события, реагирующие на нажатие

мыши и клавиатуры, переключение фокуса, активацию окон.

Page 84: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Кроме того, для каждого компонента могут существовать характерные для него

события, на которые может потребоваться реакция и обработка, например, событие

изменения текста в поле ввода.

Некоторые конкретные компоненты и их предназначение.

Для вывода надписей предназначен компонент Label.

Для ввода текста пользователем используется компонент Edit.

Для работы с несколькими строками используют Memo. Строки хранятся в

свойстве Lines.

Кнопка реализуется компонентом Button.

Для работы с пунктами используется CheckBox.

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

ComboBox. Альтернативы хранятся в свойстве Items, аналогичном свойству Lines у

компонента Memo.

Для множественного выбора используется RadioGroup. Чтобы добавить в него

пункты, щелкните на кнопку свойства Items и введите названия пунктов. Номер

выделенного пункта соответствует свойству ItemIndex, нумерация с нуля.

Простейшим контейнером компонентов может служить компонент Panel. На

него можно поместить другой компонент, например, кнопку. При перемещении

контейнера передвигаются все находящиеся в нем компоненты.

Для работы с картинкой используется компонент Image. Картинку можно

загрузить, щелкнув на кнопку свойства Picture и выбрав сохраненную картинку. Если

загруженная картинка не совпадает по размерам с размерами компонента, ее можно

масштабировать, установив свойство Stretch, либо изменить размеры компонента,

установив свойство AutoSize. Задний фон картинки можно убрать, используя свойство

Transparent.

Для графического оформления используется компонент Bevel. Его вид можно

настроить с помощью свойства Shape.

Ввод целых чисел с помощью мыши можно обеспечить с помощью компонента

TrackBar. Его основное свойство – Position.

А для отображения процесса длительных расчетов можно использовать

компонент ProgressBar. Его свойство Position отображает процент выполненной работы.

Структура программы. Модуль кода (unit) делится на две части – интерфейс

(interface) и реализацию (implementation).

Раздел interface:

Page 85: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

uses: подключаемые модули, в которых содержатся используемые процедуры,

функции, классы и т.п. Их список формируется автоматически в зависимости от

добавленных в форму компонентов.

type: описания типов. Автоматически в этом разделе описан класс вашей формы.

var: описание глобальных переменных. Автоматически тут описана переменная

типа описанного класса формы. В этой переменной во время работы программы хранится

указатель на экземпляр формы.

const: описание констант. Этот раздел автоматически не создается, однако может

быть легко добавлен.

Раздел implementation: Здесь также можно добавить uses.

С помощью {$R} подключаются файлы ресурсов. Автоматически подключен файл

dfm, имеющий то же имя, что и файл модуля и потому подключаемый как *.dfm. В этом

файле хранится информация о форме – расположение и настройки компонентов,

помещенных в форму, и т.п. 

Раздел содержит описание реализаций процедур и функций. Автоматически тут

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

программе процедур, функций и методов классов.

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

констант, процедур, типов, классов и т.п., должно быть описано в разделе interface. В этой

части программы, которая создается автоматически, в разделе uses перечисляются

используемые модули, в разделе type описывается класс формы – потомок класса TForm, а

в разделе var описывается глобальная переменная, в которой будет храниться указатель на

объект-экземпляр формы. Соответственно, если надо подключить какой-то свой модуль,

то необходимо добавить его в раздел uses. При описани нового типа его добавляют в

раздел type до или после класса формы. Если нужно описать глобальную переменную, то

ее добавляют в раздел var, а если нужна константа – создается дополнительно раздел

const. В свою очередь, в разделе implementation сначала указывается ссылка на файлы

ресурсов, а затем описываются реализации процедур и функций – как создаваемых

автоматически обработчиков событий, так и добавляемых по необходимости. Вначале эта

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

При добавлении компонента в форму автоматически модифицируется код модуля –

в описании класса формы появляется переменная, хранящая ссылку на добавленный

компонент.

Page 86: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

При создании обработчика события (при нажатии на компонент, помещенный в

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

Инспектора Объектов) в коде происходят следующие изменения:

в разделе implementation создается пустой обработчик, который вы потом

заполняете;

в классе вашей формы создается описание этого метода (обработчики событий

являются методами);

если не создавать обработчик через страницу Events Инспектора Объектов (или

двойным щелчком по компоненту), а просто написать в коде процедуру-

обработчик, то он не будет должным образом связан с компонентом, и событие не

сработает.

Если изменить имя компонента, то изменятся имена и обработчиков событий,

которые с ним связаны.

Если необходимо изменить название обработчика, то надо воспользоваться

Инспектором Объектов. Переименовывая здесь имя процедуры обработчика, корректно

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

Если необходимо удалить какой-то обработчик, то удалите весь код внутри

процедуры. При следующем запуске программы все пустые процедуры автоматически

корректно удаляются. Компилятор автоматически удаляет пустые процедуры при запуске.

При удалении всей процедуры описание и ссылки на нее останутся, а удаление их всех

требует времени и аккуратности.

При удалении компонента не удаляются процедуры-обработчики его событий. Это

связано с тем, что один и тот же обработчик может использоваться для разных

компонентов. В случае, если нужно удалить эти оставшиеся обработчики, удалите код

внутри них и запустите программу.

Проблема обеспечения гарантированного выполнения некоторых действий

решается наличием специального события OnCreate. Это событие формы. Оно возникает

тогда, когда форма создается, а поскольку главная форма создается в самом начале работы

приложения, то и код, описанный в обработчике данного события, выполнится один раз и

в самом начале. В обработчике события OnCreate можно описать процедуры и функции

инициализации, присваивать нужные значения глобальным переменным и т.п.

Раздел implementation предназначен не только для обработчиков событий. В этот

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

что они должны идти раньше процедур и обработчиков, из которых вызываются, или

Page 87: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

объявить их в разделе interface. В последнем случае эти функции и процедуры будут

доступны для вызова из других модулей.

Существует также важная тонкость использования собственных функций: все

обработчики событий имеют в своем названии имя формы:

procedure TForm1.FormCreate(Sender: TObject);

Это указывает на то, что работают с классом формы TForm1 и описывают методы для нее.

Из обработчика просто обращаются к компонентам формы (класс формы «знает» о

наличии компонентов на ней и имеет к ним непосредственный доступ), например:

MyGrid.RowCount := Num;

Когда описывается собственная процедура, то она «ничего не знает» о компонентах

формы, и поэтому нужно обращаться к компонентам через форму, а, не минуя ее.

Алфавит языка. Константы. Переменные. Типы данных: целый, вещественный, логический.

Delphi – это среда разработки программ, ориентированных на работу в

операционной системе Windows. В основе Delphi лежит технология визуального

проектирования, которая базируется на идеях объектно-ориентированного

программирования. Программы в Delphi пишутся на языке Object Pascal, который

является развитием языка Turbo Pascal. Слово “Object” особо подчёркивает, что язык

поддерживает концепцию объектно-ориентированного программирования. Основной

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

использованием возможностей визуального программирования. Однако Delphi

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

оперативную память используются процедуры read и readln, а для вывода

результатов на экран монитора – процедуры write и writeln. Такие приложения

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

основ языка Object Pascal на примерах создания консольных приложений. Алфавит

языка Object Pascal состоит из букв, цифр, специальных символов и неиспользуемых

символов.

К буквам относятся большие и малые буквы латинского алфавита. При этом

Object Pascal не различает одноимённые большие и малые буквы, если только они

не входят в символьное или строковое выражение. Буквой является также знак

подчёркивания « _ ».

К цифрам относятся арабские цифры от 0 до 9 и шестнадцатеричные цифры.

Перед шестнадцатеричным числом ставят знак $ .

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

операций и зарезервированные слова. В качестве разделителей можно использовать

Page 88: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

пробел, управляющие символы (символы с кодами от 0 до 32), комментарий.

Комментарием называется любая последовательность символов, заключённая в

фигурные скобки: {это комментарий}. Комментарий во время выполнения

программы игнорируется, его основное назначение – пояснения к тексту программы.

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

которые начинаются с пары символов {$, рассматриваемых как одно целое.

Знаки операций:

+ – * / = < > <= >=

Знаки пунктуации:

, . : ; // := .. “ ^ @ $ # ( ) (* *) [ ] (. .) { }

Зарезервированные слова нельзя использовать в качестве имён, которые задаёт

программист. Примеры зарезервированных слов: begin, end, var, program, uses.

Неиспользуемые символы, к которым, в частности относятся буквы русского

алфавита, могут быть использованы в комментариях, а также символьных и

строковых константах.

Идентификаторы (имена) используются для обозначения констант, типов,

переменных, процедур, функций, классов, модулей, программ и т.д. Идентификаторы

состоят из букв и цифр и должны начинаться с буквы. Длина идентификатора

может быть произвольной, но значащими являются только первые 64 символа. Знак

подчёркивания может входить в идентификатор. Специальные символы и

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

правильного идентификатора: pr_1_3. Примеры недопустимых идентификаторов: 5p

сумма var sum.6 x 5

Консольное приложение состоит из заголовка (правильного идентификатора) и

следующих разделов (структура консольного приложения): program p1;

{$APPTYPE CONSOLE}uses SysUtils;

Список подключаемых модулей начинается словом uses и содержит имена

модулей, содержимое которых может использовать данное консольное приложение.

Раздел меток начинается словом label, за которым следует список меток,

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

Метки позволяют пометить любой оператор, чтобы на него можно было передать

управление из любого места программы.

Page 89: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Раздел констант начинается словом const, за которым идут конструкции вида <имя константы> = <значение>. Константами называют любые неизменяемые в процессе выполнения программы данные.

Раздел описания типов начинается словом type, за которым идут конструкции вида <имя типа> = <описание>, позволяющие программисту создавать собственные типы.

Раздел описания переменных начинается со слова var. Здесь должны быть указаны все переменные, используемые в разделе операторов программы, а также их тип: <имя переменной > : <тип>;

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

Раздел операторов начинается служебным словом begin и заканчивается словом

end, после которого ставится точка – признак конца программы. Раздел операторов

содержит последовательность действий, которую должен выполнить компьютер

const n = 10;

var t : boolean; x, i : integer; Данные, независимо от типа, имеют некоторое значение и в

программе предстают как константы или переменные. Данные, которые получили

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

константами. Константами, например, являются скорость света в вакууме и соотношение

единиц измерения (метр, сантиметр, ярд, фут, дюйм), которые имеют научно

обоснованные или традиционно принятые постоянные значения. Константы описываются

с помощью зарезервированного слова const. За ним идет список имен констант, каждому

из которых с помощью знака равенства присваивается значение. Одно присваивание

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

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

констант:

После такого описания для обращения к нужному значению достаточно указать лишь имя

соответствующей константы. Значение константы можно задавать и выражением. Эту

возможность удобно использовать для комплексного представления какого-либо понятия.

При объявлении константы можно указать ее тип. Такие константы называются

Page 90: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

типизированными; их основное назначение — объявление константных значений

составных типов данных.

Простыми являются порядковые, вещественные типы и тип дата-время.

Порядковые типы характеризуются тем, что соответствующие им значения

образуют конечное упорядоченное множество и каждое значение имеет свой

порядковый номер. К порядковым типам относятся целые (табл. 1), логические

(табл.2), символьные, перечислимые типы и тип-диапазон. Для выражений

порядкового типа определены следующие функции:

ord(x) – возвращает порядковый номер значения данного выражения. Для

целых типов возвращает само значение x, для логического 0 или 1, для

символьного – значение в диапазоне от 0 до 255, для перечислимого – значение в

диапазоне от 0 до 65535. Для типа-дипазона результат зависит от свойств базового

порядкового типа.

pred(x) – возвращает значение, предшествующее значению данного выражения

x.

succ(x) – возвращает значение, следующее за значением данного выражения

x.

high(x) – возвращает максимальное возможное значение для аргумента x.

low(x) – возвращает минимальное возможное значение для аргумента x.

Таблица 1 - Целые типыТип Диапазон значений Размер (в байтах)

integer -2147483648..2147483647 4

cardinal 0..4294967295 4

shortint -128..127 1

smallint -32768..32767 2

longint -2147483648..2147483647 4

int64 -263..263-1 8

Byte 0..255 1

word 0..65535 2

longword 0..4294967295 4

Целые типы данных предназначены для представления целых чисел.

Наибольшая производительность процессора и операционной системы достигается

при использовании типов integer и cardinal.

К переменным целого типа можно применять операции целочисленного деления

div и mod. Если a и b – переменные целого типа, то

Page 91: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

a div b – это целая часть частного от деления a на b;

a mod b – это остаток от деления a на b.

Например, 9 div 2 = 4 9 mod 2 = 1

При применении к данным целого типа операций

* div mod + –

полученный результат будет также целого типа. То же можно сказать и о

стандартных функциях abs и sqr. Операция деления / над целочисленными

операндами даёт результат вещественного типа. Если в арифметическом выражении

используются значения только какого-нибудь одного из целых типов, то результат

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

разных типов, то результат будет иметь тип integer. Для данных целого типа

определены процедуры:

inc(i, k) – увеличивает значение i на k единиц; если k не задано, то на 1;

dec(i, k) – уменьшает значение i на k единиц; если k не задано, то на 1.

2.2. Разработка программ с разветвлениями

В Delphi данные логического (булева) типа могут принимать одно из двух значений: true (истина) или false (ложь). Логические типы, определённые в Object Pascal: Таблица 2 - Логические типы

Тип Размер (в байтах)

Boolean 1

ByteBool 1

WordBool 2

LongBool 4

Основным логическим типом в Delphi 7 является Boolean. Остальные типы

нужны для совместимости с логическими данными, используемыми в Windows и

некоторых других системах программирования, например Visual C.

В логических выражениях можно использовать логические операции: not

(отрицание), and (логическое И), or (логическое ИЛИ), xor (логическое исключающее

ИЛИ). Результат применения этих операций к операндам логического типа

представлен в следующей таблице.

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

операция not, затем and, потом or и xor. Операции отношения выполняются в

последнюю очередь.

Page 92: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Логические поразрядные операции предназначены для поразрядной обработки

целочисленных операндов, представленных в двоичном виде. Такими операциями

являются поразрядные отрицание (not), и (and), или (or), исключающее или (xor), а

также поразрядные сдвиг влево (shl) и сдвиг вправо (shr). Расмотрим пример. Пусть

переменные a и b типа byte имеют значения 3 и 5 соответственно. В двоичном

представлении эти числа будут иметь вид : 00000011 и 00000101. Вычислим a xor

b. Операция xor будет применяться поразрядно, т.е. к каждой паре чисел, стоящих в

одинаковых позициях. Результат можно определить при помощи приведённой выше

таблицы, если мысленно заменить 0 словом false, а 1 – словом true. Получим

00000110 = 6 (10). Операции shl и shr сдвигают значение переменной влево или

вправо на указанное количество битов (например a shl 1 – сдвиг влево на 1 бит).

При этом начальные или конечные биты теряются, а вновь появившиеся биты

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

количеству разрядов смещения.

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

: Таблица 3 - Вещественные типыТип Диапазон значений Размер (в байтах)

real 5.0*10–324 .. 1.7*10308 8

real48 2.9*10–39 .. 1.7*1038 6

single 1.5*10–45 .. 3.4*1038 4

double 5.0*10–324 .. 1.7*10308 8

extended 3.6*10–4951 .. 1.1*104932 10

comp –263 +1 .. 263–1 8

currency –922337203685477.5808 ..922337203685477.5807 8

Наибольшая производительность процессора достигается при использовании

типа real. В Delphi 7 ему эквивалентен тип double.

При условии, что хотя бы один из операндов вещественного типа, операции

* , / , + , – дают вещественный результат. К данным вещественного типа применимы

все вышеперечисленные стандартные математические функции.

Вещественные значения могут изображаться в форме с фиксированной точкой (

например, 7.32 456.721 0.015), а также в форме с плавающей точкой, т.е. в виде

Page 93: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

<мантисса>Е<порядок>. Точка в мантиссе плавает – отсюда название.

Вещественные числа выводятся на экран в форме с плавающей точкой, если не

используется вывод с форматом.

2.3 Инструкции цикла. Массивы.

Основная часть программы на языке Delphi представляет собой последовательность

операторов, выполняющих некоторое действие над данными, объявленными в секции

описания данных. Операторы выполняются строго последовательно в том порядке, в

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

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

простые и структурные. Простые операторы не содержат в себе никаких других

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

перехода. Структурные операторы содержат в себе простые или другие структурные

операторы и подразделяются на составной оператор, условные операторы и операторы

повтора.

Оператор присваивания (:=) вычисляет выражение, заданное в его правой части, и

присваивает результат переменной, идентификатор которой расположен в левой части.

Например:

X := 4;

Y := 6;

Z := (X + Y) / 2;

Во избежании ошибок присваивания необходимо следить, чтобы тип выражения был

совместим с типом переменной. Под совместимостью типов данных понимается

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

другого типа данных. Например, все целочисленные типы данных совместимы с

вещественными (но не наоборот!).

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

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

широким диапазоном значений. Например, выражение с типом данных Byte можно

присвоить переменной с типом данных Integer, а выражение с типом данных Integer

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

выражение принадлежит 32-разрядному целочисленному типу данных (например, Integer),

а переменная — 64-разрядному целочисленному типу данных Int64. Для того, чтобы на

32-разрядных процессорах семейства x86 вычисление выражения происходило правильно,

Page 94: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

необходимо выполнить явное преобразование одного из операндов выражения к типу

данных Int64. Следующий пример поясняет сказанное:

var

I: Integer;

J: Int64;

begin

I := MaxInt; // I = 2147483647 (максимальное целое)

J := I + 1; // J = -2147483648 (неправильно: ошибка переполнения!)

J := Int64(I) + 1; // J = 2147483648 (правильно: вычисления в формате Int64)

end.

Пусть, например, переменной x присвоено значение 13, а переменной y –

значение 25. Чтобы x и y поменялись значениями, можно, используя

вспомогательную (буферную) переменную t, записать следующую последовательность

операторов присваивания:

x:=13; y:=25; t:=x; x:=y; y:=t;

В результате получим x=25 y=13.

Условный оператор IF.

Оператор if предназначен для реализации разветвляющегося вычислительного

процесса. В общем виде условный оператор записывается следующим образом:

if <логическое выражение> then <оператор1> else <оператор2>;

Вначале оператор if вычисляет значение логического выражения. Если значение

логического выражения равно true, то выполняется оператор1, в противном случае –

оператор2. В качестве оператора1 и оператора2 может быть использован составной

оператор (группа операторов, заключённых в операторные скобки begin end) или

другой условный оператор (вложенный условный оператор).

Оператор if может быть записан в сокращённой форме:

if <логическое выражение> then <оператор> ;

Пример . Даны два различных вещественных числа. Вывести на экран большее из

них.

var x, y : real;

begin

readln(x, y);

if x>y then writeln(x:7:2) else writeln(y:7:2);

readln

end.

Page 95: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Один оператор if может входить в состав другого оператора if. В таком случае говорят о

вложенности операторов. При вложенности операторов каждое else соответствует тому

then, которое непосредственно ему предшествует. Например:

2.3 Инструкции цикла. Массивы

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

последовательность действий. Такие повторяющиеся действия называются циклами.

В языке Object Pascal возможна организация 3-х видов циклов.

4. С параметром (оператор for)

5. С предусловием (оператор while)

6. С постусловием (оператор repeat)

Оператор цикла for организует выполнение последовательности операторов

заранее известное число раз. Существуют два варианта оператора:

1. С увеличением счётчика:

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

2. С уменьшением счётчика:

for <счётчик>:=<начальное значение>downto <конечное значение>do <оператор>;

Здесь

<счётчик> – переменная порядкового типа – параметр цикла;

<начальное значение> и <конечное значение> – выражения, которые должны быть

совместимы с параметром цикла;

<оператор> – это оператор, который выполняется в цикле – тело цикла.

Если в цикле необходимо выполнить группу операторов, то её следует заключить в

операторные скобки begin…end.

Оператор for действует следующим образом. Вначале вычисляются начальное и

конечное значения счётчика. Далее счётчику присваивается начальное значение.

Затем значение счётчика сравнивается с конечным значением. Далее, пока счётчик

меньше или равен конечному значению ( в первом варианте ) или больше или равен

( во втором варианте ), выполняется очередная итерация цикла. В противном случае

происходит выход из цикла. Выполнение очередной итерации включает в себя

сначала выполнение тела цикла, а затем присвоение счётчику следующего большего

значения (в первом варианте ) или следующего меньшего значения ( во втором

варианте ). Если параметр цикла целого типа, то это означает увеличение либо

уменьшение его на 1. В первом варианте начальное значение должно быть меньше

конечного, а во втором варианте – больше конечного. В противном случае тело

цикла не будет выполнено ни разу.

Page 96: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Пример . Напечатать столбиком все целые числа от 30 до 45.

var i : integer;

begin

for i:=30 to 45 do writeln(i);

readln

end.

Пример. Найти сумму всех целых чисел от 10 до 50.

var i, s : integer;

begin

s:=0;

for i:=10 to 50 do s:=s+i;

writeln(s);

readln

end.

Рассмотрим выполнение этой программы по шагам:

i s

10 0 + 10 = 10

11 10 + 11 = 21

12 21 + 12 = 33

…………………………..

50 1230

Пример . Вычислить сумму 22 + 23 + 24 + … + 210

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

сумме? Слагаемые – это степени двойки от 2ой до 10ой. Следовательно, имеем 9

слагаемых. Каждое следующее слагаемое получается из предыдущего умножением на

2. Пусть a – очередное слагаемое, s – сумма. Используя эти соображения, запишем

решение:

var i, a, s : integer;

begin

a:=2; s:=0;

for i:=1 to 9 do

begin a:=a*2; s:=s+a end;

writeln(s);

Page 97: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

readln

end.

Пример . Подсчитать количество двузначных чисел, кратных 7.

Решение. Двузначные числа – это все целые числа от 10 до 99. k – счётчик

двузначных чисел, кратных 7.

var i, k : integer;

begin

k:=0;

for i:=10 to 99 do

if i mod 7=0 then inc(k);

writeln(k);

readln;

end.

Пример . Дана последовательность из 10 действительных чисел, которые вводятся с

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

var i : integer; a, max : real;

begin

read(max);

for i:=2 to 10 do

begin

read(a);

if a>max then max:=a

end;

writeln(max:5:2);

readln; readln

end.

Рассмотрим выполнение этой программы по шагам, считая, что последовательность

чисел та же, что и в предыдущем примере:

i a max

6.5

2 -0.4 6.5

3 2.01 6.5

4 12.8 12.8

5 -9.2 12.8

Page 98: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

6 -0.15 12.8

………………………………

В результате получим ответ 12.8.

При решении некоторых задач бывает необходимо организовать вычисление циклов

в другом цикле. Т.е. необходимо создавать вложенные циклы. Довольно часто работа с

вычислениями многомерных массивов требует этого.

Операторы Break и Continue

Оператор Break может быть размещен в теле цикла. При его выполнении цикл прекращает

работу и считается выполненным.

Пример.

s:= 0;

i:=0;

Repeat

Inc (i);

s:= s + z[i];

if (s > 14) then Break;

Until (i = 44);

В этом примере цикл будет выполняться до тех пор, пока не выполнится условие i = 44

или если в операторе if переменная s превысит значение 14.

Оператор Continue также может быть размещен в теле цикла. При его выполнении

управление независимо от того, где он расположен, сразу передается в начало цикла для

выполнения следующего шага.

Пример.

s:= 0;

i:=0;

Repeat

Inc (i);

s:= s + z[i];

if (s > 20) then Continue;

if (s > 14) then Break;

Until (i = 44);

В этом примере если в первом операторе if выполнится условие s > 20, то сработает

оператор Continue. Он сразу передаст управление на первый оператор в теле цикла – Inc

(i), предотвратив тем самым выполнение ниже-следующих операторов – второго if и Until.

Page 99: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Вложенные циклы

В теле оператора цикла могут быть размещены другие операторы цикла. Такие структуры

называются вложенными циклами. Язык допускает любую глубину вложенности циклов.

При использовании вложенных циклов необходимо иметь в виду следующее:

все вложенные циклы For – Do должны иметь различные счетчики (иначе это

противоречило бы требованию на запрет изменения значения счетчика внутри

цикла);

нет никаких ограничений на досрочный выход из внутреннего цикла наружу;

недопустим вход во внутренний цикл For – Do, минуя его заголовок, что

соответствует общему требованию о корректном входе в цикл.

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

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

Пример.

Const

n = 15;

m = 24;

Var

i,j: Byte;

R,Tau,s: Real;

z: array[1..n, 1..m] of Real;

{заполнение массива z с использованием вложенных циклов}

Tau:= Pi/m;

For i:=1 to n do begin

R:=4.0*Pi*Sin(i*Tau); {первый оператор в теле цикла по i}

For j:=1 to m do z[i, j] := R+j; {второй оператор в теле  цикла по i}

end {i};

{вычисление суммы положительных элементов массива z с использованием вложенных

циклов }

s:=0;

For i:=1 to n do

For j:=1 to m do

  if ( z[i, j] > 0) then s:= s + z [i, j];

Приведенный пример содержит две структуры вложенных циклов. Первая структура

предназначена для заполнения элементов двумерного массива z с помощью

Page 100: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

математической формулы

Наружный цикл со счетчиком i в теле цикла содержит два оператора – оператор

присваивания (вычисление значения вспомогательной переменной R с целью сокращения

времени вычислений) и оператор внутреннего цикла со счетчиком j. Поскольку наружный

цикл в своем теле содержит несколько операторов, то они заключены в операторные

скобки begin … end.

Эта структура работает следующим образом. После входа в наружный цикл переменная i

(счетчик этого цикла) примет значение 1. Далее будет вычислено значение переменной R

при i = 1. После этого будет выполнен внутренний цикл со счетчиком j, где j на каждом

шаге будет последовательно принимать значения 1, 2, 3, … m (i при этом остается

неизменным и равным 1). В результате будут вычислены элементы z11, z12, …, z1m первой

строки массива. Затем будет выполнен возврат к заголовку наружного цикла, где значение

счетчика i будет увеличено на 1 (т. е. i станет равно 2) и вновь будет выполнены

операторы, расположенные в его теле. В результате будут определены элементы z21, z22, …,

z2m второй строки массива и т.д.

Вторая структура вложенных циклов предназначена для вычисления суммы

положительных элементов массива z. Для этого сначала переменной s будет присвоено

значение 0, а затем во вложенных циклах будет накоплена требуемая сумма в ячейку s.

При работе со вложенными циклами мы должны помнить, что процедуры Continue и

Break воздействуют только на ближайший оператор цикла и следовательно прекратить

выполнение всех вложенных циклов с их помощью нельзя.

Для прекращения выполнения вложенных циклов, а также функции в которой он

расположен необходимо воспользоваться оператором Exit

Оператор цикла с предусловием WHILE имеет следующий формат:

while <логическое выражение> do <оператор>;

Выполняется оператор следующим образом. Вначале вычисляется значение

логического выражения. Если это значение равняется true, то выполняется тело

цикла – оператор, стоящий после слова do. После этого снова вычисляется значение

логического выражения и процесс повторяется. Цикл прекращается, если при

очередном вычислении логического выражения его значение окажется равным false.

Если при первом вычислении значения логического выражения окажется, что оно

равно false, то тело цикла не выполнится ни разу. В качестве оператора тела цикла

Page 101: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

может быть использован составной оператор, заключённый в операторные скобки

begin .. end.

Пример . Дано натуральное число n ( n0 ). Подсчитать количество цифр данного

числа.

var n : longint; k : byte;

begin

readln(n); k0;

while n0 do

begin inc(k); nn div 10 end;

writeln(k);

readln

end.

Пример . Даны действительные числа a1, a2, a3, … . Известно, что a1>0 и что

среди a2 ,a3 . . . есть хотя бы одно отрицательное число. Пусть a1, a2, … , an элементы

данной последовательности, предшествующие первому отрицательному элементу (n

заранее неизвестно). Получить a1 + a2 + … + an .

var a, s : real;

begin

s:=0; read(a);

while a>=0 do

begin

s:=s + a; read(a)

end;

writeln(s:6:1);

readln; readln

end.

Пример . Дано 10 натуральных чисел. Проверить, что среди них есть хотя бы одно,

кратное 3.

const n = 10;

var t : boolean; x, i : integer;

begin

t:=true; i:=0;

while t and (i<n) do

Page 102: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

begin read(x); inc(i); t:=x mod 3<>0 end;

writeln( not(t) );

readln; readln

end.

Пример . Даны натуральные числа n и m. Получить все натуральные числа из

диапазона от m до n, сумма цифр которых равна 12.

var i, n, m, s, a : integer;

begin

readln(m, n);

for i:=m to n do

begin

s:=0; a:=i;

while a<>0 do

begin s:=s + a mod 10; a:=a div 10 end;

if s=12 then writeln(i);

end;

readln;

end.

Сложные типы данных. Одномерные и многомерные массивы. Алгоритмы

сортировки массивов и их программная реализация.

В Delphi 7 массивы могут быть статическими, т.е. иметь фиксированное число

элементов, либо динамическими, когда количество элементов задаётся в процессе

выполнения программы.

Статические массивы.

Статический тип-массив (далее просто тип-массив) представляет собой

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

снабжённых индексами. Массив может быть одномерным или многомерным.

Описание типа массив выглядит следующим образом:

type <имя типа>=array[<тип индекса (индексов)>] of <тип компонентов>;

Если в качестве типа компонентов взят другой массив, образуется структура,

которую называют многомерным массивом.

Например:

type vector = array[1..3] of real;

Page 103: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

table = array[1..4] of array[1..5] of integer;

Здесь vector – одномерный массив, состоящий из трёх вещественных чисел, table –

двумерный массив (матрица), состоящий из четырёх строк и пяти столбцов целых

чисел. Описание типа table можно также записать следующим образом:

type table = array[1..4, 1..5] of integer;

Размерность массива может быть любой, компоненты массива также могут быть

любого типа, индексы могут быть любого порядкового типа, кроме типов LongWord

и Int64.

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

var m1, m2 : vector; matr : table;

Массив можно описать и непосредственно в разделе описания переменных:

var m1, m2 : array[1..3] of real;

matr : array[1..4, 1..5] of integer;

В Object Pascal одним оператором присваивания можно передать все элементы

одного массива другому массиву того же типа, например:

m1:=m2;

Однако, объявление

var a : array[1..6] of integer;

b : array[1..6] of integer;

создаст разные типы массивов, поэтому оператор a:=b вызовет ошибку.

Доступ к компонентам массива осуществляется указанием имени массива, за

которым в квадратных скобках помещается значение индекса (индексов) компонента.

Индекс компонента может быть задан выражением соответствующего типа.

Например:

m1[2] matr[3,4] m2[i+1]

Если статический массив используется в качестве параметра процедуры или

функции, то нужно учитывать, что типом любого формального параметра может

быть только стандартный или ранее объявленный тип. Поэтому нельзя, например,

объявить следующую процедуру:

procedure S(a : array[1..10] of integer);

Правильно будет сначала описать тип массива в разделе type основной программы.

Например:

const n = 10;

type lin = array[1..n] of integer;

procedure S(a : lin);

Page 104: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

……………………………….

Одномерный массив. Инициализация. Работа с элементами. Рассмотрим

процедуры инициализации и распечатки одномерного массива, считая, что тип

массива описан следующим образом:

const n = 10;

type lin = array[1..n] of integer;

Заполнение массива числами, введёнными с клавиатуры:

procedure init1(var x : lin);

var i : integer;

begin

for i:=1 to n do read(x[i]);

end;

Заполнение массива случайными числами с помощью генератора случайных

чисел:

procedure init2(var x:lin);

var i:integer;

begin

randomize;

for i:=1 to n do x[i]:=-50 + random(101);

end;

Функция random(t) берёт случайное целое число из отрезка [0, t-1]. Таким образом,

массив будет заполнен случайными числами от -50 до 50.

Распечатка массива (вывод элементов массива на экран)

procedure print(x : lin);

var i : integer;

begin

for i:=1 to n do write(x[i]:4);

writeln

end;

Пример . Заполнить массив случайными числами от -25 до 25. Распечатать массив.

Заменить отрицательные элементы массива на противоположные по знаку.

Распечатать преобразованный массив.

const n = 10;

type lin = array[1..n] of integer;

Page 105: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

var a : lin;

procedure init2(var x : lin);

var i : integer;

begin

randomize;

for i:=1 to n do x[i]:=-25 + random(51);

end;

procedure print(x : lin);

var i : integer;

begin

for i:=1 to n do write(x[i]:4);

writeln

end;

procedure sign1(var x : lin);

var i : integer;

begin

for i:=1 to n do

if x[i]<0 then x[i]:=-x[i]

end;

begin

init2(a); print(a);

sign1(a); print(a);

readln

end.

Сортировка одномерного массива.

Для решения многих задач необходимо упорядочить данные по определённому

признаку. Процесс упорядочения заданного множества объектов по определённому

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

возрастанию a[1]<a[2]<…<a[n], по неубыванию a[1]a[2]…a[n], по убыванию

a[1]>a[2]>…>a[n], по невозрастанию a[1]a[2]…a[n]. Научившись выполнять одну

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

Page 106: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

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

Объявление процедур и функций. Вызов процедур и функций. Способы передачи

параметров в процедурах и функциях. Формальные и фактические параметры. Локальные

и глобальные переменные. Рекурсивные подпрограммы побочные эффекты применения.

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

Если в программе возникает необходимость частого обращения к некоторой

группе операторов, то рационально выделить такую группу операторов в

самостоятельный блок, к которому можно обращаться, указывая его имя. Такие

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

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

Процедуры.

Формат описания процедуры:

procedure имя (формальные параметры);

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

begin

операторы

end;

Описание процедуры включает заголовок и тело процедуры. Заголовок состоит

из зарезервированного слова procedure , идентификатора имя процедуры и списка

формальных параметров с указанием типа параметра (список параметров может

отсутствовать). Имя процедуры – идентификатор, уникальный в пределах

программы. Тело процедуры представляет собой блок, по структуре аналогичный

программе.

Рассмотрим пример процедуры, которая вычисляет an , где a и n – это данные

целые числа (n0).

procedure degree( a,n:integer; var step:integer);

var i:integer;

begin

step1;

for i1 to n do stepstepa;

end;

Page 107: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

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

Рассмотрим пример процедуры, меняющей местами значения двух переменных x и

y.

procedure swap(var x, y:integer);

var z:integer;

begin

zx; xy; yz

end;

Функции.

Формат описания функции:

function имя (формальные параметры) : тип результата;

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

begin

операторы

end;

Функция состоит из заголовка и тела функции. В отличие от процедуры

результатом выполнения функции может быть только одно значение. В теле

функции обязательно должен быть хотя бы один оператор присваивания, где в

левой части стоит имя стандартной переменной result, а в правой – вычисленное

значение функции.

Рассмотрим пример функции, которая вычисляет факториал числа n.

n! 123… n

function fact(n:integer):integer;

var i:integer; f:integer;

begin

f1; for i1 to n do ff i;

resultf

end;

Вызов подпрограмм.

Описание процедур и функций в основной программе занимает место в конце

раздела описаний, до начала блока операторов. При вызове процедуры или функции

её формальные параметры заменяются фактическими. Число и тип формальных и

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

должны располагаться в том же порядке, что и формальные.

Page 108: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Пример . Рассмотрим пример применения процедуры degree для решения следующей

задачи: Вычислить y8x5 3x4 2x3.

var x:integer; y, z:integer;

procedure degree( a, n:integer; var step:integer);

var i:integer;

begin

step1;

for i1 to n do stepstepa;

end;

begin

readln(x);

degree(x, 5, z); y8z;

degree(x, 4, z); yy – 3z;

degree(x, 3, z); yy 2z;

writeln(y);

readln

end.

Вызов процедуры – это оператор, состоящий из имени процедуры, за которым в

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

соответствующим формальным параметрам.

1ый вызов xa 5n zstep

2ой вызов xa 4n zstep

3ий вызов xa 3n zstep

Вызов и выполнение функции производятся при вычислении значения указателя

функции

<имя функции>(<список фактических параметров>),

который входит в некоторое выражение в вызывающей программе.

Локализация имён.

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

они как бы «невидимы» снаружи подпрограммы. Такие переменные называются

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

глобальными. Они доступны в любой части программы, в том числе и в любой

подпрограмме.

Например, в последнем рассмотренном примере переменные x, y, z – глобальные,

переменные a, n, step, i – локальные, они недоступны основной программе. Локальные

Page 109: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

переменные существуют только тогда, когда работает подпрограмма: появляются при

её вызове и исчезают при завершении её работы.

Имена переменных, локализованных в подпрограмме, могут совпадать с ранее

объявленными глобальными именами. В этом случае локальное имя «закрывает»

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

пример:

var i:integer;

procedure P;

var i:integer;

begin writeln(i) end;

begin i7; P end.

Что напечатает эта программа? Всё, что угодно: значение локальной

переменной i при входе в процедуру P не определено, хотя одноимённая глобальная

переменная имеет значение 7. Локальная переменная «закроет» глобальную и на

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

переменной i. Если убрать описание var i:integer; из процедуры P, то на экран

будет выведено значение глобальной переменной i, т.е. 7.

Параметры.

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

формальных параметров подпрограммы может быть параметром-значением или

параметром-переменной. Кроме того, в Delphi 5 имеются ещё параметры-константы и

так называемые выходные параметры. Перед параметром-переменной в списке

формальных параметров ставится служебное слово var, а перед параметром-

значением служебное слово var не ставится.

Параметру-переменной должен соответствовать при вызове подпрограммы

фактический параметр в виде переменной нужного типа. Если же формальный

параметр объявлен как параметр-значение, то при вызове ему может соответствовать

произвольное выражение.

Например, пусть описана процедура M:

var b,c,res : real;

procedure M(x:real; var r,y:real);

begin y:=3x r end;

Рассмотрим варианты вызова этой процедуры.

1). M(5, 1, res);

Вызов процедуры осуществлён неправильно. Правильно сделать так:

Page 110: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

b1; M(5, b, res);

2). M(5, 2b–1, res);

Вызов процедуры осуществлён неправильно. Правильно сделать так:

c2b–1; M(5, c, res);

3). M(6b–7, c, res);

Вызов процедуры осуществлён правильно.

Если параметр определён как параметр-значение, то перед вызовом

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

временную память и передаётся подпрограмме. Любые возможные изменения

параметра-значения в подпрограмме никак не воспринимаются основной программой,

так как в этом случае изменяется копия фактического параметра. Сами же

фактические параметры, какими были до вызова процедуры, такими же и останутся

после завершения её работы.

Если параметр определён как параметр-переменная, то при вызове

подпрограммы передаётся адрес переменной в оперативной памяти (ссылка).

Изменения параметра-переменной приводит к изменению самого фактического

параметра в вызывающей программе. Поэтому результаты работы процедуры

должны передаваться через параметр-переменную.

После введения чисел 5 и 7 на экран будет выведено:

исходные: 5 7

удвоенные: 10 14

результат: 10 7

Параметры-переменные используются как средство связи подпрограммы и

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

своей работы вызывающей программе. В распоряжении программиста всегда есть и

другой способ передачи результатов подпрограммы – через глобальные переменные.

Однако, злоупотребление глобальными переменными делает программу запутанной,

трудной в понимании и сложной в отладке. Поэтому рекомендуется там, где это

возможно, использовать передачу результатов через параметры-переменные. С другой

стороны, описание всех формальных параметров как параметры-переменные

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

подпрограммы с фактическими параметрами в виде выражений. Во-вторых, в

подпрограмме возможно случайное использование формального параметра, т.е.

существует опасность испортить непреднамеренно фактическую переменную. Чем

меньше параметров объявлено параметрами-переменными и чем меньше в

Page 111: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

подпрограмме используются глобальные переменные, тем меньше опасность

непредусмотренных побочных эффектов, связанных с вызовом подпрограмм.

При использовании параметра-константы перед ним в списке формальных

параметров должно стоять слово const. Параметр-константа передаётся по ссылке,

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

При описании выходного параметра перед ним в списке формальных

параметров следует поставить слово out. Выходной параметр подобен параметру-

переменной. Но его можно использовать только для возврата результата, поскольку

память, занимаемая соответствующим фактическим параметром, в момент обращения

к процедуре очищается.

В Delphi 5 имеются параметры, значения которых можно не указывать при

вызове процедуры или функции. Их называют параметрами со значениями по

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

<имя параметра>:<тип>=<значение>.

Умалчиваемые параметры должны находиться в конце списка формальных

параметров. Если при вызове процедуры или функции фактический параметр,

соответствующий умалчиваемому параметру, не указан, то в подпрограмму

передаётся заданное для умалчиваемого параметра значение.

Перегрузка функций.

В Object Pascal имеется возможность использовать подпрограммы с

одинаковыми именами, но отличающиеся количеством и типом параметров. В

заголовках таких подпрограмм должно быть указано слово overload. При вызове

таких подпрограмм компилятор анализирует количество и тип фактических

параметров и вызывает соответствующую подпрограмму. Например, в программе

могут быть описаны две функции с именем min. Первая для определения

минимального из двух действительных чисел, а вторая для определения символа с

минимальным порядковым номером.

function min(a, b : real) : real; overload;

begin if a>b then result:=b else result:=a end;

function min(a, b : char) : char; overload;

begin if a>b then result:=b else result:=a end;

Page 112: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

При вызове этой функции с фактическими параметрами, являющимися

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

параметров, являющихся символами, – вторая.

Процедурные типы.

Существуют два процедурных типа: тип-процедура и тип-функция. Описание

процедурного типа имеет вид:

type <имя процедурного типа> =

<заголовок процедуры или функции без имени>;

Например:

type funcl = function (a, b : real) : real;

Процедурные типы широко применяются в Object Pascal при использовании

классов.

Структура модулей. Интерфейсная и исполняемая части модулей. Создание и

подключение модуля. Библиотеки подпрограмм: понятие, виды. Статическое и

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

2.5 Модули

Модуль – это автономно компилируемая программная единица, включающая в

себя различные компоненты раздела описаний (типы, константы, переменные,

процедуры и функции) и, возможно, некоторые исполняемые операторы

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

модуля, которая может быть скрыта от пользователя. Роль модулей в Delphi не

исчерпывается только механизмом раздельной компиляции. Delphi связывает с

каждым включаемым в программу окном собственный модуль и таким способом

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

далее, основная программа оконного приложения (файл проекта DPR) содержит

перечень всех используемых в приложении модулей и несколько исполняемых

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

Вся основная работа приложения управляется кодом, содержащимся в модулях.

Модуль имеет следующую структуру

unit <имя>;

interface

<интерфейсная часть>

implementation

Page 113: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

<исполняемая часть>

initialization

<инициирующая часть>

finalization

<завершающая часть>

end.

Таким образом, модуль состоит из заголовка и четырёх составных частей,

любая из которых может быть пустой.

Для правильной работы среды Delphi имя модуля должно совпадать с именем

дискового файла, в который помещается исходный текст модуля. Если, например,

имеем заголовок модуля unit vector, то исходный текст соответствующего модуля

должен размещаться в дисковом файле vector.pas. Связь модуля с другими

модулями и основной программой устанавливается специальным предложением

uses <список модулей>;

Например,

uses SysUtils, vector;

Объявление uses должно открывать раздел описаний основной программы.

В интерфейсной части содержатся объявления всех глобальных объектов

модуля (типов, констант, переменных и подпрограмм), которые должны стать

доступны основной программе или другим модулям. При объявлении глобальных

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

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

могут объявляться локальные для модуля объекты: вспомогательные типы,

константы, переменные и подпрограммы. Описанию подпрограммы, объявленной в

интерфейсной части модуля, в исполняемой части должен предшествовать заголовок,

в котором можно опускать список формальных параметров (и тип результата для

функции). Но если заголовок подпрограммы приводится в полном виде, то есть со

списком формальных параметров и объявлением типа результата, он должен

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

Инициирующая и завершающая части чаще всего отсутствуют вместе с

начинающими их словами initialization и finalization. В инициирующей части

размещаются операторы, которые исполняются до передачи управления основной

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

указываются операторы, выполняющиеся после завершения работы основной

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

Page 114: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Пример . Дано два целочисленных вектора размера n. Найти их скалярное

произведение. Для решения задачи создать и использовать модуль, содержащий

следующие подпрограммы: процедуру заполнения одномерного массива с клавиатуры,

функцию для нахождения скалярного произведения двух векторов.

unit vector;

interface

const n=5;

type lin=array[1..n] of integer;

procedure init(var x:lin);

function scal(x,y:lin):integer;

implementation

procedure init;

var i:integer;

begin

for i:=1 to n do read(x[i]);

end;

function scal;

var i:integer;

begin

result:=0;

for i:=1 to n do result:=result + x[i]*y[i];

end;

end.

Чтобы создать такой модуль, следует выбрать команду File�New�Unit. Текст

модуля следует сохранить в файле vector.pas. Приведём текст основной программы

(консольного приложения), использующей модуль vector.

program p56;

{$APPTYPE CONSOLE}

uses

SysUtils, vector;

var a,b:lin; rez:integer;

begin

init(a); init(b); rez:=scal(a,b);

writeln(rez:6);

readln; readln

Page 115: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

end.

2.6 Символы и строки

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

Например: abcdef Иванов И.И. 10.0 S =

Константа типа char представляет собой символьную строку единичной длины.

Используемые в Object Pascal строковые типы приведены в следующей таблице:

Тип строки Максимальная длина Нулевой символ в конце

ShortString 255 байт Нет

AnsiString 2 Гб Есть

String 255 байт / 2 Гб Нет / Есть

WideString 1 Гб Есть

Значение типа ShortString – это так называемые короткие строки, длина

которых не превышает 255 символов. Каждый символ занимает один байт, самый

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

порядковый номер. Первый байт, содержащий длину строки, имеет номер 0. По

номеру символа можно получить доступ к его значению, указав номер символа в

квадратных скобках после имени строки.

Например, для строки st , имеющей тип shortstring и значение st =

Object , получим:

ord(st[0])=6, st[1]=O, st[2]=b, st[3]=j, st[4]=e, st[5]=c, st[6]=t.

Длина строки, хранящаяся в нулевом байте, представлена в символьном виде,

поэтому для преобразования в число следует воспользоваться стандартной функцией

ord, а обратно – функцией chr.

Короткая строка размещается компилятором в памяти компьютера до начала

выполнения программы, т.е. статически.

Строка типа AnsiString располагается в памяти иначе. Сама переменная типа

AnsiString занимает в памяти 4 байта и является указателем, т.е. содержит адрес

той ячейки памяти, начиная с которой будет фактически располагаться символьная

строка. Выделение места в памяти происходит на этапе выполнения программы, т.е.

динамически. Программа сама определяет необходимую длину строки по заданному

количеству символов, и операционная система выделяет нужный участок памяти. В

Page 116: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

конце строки размещается терминальный (завершающий ) нуль – символ #0 и так

называемый счётчик ссылок, занимающий 4 байта. Счётчик ссылок позволяет

экономить память. Например, если в программе имеется фрагмент:

……………………………………

var s1, s2 : ansistring;

……………………………………

s1 stroka ;

s2 s1;

…………………………………..

то память для размещения переменной s2 не выделяется, а в переменную s2

помещается значение указателя из переменной s1. Счётчик ссылок в области

памяти, связанной с переменной s1, увеличивает своё значение на 1 и станет

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

ту же строку. Счётчик ссылок равняется количеству ссылающихся на строку

переменных. Если одна из ссылающихся на строку типа AnsiString переменных

изменит своё значение, то в памяти будет выделено место для новой строки. Число

ссылок в прежней строке уменьшится на 1, а в новой строке становится равным 1.

Если число ссылок на строку станет равным 0, то строка уничтожается и

освобождает место в памяти. Нумерация символов в строке типа AnsiString

начинается с 1. Процедура SetLength, которую мы использовали для установления

длины динамического массива, может быть также использована для установления

длины строки типа AnsiString.

Тип String интерпретируется компилятором Object Pascal по-разному, в

зависимости от значения директивы компилятора $H. Если она включена –

{$H+} – то тип String интерпретируется как AnsiString, если нет – {$H-} – то как

ShortString. По умолчанию действует директива {$H+}.

Если в разделе описаний указано, например String[10], то независимо от

директив компилятора тип трактуется как ShortString с указанным числом символов.

Тип WideString также представляет собой динамически размещаемые в памяти

компьютера строки, длина которых ограничена только объёмом свободной памяти

компьютера. Однако в отличие от строки типа AnsiString каждый символ является

Unicode-символом, т.е. кодируется 2 байтами.

Пример . В строке Ivanov I. дописать полностью имя (Ivan).

var s : ansistring;

Page 117: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

begin

s:='Ivanov I.';

setlength(s, 12);

s[9]:='v'; s[10]:='a'; s[11]:='n'; s[12]:='.';

writeln(s);

readln;

end.

Стандартные подпрограммы для строк.

function AnsiCompareStr(const S1, S2 : string): integer;

Сравнивает две строки S1 и S2 в кодировке Ansi с учётом регистра. Возвращает

значение меньше 0, если S1<S2, 0, если S1=S2, и больше 0, если S1>S2. В

русифицированных версиях Widows может быть применена к строкам, содержащим

русские буквы.

function AnsiCompareText(const S1, S2 : string): integer;

Полностью аналогична предыдущей функции за исключением того, что сравнение

символов осуществляется без учёта регистра.

function AnsiLowerCase(const S : string): string;

Возвращает в кодировке Ansi строку S, преобразованную к нижнему регистру. В

русифицированных версиях может быть применена к строкам, содержащим русские

буквы.

function AnsiPos(const Substr, S : string): integer;

Возвращает позицию (индекс) первого вхождения Substr в S. Если Substr не входит

в S, то возвращается 0. В русифицированных версиях Windows может быть

применена к строкам, содержащим русские буквы.

function AnsiUpperCase(const S : string): string;

Возвращает строку S в кодировке Ansi, преобразованную к верхнему регистру. В

русифицированных версиях Windows может быть применена к строкам, содержащим

русские буквы.

function Concat(S1, S2…SN : string): string;

Возвращает строку, представляющую сцепление строк S1, S2… SN. Идентична

операции + для строк.

function Copy(S; Index, Count: integer): string;

Параметр S – это строка типа string или динамический массив. Функция Copy

возвращает подстроку строки S, начинающуюся с символа с номером Index и

содержащую Count символов.

Page 118: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

procedure Delete(var S : string; Index, Count : integer);

Удаляет из S подстроку, начинающуюся с символа с номером Index и содержащую

Count символов.

procedure Insert(Substr : string; S : string; Index : integer);

Вставляет строку Substr в S, начиная с символа с номером Index.

function Length(S : string): integer;

Возвращает число символов в строке S.

function Pos(Substr, S : string): integer;

Возвращает позицию (индекс) первого вхождения подстроки Substr в строку S. Если

Substr нет в S, то возвращается 0.

procedure SetLength(var S; NewLength : integer);

Параметр S является строкой или динамическим массивом. Процедура устанавливает

новую длину NewLength строки S. Если строка имеет тип ShortString, то значение

параметра NewLength должно находиться в диапазоне 0..255. Для длинных строк

значение параметра NewLength ограничено лишь размерами доступной памяти

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

сохраняются, а во вновь добавленных позициях находятся неопределённые значения.

function StringOfChar(Ch : char; Count : integer): string;

Создаёт строку, состоящую из Count раз повторяющегося символа Ch.

function Trim(const S : string): string;

Удаляет из строки S начальные и завершающие пробелы и управляющие символы.

Строковые выражения.

Над строками определены операции отношения. Строки сравниваются по кодам

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

ASCII, а для оконных – ANSI. При сравнении двух строк последовательно

сравниваются коды символов, стоящих в одинаковых позициях. Символы в строках

просматриваются слева направо. Если в очередной паре оказываются различные

символы, то большей считается та строка, символ которой имеет больший код. На

этом сравнение прекращается. Если сравниваются строки разной длины, причём

одна строка совпадает с началом другой, то большей будет более длинная строка.

Например,

муха < слон

слон < слоник

2 > 123

Page 119: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Кроме операций отношения над строками определена операция сцепления

(конкатенации), которая обозначается знаком + . Например,

Object + Pascal = Object Pascal

Строки разных типов могут смешиваться в одном выражении, переменным

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

Компилятор при этом осуществляет автоматическое приведение типов. Если

переменной типа ShortString присваивается в качестве значения строка, длина

которой больше 255, то лишние символы отбрасываются.

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

read. Это объясняется тем, что в конце каждой символьной строки, вводимой с

клавиатуры, стоит так называемый разделитель строк EOLN (end of line) –

последовательность кодов #13(CR – перевод каретки) и #10(LF – переход на начало

строки). Разделитель строк вставляется во вводимый текст при нажатии на клавишу

Enter. Процедура readln считывает все символы, расположенные до разделителя

строк, а затем и символы разделителя строк (#13 и #10), которые являются

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

Пример . Используя стандартные функции для строк, получить из строки

'grammofon' строку fonogramma.

var t, s : string; i, j : integer; Комментарий

begin

s:='grammofon';

i:=pos('o', s); i = 6

t:=copy(s, 1, i-1); t = gramm

delete(s, 1, i); s = fon

j:=length(s); j = 3

s:= s + t + 'a'; s = fongramma

insert('o', s, j+1); s = fonogramma

writeln(s); readln

end.

Преобразование строк в числовые типы и обратно.

Задача преобразования строк в числовые типы и обратно для консольных

приложений не актуальна, так как процедуры read, readln, write, writeln выполняют

эти преобразования автоматически. Основная область применения этих подпрограмм

Page 120: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

– оконные приложения, при создании которых программист сам должен

предусматривать преобразование типов.

procedure Str(x; var s:string);

Преобразует целое или действительное значение x в строку s (параметр x может

иметь указание формата вывода).

procedure Val(s:string; var v; var code:integer);

Преобразует строку s в целую или вещественную переменную v. Параметр code

равен нулю, если преобразование прошло успешно, в противном случае он равен

номер позиции в строке s, где обнаружен ошибочный символ. Например: если

s:='95'; , то в результате выполнения val(s,x,d); x = 95, d=0. Если s=a4, то x=0, d=1.

function StrToInt(s:string):integer;

Возвращает целое число, изображением которого является строка s.

function StrToFloat(s:string):extended;

Возвращает вещественное число, изображением которого является строка s.

function IntToStr(n:integer):string;

Возвращает строку, являющуюся изображением целого числа n.

function FloatToStr(n:extended):string;

Возвращает строку, являющуюся изображением вещественного числа n.

function FloatToStrF(n:extended; format; k, m:integer):string; – строка, являющаяся

изображением вещественного n в различных форматах;

при вызове функции указываются:

format – формат (способ изображения);

k – общее количество цифр;

m – количество цифр после десятичной точки.

Значениями параметра format могут быть следующие константы:

ffFixed – число представляется в формате с фиксированной десятичной точкой.

ffExponent – научный формат (экспоненциальная форма записи).

ffGeneral – общий цифровой формат.

ffNumber – аналогичен ffFixed, но в изображении числа используется разделитель

групп разрядов.

ffCurrency – денежный формат.

Например: если x=3.587 и s:=floattostrf(x, ffFixed, 7, 3); , то s = 3,587 (используется

десятичная запятая).

Page 121: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

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

Запись – это структура данных, состоящая из фиксированного числа

компонентов, называемых полями записи. Компоненты (поля) записи могут быть

различного типа.

Описание типа запись:

имя типа record список полей end;

Здесь имя типа – правильный идентификатор. Список полей представляет собой

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

Каждый раздел записи состоит из одного или нескольких идентификаторов полей,

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

описание типа поля.

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

структуры данных:

type tel = record

number : integer;

fio : string[40];

adr : string[60]

end;

var m, v : tel;

Обращение к значению поля осуществляется с помощью идентификатора переменной

записи и идентификатора поля, разделённых точкой. Например:

m.number; m.fio; m.adr;

Поля записи используются в программе как обычные переменные соответствующего

типа. Например, можно написать

m.numberm.number 1; или m.fio[1]<>Ф

Допускается применение оператора присваивания к записи в целом. Например,

vm; После выполнения этого оператора значения полей записи v станут равны

значениям соответствующих полей записи m. Логические операции сравнения для

записей не определены. Тип запись нельзя использовать для описания типа

функции.

Обращение к полям записи имеет несколько громоздкий вид. Для решения этой

проблемы в языке Паскаль предназначен оператор присоединения with , который

имеет следующий формат:

with переменная типа запись do оператор;

Page 122: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Один раз указав переменную типа запись в операторе with , можно далее работать

с именами полей без указания перед идентификатором поля имени записи.

Например:

with m do begin number1364; fioПетров end;

Пример 50. Описать тип point для точки на плоскости со следующими полями:

буква, обозначающая точку, координата x, координата y. Даны две точки. Найти

длину отрезка, соединяющего эти две точки.

type point = record

name : 'A' .. 'Z';

x : real;

y : real

end;

var a, b : point; ab : real;

begin

readln(a.name, a.x, a.y);

with b do

readln(name, x, y);

ab:=sqrt(sqr(b.x – a.x) + sqr(b.y – a.y));

writeln(a.name, b.name, ' = ', ab:5:2); readln

end.

Множественный тип представляет собой конечный набор значений некоторого

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

тип, кроме word, integer, longint, int64.

Описание множественного типа имеет вид:

<имя типа > = set of <базовый тип>;

Например:

type mn1 = set of A . . Z;

mn2 = set of 1 . . 5;

Значениями переменных множественного типа являются любые подмножества

базового множества. Для задания множества используется конструктор множества,

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

и обрамлённый квадратными скобками.

Пример.

type digitChar set of 0 .. 9;

Page 123: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

digit set of 0 .. 9;

var s1, s2 : digitChar; s3, s4, s5 : digit;

begin

s1[1, 2, 3]; s2[3, 2, 1];

s3[0..3, 6]; s4[4, 5]; s5[3..9]

end.

[] – пустое множество. Над множествами определены операции:

– пересечение множеств.

s3s4=[]; s3s5=[3, 6];

– объединение множеств.

s3+s4=[0 .. 6];

– – разность множеств.

s5 – s4=[3, 6 .. 9];

= – проверка эквивалентности множеств, возвращает true, если множества

эквивалентны.

s1=s2

<> – проверка неэквивалентности.

<= – проверка вложения.

s4<=s5 результат true.

in – проверка принадлежности.

7 in s5 результат true.

Стандартные процедуры для работы с множествами:

include(s, i) – включает элемент i базового типа в множество s.

exclude(s, i) – исключает элемент i из множества s.

Использование множеств позволяет сделать программы более эффективными за

счёт уменьшения количества различных проверок.

Пример . Используя метод Решето Эратосфена напечатать все простые числа из

диапазона 1..30.

Суть метода – вычёркиваем из исходного множества [1..30] те числа, которые

не являются простыми.

var n : set of 1..30; k, s : integer;

begin

n:=[1..30];

for s:=2 to 15 do

if s in n then

Page 124: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

for k:=s+1 to 30 do

if k mod s=0 then exclude(n, k);

for s:=1 to 30 do

if s in n then write(s:3);

readln

end.

Программа работает следующим образом. Вначале s=2. Это значение

принадлежит n, поэтому, начиная с числа 3, вычёркиваем все числа, кратные 2.

Теперь s=3. Это значение принадлежит n, поэтому, начиная с числа 4,

вычёркиваем все числа, кратные 3. Теперь s=4. Это значение уже вычеркнуто из n.

Переходим к s=5 и так далее. Вывод на экран элементов полученного множества

осуществляем следующим образом: перебираем все элементы базового множества и

отбираем для печати те из них, которые принадлежат n.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

2.8. Файлы

Object Pascal располагает средствами создания и обработки файлов различных

типов. Доступ к файлу осуществляется с помощью переменных файлового типа. В

Object Pascal существует три файловых типа:

TextFile – текстовый файл, представляющий собой набор символьных

строк переменной длины;

File of < тип > – типизированный файл, представляющий собой набор

данных указанного типа;

File – нетипизированный файл, представляющий собой набор

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

Примеры описания файловых переменных:

var f1: textfile; f2: file of integer; f3: file of char; f4: file;

Здесь f1 – текстовый файл, f2 и f3 – типизированные файлы, f4 – нетипизированный

файл.

Стандартные подпрограммы для доступа к файлам.

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

чтобы указать, с каким элементом будет производиться очередная операция чтения

или записи, существует понятие указателя на доступный элемент файла. После

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

Page 125: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Перед использованием файловой переменной она должна быть связана с

внешним файлом ( файлом на диске) с помощью вызова процедуры

AssignFile(< файловая переменная>, < имя файла>);

здесь <файловая переменная> – имя переменной файлового типа, объявленной в

программе; <имя файла> – символьная строка, содержащая имя файла. Если файл

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

только имя файла, в противном случае надо указать полный путь к файлу,

например:

c:\files\z1.txt

Когда связь с внешним файлом установлена, его можно открыть для ввода или

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

Reset(<файловая переменная>);

Процедура reset открывает существующий внешний файл, имя которого было

связано с файловой переменной. Если внешний файл с указанным именем

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

открыт, то он сначала закрывается, а затем открывается вновь. Файловый указатель

устанавливается на элемент файла с порядковым номером 0.

Текстовый файл, открытый процедурой reset, доступен только для чтения. Для

типизированных и нетипизированных файлов, открытых процедурой reset,

допускается выполнять операции чтения и записи в файл.

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

Rewrite(<файловая переменная>);

Процедура rewrite создаёт новый файл, имя которого связано с файловой

переменной. Если файл с указанным именем уже существует, то он удаляется и на

его месте создаётся новый пустой файл. Текущая позиция в файле устанавливается

на начало файла, т.е. указатель будет указывать на элемент с порядковым номером

0.

Если процедура rewrite открывает текстовый файл, то он становится доступным

только для записи. Для типизированных и нетипизированных файлов, открытых

процедурой rewrite, допускается выполнять операции чтения и записи в файл.

Текстовый файл может быть открыт процедурой

Append(<файловая переменная>);

Процедура append открывает уже существующий внешний файл, связанный с

файловой переменной, для добавления новой информации. Если файла с указанным

именем не существует, то возникает ошибка. Если файл уже открыт, то он сначала

Page 126: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

закрывается, а затем открывается заново. Указатель будет указывать на конец

файла. В результате обращения к append текстовый файл становится доступным

только для записи.

Когда программа завершает обработку файла, он должен быть закрыт с

помощью стандартной процедуры

CloseFile(<файловая переменная>);

Процедура closefile закрывает открытый файл. При этом обеспечивается

сохранение в файле всех новых записей и регистрация файла в папке. Процедура

closefile не разрывает связь файла с файловой переменной, поэтому файл можно

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

Текстовые файлы.

Текстовый файл представляет собой последовательность символов,

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

маркером конца строки – EOLN (end of line), состоящим из двух символов: CR=#13 и

LF=#10. Заканчивается файл символом конца файла EOF (end of file, код #26).

Чтение данных из произвольного текстового файла можно осуществить с

помощью процедур read и readln. При этом в списке их параметров первой должна

стоять соответствующая файловая переменная. Например, процедура read(f, x, y, z);

осуществляет чтение из файла, связанного с файловой переменной f, значения

переменных x, y, z. Процедура readln(f, a);

прочитает из файла, связанного с переменной f, значение переменной a и перейдёт

в этом файле к следующей строке.

Вывод данных в текстовый файл производится процедурами write и writeln, у

которых первой в списке параметров указана соответствующая файловая переменная.

Например, процедура write(f, s = , s) осуществляет запись в файл, связанный с

переменной f, символьной строки s = и значения переменной s. Процедура

writeln(f) запишет в файл, связанный с переменной f, пустую строку.

При работе с текстовыми файлами используются логические функции

eof(<файловая переменная>) и eoln(<файловая переменная >). Функция eof

возвращает значение true, если достигнут конец файла, и false в противном случае.

Функция eoln возвращает значение true, если достигнут конец строки в текстовом

файле, и false в противном случае.

Текстовый файл можно создать в среде Delphi, выбрав в меню команду

File�New�Text. В открывшемся окне нужно набрать содержимое текстового файла и

сохранить файл с помощью команды File�Save. Текстовый файл можно также

Page 127: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

создать программным способом. Рассмотрим несколько возможных вариантов

программы для создания текстового файла.

Типизированные файлы.

Типизированный файл содержит элементы одного типа. Тип элементов может

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

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

должна осуществляться программным путём. Напомним, что описание файловой

переменной, соответствующей типизированному файлу имеет вид:

var <имя файловой переменной> : file of <тип>;

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

Список ввода процедуры read должен содержать переменные того же типа, что и

элементы файла. Для записи в типизированный файл используется процедура write,

список вывода которой должен содержать переменные того же типа, что и

элементы файла. Процедуры readln и writeln для типизированных файлов не

применяются.

Доступ к текстовым файлам возможен только последовательно, то есть, когда

элемент считывается или записывается, указатель файла перемещается к

следующему по порядку элементу файла. К типизированным файлам можно

организовать прямой доступ с помощью стандартной процедуры

procedure seek( var f; n:longint);

которая перемещает файловый указатель в типизированном файле, связанном с

файловой переменной f, на элемент с номером n. Нумерация элементов в файле

начинается с нуля. Для определения текущей позиции в файле используется

функция

function filepos( var f):longint;

Для определения размера файла используется функция

function filesize( var f):integer;

Например, для установки файлового указателя на последний элемент файла f

достаточно записать

seek(f, filesize(f)–1);

на первый элемент файла

seek(f, 0);

вернуться на один элемент назад

seek(f, filepos(f)–1);

Page 128: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Применение процедур assignfile и closefile для типизированных файлов не

отличается от текстовых файлов. Процедура reset, в отличие от текстовых файлов,

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

Процедура rewrite, в отличие от текстовых файлов, допускает не только запись, но

и чтение из файла. Процедура append и функция eoln для типизированных файлов

не работают.

Нетипизированные файлы.

С точки зрения Object Pascal, нетипизированный файл представляет собой

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

Основное назначение нетипизированных файлов – обеспечение совместимости с

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

внешними запоминающими устройствами и оперативной памятью. Описание

нетипизированного файла f имеет вид:

var f : file;

В процедурах reset и rewrite для нетипизированных файлов указывается

дополнительный параметр RecSize, чтобы задать размер записи, используемой при

передаче файла:

procedure reset (var f : file {; RecSize : word});

procedure rewrite (var f : file {; RecSize : word});

Если параметр RecSize не указан, то принимаемая по умолчанию длина

записи равна 128 байтам. Длина записи измеряется в байтах и может быть задана

произвольным целым числом – от 1 байта до 2 Гбайт. Если задать длину записи,

кратную 512 байт, то это позволит выполнять операции чтения-записи для

нетипизированного файла с максимальной скоростью.

За исключением процедур read и write для нетипизированных файлов

можно использовать все стандартные процедуры, которые допускается использовать

для типизированных файлов. Вместо процедур read и write используются

процедуры blockread и blockwrite, позволяющие пересылать данные с высокой

скоростью:

procedure blockread( var f : file; var buf; count : integer; {var at : integer});

procedure blockwrite( var f : file; var buf; count : integer; {var at : integer});

Здесь f – имя файловой переменной, связанной с нетипизированным файлом,

buf – переменная, в которую будут помещаться данные при чтении из файла или из

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

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

Page 129: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

за одно обращение к файлу. Переменная buf должна иметь длину равную

count�RecSize байт. Необязательный параметр at содержит количество реально

прочитанных или записанных записей.

2.9. Классы и объекты

Объектно-ориентированное программирование (ООП) – это методика разработки

программ, в основе которой лежит понятие объекта, как некоторой структуры,

описывающей объект реального мира, его поведение. Задача, решаемая с

использованием методики ООП, описывается в терминах объектов и операций над

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

между ними.

Строго говоря, для разработки оконного приложения в Delphi на базе

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

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

более глубокого понимания того, как программа взаимодействует с компонентами,

что и почему Delphi добавляет в текст программы.

Язык Object Pascal, поддерживая концепцию объектно-ориентированного

программирования, даёт возможность определять классы. Описание типа class

напоминает описание типа record (запись), но тип class кроме описания полей

данных содержит ещё методы (процедуры и функции).

Объект в Object Pascal – это конкретный экземпляр класса. Переменная-объект

понимается как динамическая структура, то есть содержит не данные, а ссылку на

данные объекта. Выделение памяти под эти данные осуществляется при помощи

специального метода – конструктора (constructor).

Пример объявления простого класса:

type tPerson = class

fname : string[15];

faddress : string[45];

fage : byte;

procedure show;

end;

var boy1 : tPerson;

В основе объектно-ориентированного программирования лежат три основных

принципа: инкапсуляция, наследование и полиморфизм.

Page 130: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

Инкапсуляцией называется объединение в классе данных и подпрограмм для их

обработки. Данные содержатся в полях класса, а процедуры и функции называются

методами. В соответствии с правилами объектно-ориентированного

программирования прямой доступ к полям нежелателен. В связи с этим в Object

Pascal предусмотрены специальные конструкции, называемые свойствами, которые

осуществляют чтение или запись в поля при помощи вызова соответствующих

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

буквы t. Например:

type tPerson = class;

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

type tStudent = class(tPerson);

Принцип наследования заключается в том, что порождённый класс-потомок

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

может дополнять их новыми.

В Object Pascal все классы являются потомками класса tObject. Этот класс не

включает в себя полей и свойств, зато его методы позволяют создавать,

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

являющийся непосредственным потомком класса tObject, то имя класса-родителя в

этом случае можно не указывать, т.е. следующие строки являются эквивалентными:

type tNewClass = class(tObject);

type tNewClass = class;

Использование принципа наследования в Delphi привело к созданию

разветвлённого дерева классов. В верхней части этого дерева находятся так

называемые абстрактные классы, для которых нельзя создать полноценные

работающие объекты. Но вместе с тем абстрактные классы являются

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

объекты.

Полиморфизм позволяет использовать одинаковые имена для методов,

входящих в различные классы. Принцип полиморфизма обеспечивает в случае

обращения к одноимённым методам выполнение того из них, который соответствует

классу объекта.

В общем виде класс объявляется в разделе type следующим образом:

Page 131: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

type < имя класса > = class(< имя класса-родителя >)

public

< описание общедоступных элементов >

published

< описание элементов, доступных в Инспекторе Объектов >

protected

< описание элементов, доступных в классах-потомках >

private

< описание элементов, доступных только в модуле >

end;

Секции public, published, protected, private могут содержать описания полей, методов,

свойств, событий.

Следующий пример иллюстрирует создание объекта типа tPerson, обращение к

его полям и методам.

type tPerson = class

private

fname : string[15];

faddress : string[45];

fage : byte;

public

procedure show;

end;

var boy1 : tPerson;

procedure tPerson.show;

begin

writeln('Surname?'); writeln(fname);

writeln('Address?'); writeln(faddress);

writeln('Age?'); writeln(fage);

end;

begin

boy1:=tPerson.Create; boy1.fname:='Ivanov';

boy1.faddress:='Kolzovskaja, 59-45';

boy1.fage:=16; boy1.show;

readln;

end.

Page 132: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

После описания типа класса tPerson следует описание реализации методов. В

заголовке имя метода дополняется именем класса, к которому данный метод

относится (procedure tPerson.show;). В теле метода обращение к полям класса

происходит без указания имени класса. Создание объекта boy1 происходит в

результате применения конструктора Create к имени класса. Для того чтобы

обратиться к полю объекта, нужно написать имя объекта и имя поля, разделённые

точкой (boy1.fage). Аналогично записывается вызов метода объекта (boy1.show).

Классы, созданные разработчиками Delphi, образуют сложную иерархическую

структуру, называемую Библиотекой визуальных компонентов (Visual Component

Library –VCL). Количество входящих в VCL классов составляет несколько сотен. На

следующем рисунке изображены базовые классы, являющиеся родоначальниками

всех остальных классов.

Во время проектирования формы приложения Delphi автоматически добавляет в

текст программы необходимые объекты. Если сразу после запуска Delphi

просмотреть содержимое окна редактора кода, то там можно обнаружить следующее

описание класса исходной, пустой формы приложения и объявление объекта –

формы приложения:

type

TForm1 = class(TForm)

private

{ Private declarations }

TObject

TObjectTObject TPersistent

TObject TComponent

TObject TControl

TGraphicControl TWinControl

Page 133: dep_ivs.pnzgu.rudep_ivs.pnzgu.ru/files/dep_ivs.pnzgu.ru/kurs_lekciy_op.docx · Web viewИзучение основ программирования является важным при

public

{ Public declarations }

end;

var

Form1: TForm1;

Когда программист, добавляя необходимые компоненты, создаёт нужную

форму, Delphi формирует описание класса формы. Когда программист создаёт

процедуру обработки события формы или её компонента, Delphi добавляет

объявление метода в описание класса формы приложения.

Список использованных источников

6. Бобровский С.И. Delphi 7. Учебный курс – СПб: Питер, 2008 – 736 с.

7. Голицына О.Л., Попов И.И. Основы алгоритмизации и программирования: Учебное

пособие. – 2 издание – М.: ФОРУМ: ИНФРА – М, 2006

8. Поган А.М. Delphi. Руководство программиста. – М.: ЭКСМО, 2006

9. Фаронов В.В. Delphi. Программирование на языке высокого уровня: Учебник для

вузов – СПб.: Питер, 2007.

10. Хомоненко А.Д. и др. Delphi 7. – СПб.: БХВ – Петербург, 2005.

Интернет-ресурсы:

4. Delphi программирование. – URL: http://www.delphisources.ru/index.html.

5. Иллюстрированный самоучитель по Delphi 7 для начинаюших. – URL:

http://www.realcoding.net/teach/Delphi_7.

6. Программирование на Delphi 7. - URL: http://gluk.webhost.ru/delphi.html.

Дополнительные источники:

5. Архангельский А.Я. Программирование в Delphi. Учебник по классическим версиям

Delphi – М.: Бином, 2006 – 1152 с.

6. Культин Н.Б. Delphi 7 в задачах и примерах. – СПб.: БХВ – Петербург, 2004

7. Фленов М.В. Библия Delphi 7.0. - Издательство: БХВ-Петербург, 2011. - 686 c.

8. Чиртик А.А., Борисок В.В., Корвель Ю.И. Delphi. Трюки и эффекты. – СПб.: Питер,

2007.