Рис. 7.5.3. Программа определения наибольшего из трех чисел и результаты ее работы
В данной программе операторами readln производится ввод исходных данных – трех чисел, которые присваиваются переменным x, yи z.
В результате последовательного выполнения двух сокращенных условных операторов мы получим в переменной max искомую величину – наибольшее из трех чисел. Остается только вывести значение переменной max оператором writeln на экран компьютера – это и будет решение поставленной задачи.
Нередко в ходе разработки программ возникает необходимость разместить в одной или обеих ветвях условного оператора не одно, а целый ряд действий. В таком случае в качестве вариантов действий, находящихся в ветвях условного оператора используют не простые, а составные операторы, которые помещаются в программе после служебных слов then или else.
Составной оператор представляет собой группу операторов, размещенную между служебными словами begin и end.Слова begin и end,называемые в данном случае операторными скобками, обозначают здесь не начало и конец основной части программы, а начало и конец составного оператора. Между ними могут располагаться различные операторы: Количество простых операторов, входящих в составной не ограничено.
Операторы, входящие в составной оператор, отделяются друг от друга точками с запятой. Перед словом end точка с запятой не ставится. Не ставится в данном случае точка с запятой и после слова endперед словомelse , так как end обозначает здесь лишь конец одного из вариантов, входящих в состав единого условного оператора. Таким образом, в общем виде структуру условного оператора с составными операторами в его ветвях можно представить следующим образом:
if then
Begin
; ; ………..
End
Else
Begin
; ; ………..
end;
Рассмотрим использование составного оператора для решения следующей задачи. Администрация магазина ввела правило, согласно которому каждый покупатель, который приобрел товар на сумму более 1000 рублей имеет право на трехпроцентную скидку от стоимости покупок.. Эта программа должна подсчитывать величину скидки и ту сумму, которую должен оплатить покупатель с учетом скидки. В случае же если стоимость покупок меньше 1000 рублей программа должна выдавать сообщение о том, что покупка должна быть оплачена полностью.
Программа для решения этой задачи приведена на рис. 7.5.4. В этой программе используются три переменных вещественного типа: sum – сумма покупки без учета скидок, skidka – величина трехпроцентной скидки, sumsk – стоимость покупки с учетом скидки.
Для вывода значения каждой переменной результата предусмотрено два разряда в дробной части, соответствующие копейкам, следовательно, цифры перед точкой в каждой из сумм будут соответствовать рублям, а цифры расположенные после точки копейкам.
На рис. 7.5.4 под текстом программы приведены результаты ее работы для обоих возможных случаев (сумма больше 1000 и сумма меньше 1000).
Рис. 7.5.4. Программа, определяющая скидку при покупке товаров в магазине и результаты ее работы при различных исходных данных
7.5.2. Логические переменные. Логические операции
Результатом операции сравнения двух чисел может быть величина, которая принимает одно из двух возможных значений: «истинно» (если указанное соотношение действительно выполняется) и «ложно» (если соотношение не выполняется). По-английски «истинно» и «ложно» пишется соответственно True и False. Константы и переменные, значениями которых может быть только эти две величины (True или False) называются логическими или булевскими константами и переменными. Название это дано в честь английского математика XIX века Джона Буля. Для описания таких переменных в языке Паскаль существует специальный тип – boolean. Пример описания логической переменной flag:
Var flag:Boolean.
Логическим переменным им можно присваивать значения операций сравнения подобно тому, как мы присваиваем числовым переменным значения арифметических операций. Такая операция присваивания может выглядеть, например, следующим образом:
flag:=x=15;
то есть переменной логического типа flagмы присваиваем значение операции сравнения x=15. В случае, если указанное неравенство выполняется, значение переменной будет равно true. В противоположном случае ее значение будет равно false. Имя логической переменной, которой присвоено значение операции сравнения, можно подставлять в условный оператор вместо самой этой операции. Такой прием позволяет сделать программу более компактной в том случае, если одна и та же операция сравнения повторяется в программе несколько раз. Значения логической переменной можно выводить на экран компьютера оператором writeln подобно значениям числовых переменных. Можно присваивать значения true и false логическим переменным и напрямую: flag:=true;
Именно такой способ присваивания значений логической переменной мы и используем в следующей программе. Эта программа проверяет, имеется ли в ряду из трех целых чисел хотя бы одно положительное. Эти числа, как обычно, мы будем вводить с клавиатуры, а сообщение о результатах проверки будет выведено на экран компьютера. В программе, текст которой приведен на рис.7.5.5 используются три переменные целого типаx, y и z для вводимых числовых значений и одна переменная логического типа flag, назначение которой в данной программе мы рассмотрим ниже. Описание переменной или переменных, относящихся к одному типу, составляет отдельную группу, которую от следующей группы отделяет точка с запятой. При этом слово var, открывающее раздел описания переменных ставится только один раз.
В основной части программы переменной flag присваивается начальное значение false. Вслед за оператором присваивания в программе идут три однотипных блока, в каждом из которых обрабатывается одно из вводимых чисел. Каждый такой блок состоит из оператора вывода, предлагающего пользователю ввести число, оператора ввода, присваивающего введенное значение одной из переменных целого типа и сокращенного условного оператора, проверяющего, является ли введенное число положительным или отрицательным. В случае, если число положительное, переменной flag присваивается значение true. В том случае, если число отрицательное, никаких действий не производится.. Если же нет положительных чисел среди введенных, то значение flag останется неизменным, то есть равным false.
Рис. 7.5.5. Программа, определяющая, имеются ли в ряду чисел положительные, и результаты ее работы при различных исходных данных
Далее в программе расположен полный условный оператор, который проверяет итоговое значение переменной flag и если она имеет значение true,то выводится сообщение о наличии среди введенных чисел, хотя бы одного положительного, а иначе выводится сообщение о том, что все введенные числа отрицательны. На рис. 7.5.5 под текстом программы показаны результаты ее работы при различных исходных данных.
Над величинами логического типа можно производить логические операции. Результатом логических операций могут быть только логические величины, то есть величины, имеющие значения true и false. Всего в Паскале используется 4 логических операции: not (НЕТ) -логическое отрицание, and (И) – логическое И, or (ИЛИ) – логическое ИЛИ, xor (Исключающее ИЛИ). Эти операции подразделяются на унарные, то есть такие, которые производятся только над одной величиной, и бинарные, то есть те которые производятся сразу над двумя величинами. К первому типу операций относится not, ко второму – все остальные. При выполнении логических операций соблюдается, как и для арифметических операций, определенный приоритет. Наиболее высоким приоритетом обладает операция not, то есть она выполняется в первую очередь. Далее выполняется операция and.
Самый низкий приоритет имеют операции orи xor. Если в выражении необходимо изменить порядок выполнения логических операций, для этого используются скобки, потому что выражение, заключенное в скобки, обладает высшим приоритетом.
Для логических величин существует таблицы, в которой указаны результаты логических операций при различных исходных данных. Такая таблица называется таблицей истинности. Ниже приведена такая таблица для унарных (табл.1) и (табл.2) бинарных операций.
Таблица 1. Унарные операции.
X | Not(X) |
False | True |
True | False |
Из данной таблицы видно, что в результате операции not,производимой над любой величиной, ее значение изменяется на противоположное.
Если рассмотреть результаты, показанные в таблице 2, то можно сделать вывод о том, что для операции and значение будет равно true только тогда, когда обе исходных величины Xи Y, над которыми производится эта операция (такие величины называются операндами) имеют значение true. Во всех остальных случаях результатом операции будет false. Для операции or значение будет true, если хотя бы один из операндов (или X или Y) имеет значение true. Результат операции or будет равен false только тогда, когда оба операнда имеют значение false. Для операции xor значение будет true, если значения операндов не совпадают. Если же значения операндов совпадают (вне зависимости от того, будут ли эти значения равны false или true) то итог операции будет равен false.
Таблица 2. Бинарные операции.
Y | X and Y | X or Y | X xor Y | |
False | False | False | False | False |
False | True | False | True | True |
True | False | False | True | True |
True | True | True | True | False |
Логические операции используют при составлении программ, в которых требуется проверить сразу несколько условий. Например, если некоторое действие должно выполняться при условии, что значение переменной aнаходится в диапазоне от 5 до 20, то есть a должно быть больше или равно 5 и меньше или равно 20 то это условие можно записать следующим образом:
(a=5) and (a
При этом группируемые операции сравнения заключаются в скобки как в вышеприведенном выражении.
7.5.3. Оператор Case
При составлении программ часто возникает потребность в структуре, которая обеспечивала бы возможность рассмотреть не два, а большее количество возможных вариантов дальнейших действий. В некоторых случаях для этого используются вложенные условные операторы. В каждый из вложенных условных операторов можно вставить следующий вложенный оператор и так далее. Такой способ создания многовариантного ветвления делает структуру программы чересчур сложной. Поэтому в языке Паскаль предусмотрена другая конструкция, которая позволяет осуществлять выбор из множества возможных вариантов и в то же время является более простой и наглядной, чем вышеописанная. Эта конструкция реализуется с помощью оператора Case.
Общий вид оператора case следующий:
Case of
: ;
: ;
…………………………………
Значениеn : ;
Else Вариант N+1 ;
end;
где Case, of , Else – служебные слова языка Паскаль. Словосочетание Case ofпереводится на русский как «В случае если». Селектором называется переменная целого или символьного типа (о символьных переменных мы расскажем более подробно в разделе «Работа с символами и строками»). Переменная-селектор может принимать различные значения. После заголовка в операторе идет перечень возможных значений переменной- селектора. Каждому из этих значений соответствует определенный вариант действий, который реализуется в том случае, если в программе селектор принимает это значение. Этот вариант указывается после двоеточия, отделяющего его от значения, и представляет собой простой или составной оператор. Если переменная-селектор не принимает ни одно из перечисленных в операторе case значений, то выполняется альтернативный вариант, который указан после служебного слова else.Обратите внимание на то, что в отличие от условного оператора if в операторе case перед вариантом с else ставится точка с запятой. Эта часть оператора (elseс соответствующим ему вариантом) не является обязательной. Возможен сокращенный вариант оператора без этой части. Заканчивается оператор case служебным словом end, после которого ставится точка с запятой.
Разберем следующий фрагмент программы, в которой использован оператора case:
Case k of
1: x:=x+5;
2: x:=x+10;
3: x:=x+20;
else x:=0
end;
В данном условном операторе в роли переменной-селектора выступает целочисленная переменная k. Если k имеет значение равное 1, то текущее значение другой целочисленной переменной x увеличивается на 5, если k имеет значение равное 2, то текущее значение x увеличивается на 10, если k имеет значение 3, то значение xувеличивается на 20, если же переменная-селектор принимает любое другое значение, то переменная x обнуляется. Каждое из указанных после двоеточия действий производится простым оператором присваивания. Составные операторы внутри данного оператора caseотсутствуют.
Возможности, предоставляемые программисту оператором case, мы используем в программе, которая имитирует работу простейшего электронного калькулятора. По запросу пользователя программа выполняет одно из четырех основных арифметических действий над любыми двумя введенными им с клавиатуры целыми числами. В начале программы-калькулятора пользователю предлагается ввести с клавиатуры два целых числа, над которыми будет произведена одна из арифметических операций. Затем, после ввода чисел операторами readln на экран компьютера операторами writeln выводится текст программного меню. Этот текст сообщает пользователю программы, нажатие какой клавиши соответствует выполнению какой арифметической операции. Например, нажатие клавиши с цифрой 1 производит сложение введенных чисел, 2 – вычитание и т. д.
Каждый из операторов writeln в начале выводит значения операндов, над которыми производится действия, а между ними указывается знак производимой арифметической операции. Затем на экран выводится знак равенства, а в конце указывается само вычисляемое выражение, которое подсчитывается компьютером и выводится на экран.
Рис. 7.5.6. Программа — калькулятор и результаты ее работы
В последнем, четвертом случае мы используем составной оператор, так как в этом случае результат операции будет числом вещественным.
Мы сперва подсчитаем результат деления, присвоим его вещественной переменной d, а затем в списке вывода оператора writeln выведем значение переменной d в отформатированном виде, обеспечив таким образом точность выведенного вещественного числа — результата до третьего знака после запятой. Текст программы и результаты ее работы приведены на рис. 7.5.6.
Рассмотренный нами вариант оператора case является несколько упрощенным. В нем каждому варианту действий соответствует только одно значение переменной-селектора. Возможна и другая форма того же оператора, когда каждому варианту действий соответствует какая – либо группа значений селектора. Эта группа значений, находящаяся в операторе перед двоеточием, может представлять собой как несколько отдельных значений, перечисленных через запятую, так и целый диапазон значений. В последнем случае в соответствующем разделе оператора указывается только начальное и конечное значение диапазона, а между ними ставятся две горизонтальные точки.
Поясним сказанное на следующем примере. Перед нами фрагмент программы с условным оператором case, в котором переменной y присваиваются различные значения, представляющие собой степени x. Какое именно значение будет присвоено переменной y, зависит от значения переменной-селектора n:
case n of:
3,5,7: y:=x*x;
10..20: y:=x*x*x;
30..40: y:=x*x*x*x;
else y:=x
end;
В случае если переменная n принимает значение равное числам 3, 5 или 7, то значение y будет равно квадрату x. Если n примет любое целочисленное значение из диапазона от 10 до 20 (10,11, 12 и так далее до 20 включительно), то y будет присвоено значение равное кубу x. Если же n примет любое значение из диапазона от 30 до 40, то yполучит значение, равное четвертой степени x. Наконец, если n не примет ни одно из вышеуказанных значений, то yбудет равно первой степени x.
7.5.4. Безусловный оператор перехода Goto
В программах, рассмотренных нами в предыдущих разделах пособия, операторы либо выполнялись друг за другом последовательно (линейные программы) либо при наличии в программе условного оператора ход выполнения программы зависел от выполнения или невыполнения некоторого условия. Однако бывают и такие ситуации, когда требуется нарушить линейный ход выполнения программы без выполнения какого-либо предварительного условия. Такая ситуация возникает, например, если в определенном месте программы требуется перейти в конец программы для того, чтобы досрочно завершить ее выполнение.
Оператор, который позволяет производить такое действие, называется оператором безусловного перехода. Этот оператор может не только осуществлять переход в начало или конец программы, но и переходить практически в любое место программы и продолжать ее выполнение начиная с любого нужного оператора (или как говорят передавать управление в любую точку программы). Для этого в начале строки, содержащей оператор, на который передается управление, ставится метка. Эта же метка указывается и в самом операторе безусловного перехода.
Общий вид оператора безусловного перехода имеет вид:
goto ;
где goto – служебное слово, означающее в переводе с английского «перейти к», а – имя метки, ранее описанное в разделе label. Имя метки это идентификатор или целое число без знака.
Описание метки должно находиться в самом начале раздела описаний перед описанием переменных и констант.
В общем виде, описание метки выглядит следующим образом:
label ;
где label– служебное слово, означающее в переводе «метка»,
Строка, содержащая метку должна выглядеть следующим образом:
: ;
То есть строка, на которую производится переход, должна обязательно начинаться с имени метки, после которого ставится двоеточие. После двоеточия в строке пишутся оператор или операторы, как и в любой обычной строке программы.
В Паскале разрешается производить ссылки на одну и ту же строку из разных мест программы различными операторами безусловного перехода. Использовать же несколько раз одну и ту же метку для обозначения разных строк или разных операторов недопустимо.
7.6. Операторы цикла
В ходе создания программ нередко возникает ситуация, когда программисту нужно повторять выполнение одного и того же оператора или группу операторов, которые аналогичны друг другу и отличаются лишь значениями некоторых переменных или вводимых исходных данных.
Для решения этой задачи надо автоматически повторять группу операторов с соответствующим изменением значений переменной. Для реализации этого будем использовать структуру, которая называется оператором цикла.
В общем виде цикл состоит из двух основных блоков:
1. Заголовок цикла. В заголовке цикла содержится некоторое условие, которое определяет число повторений цикла.
2. Тело цикла. Телом цикла называется простой или составной оператор (составным оператором называется группа операторов, заключенная в операторные скобки), который может многократно повторяться в ходе работы цикла. В теле цикла могут содержаться операторы различных типов. Это могут быть операторы ввода и вывода, операторы присваивания, условные операторы, а также другие операторы цикла. Оператор цикла, находящийся в теле другого циклического оператора, называется вложенным.
Всего в языке Паскаль используется три типов циклов:
Цикл с заранее заданным числом повторений. Его также называют циклом со счетчиком. (цикл for..to);
Цикл с предусловием (цикл while);
Цикл с постусловием (цикл repeat..until).
Каждый из этих видов цикла имеет свои особенности и область применения, которые мы и рассмотрим ниже.
Общим для всех этих операторов является то, что они включают в себя управляющие конструкции (в операторах for..toи while –это строка заголовка, а в операторе repeat..until –строка заголовка и завершающая строка) и тело цикла.
Если количество повторений тела цикла заранее известно, то рекомендуется использовать оператор цикла for..to. В другом случае нужно использовать оператор repeat..until(если для решения поставленной задачи требуется, чтобы тело цикла выполнялось хотя бы один раз), либо оператор while(в этом случае перед выполнением тела цикла проверяется, есть ли вообще необходимость в его выполнении). Рассмотрим подробно каждый из этих видов цикла.
7.6.1. Оператор For
Общий вид данного оператора следующий:
for i:= n1 to n2 do
;
где i –управляющая переменная цикла, называемая также счетчиком цикла, n1 – начальное значение счетчика цикла, n2 – конечное значение счетчика цикла, for, toи do– служебные слова (forв данном случае означает «для», to – «до», do – «делать, выполнять»). Весь текст заголовка можно расшифровать таким образом: для i, изменяющего значение от n1 до n2выполнить. Имеется в виду выполнение тела цикла. При этом конечное значение счетчика цикла должно быть больше, чем начальное. В ходе работы данного оператора значение счетчика при каждом выполнении тела цикла увеличивается на единицу и таким образом принимает все целочисленные значения от n1 до n2, а тело цикла всего выполняется n2-n1+1 раз. Следует обратить внимание на то, что между заголовком цикла и телом цикла не ставится точка с запятой.
Решение задачи по переводу центнеров в килограммы, будет выглядеть следующим образом:
for c:=1 to 50 do
Begin
kg:=c*100;
Writeln(c,kg)
end;
где c– вес в центнерах, а kg– тот же вес в килограммах.
В приведенном фрагменте программы роль счетчика цикла выполняет переменная c. Начальное значение переменной цикла равно 1. Для этого начального значения выполняются действия, указанные в составном операторе, то есть будет вычислено значение kg, равное 50, а затем значения 1 и 50 будут выведены на экран компьютера. Далее будет подсчитано значение kg для с равного 2 и числа 2 и 100 будут выведены на экран в следующей строке и аналогичные действия будут производиться до тех пор, пока не будет выведена последняя строка со значениями cи kg – 50 и 5000. Цикл прекратит свою работу, когда переменная c достигнет конечного значения – 50. Всего действия указанные в теле цикла будут повторены согласно приведенной формуле 50-1+1 раз, то есть 50 раз.
Приведенный вариант цикла forне является единственным. Цикл типа for может иметь и такой общий вид:
for i:= n1 downto n2 do
;
в этом случае при каждом повторении тела цикла значение счетчика i уменьшается на единицу, и, следовательно, конечное значение счетчика цикла n2 должно быть меньше начального n1.
В качестве примера работы цикла типа forприведем программу, которая составляет таблицу для перевода расстояния, выраженного в милях, в километры (рис. 7.6.1). На экран компьютера должна быть выведена таблица для расстояний от 1 до n миль, где n – целое положительное число, вводимое с клавиатуры пользователем. 1 миля составляет 1,609 километра. Таблица, выводимая на экран компьютер должна иметь заголовок и состоять из двух столбцов. В левом столбце должны быть указаны расстояния в милях, а в правом — соответствующие им расстояния в километрах.
В данной программе для решения задачи используются три переменные. Это, во-первых, переменная целого типа mile, содержащая расстояния в милях, которая одновременно является счетчиком цикла. Во-вторых, – это переменная n, содержащая максимальное число миль, которое нужно перевести в километры. Наконец,km – это переменная вещественного типа, представляющее собой расстояние в километрах.
Для вывода значения целочисленной переменной mile указывается лишь общее количество выводимых на экран символов (в данном случае – 3), а для вещественной переменной km указывается и общее количество символов и их количество в дробной части (в данном случае соответственно 7 и 3). Это делается для того, чтобы выровнять столбцы выводимых чисел. При n=10 получаем результаты работы программы, показанные на рис. 7.6.1.