4614

Программирование выражений и операторов на языке Delphi

Лабораторная работа

Информатика, кибернетика и программирование

Главную часть программы на языке Delphi составляет раздел операторов, в котором реализуется алгоритм решения поставленной задачи, т.е. именно в нем с предварительно описанными переменными, константами, значениями функций и т.п. выполняются...

Русский

2012-11-23

200.5 KB

20 чел.

Введение

Главную часть программы на языке Delphi составляет раздел операторов, в котором реализуется алгоритм решения поставленной задачи, т.е. именно в нем с предварительно описанными переменными, константами, значениями функций и т.п. выполняются определенные действия, позволяющие получить результат, ради которого создается программа.

Раздел операторов начинается ключевым словом Begin (Начало), затем следуют операторы языка, отделяемые друг от друга точкой с запятой. Завершают раздел ключевое слово End (Конец) и точка.

Операторы выполняются строго последовательно в том порядке, в котором они записаны в тексте программы в соответствии с синтаксисом и семантикой языка программирования. Некоторые операторы (перехода, условные) позволяют нарушить естественный последовательный порядок выполнения операторов.


I. ЦЕЛЬ И СОДЕРЖАНИЕ РАБОТЫ

Цель лабораторной работы:

  •  привитие практических навыков в записи выражений на языке Delphi и программировании основных операторов.

Содержание работы:

1. Запись выражений.

2. Программирование простых и структурных операторов.

Требования к отчету:

Отчет по работе должен содержать:

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

II. МЕТОДИКА ВЫПОЛНЕНИЯ РАБОТЫ

1. Запись выражений

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

1. Арифметические операции:

  •  унарные: +, -
  •  бинарные: +, -, *, /, div, mod 

2. Операции отношения:

=, <>, <, >, <=, >=

3. Булевы (логические) операции:

not, and, or, xor

4. Поразрядные логические и сдвиговые операции:

not, and, or, xor, shl, shr

5. Строковая операция (конкатенация):

+

6. Операции над множествами:

+, -, *, in, <=, >=

7. Операция взятия адреса:

@

Последовательность выполнения операций в выражении определяется тремя факторами:

  •  приоритетом операций;
  •  порядком расположения операций в выражении;
  •  использованием скобок.

По приоритету все операции делятся на четыре группы (табл. 1.1).

Таблица 1.1. Приоритет операций

Приоритет

Операции

Категория операций

Первый (высший)

+  -  not  @

Унарные операции

Второй

* / div mod and shl shr

Бинарные операции типа умножения

Третий

+  -  or  xor

Бинарные операции типа сложения

Четвертый (низший)

=  <> <  >  <=  >=  in

Бинарные операции отношения

В зависимости от используемых операций и типов операндов выражения бывают:

  •  арифметическими – порождают целое или действительное значение. В арифметические выражения могут включаться стандартные и пользовательские функции;
  •  отношения – определяют истинность или ложность результата сравнения;
  •  логическими (булевскими) – используют операнды булевского типа (Boolean). В качестве операций выступают логические операции НЕ (not), И (and), ИЛИ (or), Исключающее ИЛИ (xor), а результатом выполнения выражения является логическое значение True или False;
  •  строковыми – выражения, в которых операндами служат строковые данные. Над строковыми данными допустимы операция сцепления (конкатенации) и операции отношения.

Задание № 1. Примеры записи выражений

  1.  Записать арифметические выражения, заданные формулами:

Исходное выражение

Выражение на языке Delphi

sin(abs((y-sqrt(abs(x)))*(x-y/(z*z+x*x/4))))

1. Введем переменную , которую можно записать так: z:=c*x1*sqr(x1)+d*sqr(x2)-x3.

2. Так как в языке отсутсвует стандартная функция tg(x), то ее можно записать как .

3. Тогда заданное выражение на языке Delphi:

sqr(sin(abs(z)))/sqrt(z*z+3.14)+sin(z)/cos(z)

Самостоятельно

Самостоятельно

  1.  Пусть переменные x, y, z имеют тип Boolean. В алгебре логики приняты следующие обозначения логических операций: - И (and); - ИЛИ (or); - Исключающее ИЛИ (xor); черта сверху – НЕ (not).

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

Исходное выражение

Выражение на языке Delphi

(x and y and z) or (not x and y and (not z)) or (not (x and (not y) and z)) xor ((not (x and y)) and z)

Самостоятельно

Самостоятельно

  1.  Записать выражения отношений:

Исходное выражение

Выражение на языке Delphi

1  х  100 и a < b/c или z  0

((1<=x) and (x<=100)) and (a<b/c) or (z<>0)

Точка с координатами (x, y) принадлежит внешности единичного круга с центром в начале координат или его второй четверти:

x2+y2 > 1 или x2+y2  1 и x<0 и y>0.

1. Введем переменную z = x2+y2, которую можно записать так:

z:=Sqr(x)+Sqr(y).

2. Тогда выражение отношения:

(z>1) or ((z<=1) and (x<0) and (y>0))

Целые числа a и b имеют одинаковую четность:

a mod 2 = 0 и b mod 2 = 0

или a mod 2 = 1 и b mod 2 = 1

(a mod 2 = 0) and (b mod 2 = 0)

or (a mod 2 = 1) and (b mod 2 = 1)

Точка с координатами (x, y) лежит в круге радиуса r с центром в точке (a, b):

Самостоятельно

Квадратное уравнение ax2 + bx + c = 0 не имеет действительных корней

Самостоятельно

  1.  Записать символьные и строковые выражения:

Исходное выражение

Выражение на языке Delphil

Соединить строки «Прима» и «балерина»

'Прима'+' балерина' 'Прима балерина'

Для строки «Казнить нельзя помиловать»:

  •  определить ее длину;
  •  удалить подстроку «помиловать»;
  •  определить, с какой позиции начинается подстрока «нельзя»;
  •  выделить подстроку «нельзя».

Length('Казнить нельзя помиловать') 25

Delete('Казнить нельзя помиловать',15,11) 'Казнить нельзя'

Pos('нельзя','Казнить нельзя помиловать') 9

Copy('Казнить нельзя помиловать',9,6) 'нельзя'

Для строки «To be or not to be»:

  •  определить ее длину;
  •  удалить подстроку «be»;
  •  определить позицию начала подстроки «not»;
  •  выделить второе «to»

Самостоятельно

  1.  Сохранить ответ в папке \Мои документы\ПЗ-03\Задание-01 под именем Выражения.txt.

Задание № 2. Арифметические операции с целыми числами

  1.  Разработайте консольную программу, демонстрирующую выполнение арифметических операций над целыми величинами. Для этого:
    •  Введите целочисленные переменные i, n и объявите их Integer.
    •  Введите целочисленные переменные A, B и объявите их Byte.
    •  Организуйте ввод с клавиатуры значений i, n, A, B.
    •  Организуйте вывод на экран результатов целочисленного деления i div n и i mod n.
    •  Организуйте вывод на экран результатов поразрядных булевских и сдвиговых операций с числами A и B.

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

Program Operation_Integer;

{$APPTYPE CONSOLE}

uses

 SysUtils;

Var

 i,n: integer;

 A,B: byte;

Begin

 writeln('Vvedite znachenia i, n, A, B');

 readln(i,n,A,B);    // Введите произвольные целые числа

                     // из допустимого диапазона

 writeln('Isxodni danny: i=',i:5,' n=',n:5,' A=',A:5,' B=',B:5);

 writeln(i:5,' div',n:5,' = ',i div n:5);

 writeln(i:5,' mod',n:5,' = ',i mod n:5);

 writeln;

 writeln('not ',A,' = ',not A);

 writeln(A,' and ',B,' = ',A and B);

 writeln(A,' or  ',B,' = ',A or B);

 writeln(A,' xor ',B,' = ',A xor B);

 writeln(A,' shl ',B,' = ',A shl B);

 writeln(A,' shr ',B,' = ',A shr B);

 readln

End.

  1.  Откомпилируйте и выполните программу. При наличии ошибок, исправьте их.
  2.  При отсутствии ошибок вы должны получить результат, представленный на рис. 1.1.
  3.  Сохраните проект программы в папке \Мои документы\ПЗ-02\Задание-02 под именем Operation_Integer.

2. Программирование простых и структурных операторов

Операторы языка разделяются на две группы: простые и структурные.

Операторы отделяются друг от друга символом точка с запятой (;).

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

Оператор присваивания состоит из идентификатора переменной или пользовательской функции, символа присваивания «:=» и выражения:

Идентификатор := Выражение;

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

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

Имя_процедуры(Список_фактических_параметров);

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

Примерами стандартных процедур являются процедуры ввода-вывода: read, readln, write и writeln.

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

read(X1, X2, ... , Xn);

где X1, X2, ... , Xn – переменные допустимых типов данных.

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

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

write(Y1, Y2, ..., Yn);

где Y1, Y2, ..., Yn - выражения типа integer, real, char, boolean и т.п.

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

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

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

Goto Метка;

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

Структурные операторы включают в себя другие операторы и управляют последовательностью их выполнения. К ним относятся: составной оператор; условные операторы; операторы цикла; оператор присоединения.

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

Begin

 Оператор_1;

 Оператор_2;

 ...

 Оператор_n

end;

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

Оператор условия if может быть записан в полном и неполном форматах:

Полный формат:

if Условие then Оператор_1 else Оператор_2;

Неполный формат:

if Условие then Оператор;

Условие может быть простым или сложным. Сложные условия образуются с помощью логических операций not, and, or, xor.

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

case Селектор of

      Список_1: Оператор_1;

      Список_2: Оператор_2;

      ...

      Список_N: Оператор_N

    else Оператор_Е

end;

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

Оператор цикла с предусловием while имеет следующий формат:

while Условие do Тело_цикла;

Условие – булевское выражение, а тело цикла – простой или составной оператор.

Оператор цикла с постусловием состоит из заголовка repeat, тела цикла, замыкающего ключевого слова until, после которого указывается условие окончания цикла:

repeat

     Оператор_1;

     Оператор_2;

     ...

     Оператор_N

until Условие;

Условие – выражение булевского типа. Вначале выполняются операторы тела цикла, затем проверяется Условие выхода из цикла. Если значением Условие является False, то тело цикла активизируется еще раз, а если значением Условие является True, то происходит выход из цикла.

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

1) Если параметр цикла наращивает свое значение:

for Параметр_цикла:=S1 to S2 do Тело_цикла;

2) Если параметр цикла уменьшает свое значение:

for Параметр_цикла:=S1 downto S2 do Тело_цикла;

где S1 и S2 – выражения, определяющие соответственно начальное и конечное значения параметра цикла. Для первого варианта должно быть S1<=S2, а для второго S1>=S2.

Тело цикла может быть простым или составным оператором.

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

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

Задание № 3. Использование стандартных функций

  1.  Разработайте консольную программу вычисления значения функции  при х = 2.346. Затем вычислить квадратный корень из абсолютной величины полученного значения, т.е. найти . Для этого:
    •  Задайте значение х = 2.346 в виде константы.
    •  Введите вещественные переменные y, z и объявите их Real.
    •  Организуйте вывод на экран результатов вычисления заданных функций.

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

program Standart_Function;
{$APPTYPE CONSOLE}
uses
 SysUtils;
const
 x=2.346;
var
 y,z: real;
begin
 writeln('Raschet function Y=1+cos^2(x)+sin^3(x) for x=2.346');
 y:=1+x*sqr(cos(x))+sqr(sin(x))*sin(x);
 z:=sqrt(abs(x));
 writeln('y=',y);
 writeln('z=',z);
 readln
end.
  1.  Откомпилируйте и выполните программу. При наличии ошибок, исправьте их.
    1.  При отсутствии ошибок вы должны получить результат, представленный на рис. 2.1.
      1.  Сохраните проект программы в папке \Мои документы\ПЗ-02\Задание-03 под именем Standart_Function.

Задание № 4. Использование условных операторов

  1.  Разработайте консольную программу решения системы неравенств:
  1.  Исходные данные – коэффициенты a1, b1, a2, b2 целого типа и вводятся с клавиатуры. Результат вещественного типа и выводится на экран.
  2.  Для ввода используются следующие значения: a1=2, b1=-1, а2=4, b2=6.
  3.  Листинг программы должен иметь примерно следующий вид:
program Zadanie_4;
{$APPTYPE CONSOLE}
uses
 SysUtils;
var
 a1,a2,b1,b2: integer;     // Описание исходных коэффициентов
       r1,r2: real;        // Описание выходных результатов
begin
 writeln('Vvedite a1=');
 readln(a1);               // Ввести a1 и нажать Enter
 writeln('Vvedite b1=');
 readln(b1);               // Ввести b1 и нажать Enter 
 writeln('Vvedite a2=');
 readln(a2);               // Ввести a2 и нажать Enter
 writeln('Vvedite b2=');
 readln(b2);               // Ввести b2 и нажать Enter
 r1:=-b1/a1;               // Вычисление результатов
 r2:=-b2/a2;
 if (r1<0) and (r2<0)      // Условный оператор
   then case r1<=r2 of     // Оператор выбора
          false: writeln('Otvet: X<',r1:3:2);
           true: writeln('Otvet: X<',r2:3:2);
        end
   else case r1>r2 of
          false: writeln('Otvet: X<',r1:3:2);
           true: writeln('Otvet: X<',r2:3:2);
        end;
   readln
end.
  1.  В условный оператор включен оператор выбора, который в зависимости от того, какое из значений результатов меньше (или больше) выбирает путь вывода результата на экран.
  2.  Откомпилируйте и выполните программу. При наличии ошибок, исправьте их.
  3.  При отсутствии ошибок вы должны получить результат, представленный на рис. 2.2.
  4.  Сохраните проект программы в папке \Мои документы\ПЗ-02\Задание-04 под именем Zadanie_4.

Задание № 5. Использование операторов цикла

  1.  Разработайте консольную программу вычисления таблицы значений функций  и  на отрезке [a, b] в точках xi=a+ih, где h = (ba)/m, m — заданное целое число. Значение шага h должно вычисляться один раз. Для этого:
    •  Введите вещественные переменные a,b,h,x,y,z и объявите их Real.
    •  Введите целые переменные m, i и объявите их Integer.
    •  Организуйте ввод с клавиатуры исходного значения m=20.
    •  Вычислите начальную и конечную точки отрезка: a=-/2; b=/2, используя стандартную функцию Pi.
    •  Вычислите шаг изменения аргумента по формуле h=(ba)/m.
    •  Организуйте в цикле со счетчиком вычисление заданных функций и их выдачу на экран в виде таблицы.
    •  Не забудьте в теле цикла изменять значение аргумента x.
    1.  В эту же программу включите блок, вычисляющий сумму бесконечного ряда:

, где  - факториал числа.

Вычисления прекратить, когда очередное значение an  , где - заданная точность вычислений. Общий член ряда рассчитывается по формуле:

, n = 1, 2, 3, ….

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

, n = 1, 2, 3, …, причем a0=1.

При составлении программы считать, что точность задана =10-4 и определяется константой e.

  1.  Листинг программы должен иметь примерно следующий вид:

program Zadanie_5;

{$APPTYPE CONSOLE}

uses

 SysUtils;

const

 e=1.0e-4;          // Константа, определяющая точность

var

 a,b,h,x,y,z: real; // Переменные первой задачи

         m,i: integer;

        s,an: real; // Переменные второй задачи

           n: integer;

begin

 {Первая задача}

 writeln('Vvesdite znachenie m=');

 readln(m);         // Введите значения m и нажмите Enter

 a:=-Pi/2;          // Вычисление нижней границы интервала

 b:=-a;             // Вычисление верхней границы интервала

 h:=(b-a)/m;        // Вычисление шага изменения аргумента

 x:=a;              // Присвоение начального значения аргумента

 for i:=1 to m+1 do // Цикл со счетчиком

   begin

     y:=1+x*sqr(cos(x))+sqr(sin(x))*sin(x); // Выч. функций

     z:=sqrt(abs(y));

     writeln('x=',x:7:4,' y=', y:7:4,' z=',z:7:4);

     x:=x+h;        // Переход к следующему значению аргумента

   end;

 writeln;

 {Вторая задача}

 s:=0;                   // Обнуление суммы

 an:=1;                  // Вычисление первого члена суммы

 n:=1;                   // Начальное значение переменной цикла

 while an>e do           // Цикл с предусловием

   begin

     s:=s+an;            // Накопление суммы

     n:=n+1;             // Изменение переменной цикла

     an:=an*(exp(n*(ln(n/(n+1))))); // Выч. оч. чл. суммы

   end;

 writeln('Summa ',n,' elementov ravna =',s:9:6);

 readln

end.

  1.  Откомпилируйте и выполните программу. При наличии ошибок, исправьте их.
    1.  При отсутствии ошибок вы должны получить результат, представленный на рис. 2.3.
    2.  Сохраните проект программы в папке \Мои документы\ПЗ-02\Задание-05 под именем Zadanie_5.
    3.  Посмотрите, как изменятся результаты, если задать значения m=10 и e=1.0e-8.
    4.  Самостоятельно составьте программу решения второй задачи, но используя оператор цикла с постусловием (repeat ... until).

ВЫВОДЫ

  1.  Выражение в программировании служит для определения порядка выполнения действий над элементами данных и состоит из операндов (констант, переменных, обращений к функциям), круглых скобок и знаков операций.
  2.  По характеру выполняемых действий операции разделяются на арифметические (унарные + и -; бинарные +, -, *, /, div, mod), отношения (=, <>, <, >, <=, >=), булевы (логические) (not, and, or, xor), поразрядные логические и сдвиговые (not, and, or, xor, shl, shr), строковые (конкатенация +), операции над множествами (+, -, *, in, <=, >=) и операцию взятия адреса (@). Последовательность выполнения операций в выражении определяется приоритетом операций, порядком расположения операций в выражении и использованием скобок.
  3.  В зависимости от используемых операций и типов операндов выражения бывают арифметическими, логическими, отношения, строковыми и др.
  4.  Операторы предназначены для описания действий, которые будут выполнены при реализации алгоритма. Операторы языка разделяются на две группы: простые и структурные операторы.
  5.  Простые операторы — операторы, которые не содержат в себе других операторов. К ним относятся операторы присваивания, процедуры, безусловного перехода и пустой.
  6.  Структурные операторы включают в себя другие операторы и управляют последовательностью их выполнения. К ним относятся:  составной оператор; условные операторы if-then-else и оператор выбора case-else; операторы цикла с предусловием while-do, постусловием repeat-until и со счетчиком for-to-do (for-downto-do).
  7.  Ввод-вывод информации в программе осуществляется с помощью предопределенных процедур read, readln, write и writeln.

Контрольные вопросы

  1.  Как операции в языке Delphi разделяются по приоритетам? Каким образом можно изменить приоритет выполнения операций?
  2.  Какие типы выражений существуют? Чем определяется тип выражения?
  3.  Объясните, как выполняются операции div и mod. Какой результат при этом получается?
  4.  Объясните, как выполняются логические операции и операции сдвига над целыми числами.
  5.  Объясните действие условных операторов.
  6.  Как работают операторы цикла? В чем заключается различие между оператором цикла с предусловием и постусловием?
  7.  Какими средствами можно устранить эффект «зацикливания»?
  8.  Какие средства используются для принудительного выхода из цикла?
  9.  Объясните действие процедур ввода данных с клавиатуры и вывода данных на экран.
  10.  Каким образом задаются поля вывода в процедурах write и writeln?


Рис. 1.1.
 Результаты работы программы, иллюстрирующей арифметические операции с целыми числами

Рис. 2.1. Результаты работы программы, иллюстрирующей применение стандартных функций

Рис. 2.2. Результаты работы программы, иллюстрирующей работу условных операторов

Рис. 2.3. Результаты работы программы, иллюстрирующей работу операторов цикла

  1.