Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Пример линейной программы




 

Теперь, когда мы познакомились с операторами, необходимыми для составления линейной программы, рассмотрим еще один пример такой программы. Пусть дано два числа a и b - длины сторон прямоугольника. Найти площадь s и периметр p прямоугольника. На рис.6 представлена графическая схема алгоритма решения данной задачи, а программа приведена в примере pr2.

Рис. 6

program pr2;

var

a,b,s,p:real;

begin

writeln('Введите длины стоpон пpямоугольника:');

read(a,b);

s:=a*b;

p:=(a+b)*2;

writeln('Площадь = ',s:5:3);

writeln('Пеpиметp = ',p:5:3);

end.

В этой программе все операторы выполняются последовательно друг за другом. Выполнение программы начинается с вызова процедуры вывода writeln, которая выводит на экран подсказку "Введите длины сторон прямоугольника:", что обеспечивает удобный интерфейс с пользователем. Вызов процедуры read приводит к прерыванию программы до тех пор, пока пользователь не введет два числа. Далее вычисляются площадь и периметр прямоугольника и выводятся результаты на экран.

 

РАЗВЕТВЛЯЮЩИЯСЯ ПРОГРАММЫ

 

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

На рис.7 приведена графическая схема алгоритма, а программа - в примере pr3.

 

Рис. 7

 

program pr3;

var

x,y:real;

begin

writeln('Введите x:');

readln(x);

if x>0

then

y:=x*x*x+3

else

y:=x*sin(x);

writeln(y);

end.

В этой программе впервые встречается условный оператор и служит для выбора формулы вычисления y в зависимости от введенного значения x.

 

 

УСЛОВНЫЙ ОПЕРАТОР

Условный оператор служит для ветвлений в программе и имеет следующий синтаксис:

if <условие> then <оператор1> else <оператор2>.

Здесь if, then, else - ключевые слова (перев. с англ. если, то, иначе соответственно);

<условие> - логическое выражение типа сравнения (например, a>b, c<=d, f=1), логическому типу посвящен следующий раздел пособия;

<оператор1> и <оператор2> - любой оператор Турбо-Паскаля. Оператор работает следующим образом: если условие истинно, то выполняется <оператор1> и управление передается на следующий за условным оператор; если условие ложно, то выполняется <оператор2> и управление передается на следующий за условным оператор. Таким образом, всегда выполняется один из двух операторов: либо из ветви then, либо из ветви else.

Кроме вышеприведенной формы условного оператора, существует сокращенная форма условного оператора, в которой отсутствует ветвь else:

if <условие> then <оператор1>.

Оператор работает следующим образом: если условие истинно, то выполняется <оператор1> и управление передается на следующий за условным оператор; если условие ложно, то управление сразу передается на следующий за условным оператор. Таким образом, в зависимости от условия <оператор1> либо выполняется, либо не выполняется.

Рассмотрим фрагменты схем алгоритмов и соответствующие им фрагменты программ.

 

  if a>b then max:=a else max:=b;
if k>0 then s:=s+k;
if a>b then if a>c then max:=a else max:=c;
     

 

if a>b then

if a>c then

max:=a

else max:=c

else

if b>c then

max:=b

else max:=c;

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

При определении последовательности выполнения вложенных условных операторов следует учесть, что каждое else соответствует тому if, которое ему непосредственно предшествует, таким образом исключается всякая двусмысленность.

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

 

СОСТАВНОЙ ОПЕРАТОР

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

 

 

  if c>0 then begin s:=s+c; k:=k+1 end else c:=c-1;
if n<m then begin n:=n+1; m:=m-1; end else begin n:=n-1; m:=m+1; end;

 

Здесь следует обратить внимание на правила употребления точки с запятой:

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

каждый оператор в теле программы завершается точкой с запятой, если сразу за ним не следуют ключевые слова end, else или until;

после определенных ключевых слов, таких, как then, else, begin, var, const, никогда не ставится точка с запятой.

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

 

ЛОГИЧЕСКИЙ ТИП

 

Турбо-Паскаль позволяет обрабатывать данные не только числового типа, но и других типов, например логического. Для обозначения логического типа используется ключевое слово boolean. Булевы (логические) переменные могут иметь одно из двух значений: true (истина) или false (ложь). Булевский тип является порядковым типом и упорядочен так, что false < true. По сравнению с типом real, который допускает миллионы различимых значений, может показаться, что тип boolean имеет ограниченную область применения. Однако, как это ни странно, именно ограниченность диапазона значений булевых переменных придает булевым выражениям их значимость.

Булевы выражения могут принимать несколько различных форм. Во-первых, они могут быть просто константами true (истина) или false (ложь). Оператор присваивания, использующий эту форму, аналогичен арифметическому оператору. Например, пусть переменные a и b логического типа:

var a,b:boolean;

тогда можно написать операторы:

a:=true;

b:=false.

Булевы выражения можно использовать для проверки отношений между двумя переменными: a>b,c<=d,k=m и т.д. Таким образом, условие в условном операторе является выражением логического типа. Кроме того, булевы выражения могут конструироваться с помощью булевых операций. Эти операции образуют инструментальный фундамент булевой логики, алгебры логики, разработанной в ХIХв. математиком Джорджем Булем. Рассмотрим три основные булевы операции.

Операция and – логическое пересечение (умножение, операция "и"). Выражение a and b дает значение true только в том случае, если a и b имеют значения true, в остальных случаях – false:

true and true = true

true and false = false

false and false = false

Операция or – логическое сложение (объединение, операция "или"). Выражение a or b дает значение false в том и только в том случае, если a и b имеют значения false, в остальных случаях – результат true:

true or true = true

true or false = true

false or false = false

Операция not – отрицание (операция "не"). Выражение not a имеет значение, противоположное значению a:

not true = false

not false = true

Эти операции полезны, если нужно проверить сложное условие:

 

if (a>b) and (a>c) then max:=a;

 

if (x=y) or (x=z) then z:=y;

Оператор case

Оператор case предназначен для организации выбора из множества различных вариантов. В общем случае оператор case выглядит следующим образом:

case <выражение> of <список выбора> else <оператор> end;

Здесь case, of, else, end - ключевые слова (пер. с англ.: выбор, из, иначе, конец);

<выражение> - выражение любого порядкового типа;

<список выбора> - одна или более конструкций вида: <значение>: <оператор>;

<значение> - константа или константное выражение того же типа, что и <выражение>;

<оператор> - любой оператор Турбо-Паскаля, в том числе и составной.

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

Ниже приведены примеры, демонстрирующие работу оператора выбора.

program pr4;

var n:integer;

begin

writeln('Введите число');

read(n);

case n mod 2 of

1: writeln(n,'- нечетное');

0: writeln(n,'- четное');

end;

end.

Следующая программа по номеру месяца определяет время года.

program pr5;

var month: integer;

begin

writeln('Введите число - номеp месяца');

read(month);

case month of

12,1,2: writeln(month,' - зимний месяц');

3,4,5: writeln(month,' - весенний месяц');

6,7,8: writeln(month,' - летний месяц');

9,10,11: writeln(month,' - осенний месяц');

else writeln('Пpо это мне неизвестно!');

end;

end.

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

program pr6;

var

op: char;{Арифметическая операция}

x,y,z: real;{Операнды и результат}

begin

write('x,y=');

readln(x,y);

write('Введите аpифметическую опеpация:');

readln(op);

case op of

'*': begin z:= x* y; writeln('z=',z);end;

'/': begin z:= x/ y; writeln('z=',z);end;

'+': begin z:= x+y; writeln('z=',z);end;

'-': begin z:= x- y; writeln('z=',z);end;

else writeln('Увы! Это не аpифметическая опеpация.');

end;

end.

 

Оператор перехода

 

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

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

goto <метка>

Здесь goto - ключевое слово (англ.: перейти на [метку]).

Метка - это произвольный идентификатор, позволяющий пометить некоторый оператор, чтобы ссылаться на него. Для совместимости со стандартным Паскалем разрешается в качестве метки использовать целые числа. Метка ставится перед оператором получающим управление и отделяется от него двоеточием. Как любой идентификатор метку необходимо описать в разделе описания меток, который начинается с ключевого слова label, за которым следует список меток:

...............

label m,1,loop;

begin

.........

goto 1;

m:.........

goto loop;

1:............

goto m;

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

 

3.2.6. ПРИМЕР РАЗВЕТВЛЯЮЩЕЙСЯ ПРОГРАММЫ

 

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

Поле шахматной доски опpеделяется паpой натуpальных чисел, каждое из котоpых не пpевосходит восьми: пеpвое число - номеp веpтикали (пpи счете слева напpаво), втоpое - номеp гоpизонтали (пpи счете снизу ввеpх). Даны натуpальные числа k,l,m,n, каждое из котоpых не пpевосходит восьми. Требуется выяснить, являются ли поля (k,l) и (m,n) полями одного цвета.

Прежде чем приступать к составлению алгоритма и программы, необходимо внимательно рассмотреть шахматную доску и прийти к выводу, что поля будут иметь одинаковый цвет, если сумма номеров горизонтали (k+l) и вертикали (n+m) того и другого поля будет четной или того (k+l) и другого (n+m) поля нечетной. Схема алгоритма приведена на рис.8, a программа на языке Турбо-Паскаль - в примере pr7.

program pr7;

var k,l,n,m:byte;

begin

writeln('Введите кооpдинаты полей k,l,n,m: ');

read(k,l,n,m);

if odd(k+l) and odd(n+m) or not odd(k+l) and not odd(n+m)

then writeln('Поля одного цвета ')

else writeln('Поля pазного цвета ');

end.

Рис. 8

Следует заметить, что приоритет операции not выше, чем and, а приоритет операции and выше, чем or. Функция odd – встроенная и возвращает true, если аргумент нечетный, и false, если аргумент четный.

 

ТИП ДИАПАЗОН

 

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

var

a,b:1900..2000;

с: 'a'..'z';

Для переменных a и b базовым является целый тип, для с –символьный. Сначала указывается нижняя граница, затем – верхняя (при этом нижняя граница не должна быть больше верхней). Попытки присвоить переменной ограниченного типа значение, не входящее в заданный диапазон, приведет к возникновению ошибки при счете. Таким образом, введение ограниченных типов перекладывает проверку допустимости значений с программиста на ЭВМ. К переменным типа диапазон применимы все операции и стандартные функции, которые допустимы с переменными соответствующего порядкового типа. Теперь, в свете вышеприведенных сведений, программа про шахматное поле будет следующей:

program pr8;

var k,l,n,m: 1..8;

begin

writeln('Введите кооpдинаты полей k,l,n,m: ');

read(k,l,n,m);

if odd(k+l) and odd(n+m) or not odd(k+l) and not odd(n+m)

then writeln('Поля одного цвета')

else writeln('Поля pазного цвета');

end.

Поделиться:





Читайте также:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...