- •Введение в конструирование программ
- •Пенза 2006 г.
- •Предисловие
- •1 Обработка информации на компьютере
- •1.1 Модель обработки информации на компьютере
- •1.2 Основные объекты языка программирования
- •1.2.1 Синтаксические элементы языка программирования
- •1.2.2. Значения и типы
- •1.2.3. Константы и переменные
- •1.2.4. Выражения
- •1.2.5. Операторы
- •1.3 Лабораторные задания
- •1.3.1 Логическая разминка
- •1.3.2 Реализовать схемы программ на языке Object Pascal
- •2 Структурное конструирование программ
- •2.1 Простая программа
- •2.2 Консольное приложение
- •2.2.1 Создание, сохранение и загрузка программы
- •2.2.2 Компиляция и выполнение программы
- •2.3 Лабораторные задания
- •2.3.1 Составление простых программ
- •2.3.2 Выполните трассировку и определите результаты работы программы
- •2.3.3 Программирование с использованием управляющих структур
- •2.4 Подпрограммы
- •2.4.1 Глобальные данные
- •2.4.2 Способы передачи параметров
- •2.4.3 Функции
- •2.4.4 Процедуры
- •2.4.5 Значения параметров по умолчанию
- •2.4.6 Перегрузка функций
- •2.4.7. Рекурсивные подпрограммы
- •2.4.8. Передача наименования подпрограммы как параметра
- •2.5 Отладка программ
- •2.6 Лабораторные задания. Подпрограммы
- •2.6.1 Конструирование подпрограмм
- •2.6.2 Разработка рекурсивных подпрограмм
- •2.7. Модули
- •Interface {интерфейс модуля}
- •Implementation {реализация}
- •Initialization {инициализация}
- •3. Структуры данных
- •3.1. Массивы
- •3.1.1. Действия над массивами
- •I, j : byte; { индексы элементов массивов }
- •3.1.2 Передача массивов в качестве параметров
- •3.1.2.1. Формальные параметры как массивы с фиксированными размерами
- •3.1.2.2. Формальные параметры как массивы со «свободными» размерами
- •3.1.2.3. Определение наименьшего/наибольшего значения массива
- •3.1.3 Лабораторные задания
- •3.1.3.1 Одномерные массивы
- •3.1.3.2. Двумерные массивы
- •3.2. Строки
- •3.2.1 Лабораторные задания
- •3.3. Записи
- •3.3.1 Лабораторные задания
- •3.4 Файлы.
- •3.4.1 Основные понятия и операции
- •3.4.2 Типизированные файлы
- •3.4.3 Текстовые файлы
- •3.4.4 Лабораторные задания
- •3.5 Динамические структуры данных. Указатели
- •3.5.1 Основные понятия и определения
- •3.5.2 Процедуры выделения и освобождения памяти
- •3.5.3 Односвязный список
- •3.5.4 Лабораторные задания. Указатели, список
- •3.5.5 Динамические массивы
- •4. Введение в объектно-ориентированное конструирование программ
- •4.1 Основные понятия и определения
- •4.2 Классы и объекты
- •4.2.1 Структура класса
- •4.2.2 Создание и уничтожение объектов
- •4.2.3 Пример. Класс – динамический массив
- •4.2.5 Операции с объектами
- •4.2.5.1 Оператор is
- •4.2.5.2 Оператор as
- •4.2.5.3 Копирование объектов одного класса
- •4.2.6 Свойства
- •4.2.7 Наследование и полиморфизм
- •4.2.8 События
- •4.2.9 Исключительные ситуации
- •4.2.9.1 Операторы try…except
- •4.2.9.2 Операторы try…finally
- •5. Визуальная разработка программ в delphi
- •5.1. Интегрированная среда разработки программ
- •5.1.1 Проект
- •5.2 Конструирование простого приложения
- •5.2.1 Интерфейс Пользователя
- •5.2.2 Визуальное конструирование
- •5.2.3 Реализация методов
- •5.2.4 Обработка исключительных ситуаций
- •5.2.5 Файлы приложения Калькулятор
- •5.3 Компоненты ввода/вывода данных StringGrid и Memo
- •5.3.1 Компонент StringGrid – таблица строк
- •5.3.1 Ввод массива. Компонент StringGrid
- •5.3.3 Компонент Memo – многострочное окно редактирования
- •5.3.4 Ввод массива. Компонент Memo
- •5.4 Немного о графике
- •5.4.1 Свойство Canvas. Построение графика функции
- •5.4.2 Событие OnPaint
- •Список литературы
- •Приложение а. Кратко о Delphi а.1 Свойства проекта
- •А.2 Программный код пустой формы
- •А.3 Главная форма
- •А.3.1 Свойства главной формы
- •А.3.2 События главной формы
- •А.4 Компоненты Delphi
- •Приложение b. Приложение «Калькулятор»
1.2.4. Выражения
Выражение предназначено для вычисления значения и состоит из операндов (констант, переменных, функций) и операций над ними. Порядок действий в выражении определяется приоритетами знаков операций и круглыми скобками. Типы операндов, входящих в выражение должны совпадать или удовлетворять правилам согласования типов языка программирования.
Выражения называют арифметическими, отношения, логическими и символьными в зависимости от того, какого типа операнды и операции в них используются.
Арифметическое выражение включает операции, допустимые для числовых типов данных (integer, byte, real и других). Приоритет операций в порядке убывания следующий: /, , div (частное от деления целых чисел), mod (остаток от деления целых чисел), and (поразрядное «и»), or (поразрядное «или»), shl (сдвиг влево), shr(сдвиг вправо), , .
Пример:
45.2 / 4 { результат 11.3 }
r mod 10 {если r = 25, результат 5 }
r div 10 {если r = 25, результат 2 }
d1 shl 2 {если d1 = 2, результат 8 }
Выражение отношения выполняет сравнение операндов и определяют истинно выражение или ложно. Все операции выражения являются бинарными. Приоритет операций в порядке убывания следующий: =, <>, <, >, <=, >=, in (операция принадлежности множеству). Результат всегда имеет логический тип.
Пример:
W <= R {если W = 25, R = 34, результат true }
f1 <> 5 {если f1 = 5 , результат false }
ch in ['a'..'z'] {если ch – латинская буква , результат true }
Логическое выражение выполняет логические операции над логическими операндами. Приоритет операций в порядке убывания следующий: not, and, or, xor.
Пример:
(W and R) or (not f1 and f2) {если W, f2=true; R, f1=false, результат true}
Символьное выражение включает такие операнды, как символьная константа, символьная переменная, элемент массива символьного типа, функция, возвращающая значение символьного типа. Над операндами может выполняться операция конкатенации (объединения) – +.
Пример:
'Pas'+'cal' {результат – символьная константа 'Pascal' }
Относительные приоритеты операций языка Object Pascal приведены в таблице 1.2.
Таблица 1.2 Приоритет операций в языке Object Pascal
-
Операция
Приоритет
@, not
Первый (высший)
, /, div, mod, and, shl, shr
Второй
+, -, or, xor
Третий
=, <>, >,<, <=,>=, in
Четвертый (низший)
1.2.5. Операторы
Для описания последовательности действий, необходимых для вычисления значений в языке программирования используют операторы.
Различают операторы следующих видов:
Операторы собственно обработки информации. К ним будем относить оператор присваивания, операторы чтения (ввода) и операторы записи (вывода)
Операторы управления работой программы. Эти операторы реализуют «управляющие структуры», которые определяют последовательные, разветвляющиеся и циклические вычислительные процессы.
Оператор присваивания (:=) предписывает вычислить выражение, заданное в его правой части, и присвоить полученное значение переменной, идентификатор которой расположен в его левой части. Переменная и результат вычисления выражения должны иметь один и тот же тип (или типы, подчиняющиеся правилам согласования типов языка Object Pascal).
Синтаксис:
<имя переменной> := <выражение>;
Пример:
var
result, firstValue, secondValue : integer;
begin
firstValue := 12;
secondValue := 5;
result := firstValue div secondValue; {результат = 2}
end.
Все переменные должны быть предварительно описаны, а переменные, входящие в выражение, должны быть обязательно инициализированы (им должно быть присвоено некоторое значение).
В режиме консольного приложения (в этом режиме отсутствует графический интерфейс Delphi) для ввода и вывода данных можно использовать операторы чтения и записи языка Object Pascal.
Операторы чтения (ввода) данных: read и readln.
Оператор read
Синтаксис:
read(X1, X2, ..., Xn); { X1, X2, ..., Xn – переменные допустимых типов данных}
{ тип Boolean не допустим! }
Значения для переменных X1, X2, ..., Xn набираются пользователем на клавиатуре минимум через один пробел (в тексте пробел будем обозначать символом ). После набора данных нажимается клавиша «Ввод» (Enter).
Оператор readln
Аналогичен оператору read. Единственное отличие заключается в том, что после считывания последнего в списке значения будет очищен буфер клавиатуры.
Пример:
Ввод значений двух целых чисел x и y
readln(x,y); { если Пользователь набрал на клавиатуре: 25 }
{ и нажал клавишу Enter, то значением x будет 2, y – 5 }
Операторы записи (вывода) данных: write и writeln.
Оператор write
Синтаксис:
write (Y1, Y2, ..., Yn);
где Y1, Y2, ..., Yn – выражения.
После каждого выражения через двоеточие может быть записан формат вывода. Первое число, стоящее за двоеточием, определяет ширину поля вывода. Второе число в описании формата используется только для вывода вещественного значения и определяет количество цифр дробной части значения.
Пример:
write (a:8:3); { если значение переменной a (a: real) равно 38.52, }
{ результат вывода будет таким: 38.52}
Если формат не указан, то значение будет размещено при выводе в поле, ширина которого установлена вычислительной системой. Например, значение переменной a(a: real), равное 38.52, будет выведено как 3.85200000000000Е+0001 (3.852×101).
Оператор writeln
Аналогичен оператору write, но после вывода последнего в списке значения происходит перевод курсора в начало следующей строки. Оператор writeln, записанный без параметров, вызывает перевод курсора на новую строку.
Пример:
writeln ('ПриXравном', x:2); {если x=5, y=12 (x, y: integer), то }
writeln ('Yравен', y:4); {результат вывода будет таким: }
{ПриXравном5}
{Yравен12}
Операторы управления. Управляющие структуры
Процессор компьютера способен выполнять некоторое число элементарных операций над данными: сложение, вычитание, присваивание, сравнение и другие. Процессор может самостоятельно управлять последовательностью этих операций во времени по заданной программе.
Каким образом с помощью программы можно указать порядок выполнения операций? Для этого в программе используют три основных категории управляющих структур:
Последовательность;
Ветвление (порядок выполнения определяется значением условия);
Цикл (повторение).
Эти структуры дают нам «конструктор», комбинируя элементами которого, можно реализовать процесс вычислений произвольной сложности, сохраняя отчетливое видение общей структуры процесса.
Все управляющие структуры имеют один вход и один выход.
Базовыми структурами являются структуры Последовательность, Если_То_Иначе и Цикл_Пока.
Все современные языки программирования имеют операторы, которые однозначно реализуют управляющие структуры.
Рассмотрим управляющие структуры и операторы языка Object Pascal, которые их реализуют (таблица 1.3). Для графического представления управляющих структур будем использовать следующие узлы:
Таблица 1.3 Управляющие структуры
Управляющая структура |
Оператор языка Object Pascal |
Пример |
Последовательность
|
A; B; Сначала выполняется A, затем B. A, B – операторы обработки информации |
readln(x); y:= x; |
Если_То_Иначе
|
if P then A else B; Если значение логического выражения P истинно, то выполняется A, иначе – B. |
if x>0 then y:= 1 else y:=0; |
Если_То
|
if P then A;
|
if x>0 then y:= 1;
|
Выбор
|
case K of 1: A; 2: B; 3: C else D; end; K – переменная («переключатель»), значение которой определяет выполнение операторов: если K = 1, то A; если K = 2, то B; если K = 3, то C иначе – D; |
var ch: char;
begin . . . case ch of '0'..'9': writeln('Это цифра'); 'a'..'z': writeln('Это буква') else writeln('Это другой символ'); end; . . . end. |
Цикл_Пока (цикл с предусловием)
|
while P do A;
Оператор A выполняется, пока значение логического выражения P истинно. |
while N>0 do N:=N-1;
|
Цикл_со_счетчиком (цикл с предусловием)
|
for i:= <начальное значение> to <конечное значение> do A;
Переменная i – это показатель цикла, значение которого на каждом шаге цикла автоматически увеличивается (или уменьшается) на 1. |
for i:= 1 to N do writeln(i);
for i:= N downto 1 do writeln(i); |
Цикл_До (цикл с постусловием)
|
repeat A; until P;
Оператор A выполняется до тех пор, пока логическое выражение P не станет истинным. |
repeat N:=N-1; until N <= 0;
|
Составной оператор
Управляющие структуры ветвления и цикла в каждой своей «ветви» содержат не более одного оператора обработки информации (в таблице 1.3 A, B). Во многих программах этого недостаточно даже для реализации простого алгоритма. Для того чтобы распространить область действия значения условия или цикла на несколько операторов, необходимо объединить их в составной оператор.
Составной оператор – это последовательность операторов, заключенная в операторные скобки begin …end.
Пример:
if x>0 then
begin
y:= 1; { здесь составной оператор – это операторы y:=1 и k:=k+1,}
k:= k+1; { которые выполняются только при условии x > 0 }
end;
На практике использование составного оператора означает, что мы просто заменяем функциональный узел «внутри» управляющей структуры такой управляющей структурой, которая необходима для реализации алгоритма.
В приведенном примере на рисунке 1.2 функциональный узел в структуре Если_То был заменен структурой Последовательность.
Рисунок 1.2 – Составной оператор
Это способ построения программы дает нам возможность, используя всего несколько базовых структур, построить программу любой сложности. При этом разработка программы осуществляется «сверху вниз»: от общей структуры программы, как одного функционального узла, к ее конкретному уточненному представлению в виде совокупности вложенных управляющих структур.
Операторы прерывания выполнения
Реализация циклических алгоритмов требует в некоторых случаях прекращения «шага» цикла или всего цикла до выполнения условия его завершения. Для этих целей в языках программирования предусмотрены специальные операторы (НЕ управляющие структуры!).
В языке Object Pascal это такие операторы:
continue – оператор завершения шага цикла. По этому оператору прекращается выполнение текущего шага цикла, и управление передается на следующий шаг
break – оператор «выхода» из цикла. Прекращается выполнение цикла и управление передается оператору, следующему за последним оператором цикла.
exit – оператор «выхода» из программы. По этому оператору выполнение программы завершается. Рекомендуется использовать для выхода из подпрограмм.