Лабораторная работа по дисциплине «Информационные технологии в менеджменте» для ТулГУ



Лабораторная работа №34 «Язык программирования Турбо Паскаль: Операторы»

1.Цель и задачи лабораторной работы.

Приобретение навыков программирования на языке Турбо Паскаль.

!!! Загрузите систему программирования Турбо Паскаль (файл программы BPW.exe).

2.Теоретические сведения.

2.1. Оператором называется элементарная структурная единица программы. Оператор задает некоторое законченное действие, логически эквивалентное элементарному шагу алгоритма, реализуемого программой. Операторы выполняются в порядке их следования в тексте программы, и лишь оператор перехода Goto нарушает эту естественную последовательность, передавая управление оператору с заданной меткой. Операторы отделяются друг от друга точкой с запятой. Любой из них может быть снабжен меткой, используемой для передачи управления этому оператору. Метками могут служить не только целые числа в диапазоне от 0 до 9999, но и идентификаторы.

2.2. Простые операторы

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

<имя>:= <выражение>;

Например:

X:= Pi ;

Y:= Sqr(Z*Z + T*T);

Out:= (I>10) or (I<1);

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

Goto <метка>;

Меткой может быть снабжен любой выполняемый оператор. Метка предшествует оператору и отделяется от него двоеточием:

<помеченный оператор>::=<метка>:<непомеченный оператор>

При употреблении операторов перехода следует соблюдать следующие правила:

— каждая метка в блоке должна быть объявлена в разделе объявлений:

Label <список>;

где <список> ::= <имя метки>[,<список>]

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

— переход извне к оператору, входящему в состав составного оператора не допустим.

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

lb1: ;

lb2: A:=B+1;

2.3. Составные операторы

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

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

Begin

       Z:= X;

       X:= Y;

       Y:= Z;

End;

Примером использования вышеописанных операторов служит следующая программа:

Program Ex1;                             {Пример 1}

       Uses WinCrt;

       Label 1,2,3;

       Var 

              a: integer;

       Begin{открывающая операторная скобка}

              goto 2;

1:           a:=4;                              {оператор присваивания}

              writeln(‘ Оценка — ‘, a);

              goto 3;

2:           goto 1;

3            ;                                        {пустой оператор}

       End.                                       {закрывающая операторная скобка}

!!! Скопируйте Пример 1 через буфер обмена в окно редактирования  системы программирования Турбо Паскаль и выполните эту программу по команде RunRun.

Объясните работу программы

2.4. Условные операторы

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

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

if <выражение> then

         <оператор 1>

[ else <оператор 2>];

В результате вычисления выражения должно получаться логическое значение, имеющее стандартный тип Boolean. Если результатом является значение True, то выполняется оператор 1, следующий за ключевым словом Then. Если же в результате вычислений получается значение False, то при использовании полной формы оператора if, содержащей ключевое слово Else, выполняется оператор 2, следующий за Else. В сокращенной форме, где ключевое слово Else отсутствует, управление получает оператор, следующий за оператором if.

Например,

If A<0 then begin A:=0; B:=0; end

       else begin A:=10; B:=10; end;

Примером использования оператора if служит программа:

Program Ex2;             {пример 2}

       Uses WinCrt;

       Type matr=array[1..5]of real;

       Const r : matr=(1.0,2.0,3.0,4.0,5.0);

p=3.1415926;

       Var l: real; i:byte;

       Begin

              write(‘Для расчета длины дуги окружности введите 1’, #13#10,

                       ‘Для расчета площади круга введите 2’,#13#10,

                       ‘Что рассчитать? ‘);

              readln(i);

              if i=1 then

                            for i:=1 to 5 do

                                   begin

                                          l:=2*p*r[i];

                                          writeln(‘Радиус =’,r[i],’  Длина окружности =’,l);

                                   end

                     else

                            for i:=1 to 5 do

                                   begin

                                          l:=p*sqr(r[i]);

                                          writeln(‘Радиус =’,r[i],’  Площадь круга =’,l);

                                   end;

       End.

!!! Скопируйте Пример 2 через буфер обмена в новое окно редактирования системы программирования Турбо Паскаль и выполните эту программу по команде RunRun.

Объясните работу программы.

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

Case <селектор> of

       <список 1> : <оператор 1> ;

       <список 2> : <оператор 2> ;

       ………..

       <cписок N> : <оператор N>;

              [else <оператор>]

       End;

Каждый из списков, предшествующих операторам, имеет вид:

<список> ::=<константа>[,<список>] |<интервал>[,<список>]

Выполнение оператора Case производится следующим образом. Вычисляется значение селектора и результат поочередно сравнивается с содержимым списков. Если полученное значение совпадает с константой или попадает в интервал одного из списков, то выполняется оператор, которому предшествует этот список. Если такой константы не обнаруживается, то выполняется оператор, следующий за ключевым словом Else. Ветвь еlse может отсутствовать, и в этом случае управление переходит к оператору, следующему за конструкцией Case. Переменная селектор должна принадлежать одному из порядковых типов. Нельзя использовать селекторы строкового типа или типа Longint. В списках все константы должны отличаться друг от друга и относится к порядковому типу, совместимому с типом селектора. Например,

       Var

       Sym: Char;

       ……

       readln (‘Введите символ’, Sym);

       Case Sym of

              ‘A’..’Z’ : Writeln (‘Прописная буква’, Sym);

              ‘a’.. ‘z’ : Writeln (‘Строчная буква’  , Sym);

       Else

              Writeln (‘Не латинская буква’)

       End;

Примером использования оператора Case служит Пример 3, полученный в результате модификации Примера 2:

Program Ex3;             {пример 3}

       Uses WinCrt;

       Label 1;

       Type matr=array[1..5]of real;

       Const r : matr=(1.0,2.0,3.0,4.0,5.0);

                 p=3.1415926;

       Var l: real; i:byte;

       Begin

1:           write(‘Для расчета длины дуги окружности введите 1’, #13#10,

                       ‘Для расчета площади круга введите 2’,#13#10,

                       ‘Что рассчитать? ‘);

              readln(i);

              Case i of

              1:       for i:=1 to 5 do

                                          begin

                                                 l:=2*p*r[i];

                                                 writeln(‘Радиус =’,r[i],’  Длина окружности =’,l);

                                          end;

              2:      for i:=1 to 5 do

                                          begin

                                                 l:=p*sqr(r[i]);

                                                 writeln(‘Радиус =’,r[i],’  Площадь круга =’,l);

                                          end;

              else

                     begin

                     writeln(‘Неверно указан режим расчета’);

                                  goto 1;

                               end

                     end;

       End.

!!! Скопируйте Пример 3 через буфер обмена в новое окно редактирования системы программирования Турбо Паскаль и выполните эту программу по команде RunRun.

Объясните работу программы.

2.5.Операторы цикла организуют многократное выполнение повторяющихся действий. Если число повторений цикла известно заранее или может быть вычислено, то целесообразно использовать один из вариантов оператора For. Если же момент завершения цикла зависит от выполнения некоторого условия, то применяются операторы While или Repeat, отличающиеся друг от друга способами проверки условий завершения цикла.

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

— инкрементный ( с возрастанием переменной цикла) :

For <переменная цикла>:=<начало> to <конец> do

<оператор>;

— декрементный ( с убыванием переменной цикла):

For <переменная цикла>:=<начало> downto <конец> do

<оператор> ;

В качестве переменной цикла должна использоваться переменная порядкового типа. Параметры <начало> и <конец> задаются выражениями, типы которых должны быть совместимы с типом переменной цикла. Их значения определяются один раз, при входе в оператор For, и сохраняются на протяжении всего процесса его выполнения. После вычисления начального и конечного значений первое присваивается переменной цикла. Затем, если используется инкрементный вариант, оператора For, производится проверка, не превосходит ли содержимое переменной цикла конечного значения. Если не превосходит, выполняются операторы, образующие тело цикла. (Отметим, что эти операторы не выполняются ни разу, если конечное значение меньше начального.) Далее значение переменной цикла увеличивается на единицу, и процесс, включающий проверку и выполнение операторов, повторяется. Так происходит до тех пор, пока проверка не даст положительный результат (True). В этом случае оператор for завершается и осуществляется переход на оператор, следующий за For.

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

Применение инкрементного варианта оператора цикла For рассмотрим на примере вычисления суммы первых N членов разложения в ряд экспоненты exp(X), где N и X — заданные числа соответственно целого и вещественного типов. Воспользовавшись формулой

exp(X) = 1 + (X)/(1) + (X*X)/(1*2) + (X*X*X)/(1*2*3) + . . .

напишем следующую программу:

Program Ex4;             {Пример 4}

       Uses WinCrt;

       Var  N,I:integer;

                x,Sum,Prod,Fact: real;

       Begin

              Write(‘Введите значение х=’);

              readln(x);

              write(‘Введите значение N=’);

              readln(N);

              Sum:= 1 ;

              Prod:= 1 ;

              Fact:= 1 ;

              For I:= 1 to N-1 Do

                     Begin

                          Fact:= Fact*I; {Факториал I}

                          Prod:= Prod*X; {Х в степени I}

                          Sum:= Sum + Prod/Fact; {Сумма (I+1) членов разложения}

                     End;

              Writeln(‘Ответ: ‘,Sum);

       End.

!!! Скопируйте Пример 4 через буфер обмена в новое окно редактирования системы программирования Турбо Паскаль и выполните эту программу по команде RunRun.

Объясните работу программы.

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

Repeat

<последовательность операторов>

Until <выражение>;

В результате вычисления выражения должно получаться значение логического типа. Последовательность операторов, заключенная между ключевыми словами Repeat и Until, выполняется раз за разом до тех пор, пока выражение не примет значение True. В этом случае цикл заканчивается и происходит переход на оператор, следующий за Repeat. Операторы внутри цикла Repeat выполняются по меньшей мере один раз, поскольку условие выхода из цикла проверяется только после его очередного выполнения. Например, найдем n-ю степень числа а:

b:=a ; m:=1 ;

Repeat

       b:=b*a ;

       m:=m+1 ;

Until m>=n ;

!!! Измените Пример 4, используя вместо оператора For оператор Repeatи выполните измененную программу по команде RunRun.

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

While <выражение> do

<оператор>;

В результате вычисления выражения должно получаться логическое значение. Оператор, следующий за ключевым словом Do, выполняется вновь и вновь до тех пор, пока у выражения сохраняется значение True. Если же значение выражения становится False, цикл заканчивается и осуществляется переход на оператор, следующий за оператором While. Оператор внутри цикла While может не выполниться ни разу, поскольку условие выхода из цикла проверяется до момента его выполнения. Например, возведение числа а в степень n:

b:= a; m:=1;

while m<=n do

                     begin

                            b:=b*a;

                            m:=m+1;

                     end;

!!! Измените Пример 4, используя вместо оператора For оператор Whileи выполните измененную программу по команде RunRun.

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

With <список> do

<оператор>;

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

<список>::= <имя> [,<список>]

Приведем пример использования оператора With. Предположим, что в разделе объявлений программы определены комбинированный тип и переменная — запись  этого типа:

Type

       Person = Record;

              Name: string [10];

              Sex : (Male, Female);

              Age : integer;

              Married: boolean

       End;

Var

       Driver : Person;

          В данном случае можно следующим образом заполнить поля записи Driver:

With Driver Do

       Begin

              Name:= Smith;

              Sex := Male;

              Age:= 15;

              Married:=true

       End;

Можно записать логически эквивалентный фрагмент программы, не пользуясь оператором with:

Driver .Name:= Smith;

Driver .Sex := Male;

Driver .Age:=15;

Driver . Married:= true;

Очевидно, что второй способ записи менее выразителен и более громоздок, особенно если количество операций с полями достаточно велико. При объявлении комбинированных типов имена некоторых полей могут совпасть с именами переменных той же программы. Если при обращении к такому полю используется его полное имя, включающее имя записи, конфликт с именем переменной произойти не может. Однако в операторе With имена записей при обращении к полям опускаются, и в силу этого  в нем возможно появление одноименных полей и переменных. Тем не менее конфликта имен и в этих случаях не возникает, поскольку соблюдается правило : в операторе With любой идентификатор интерпретируется компилятором как имя поля, если оно указано в объявлении соответствующей записи; лишь в отсутствии такого поля компилятор обращается к переменной с этим именем. Если в двух записях определены поля с одинаковыми именами, считается, что поле принадлежит той записи, имя которой в заголовке оператора with указано позже имени другой.

!!! Измените следующую программу, используя оператор With и выполните ее по команде Run/ Run.

Program Ex5;             {Пример 5}

       Uses WinCrt;

       Type

              Date = record

                     Year     : Word;

                     Month : 1..12;

                     Day     : 1..31;

              end;

       Var

              date1,date2:date;

       Begin

              date1.year:=1996;date1.month:=7;date1.day:=1;     {присваивание полям}

              date2.year:=1997;date2.month:=8;date2.day:=20;    {записей значений}

              writeln(‘день =’,date1.day,’  месяц =’,date1.month,’  год =’,date1.year,#13#10,

                         ‘день =’,date2.day,’  месяц =’,date2.month,’  год =’,date2.year);

       End.

2.7.Процедуры ввода-вывода информации.

Процедура Readln ввода информации с консоли (клавиатуры)имеет формат:

ReadLn (< список  ввода >);

где < список ввода >:: = < переменная >[,< список ввода >]

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

Процедуры Write и WriteLn вывода на экранимеют формат:

Write(<список вывода>);

где <список вывода >::=<выражение>[< шаблон >][,список вывода >]

< шаблон >::=:<поле>[:<дробная часть>]

Здесь <выражение> может иметь числовой, логический, символьный или строковый типы. Необязательный параметр < шаблон > определяет формат, в котором выводится значение выражения. Подпараметр < поле > указывает минимальную ширину поля, отводимого под это значение (по умолчанию 17 символьных позиций). Если значение независимо от своего типа занимает меньше позиций, слева оно дополняется необходимым количеством пробелов, а если больше то подпараметр игнорируется, и выводятся все символы значения. Подпараметр <дробная часть> можно использовать совместно с подпараметром <поле> только при выводе вещественных чисел. Процедура Write переводит значения выражений, входящих в список вывода, из внутреннего формата в символьную форму (это необходимо только при обработке выражений логического и числовых типов) и записывает их в соответствующем формате на экран.

Значение числового выражения вещественного типа в отсутствии подпараметра <дробная часть> выводится в экспоненциальном формате (в виде числа с десятичной точкой, буквы E (от Exponent) и показателя степени, занимающего 4 позиции). Если отсутствует и подпараметр <поле>, под число отводится 23 позиции, если значение этого подпараметра меньше 10, число записывается в десяти позициях. При наличии подпараметра <дробная часть> значение числового выражения вещественного типа выводится в формате с фиксированной точкой. Этот подпараметр задаёт количество цифр после десятичной точки, причём если он равен нулю, точка не пишется.

Значение выражения логического типа выводится в виде строк True или False.

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

WriteLn(<список вывода>);

Единственное различие заключается в том, что WriteLn, выполнив ту же цепочку действий, что и Write переводит строку. Благодаря этому новая операция начинается с новой строки.

Например,

writeln(‘Скорость=’,s/t:6:2,’км/час’);

в результате чего на экран будет выведена надпись:

Скорость=120.34 км/час

!!! Смотрите примеры 3-4 и выполните их по команде RunRun.

Процедуры write и writeln печати информации на принтере. Для печати используются средства стандартного программного модуля WinPrn, который должен быть подключен к программе сразу после ее заголовка перед разделом объявлений посредством директивы Uses, а первой переменной в списке вывода операторов печати должна быть файловая переменная. Например,

Program Ex6;               {Пример 6}

       Uses WinPrn;              {подключение модуля WinPrn }

       Var Prn : Text;            {объявление файловой переменной Prn}

              Begin

                     AssignDefPrn(Prn);{связывание файловой переменной с устройством}

                     Rewrite(Prn);          {открытие файла устройства}

                     writeln(Prn,’ Проверка принтера’); {печать}

                     Close(Prn);             {закрытие файла устройства}

              End.

Во всем остальном операторы печати совпадают с операторами вывода информации на экран.

!!! Подготовьте принтер к работе.

Скопируйте Пример 6 через буфер обмена в новое окно редактирования  системы программирования Турбо Паскаль и выполните эту программу по команде RunRun.

!!! Выйдите из системы программирования Турбо Паскаль, не сохраняя файлов в окнах редактирования.

3.Оборудование для лабораторной работы.

Персональный IBM PC — совместимый компьютер, подключенный в одноранговую локальную вычислительную сеть под управлением Windows 95.

4.Порядок выполнения работы.

  1. Прочитать п.2 настоящего руководства и выполнить предписанные в нем действия.
  2. Закрепить полученные знания, ответив на вопросы для самотестирования.

©2008-2020, Интернет-институт ТулГУ

Если Вы нашли ошибку, выделите её и нажмите Ctrl+Enter.
Узнать сколько стоит решение этого задания
(ответ в течение 5 мин.)
X