Учебник по программированию.

Первые шаги. Язык программирования PascalABC.

Предыдущий параграф Назад в содержание Следующий параграф


§9. Системные подпрограммы для работы с переменными  порядковых типов. Вещественные типы.

Системные подпрограммы для работы с переменными  порядковых типов.

В четвёртом параграфе речь шла о процедурах и функциях (подпрограммах). Там мы научились создавать их сами. Помимо своих подпрограмм мы можем пользоваться уже готовыми, которые заложены в язык Pascal. На данном этапе будем называть их системными. Для вызова какой-либо системной подпрограммы необходимо просто написать её имя и поставить круглые скобки, в которых указать необходимые параметры.

Некоторыми системными подпрограммами мы уже научились пользоваться: это процедуры ввода вывода Write, Writeln, Read; а так же функция для работы с символами Chr.

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

Далее буду приводить их по порядку с описанием и примером использования.  Сразу все эти подпрограммы запомнить вам вряд ли удастся. В принципе, запоминать их и нет необходимости. Они все есть в справке. Если у вас открыта система PascalABC.NET, то при нажатии клавиши F1, откроется справка. В ней нужно выберать пункт: «Справочник по языку -> Системные процедуры, функции, типы и константы -> Процедуры и функции для работы с перечислимыми типами».

Функция Ord(x) возвращает порядковый номер значения переменной x порядкового типа. Пример:


var i:integer;

    c:char;

    b:boolean;

    a:(odin,dva,tri);

    d:4..30;

begin

  i:=-3;

  c:='a';

  b:=true;

  a:=dva;

  d:=5;

  writeln('i =',i:4,'     ord(i) = ',ord(i));

  writeln('c =',c:4,'     ord(c) = ',ord(c));

  writeln('b =',b:4,'     ord(b) = ',ord(b));

  writeln('a =',a:4,'     ord(a) = ',ord(a));

  writeln('d =',d:4,'     ord(d) = ',ord(d));

end.

_____________________________________________

i =  -3     ord(i) = -3

c =   a     ord(c) = 97

b =True     ord(b) = 1

a = dva     ord(a) = 1

d =   5     ord(d) = 5


Функция Pred(x) возвращает значение предыдущее по порядку значение от значения х.

Функция Succ(x) возвращает значение следующее по порядку значение от значения х.

Пример:


var i:integer;

    c:char;

    b:boolean;

    a:(odin,dva,tri);

    d:4..30;

begin

  i:=-3;

  c:='b';

  b:=true;

  a:=dva;

  d:=5;

  writeln('i =',i:4,'     Pred(i) = ',Pred(i));

  writeln('c =',c:4,'     Pred(c) = ',Pred(c));

  writeln('b =',b:4,'     Pred(b) = ',Pred(b));

  writeln('a =',a:4,'     Succ(a) = ',Succ(a));

  writeln('d =',d:4,'     Succ(d) = ',Succ(d));

end.

_______________________________________________

i =  -3     Pred(i) = -4

c =   b     Pred(c) = a

b =True     Pred(b) = False

a = dva     Succ(a) = tri

d =   5     Succ(d) = 6


Процедура Inc увеличивает, а процедура Dec уменьшает порядковый номер переменной порядкового типа на единицу. Пример:


var i:integer;

    c:char;

    b:boolean;

    a:(odin,dva,tri);

    d:4..30;

begin

  i:=-3;

  c:='b';

  b:=true;

  a:=dva;

  d:=20;

  write('i =',i:4);  Inc(i,3);  WriteLn('     Inc(i,3)   i = ',i);

  write('c =',c:4);  Inc(c);  WriteLn('     Inc(c)     c = ',c);

  write('b =',b:4);  Dec(b);  WriteLn('     Dec(b)     b = ',b);

  write('a =',a:4);  Dec(a);  WriteLn('     Dec(a)     a = ',a);

  write('d =',d:4);  Dec(d,10);  WriteLn('     Dec(d,10)  d = ',d);

end.

____________________________________________________________

i =  -3     Inc(i,3)   i = 0

c =   b     Inc(c)     c = c

b =True     Dec(b)     b = False

a = dva     Dec(a)     a = odin

d =  20     Dec(d,10)  d = 10


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


Процедура

Арифметическое

выражение

Inc(x)

x:=x+1

Inc(x,4)

x:=x+4

Dec(x)

x:=x-1

Dec(x,4)

x:=x-4

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

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

Далее пример программы, использующей данную функцию:


begin

  writeln('Случайное число от 0 до 100 - ',random(100));

  writeln('Случайное число от 50 до 1000 - ',Random(50,1000));

  writeln('Сучайная буква латинского алфавита - ',Chr(Random(65,90)));

end.

______________________________________________________________________

Случайное число от 0 до 100 - 44

Случайное число от 50 до 1000 - 537

Сучайная буква латинского алфавита Q


Вещественные типы.

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

  • Real;
  • Single;
  • Double;
  • Extended;
  • Comp.

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


1,4142135623730950488016887242097

Здесь 32 значащих цифры. Пересчитайте слева направо все символы кроме запятой. Получите 32. Если мы проводим вычисления у себя в тетради, то мы не будем писать все 33 символа (вместе с запятой), а возьмём первые четыре значащих цифры и получим: 1,414. Мы уменьшили количество значащих цифр, и при этом уменьшилась точность представления числа.

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

В этой книге мы будем использовать только тип Real. Переменные данного типа содержат в себе числа с точностью до 14 знаков. Этого вполне достаточно для большинства вычислений. В памяти компьютера переменная данного типа занимает 6 байт.

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

С переменными вещественного типа можно производить все арифметические операции, описанные в параграфе 3. Операции div и mod с вещественными типами не используются.

Пример программы, в которой используется переменная типа Real:


Var x:real;

begin

  x:=10/300000000;

  writeln(x);

end.

____________________

3.33333333333333E-09


Обратите внимание на то, что было выведено на экран. Эта запись равносильна следующей, которая принята в обычной математике: . Т.е. буква Е обозначает, что это число необходимо умножить на 10 в степени, значение которой указано далее. Вместо минуса может стоять знак плюс.

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


Var i,k:byte;

begin

  for i:=1 to 5 do//формируем столбцы

   begin

    For k:=1 to 10 do write(i/k:6:2);//формируем строки

    writeln;    

   end;

end.

____________________________________________________________

  1.00  0.50  0.33  0.25  0.20  0.17  0.14  0.13  0.11  0.10

  2.00  1.00  0.67  0.50  0.40  0.33  0.29  0.25  0.22  0.20

  3.00  1.50  1.00  0.75  0.60  0.50  0.43  0.38  0.33  0.30

  4.00  2.00  1.33  1.00  0.80  0.67  0.57  0.50  0.44  0.40

  5.00  2.50  1.67  1.25  1.00  0.83  0.71  0.63  0.56  0.50


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


В данном параграфе мы познакомились с системными подпрограммами для работы с порядковыми типам. А так же рассмотрели вещественные типы.


Задачи.

1. Вывести на экран список из 100 случайных целых чисел. Список представить в виде таблицы с 11 столбиками.

2. Вывести список из 100 случайных символов. Список представить в виде таблицы с 20 столбиками. Вывод организовать с помощью цикла While do. Для увеличения переменной счётчика использовать процедуру Inc.

3. Придумать программы демонстрирующие работы системных подпрограмм Ord, Pred, Succ.

4. Имеем следующую функцию:

.

Необходимо рассчитать значения для 60 значений  от 0 до 62.83. Значения вывести в виде таблицы с пятью столбиками. Порядок вывода значений должен получиться слева на право.

Примечание: обратите внимание, что в знаменателе есть следующее выражение:

.

При этом если примет значение равное 62.83, то в знаменателе получится ноль. Как известно на ноль делить нельзя, программа при этом может не закончить свою работу и выдать ошибку. Как известно из высшей математики при делении числа на ноль получается бесконечность. При сложении числа с бесконечностью получается тоже бесконечность. При делении числа на бесконечность получается ноль. Т.е. если =62.83, то будет равно нулю. В PascalABC.NET такая ситуация продумана заранее и ошибки в программе не будет, как было сказано значение будет равно нулю. Однако в другом программном продукте такая ситуация может быть не продумана и проблема ляжет на ваши плечи.


Решение.

1.

var i:integer;

begin

  for i:=1 to 100 do

    begin

      write(random(1000):5);

      if (i mod 11) = 0 then writeln;

    end;

end.

_______________________________________________________

   53  785  179  821  821  564  832  195  632  259  669

  415  207  957  780  225  754  661  923  547  941  280

  154  863  533  239  116  980  935  814  891   99  911

  651  621  980  247  746  307  303  893  892  764  665

  631  196  587  125  312  626  859  426  134  495    0

  772  631  316  287  582  448  852  260  817  368  569

  504  555  335  800  978    7  354  619  654   48  516

  488  231  337  652  990  667  309  955  464  965  415

  651  848  348  930  459  725  854   40  632  946  297

   62


2.

var i:integer;

begin

  i:=1;

  while i<=100 do

    begin

      write(Chr(random(32,128)):2);

      if (i mod 20) = 0 then writeln;

      Inc(i);

    end;

end.

__________________________________________

] \ . # > ~ $ Y ! = Ђ h 1 c H | ? , 0 I

K T E ~ 9 0 a ; q X & , L % / | - p 4 @

I p ~ k 4 p d $ & > { 7 v B } ( 6 1 k .

= i h I 7 s < , T L n O y q   \ W [ i J

M \ 5 S ] o 7 ) ( & e } $ % " ` ' T S A


3. Данную задачу решите самостоятельно.


4.

Var M,w:real;

    r:real;

    i:byte;

begin

  r:=62.83/60;

  Write('  w       M       w       M       w       M       w');

  Writeln('       M       w       M  ');

  For i:=1 to 60 do

   begin

     w:=r*i;

     write(w:5:2,' ');

     M:=2*3202*(1+0.1143*0.065)/

       ((1-w/62.83)/0.065+0.065/(1-w/62.83)+2*0.1143*0.065);

     write(M:7:2,'   ');

     if (i mod 5) = 0 then writeln;

   end;

end.

_________________________________________________________________________

  w       M       w       M       w       M       w       M       w       M 

1.05  424.19    2.09  431.43    3.14  438.92    4.19  446.68    5.24  454.71  

6.28  463.04    7.33  471.67    8.38  480.63    9.42  489.93   10.47  499.60  

11.52  509.66   12.57  520.13   13.61  531.03   14.66  542.40   15.71  554.26  

16.75  566.65   17.80  579.59   18.85  593.14   19.90  607.33   20.94  622.21  

21.99  637.83   23.04  654.25   24.08  671.52   25.13  689.72   26.18  708.91  

27.23  729.20   28.27  750.66   29.32  773.40   30.37  797.54   31.42  823.20  

32.46  850.54   33.51  879.72   34.56  910.93   35.60  944.38   36.65  980.32  

37.70 1019.01   38.75 1060.79   39.79 1106.02   40.84 1155.12   41.89 1208.60  

42.93 1267.02   43.98 1331.07   45.03 1401.53   46.08 1479.32   47.12 1565.53  

48.17 1661.42   49.22 1768.43   50.26 1888.20   51.31 2022.49   52.36 2173.01  

53.41 2341.02   54.45 2526.42   55.50 2725.78   56.55 2928.12   57.59 3106.33  

58.64 3200.98   59.69 3095.63   60.74 2603.88   61.78 1546.67   62.83    0.00  




Предыдущий параграф Назад в содержание Следующий параграф