- •Основы алгоритмизации и программирования
- •Введение
- •1.1. Структура программы
- •1.2. Типы данных
- •1.2.1. Целый тип данных
- •1.2.2. Логические типы данных – Boolean
- •1.2.3. Данные символьного типа
- •1.3. Операторы языка программирования Турбо Паскаль
- •1.3.1. Операции в Турбо Паскаль
- •1.3.2. Правила вычисления выражений
- •1.3.3. Встроенные функции в Турбо Паскаль
- •1.3.4. Описание констант и переменных
- •1.3.5. Операторы в Турбо Паскаль
- •Вопросы для самопроверки
- •Лабораторная работа №1 Организация программ линейных структур
- •Варианты заданий
- •2. Организация форматного вывода данных на языке Паскаль
- •Вопросы для самопроверки
- •Лабораторная работа №2 Организация ввода-вывода данных на языке Паскаль
- •Методические указания
- •Варианты задания
- •3. Организация программ разветвляющихся структур
- •3.1. Полная форма условного оператора
- •3.2. Краткая форма условного оператора
- •Вопросы для самопроверки
- •Лабораторная работа №3 Организация программ разветвляющихся структур
- •Варианты заданий
- •4. Организация циклических процессов
- •Лабораторная работа №4 Составление циклических программ
- •Варианты заданий
- •Методические указания
- •Варианты заданий
- •5. Программирование структур с вложенными циклами
- •Вопросы для самопроверки
- •Лабораторная работа №5 программирование структур с вложенными циклами. Вычисление суммы ряда
- •Методические указания
- •Варианты заданий
- •6. Перечислимые и ограниченные типы данных
- •6.1 Перечислимый тип данных
- •6.2. Ограниченный тип данных
- •6.3. Оператор выбора (варианта)
- •Вопросы для самопроверки
- •Лабораторная работа №6 Перечислимые и ограниченные типы данных
- •Варианты заданий.
- •7. Регулярные типы данных
- •7.1. Одномерные массивы
- •7.1.1. Краткая форма объявления одномерного массива
- •7.1.2. Полная форма объявления одномерного массива
- •7.1.3. Доступ к элементам массива
- •Вопросы для самопроверки
- •Лабораторная работа №7_1 регулярные типы данных. Массивы
- •Варианты заданий
- •7.2. Двумерные массивы
- •Полная форма описания матрицы:
- •Формирование элементов случайным образом:
- •Формирование элементов матрицы при вводе с клавиатуры:
- •Фрагменты программ по обработке 2-х мерных массивов
- •Вопросы для самопроверки
- •Лабораторная работа №7_2 регулярные типы данных. МАтрицы
- •Варианты заданий
- •7.3. Сортировка элементов массива
- •7.3.1. Сортировка методом «пузырька»
- •7.3.2. Сортировка вставками
- •7.3.3. Сортировка посредством выбора
- •7.3.4. Быстрая сортировка
- •8. Составление программ с использованием подпрограмм
- •8.1. Область видимости идентификатора переменной
- •8.2. Подпрограммы - процедуры (procedure)
- •8.2.1. Формальные и фактические параметры
- •Вопросы для самопроверки
- •Лабораторная работа №8_1 составление программ с использованием подпрограмм - процедур
- •Методические указания
- •Варианты заданий
- •8.3. Подпрограммы-функции (function)
- •Вопросы для самопроверки
- •Лабораторная работа №8_2 составление программ с использованием подпрограмм - функций
- •Варианты заданий
- •8.4. Рекурсия
- •8.4.1. Вычисление факториала
- •8.4.2. Формы рекурсивных процедур
- •8.4.3. Числа Фибоначчи
- •Вопросы для самопроверки
- •9. Модули
- •Структура модуля
- •Interface
- •Implementation
- •Вопросы для самопроверки
- •10.2. Стандартные процедуры и функции для строк
- •10.3. Хранение строк
- •Вопросы для самопроверки
- •Лабораторная работа №10 обработка символьной информации
- •Варианты заданий
- •11. Комбинированные типы. Записи (Record)
- •11.1 Записи с фиксированными частями
- •11.2. Оператор with…do
- •11.3. Вариантные записи
- •Вопросы для самопроверки
- •Лабораторная работа №11 Комбинированные типы. Записи
- •Варианты заданий
- •12. Файлы
- •12.1. Классификация файлов
- •12.1.1. Чтение файла
- •12.1.2. Запись файла
- •Вопросы для самопроверки
- •13.1. Объявление множества
- •13.2. Операции над множествами
- •13.3. Сравнение множеств
- •Include (s, I);
- •13.4. Старшинство множественных операций
- •Вопросы для самопроверки
- •Лабораторная работа №13 множества
- •Варианты заданий
- •Горячие клавиши
- •Библиографический список
- •Оглавление Введение 3
- •1. Программирование на языке Паскаль 5
- •1.1. Структура программы 5
- •2. Организация форматного вывода данных на языке Паскаль 17
- •Лабораторная работа №7_1.
- •Лабораторная работа №7_2.
- •Лабораторная работа №8_2.
Вопросы для самопроверки
Дайте определение рекурсии?
Какие существуют формы рекурсивных процедур?
Что означает косвенный рекурсивный вызов подпрограмм?
В чём заключается назначение опережающего описания рекурсивной подпрограммы?
9. Модули
Модуль – это автономно – компилируемая программная единица, включающая в себя различные компоненты раздела описаний (типы, константы, переменные, процедуры и функции), и некоторые исполняемые операторы инициирующей части.
Компилятор Турбо Паскаля размещает программный код модулей в отдельном сегменте памяти. Максимальная длина сегмента не может превышать 64 Кбайт, однако, количество одновременно используемых модулей ограничивается лишь доступной памятью, что даёт возможность создавать весьма крупные программы.
Модули представляют собой прекрасный инструмент для разработки библиотек прикладных программ и мощное средство модульного программирования.
Модуль можно разделить на несколько разделов:
Заголовок;
Интерфейсная часть;
Реализационная часть;
Инициализационная часть.
Структура модуля
Заголовок модуля
UNITИмя модуля
{$N+} Глобальные директивы компилятора
Интерфейснаячасть
INTERFACEНачало раздела объявлений
USESИспользуемые при объявлении модули
Подразделы объявления доступных глобальных соответственно
LABELметок
CONSTконстант
TYPEтипов и
VARпеременных
Заголовки доступных соответственно
PROCEDUREпроцедур и
FUNCTIONфункций
Реализационнаячасть
IMPLEMENTATIONНачало раздела реализации
USESИспользуемые при реализации модули
Подразделы объявления скрытых глобальных соответственно
LABELметок
CONSTконстант
TYPEтипов
VARпеременных
Тела доступных и скрытых соответственно
PROCEDUREпроцедур и
FUNCTIONфункций
Инициализационнаячасть
BEGIN
Основной блок модуля
END.
Заголовок модуля аналогичен заголовку программы: в модуле вместо зарезервированного слова PROGRAM используется слово UNIT.
Здесь могут присутствовать директивы компилятору, дающие общие установки и соглашения для всего модуля.
Например,
{$S+} - директива компилятору: включить (отключить) контроль возможного переполнения стека;
{$N+} - директива компилятору: использовать числовой процессор (реализовать операции с плавающей точкой программно), применяют для переменных типа real;
{$E+} - директива компилятору: включить (отключить) режим программной эмуляции сопроцессора, применяют для переменных типа extended – вещественное число повышенной точности (10 байт).
При написании модуля необходимо придерживаться следующих основных правил:
Имя модуля, как и имя программы не должно совпадать с именами объектов (процедур, функций и т. д.) внутри модуля (программы).
Имя модуля должно совпадать с именем файла, в котором он будет храниться. Отсюда, имя модуля не может состоять более чем из 8 символов.
В интерфейсной части описываются все константы, типы данных и переменных, процедуры и функции, доступные в этом модуле для использования внешними программами. Интерфейсная часть модуля несёт всю информацию, необходимую для использования процедур и функций, определённых в модуле. Любая другая информация о модуле для обычного его использования не нужна.
Примечание. В рамках приложение Турбо Паскаль 7.0 поставляются стандартные модули System, Strings, Crt, Printer, Dos, WinDos, Graph, Overlay, Graph3 и Turbo3.
В интерфейсной части, возможно, сделать доступными для использования уже существующие готовые модули, указав их имена в операторе USES.
Следом за оператором USES описываются доступные извне и необходимые для описания процедур и функций определения типов данных, констант и переменных.
Все процедуры и функции, доступные для общего пользования и определённые в данном модуле, должны быть описаны в интерфейсной части своей строкой – заголовком с указанием типов параметров. Текст программы этих процедур и функций находится (с дубликатом их заголовка) в реализационной части.
Нет необходимости упоминать в интерфейсной части все процедуры и функции, используемые в реализационной части. Возможна ситуация, когда интерфейсная часть вообще ничего не содержит.
Реализационная часть – это часть, в которой определяются процедуры и функции.
Можем определить здесь, как и внутри обычной программы, глобальные (для модуля) переменные, типы данных и константы, которые не доступны извне, и могут использоваться программами, входящими в реализационную часть.
Как и интерфейсная часть, часть реализационная может быть пустой. Такую возможность используют, если необходимо определить некоторые общие для многих программ типы данных, константы и переменные. Имея такое определение в рамках одного проекта, легко включить его во все программы (неявные и подчинённые) с помощью оператора USES.
Инициализационная часть представляет собой основной блок модуля. Приведённые в ней операторы выполняются первыми, то есть они выполняются перед операторами основного блока главной программы, в которую включён данный модуль.
Чтобы окончательно оформить эту программу как модуль, необходимо сохранить объектный модуль данной программы на диске. Для опции Compile / Destination установить значение Disk и выполнить компиляцию с помощью комбинации клавиш [Ctrl + F9].
ТП7.0 распознаёт в начале текста модуля оператор модуля UNIT и автоматически создаст файл с расширением *.TPU вместо *.EXE (как для обычных программ). Выдаваемое при этом сообщение “Can not run a unit!” просто информирует Вас о том, что модуль самостоятельно не выполняется.
В опции Options / Directories установить значение параметра Include Directory равным пути, где расположен, подключаемый к основной программе, файл с расширением *.TPU (Turbo Pascal Unit), то есть модуль.
Задача 9.1. Вычислить значение функции F(x) по формуле
.
Нахождение корня n-ой степени осуществить через подпрограмму - функцию, а расчёт значения по формуле – через подпрограмму - процедуру. Подпрограммы поместить в модуль.
Листинг модуля Second
Unit second; {Имя модуля}
{second.pas}
interface {Начало раздела объявлений}
Function FunSqrt (x1 : real; k : integer) : real; {Вычисление корня числа}
Procedure ProcY (var y1 : real; x1 : real); {Расчёт значения по формуле}
Implementation {Начало раздела реализации}
Uses Crt;
Function FunSqrt; {Тело функции}
begin
FunSqrt := exp((1/k) * ln(x1));
end;
Procedure ProcY; {Тело процедуры}
Const b = 10.7;
c = 0.4;
var a : real;
begin
a := exp(0.1*x1) + x1;
y1 := ln(FunSqrt(a,2)) / (x1 + FunSqrt(b,3) + arctan(x1)) + c;
end;
end.
Листинг основной программы
program Task;
Uses crt,
second;{Подключение модуля, в котором хранятся функция вычисления корня и процедура вычисления значения по формуле}
Var x, y : real; {Глобальные переменные}
s : char;
begin
ClrScr;
Repeat
TextColor(12); {Розовый цвет текста}
Writeln('Введите значение переменной Х:');
Readln (x);
ProcY (y,x); {Вычисляется значение по формуле}
TextColor(9); {Синий цвет текста}
Writeln('Значение переменной Y равно :', '':2, y:10:6);
TextColor(14); {Жёлтый цвет текста}
Writeln('Продолжить (Y/N) ?');
Readln (s);
Until (s = 'N') or (s = 'n');
end.
Примечание. Так как заголовки функции Funsort и процедуры Procy в модуле были описаны в интерфейсной части, то это позволит пользователю использовать эти подпрограммы в любой другой внешней программе, подключив соответствующий модуль. Учитывая условия задачи, где требовалось во внешней программе вычислить только значение переменной y по указанной формуле, подставляя каждый раз различные значения x, то есть использовать только процедуру, необходимо изменить листинг модуля. Для этого достаточно описание заголовка функции Funsort, вычисляющей корень n-ой степени, из интерфейсной части переместить в раздел реализации.
Задача 9.2. Дана матрица A(n, m). Необходимо: упорядочить элементы в каждой строке матрицы по возрастанию, а сами строки расположить по убыванию количества положительных элементов в строке. В программе организовать вызов процедуры, реализующей общую часть задания. Формирование элементов массива A случайным образом, вывод элементов массива оформить в виде процедур. Сортировку строк и элементов в строках матрицы A оформить в подпрограммах (процедурах). Нахождение количества положительных элементов в строке матрицы А выполнить с помощью функции. Процедуры и функцию описать в модуле.
Листинг модуля Second2
unitsecond2;