|
||||||||||||||||||
§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 равносильно следующим арифметическим выражениям, представленным в таблице:
Как видно из таблицы, эти процедуры можно не использовать, а писать вместо них арифметическое выражение. Однако выгоднее использовать процедуру, т.к. выполнение процедуры происходит быстрее. Это связано с программной реализацией процедур и арифметических выражений. Арифметические выражения рассчитаны на то, что в них будут использоваться целые переменные и вещественные, речь о которых пойдёт в следующем параграфе. А данные процедуры работают только с порядковыми типами. Поэтому они работают быстрее. Если вам нужна быстродействующая программ, то рекомендую использовать именно эти процедуры. Ещё одна подпрограмма – функция 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 Вещественные типы. Переменная вещественного типа может содержать в себе любое число – целое, дробное, положительное или отрицательное. Существует несколько вещественных типов:
Отличаются эти типы друг от друга количеством значащих цифр. Что это значит? Например, если вы извлечёте квадратный корень из двух с помощью калькулятора, то увидите следующее значение: 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
|