Основная структура программы




Лекция 7 (16): Основы программирования на языке Паскаль

1. Основные понятия. 1

2. Основная структура программы.. 2

2. Оператор присваивания. 3

3. Процедуры ввода-вывода. 4

4. Операторы ветвления. 4

4.1 Условный оператор if. 4

4.2 Оператор варианта case. 4

5. Операторы цикла. 4

5.1 Цикл с предусловием while. 4

5.2 Цикл с постусловием repeat 4

5.3 Цикл с параметром for 4

6. Процедуры передачи управления. 4

7. Строковые операции. 4

8. Определение типов. 4

9. Массивы.. 4

9.1 Одномерные массивы.. 4

9.2 Двумерные и многомерные массивы.. 4

10. Процедуры и функции. 4

11. Работа с файлами. 4

 

Основные понятия

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

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

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

Основная структура программы

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

program имя; { заголовок – не обязателен }

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

begin

раздел операторов

end. (* программа заканчивается точкой *)

Программа может содержать комментарии, заключенные в фигурные скобки { } или в скобки вида (* *). Комментарии служат для документирования программы — компилятор их игнорирует, поэтому на их содержимое никаких ограничений не накладывается. Операторы отделяются друг от друга символом; (точка с запятой).

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

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

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

uses crt, graph, my_module;

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

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

const MaxLen = 100; g = 9.8;

koeff = 5;

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

const weight: real = 61.5;

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

Раздел описания меток начинается с ключевого слова label, за которым через запятую следует перечисление всех меток, встречающихся в программе. Метки служат для организации перехода на конкретный оператор с помощью оператора безусловного перехода goto. Метка — это либо имя, либо положительное число, не превышающее 9999. Метка ставится перед любым исполняемым оператором и отделяется от него двоеточием:

label 1, 2, error;

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

Присваивание — это занесение значения в память. В общем виде оператор присваивания записывается так:

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

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

переменная <- выражение

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

a:= b + c / 2;

b:= a;

a:= b;

x:= 1;

x:= x + 0.5;

Обратите внимание: b:= a и a:= b — это совершенно разные действия!

ПРИМЕЧАНИЕ Чтобы не перепутать, что чему присваивается, запомните мнемоническое правило: присваивание — это передача данных 'налево'.

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

Процедуры ввода-вывода

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

Ввод с клавиатуры

Для ввода с клавиатуры определены процедуры read и readln.

read(список);

readln[(список)];

В скобках указывается список имен переменных через запятую. Квадратные скобки указывают на то, что список может отсутствовать. Например:

read(a, b, c);

readln(y);

readln;

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

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

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

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

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

Например, при вводе вещественного числа 3.78 в переменную типа real оно преобразуется из четырех символов (3, 'точка', 7 и 8) в шестибайтовое представление в виде мантиссы и порядка.

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

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

var a: integer;

b: real;

d: char;

и в программе есть процедура ввода read(a, b, c). Допустим, переменной а надо задать значение, равное 2, переменной b — 3,78, а в d записать символ #. Любой вариант расположения исходных данных приведет к неверному результату, потому что после второго числа требуется поставить пробельный символ для того, чтобы его можно было распознать, и этот же символ будет воспринят как значение переменной d.

Правильным решением является ввод чисел и символов в разных процедурах и размещение символов в отдельной строке, например:

readln(a, b);

readln(d);

Ввод данных выполняется через буфер — специальную область оперативной памяти. Фактически данные сначала заносятся в буфер, а затем считываются оттуда процедурами ввода. Занесение в буфер выполняется по нажатию клавиши Enter вместе с ее кодом (#13 #10). Процедура read, в отличие от readln, не очищает буфер, поэтому следующий после нее ввод будет выполняться с того места, на котором закончился предыдущий, то есть начиная с символа конца строки.

read(a); { считывается целое }

write(' Продолжить? (y/n) ');

readln(d); { вместо ожидания ввода символа считывается символ #13 из предыдущего ввода }

Чтобы избежать подобной ситуации, следует вместо read использовать readln.

Вывод на экран

При выводе выполняется преобразование из внутреннего представления в символы, выводимые на экран. Для этого определены стандартные процедуры write и writeln.

write(список);

writeln[(список)];

Процедура write выводит указанные в списке величины на экран, а writeln вдобавок к этому переводит курсор на следующую строку. Процедура writeln без параметров просто переводит курсор на следующую строку.

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

writeln('Значение a = ', a:4, ' b = ', b:6:2, sin(a) + b);

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

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

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

Значение a = 2 b = 3.78 4.6892974268E+00

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

Список вывода разделяется запятыми.

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

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

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

Если форматы не указаны, под целое число, символ и строку отводится минимально необходимое для их представления количество позиций. Под вещественное число всегда отводится 17 позиций, причем 10 из них — под его дробную часть.

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

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

Пример. Программа, которая переводит температуру в градусах по Фаренгейту в градусы Цельсия по формуле: С = 5/9 (F – 32), где C — температура по Цельсию, а F — температура по Фаренгейту.

program temperature;

var fahr, cels: real; { 1 }

begin

writeln('Введите температуру по Фаренгейту'); { 2 }

readln(fahr); { 3 }

cels:= 5 / 9 * (fahr – 32); { 4 }

writeln('По Фаренгейту: ', fahr:6:2, ' в градусах Цельсия: ', cels:6:2); { 5 }

end.

Для хранения исходных данных и результатов требуется выделить место в памяти. Это сделано в операторе 1. Для переменных fahr и cels выбран вещественный тип real. Оператор 2 представляет собой приглашение ко вводу данных.

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

Операторы ветвления

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

Рисунок 1. Базовые конструкции структурного программирования

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

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

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

Условный оператор if

Условный оператор if используется для разветвления процесса вычислений на два направления. Структурная схема оператора приведена на рисунке 2.

Формат оператора:

if выражение then оператор_1 [else оператор_2;]

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

Рисунок 2. Структурная схема условного оператора

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

ВНИМАНИЕ Отсутствие ключевых слов begin и end в ветви else компилятор как ошибку не распознает!

Примеры условных операторов:

if a < 0 then b:= 1; { 1 }

if (a < b) and ((a >d) or (a = 0)) then inc(b)

else begin

b:= b * a; a:= 0

end; { 2 }

if a < b then

if a < c then m:= a else m:= c

else

if b < c then m:= b else m:= c; { 3 }

В примере 1 отсутствует ветвь else. Такая конструкция называется 'пропуск оператора'.

Если требуется проверить несколько условий, их объединяют знаками логических операций. Так, выражение в примере 2 будет истинно в том случае, если выполнится одновременно условие a < b и хотя бы одно из условий a > d и a = 0. Скобки, в которые заключены операции отношения, обязательны, потому что приоритет у логических операций выше, чем у операций отношения. Поскольку по ветви else требуется выполнить два оператора, они заключены в блок.

В примере 3 вычисляется наименьшее из значений трех переменных a, b и с.

ВНИМАНИЕ Частая ошибка при программировании условных операторов — неверная запись проверки на принадлежность диапазону. Например, условие 0 < x < 1 нельзя записать непосредственно. Правильный способ: if(0 < x) and (x < 1) then …, поскольку фактически требуется задать проверку выполнения одновременно двух условий: x > 0 и x < 1.

Если условие изначально истинно и в теле цикла нет действий, влияющих на истинность этого условия, то тело цикла будет выполняться бесконечное количество раз. Такая ситуация называется "зацикливанием". Прервать зациклившуюся программу может либо оператор (нажав Ctrl+C), либо аварийный останов самой программы, в случае переполнения переменной, деления на ноль и т.п., поэтому использовать структуру цикла следует с осторожностью, хорошо понимая, что многократное выполнение должно когда-нибудь заканчиваться.

4.2 Оператор варианта case

Оператор варианта (выбора) предназначен для разветвления процесса вычислений на несколько направлений. Структурная схема оператора приведена на рисунке 4. Формат оператора:

case выражение of

константы_1: оператор_1;

константы_2: оператор_2;

 

константы_n: оператор_n;

[ else: оператор ]

end;

 

Рисунок 4. Структурная схема оператора выбора

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

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

case a of

4: writeln('4');

5, 6: writeln('5 или 6');

7..12: writeln('от 7 до 12');

end;

Операторы цикла

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

1. цикл с предусловием while,

2. цикл с постусловием repeat

3. цикл с параметром for.

Каждый из них состоит из определенной последовательности операторов.

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

Рисунок 5. Структурные схемы операторов цикла

 

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

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

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

Цикл завершается, если условие его продолжения не выполняется. Возможно принудительное завершение как текущей итерации, так и цикла в целом. Для этого служат операторы break, continue и goto. Передавать управление извне внутрь цикла не рекомендуется, потому что при этом могут не выполниться начальные установки.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-12-08 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: