Программирование на языке высокого уровня

для студентов-заочников специальностей

230102 - Автоматизированные системы обработки информации и управления

230105 – Программное обеспечение вычислительной техники и автоматизированных систем

 

Факультет – Заочный (ЗФ)

Профилирующие кафедры – Автоматизации обработки

информации (АОИ)

Автоматизированных систем

управления (АСУ)

 

Курс – 1,2,3

Семестры – 2,3,4,5

Учебный план набора 2006 года

и последующих лет

 

 


Программа, методические указания и контрольные задания составлены на основании ГОС ВО для специальностей 230102 - Автоматизированные системы обработки информации и управления, 230105 - Программное обеспечение вычислительной техники и автоматизированных систем, утвержденного 27.03.2000 г.

 

Разработчик:

доц. каф. АОИ, к.т.н. ___________В.Б. Хон

 

 

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

 

Декан З и ВФ:

доцент, к.ф.-м.н. _______________И.В. Осипов

 

Зав. профилирующей каф. АОИ:

профессор, д.т.н. _______________Ю.П. Ехлаков

 

Зав. профилирующей каф. АСУ:

профессор, д.т.н. _______________А.М. Кориков

Содержание

 

1. ЦЕЛИ И ЗАДАЧИ ДИСЦИПЛИНЫ... 4

2. РАБОЧАЯ ПРОГРАММА.. 5

3. ПРОГРАММА И МЕТОДИЧЕСКИЕ УКАЗАНИЯ.. 6

3.1. Введение в визуальное программирование. 6

3.2. Введение в язык Паскаль. 10

3.3. Типы данных. 13

3.4. Операторы.. 14

3.5. Ввод/вывод данных. 16

3.6. Ветвления. 16

3.7. Циклы.. 17

3.8. Массивы.. 18

3.9. Подпрограммы.. 20

3.10. Основы объектно-ориентированного программирования. 22

3.11. Событийно-ориентированный подход. 24

4. ТЕМЫ ПРАКТИЧЕСКИХ ЗАНЯТИЙ. 25

5. ЗАДАНИЯ НА КОНТРОЛЬНЫЕ РАБОТЫ... 27

5.1. Методические указания. 27

5.2.Контрольная работа № 1. 27

5.3.Контрольная работа № 2. 31

6. ЗАДАНИЯ НА ЛАБОРАТОРНЫЕ РАБОТЫ. 32

6.1 Лабораторная работа № 1. 32

6.2 Лабораторная работа № 2. 32

6.3 Лабораторная работа № 3. 32

6.4 Лабораторная работа № 4. 32

6.5 Лабораторная работа № 5. 33

7. МЕТОДИЧЕСКИЕ УКАЗАНИЯ К КУРСОВОМУ ПРОЕКТИРОВАНИЮ... 34

7.1 Общие требования к курсовому проекту. 34

7.2 Построение пояснительной записки. 34

8. УЧЕБНО-МЕТОДИЧЕСКИЕ МАТЕРИАЛЫ ПО ДИСЦИПЛИНЕ. 36

Приложение. 37

 

1. ЦЕЛИ И ЗАДАЧИ ДИСЦИПЛИНЫ

 

Цель дисциплины – изучение структурного и объектно-ориентированного подходов к программированию. Студенты, учатся алгоритмизировать поставленные задачи и решать их с помощью языка программирования высокого уровня Object Pascal с использованием интегрированной среды разработки (ИСР) Delphi, как инструмента создания программ в идеях визуального программирования под управлением ОС WINDOWS. Изучение дисциплины заканчивается выполнением курсового проекта.

 

2. РАБОЧАЯ ПРОГРАММА

 

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

Распределение учебного времени

Лекции - 18 часов

Практические занятия - 18 часов

Лабораторные занятия - 20 часов

Курсовой проект - 4 часа

Всего аудиторных занятий - 60 часов

 

Контрольные работы – 3,4 семестр

Зачет – 3 семестр

Экзамен – 4 семестр

Курсовой проект – 5 семестр

 

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

В конце третьего семестра сдается экзамен, в конце четвертого – зачет.

Изучение дисциплины завершается выполнением курсового проекта (пятый семестр).

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

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

- прослушивание лекций-консультаций;

- выполнение лабораторных работ на ЭВМ;

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

- выполнение курсового проекта.

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

 

3. ПРОГРАММА И МЕТОДИЧЕСКИЕ УКАЗАНИЯ

3.1. Введение в визуальное программирование

Основные понятия. Технология работы в среде Delphi базируется на идеях объектно-ориентированного и визуального про­граммирования. Идея объектно-ориентированного программиро­вания состоит в инкапсуляции (объединении) данных и средств их обработки (методов) в тип, который называется классом. Кон­кретной переменной определенного класса и есть объект. Приме­рами объектов могут быть элементы управления в окне: кнопки, списки, текстовые поля и т.п. Среда визуального программирова­ния Delphi - это графическая автоматизированная оболочка над объектно-ориентированной версией языка Паскаль (Object Pascal). Если в языке Паскаль структурные единицы - это данные и ко­манды, то здесь такой структурной единицей является визуаль­ный объект, который называется компонентом. Автоматизация программирования достигается благодаря возможности перено­сить компонент на форму (в программу) из палитры компонентов и изменять его свойства, не внося вручную изменений в про­граммный код [1-3].

Формойназывают компонент, который владеет свойствами окна Windows и предназначен для расположения на нём других компонентов. Компоненты на форме могут быть видимыми и не­видимыми. Первые служат для организации диалога с пользова­телем. Это различные кнопки, списки, текстовые поля, изобра­жения и т.п. Они отображаются на экране во время выполнения программы. Невидимые компоненты предназначены, в частности, для доступа к системным ресурсам компьютера (таймер, связь с базой данных).

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

Инструменты среды Delphi. Основными инструментами яв­ляются:

• главное меню;

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

• палитра компонентов (Component Palette);

• инспектор объектов (Object Inspector);

• окно формы;

• редактор кода (Code Editor).

Эти инструменты становятся доступными после запуска про­граммы Delphi: три находятся в главном окне (верхняя часть эк­рана, рис. 1), а остальные - в отдельных окнах.

Рис.1. Главное окно Delphi

Главное меню и панель инструментов. Главное меню состоит из таких элементов: File, Edit, Search, View, Project, Run, Component, Database, Tools, Help (рис.1).

Меню File содержит стандартные команды для работы с фай­лами проекта. С помощью этих команд можно создать новый про­ект (New Application), новую форму или модуль (New Form и New Unit), открыть или закрыть файл проекта (Open и Close), закрыть все открытые файлы (Close All), сохранить файл, проект или все сразу (Save, Save As, Save Project As, Save All). Замечательная опция - Использовать модуль (Alt+F11) вставляет в раздел Uses текущего модуля ссылку на указанный модуль.

С помощью команд меню Edit можно выравнивать компоненты относительно сетки и между собой (Align to Grid, Align), задавать порядок отображения компонентов, которые перекрываются (Bring to Front, Send to Back), изменять размер избранного ком­понента (Size), масштабировать визуальные компоненты (Scale) и т.п.

Меню Search содержит стандартные команды поиска и замены фрагмента текста (Find, Replace, Search Again, Incremental Search) и прочие. В меню View находятся команды визуализации элементов среды. Меню Project содержит команды компиляции (Compile, Build All) и проверки синтаксиса программы (Syntax Check). Меню Run содержит команды отладки и запуска программы. Меню Component используют для создания и инсталляции новых компонентов. Меню Database содержит команды вызова инструментов базы данных. В меню Tools находятся команды для настройки параметров среды.

Панель инструментов служит для дублирования команд меню с помощью кнопок.

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

Инспектор объектов. С помощью инспектора объектов мож­но задавать начальные значения свойств объекта и реакцию на стандартные события. Окно инспектора объектов содержит список компонентов текущей формы, а также две закладки: свойства (Properties) и события (Events) (рис. 2). Чтобы активизировать окно инс­пектора объектов, нажимают клавишу F11. Закладка свойств состоит из двух столбцов: левый соде­ржит названия свойств компонентов, а правый - их значения. Свойства могут быть простыми или комплексными (составными). Комплексные свойства состоят из набора других свойств. Такие свойства в инспекторе объектов обозначены символом «+», на­пример, +Font.

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

Для ввода значений свойств числового и текстового типов (Width, Name и т.п.) используют стандартное поле ввода. Значение свойств перечислимого типа (Align, Cursor и т.п.) описываются комбинированным списком, из которого выбирают необходимое. Некоторые комплексные свойства (Font, Picture, Glyph и т.п.) используют диалоговые окна, набор управляющих элементов которых зависит от конкретного свойства.

Окно формы. Форма - это окно Windows, которое создаётся в одном из возможных для окон стилей. Всё внутреннее пространство формы называется рабочей областью. На рабочую область нанесена сетка выравнивания для удобного расположения на ней компонентов. Для выполнения групповых операций несколько компонентов можно объединять. В группу приобщаются компоненты, которые хотя бы частично попадают в охваченную область. Можно также приобщить/изъять отдельный элемент. Для этого необходимо нажать клавишу Shift и, не отпуская ее, щелк­нуть мышью на нужном компоненте на форме. Удаление выде­ленных компонентов или группы выполняют клавишей Delete. Перемещение выделенного компонента в границах формы осуще­ствляют мышью. Над компонентами и их группами можно вы­полнять операции вырезания, копирование в буфер обмена и вставки из буфера.

Выравнивать компоненты можно как относительно окна формы, так и относительно друг друга. Для этого используют команду Edit=> Align главного меню или палитру выравнивания (команда View=> Alignment Palette главного меню). Другая возможность - можно не­посредственно задать значения свойствам Left и Тор компонентов в окне инспектора объектов. Компоненты в группе выравниваются от­носительно компонента, попавшего в группу первым.

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

• файл проекта *.dpr. Это небольшой файл с программным кодом на языке Object Pascal, в котором записаны ссылки
на все файлы проекта. Именно этот файл инициализирует (стартует) программу;

• файлы описания всех форм, которые входят в проект: файл модуля *.pas и файл формы *.dfm. Каждой форме проекта соответствует свой модуль;

• файл ресурсов программы *.res. В нем описаны ресурсы, не входящие в форму, например, пиктограмма програм­мы;

• файл параметров проекта *.dof;

• файлы параметров среды *.drf, *.dsk, *.dsm. Эти файлы создаются лишь после компиляции проекта.

Для сохранения Delphi-проекта необходимо задать имена моду­лей (автоматически предлагаются имена Unitl.pas, Unit2.pas, ...) и имя проекта (Projectl.dpr). Эти имена необходимо заменить на соб­ственные. Для перемещения Delphi-проекта на другой компьютер необходимо с собой брать файлы таких типов: *.dpr, *.dfm, *.pas, *.res. Другие файлы создаются автоматически.

Редактор кода. Редактор кода находится в отдельном окне. Это окно организовано как многостраничный блокнот открытых на данное время файлов. В момент открытия нового проекта в модуль Unitl.pas, который соответствует форме Forml, редактор автоматически заносит программный код описания этой формы. Во время добавления новых компонентов в окно формы в про­грамму автоматически заносятся коды с описаниями параметров этих компонентов (высота, ширина, расположение, стиль и т.п.). Добавление определенного объекта или применения к нему мето­да ведет к появлению заготовки базового кода соответствующей процедуры в окне редактора. Заготовка (шаблон) состоит из заго­ловка процедуры и ключевых слов beginи end.Заготовку запол­няет программист. Заканчивается модуль собственной командой end.Итак, модуль Unitl по умолчанию будет иметь такой общий вид:

unitUnitl; {Название модуля}

interface{Раздел деклараций процедур и функций}

uses{Список использованных модулей, например}

Windows, Messages, SysUtils, Classes,Graphics, Controls, Forms, Dialogs;

 

type{Описание классов и типов объектов, например}

TForml = class(TForm)

Button 1: TButton;

procedure ButtonlClick(Sender: TObject);

private{Частные объявления }

public{Общедоступные объявления }

end;

var{Описание глобальных переменных}

Forml: Tforml;

{ объявление процедур и функций пользователя}

procedure …;

procedure … ;

{Раздел описаний процедур и функций}

implementation

 

{$R *.DFM} {Добавляется файл с описанием формы}

procedure TForml.ButtonlClick(Sender: Tobject);

begin

{Здесь пользователь записывает тело процедуры}

end;

end.{Конец модуля}

 

3.2. Введение в язык Паскаль

Описание языка. Язык Паскаль был создан в конце 60 -начале 70-х годов прошлого столетия профессором Н.Виртом. Язык является универсальным языком программирова­ния. Его используют для решения различного рода задач [1-3].

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

 

and– и mod– остаток else— иначе record– запись
array – массив nil– ноль end– конец repeat– повторять
begin— начало not– не file— файл set– множество
case— выбор of – с for– для then– тогда
const- константы or— или function— функция to– до
div- деление без остатка Packed - упакованный Goto- перейти к type –тип
do– исполнить procedure- процедура if– если until– пока
Downto- вниз до program– программа in— в var– переменные

 

Стандартные име­на подразделяются на несколько групп:

- имена стандартных типов данных: boolean (логический), char (символьный), integer (целый), real (действитель­ный), text (текстовый файл) и т.д.;

- имена стандартных констант: false (ложь), true (истина), maxint (максимальное целое), pi (число Пи) и т.д.;

- имена стандартных функций: abs, arctan, cos, exp, In, sin и т.д.;

- имена стандартных процедур: read, readln, write, writeln, inc, dec и т.д.

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

Имена, которые пользователь присваивает величинам (кон­стантам, переменным), программе, подпрограммам и т.д., состоят из латинских букв, цифр и символа подчерка « _ ».

В имени цифра не мо­жет быть первым символом.

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

 

заголовка

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

 

описательной части

uses — присоединение библиотек и модулей;
label — объявление меток;
const — объявление констант;
type — описание типов;
var — объявление переменных;
procedure — объявление процедур пользователя;
function — объявление функций пользователя

и исполняющей части

Begin

<раздел команд>

End.

Разделителем между конструкциями (командами) программы служит символ «;». В конце программы всегда должна стоять точка (end.).

Заголовок программе ИСР Delphi присваивает автоматически, но программист всегда может его изменить. В служебных словах и именах, которыми пользователь называет свои програм­мы и переменные, прописные и строчные буквы равноправны: имена А и а (или MyName и myname) обозначают один и тот же объект.

В программу могут входить комментарии. Комментарий - фрагмент текста программы, заключенный в фигурные скобки {это комментарий}. Ком­ментарий служит для объяснения работы программы и не влияет на исполнение команд. Он может быть размещён в любом месте программы. Одну строку текста можно закомментировать двумя подряд идущими символами «//». Особым видом комментария является директива. В директиве после открывающей фигурной скобки находится символ $. Директивы служат для поддержки необходимой модели памя­ти или режимов функционирования среды программирования.

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

Переменная – это именованный фрагмент памяти, резервируемый для сохранения данных. Главной характеристикой переменной является ее тип, который определяет содержание переменной и объем выделяемой под нее памяти. Для использования переменной в программе ее необходимо объявить с помощью служебного слова Varв блоке описания переменных в следующем формате:

var <список переменных 1> : <тип переменных 1>;

<список переменных n> : <тип переменных n>;

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

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

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

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

Пример:

Var a: integer;

Begin

a := 100;

End;

Вопросы для самопроверки:

1. Приведите примеры идентификаторов переменных и констант.

2. Задайте три константы со значениями 3, 5.6, 8.95.

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

 

3.3. Типы данных

Стандартные типы данных. Количество переменных и их свойства указывает пользователь. Тип перемен­ной определяет её допустимые значения, а также операции, кото­рые можно над нею выполнять. К стандартным относятся следующие типы данных: числовые целые (пять типов, integer –основной, ), числовые вещественные (четыре типа, real - основной), символьный (char) и логиче­ский (boolean) [1-3].

Вещественные числа можно записывать в формате с фиксиро­ванной точкой, например, 5.04, -12.109, или в формате с пла­вающей точкой. Запись -5.2Е+2 является представлением числа -520.0, а 16.1Е-3 - числа 0.0161. Символы Е+2 обозначают умно­жение на 10 в степени +2, а Е-3 - на 10-3, то есть

 

NEm = N*10m

 

Символьный тип (char) - это множество символов кодовой таблицы компьютера ASCII. Символьная константа - это символ, заключенный в кавычки, например, 'а', '5', '%'.

Логический тип (boolean) характеризуется двумя значениями: false (ложь) и true(истина).

Все стандартные типы (кроме вещественного) упорядочены, то есть для каждого данного определены последующее и предыдущее значения. (succ, pred).

Нестандартные простые типы. Стандартные типы данных отличаются от не стандартных тем, что их не нужно описывать в разделе type. Пользователь может определить свои собственные типы данных (нестандартные) в разделе описания типов type таким образом:

type <имя типа 1> = <описание типа 1>;

<имя типа n> = <описание типа n>

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

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

type <имя типа> = (<значение 1>, <значение 2>, ...,<значение n>);

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

Опишем два перечислимых типа (названия дней не­дели и цветов):

type week = (mon, tue, wed, the, fri, sat, sun);

color = (red, green, yellow, white);

и объявим две переменные - day и avto этих типов:

var day : week;

avto : color;

Этим переменным можно присвоить, например, такие значе­ния:

day := fri; avto := green; avto := red.

Нумерация элементов списка начинается с 0. Над данными пе­речислимого типа определены функции ord, pred и succ. Например,

ord(avto) = 0, ord(day) = 4, pred(day) = the, succ(day) = sat.

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

Диапазонный тип — это сужение некоторого базового упорядо­ченного типа. Его описывают так:

type <имя типа> = <значение 1> .. <значение 2>

Пример. Создадим три типа (weekdays, workdays, months), ко­торые описывают все и рабочие дни недели, а также номера месяцев года. Объявим переменные dayl, day2, day3 и month этих типов:

Type weekdays = (mon, tue, wed, the, fri, sat, sun);

workdays = mon..fri;

months = 1..12;

var dayl, day2 : weekdays;

day3 : workdays;

month : months;

Строковый тип данных (string). Значениями переменной стро­кового типа может быть любая последовательность, состоящая не более чем из 255 символов. Данные строкового типа можно опи­сать в разделе типов, задать в разделе констант или объявить в разделе переменных. Например:

type t = string[10];

const s = 'Bye!';

var top : t; w : string;

В квадратных скобках указывают длину строки.

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

const <имя константы 1> : <тип 1> = <переменная 1>;

<имя константы n> : <тип п> = <переменная n>

Примерами типизированных констант могут быть:

const с : char = 'а'; n: integer = 5; k: real = 1.73; F: Boolean=true;

Вопросы для самопроверки:

1. Приведите примеры данных для каждого типа.

2. Перечислите целые и вещественные типы данных.

3. Задайте значения для переменных тех типов данных, для которых выполнимы функции succ() и pred() и вычислите результаты их выполнения

4. Перечислите операции с типами, примеры.

 

3.4. Операторы

Оператор – это определенный в языке символ, при помощи которого подвыражения (называемые операндами) комбинируются в более сложные выражения. Большинство операторов обозначаются специальными символами, такими как *, +, -, &, / и т.п. Простейшим оператором является оператор сложения: x+y.

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

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

Арифметические операторы, действующие на целочисленные и вещественные (действительные) операнды, включают в себя унарные и бинарные операторы. К унарным относятся унарный плюс (+) и унарный минус (-). К бинарным – операторы сложения (+), вычитания(-), умножения (*), деления (/), деления на цело (div), остатка от целочисленного деления (mod). При операциях с целочисленными операндами результат имеет тип Integer. Если операнды имеют тип поддиапазона целочисленного типа, то действия над ними выполняются как над целыми числами.

Булевы операторы манипулируют с операндами любого булева типа и возвращают значение типа Boolean. К этому классу относятся следующие операторы: отрицание (not), конъюнкция (and), дизъюнкция (or) и исключающая дизъюнкция (xor). Операции, выполняемые с помощью булевых операторов, подчиняются правилам булевой логики. Например, выражение X andY имеет значение True(истина), в том и только в том случае, если и X и Y имеют значение True.

Компилятор Delphi поддерживает два режима оценки для операторов and и or: режим полного вычисления и режим сокращенного вычисления (по умолчанию).

Логические операторы выполняют поразрядные операции с целочисленными операндами: поразрядное отрицание (not), поразрядная конъюнкция (and), поразрядная дизъюнкция (or), поразрядная исключающая дизъюнкция (xor), поразрядный сдвиг влево (shl), поразрядный сдвиг вправо (shr). Здесь имеют место следующие базисные правила:

- результат операций not и поразрядного сдвига имеет тот же тип, что и операнд;

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

К строковым операторам относятся оператор конкатенации (+), соединяющий две строки, и операторы сравнения (=, <>, <, >, <=, >= ). Результат операции конкатенации совместим с любым строковым типом.

Операторы сравнения являются бинарными операторами. Они позволяют выполнить соотношение операндов. В качестве операндов можно использовать любые выражения целого или действительного типа, указатели или множества. Результатом выполнения оператора сравнения является булево значение: если выражение верно, то True, иначе – False. При этом операнды должны быть одного типа или быть совместимы. Исключение из этого правила – сравнение значений целых и вещественных типов. Сравнение строк осуществляется посимвольно, в точном соответствии с расширенным набором символов ASCII [1-3].

Вопросы для самопроверки:

1. Приведите примеры выполнения всех операторов.

2. Почему при записи формул их «вытягивают» в линию? Почему знак умножения всегда указывают явно (a*k, но не ak)?

3. Определить значение X после выполнения операторов:

x := 10; x := x+3;

4. Вычислить значения выражений: 20 div 6; 20 mod 6; round(6.9);

 

Ввод/вывод данных.

В стандартном Паскале для целей ввода данных с клавиатуры и вывода результатов на экран существуют специальные команды ввода/вывода – read и write, которые актуальны при работе в среде DOS. Под ОС Windows необходимо пользоваться визуальными компонентами Delphi такими как Edit – поле редактирования и Label – текстовое поле из палитры системных компонент.

Свойство Caption компонента Label и Text компонента Edit (типа string) доступны из программы для записи и чтения, поэтому если выполнить команду:

Label1.Caption := ‘Это вывод строки текста’;

то в месте размещения компонента Label1 на форме мы увидим текст: “ Это вывод строки текста ”. Таким образом, если необходимо вывести числовые результаты работы программы можно воспользоваться визуальным компонентом текстовое поле и соответствующей функцией преобразования числового значения в строку символов. Например, если переменная а – integer, то команда вывода будет выглядеть следующим образом:

Label1.Caption := IntToStr(a); // преобразование к строковому типу

Если b – real, то используем функцию FloatToStr(b);

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

Var a : integer; b : real;

begin

a := strtoint(Edit1.text); // преобразование к целому типу

b := strtofloat(Edit2.text); // преобразование к вещественному типу

end;

 

3.6. Ветвления

Логическое выражение — это способ записи на языке программирования условий для поиска необходимых данных. Логи­ческое выражение может принимать значения true (истина) или false (ложь). Логические выражения бывают простые и сложные. Простое выражение — это два арифметических выражения, соеди­ненных символом отношения, а сложное — это простые логиче­ские выражения, соединенные логическими операциями not, and или or. Приоритет выполнения логических операций такой:

1- not, 2 - and, 3 - or

Двойное неравенство 1 < х < 5 как сложное логическое выра­жение записывают так: (1 < х) and (x < 5). Совокупность нера­венств вида х < 1; х > 5 так: (х < 1) or (x > 5). Простые логиче­ские выражения, из которых состоят сложные, всегда берут в круглые скобки.

Команда ветвления if. Команду ветвления if иначе называ­ют условной командой. Она имеет две формы: полную и корот­кую.

Полная форма команды ветвления выглядит так:

If <логическое выражение> then <оператор 1> else < оператор 2>;

Действие команды. Если логическое выражение истинно, то выполняется оператор 1, в противном случае - оператор 2. Операторы 1 и 2 могут быть простыми или составными.

Пример: if a>0 then x:=a*b else X:=0;

Короткая форма команды ветвления if выглядит так:

If <логическое выражение> then < оператор 1>;

Действие команды. Оператор 1 выполняется только тогда когда логическое выражение истинно.

Пример. Пусть х=20.

if х > 12 then у := 2 * х;

z := 10;

if x < 5 then z := 10 + x / 2;

Результат: y = 40, z = 10.

Другие команды ветвления: GOTO, CASE.

Вопросы для самопроверки:

1.Опишите действие команд GOTO и CASE

2. Запишите условный оператор, который эквивалентен следующему оператору присваивания: X := a or b and c;

3. Дайте определение пустого оператора; примеры.

4. Задача: необходимо значения переменных а, b и с поменять местами так, чтобы выполнялось условие a ≥ b ≥ c.

 

3.7. Циклы

Цикл это выполнение определенного набора команд некото­рое количество раз. Различают три вида команд циклов: с пара­метром, с предусловием и с после условием.

Команда цикла с параметром (for).В языке программиро­вания Паскаль есть два вида команды for.Рассмотрим первый

For <параметр> := <выражение 1> to < выражение 2> do< оператор 1>;

Параметр – это переменная целого, символьного, логического или перечислимого типов, а выражения 1 и 2 задают начальное и конечное значения параметра.

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

Пример.Пусть s = 0.После выполнения команды

fori := 4 to6dobegins := s + i; z := 2 * i end;

переменная s получит значение 0+4+5+6=15, а переменная z -12.

Рассмотрим второй вид команды цикла for:

for<параметр> := <выражение 1> downto<выражение 2> do<оператор 1>;

Эта команда действует, как и предыдущая, но шаг изменения параметра равен -1.

Значение параметра в середине цикла изменять нельзя!

Команда цикла с предусловием (while).Команда while вы­глядит так:

while<логическое выражение> do<оператор 1>;

Действие команды. Пока значение логического выражения ис­тинно, выполняется оператор 1. Истинность логического выражения определяет условие продолжения цикла.

Пример. Пусть переменные х, s равны х = 4, s = 0. После вы­полнения команды

while х <= 8 do begin s := s + x; x := x + 1 end;

они получат значения s=4+5+6+7+8= 30, x = 9.

Вопросы для самопроверки:

1.Вычислите x = 10! (факториал) с помощью трех различных операторов цикла.

2. Дано 100 вещественных чисел. Вычислить разность между максимальным и минимальным из них.

3. Вычислить S- сумму порядковых номеров всех букв, входящих в слово «Delphi»; в слово, введенное пользователем.

4. Подсчитать k-количество цифр в десятичной записи целого неотрицательного числа n.

3.8. Массивы

Массив (array)- это конечный набор элементов одного (ба­зового) типа, которые сохраняются в последовательно размещён­ных ячейках оперативной памяти и имеют общее имя.

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

Общий вид конструкции описания типа массива такой:

array[<размер>] of <имя базового типа>;

Размер (количество элементов) массива чаще всего задают в виде диапазона или именем некоторого перечислимого типа дан­ных.

Описать массив можно в разделе описания типов type,в разде­ле констант constили в разделе объявления переменных var.Имена типов массивов и переменных-массивов указывает пользо­ватель.

Пример.Опишем тип массива mymas, объявим постоянный массив (массив-константу) zatraty типа mymas и переменные — массивы A, al типа mymas и массив B, состоящий из 7 элемен­тов целого типа, массив C — из 100 элементов-символов.

typemymas = array [1..10] ofreal;

day = (mon, tue, wed, the, fri, sat, sun);

const zatraty: mymas =(1.2, 1, 1, 2, 8, 2.4, 8.7, 3, 7, 1.3);

vara, al : mymas;

b : array[day] of integer;

с : array [1..100]of char;

Над массивами определена единственная команда присваива­ния. Например, команда а := al все значения массива al присвоит соответствующим элементам массива а. Все остальные опера­ции определены только над элементами массива. Доступ к элементам массива осуществляется так:

<имя массива> [ <номер элемента> ]

Номер (его часто называют индексом) записывают в квадрат­ных скобках, например, а[1] - первый элемент массива a, b[tue] -второй элемент массива B.

Пример.Элементам описанных выше массивов можно присво­ить значения так:

а[1] := 15.1;b[tue] := 3; с[1] := ‘V’; с[2] := ‘b’

Элементы массива zatraty имеют такие значения:

zatraty[l] = 1.2; zatraty[2] = 1; ...; zatraty[10] =1.3.

Пример.Создать массив из первых ста положительных целых чисел и вычислить сумму всех его элементов (5050) можно так:

s := 0;

fori := 1 to 100 do

Begin

a[i]:= i;

s := s + a[i]

end;

label1.caption:=inttostr(s);

Задачи поиска в массиве конкретных данных решают методом сканирования всех элементов массива при помощи команд цикла for, whileили repeatи команды ветвления, в которой указывают условие поиска.

Двумерные массивы.Двумерные массивы предназначены для работы с табличными данными. В двумерном массиве элемен­ты определяются именем массива и двумя индексами: первый ин­декс указывает на номер строки, а второй - на номер столбца, на пересечении которых находится элемент. Например, р[1, 2] - вто­рой элемент первой строки массива р.

Рассмотрим примеры объявления массива-константы bal, кото­рый состоит из 2 строк и 4 столбцов, массива sutki, содержащего 24 строки по 60 элементов целого типа, двухмерного массива р размером 9 на 9 (т.е. с 9*9=81 элементом).

constn = 9;

bal: array [1..2, 1..4] ofinteger=((4, 3, 5, 3), (4, 4, 5, 3));

varsutki: array[0..23] of array[0..59] ofinteger;

p : array[l..n, l..n]ofinteger;

Элементы массива bal принимают такие значения:

bal[l, 1] = 4, bal[l, 2] = 3, ..., bal[2, 3] - 5, bal[2, 4] = 3.

Равносильны следующие команды:

sutki[16][20]:=5; и sutki[16,20]:=5;

 

Вопросы для самопроверки:

1. Может ли массив содержать один элемент? А ни одного?

2. Можно ли во время выполнения программы изменять размер массива (количество элементов в нем)?

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

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

var A,B : array[1..15,0..8] of real; t: Boolean;?

а) A := B; б) A := A + B; в) t := A <> B; г) A[1] := B[1]; д) A[1] := A[15];

е) A[2,3] := B[4][8] + B[1,1];

 

3.9. Подпрограммы

Понятие о структурном программировании. Структурное программирование – методология разработки программного обеспечения, в соответствии с которой любая программа представляет собой структуру, построенную из трёх типов базовых конструкций:

  • последовательное исполнение — однократное выполнение операций в том порядке, в котором они записаны в тексте программы;
  • ветвление — однократное выполнение одной из двух или более операций, в зависимости от выполнения некоторого заданного условия;
  • цикл — многократное исполнение одной и той же операции до тех пор, пока выполняется некоторое заданное условие (условие продолжения цикла).

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

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

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

Описание подпрограммы в общем случае состоит из трех частей:

- заголовок (интерфейс), позволяющий выполнить активизацию подпрограммы;

- локальное описание, содержащее объявление внутренних (рабочих) типов, объектов и переменных;

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

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

Общий вид процедуры:

Procedure <имя> (<список формальных параметров> );[<директивы >];

<локальное описание >;

Begin

<тело процедуры>

end;

Функцию описывают так:

Function <имя> (<список формальных параметров> ):<тип функции>;[<директивы>];

< локальное описание >;

Begin

<тело процедуры, содержащее хотя бы одну команду вида:

имя := выражение >

end;

 

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

В Object Pascal существует два способа передачи параметров в подпрограмму: по значению и по имени.

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

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

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

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

MyProc(3, 6);

А функции:

X := Myfunc(3, 6);

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

 

Вопросы для самопроверки:

1. Даны три натуральных числа. Напишите функцию определения наибольшего делителя.

2. В чем отличия передачи аргументов в подпрограмму по имени и по значению.

3. Как в списке формальных параметров можно задать значения по умолчанию?