Генератор случайных чисел
В Паскале существует встроенный генератор случайных чисел. Для его инициализации (установки случайного начального значения) используют процедуру Randomize без параметров.
Для получения случайного числа используют функцию Random. Обращение к ней: Random ( N ) , где N – целое число типа word. Функция возвращает случайное число
в диапазоне от 0 до N-1.
Если диапазон не указан (обращение к функции без параметра), то возвращается вещественное число в пределах от 0 до 1.
Примеры:
program р32;
Uses Crt;
Var k : integer;
begin
Randomize;
Writeln(‘ Cлучайные числа в диапазоне от 0 до 255’);
repeat
k := Random(256);
Write(k : 3, ' ');
until KeyPressed;
end.
В этом примере будут выводиться на экран случайные целые числа, пока вы не нажмёте какую-либо клавишу. В следующем примере аналогично будут выводиться действительные случайные числа.
program p33;
var
S : real;
begin
Randomize;
Writeln(‘ Cлучайные числа в диапазоне от 0 до 1’);
repeat
S := Random;
Write(S : 7 : 5, ' ');
until KeyPressed;
end.
Записи
Запись в Паскале относится к структурированным типам и в этом смысле отличается от массива только разнотипностью своих компонент, что позволяет использовать ее в качестве набора данных, описывающих некоторый объект. Например, при описании учащихся данного класса школы можно рассмотреть следующие индивидуальные характеристики отдельного ученика: фамилию, имя, месяц и число рождения, вес, рост, номер парты и т. д. Видно, что все данные об ученике разного типа. Действительно, фамилия, имя – строки; месяц, номер парты – целые числа; вес и рост – вещественные числа. Таким образом, для хранения информации об учащихся воспользоваться массивом практически невозможно. Но структурированный тип Record предназначен как раз для этого. При описании переменной - записи предварительно определяют идентификатор типа Record в разделе описания типов.
type
<идентификатор пользовательского типа> = record
<список 1 идентификаторов полей записи>: <тип полей>;
<список 2 идентификаторов полей записи>: <тип полей>;
………………………………………………………………
<список n идентификаторов полей записи>: <тип полей>;
end;
После описания типа можно использовать его идентификатор при описании любого количества переменных, как мы это делали с идентификаторами стандартных типов. Данный путь не единственный, можно описать переменную типа Record, при этом не описывая типа.
var
<список идентификаторов переменных>: record
<список 1 идентификаторов полей записи>: <тип полей>;
<список 2 идентификаторов полей записи>: <тип полей>;
………………………………………………………………
<список n идентификаторов полей записи>: <тип полей>;
end;
Запись может быть элементом массива. Такой массив называют массивом записей.
Примеры:
1)
type
child record
f, i: String;
m, d, n: integer;
x, v: Real;
end;
var
a, b, c: child;
2)
var
a, b, c: record
f, i: String;
in, d, n: integer;
r, v: Real;
end;
В примерах 1) и 2) переменные a, b, c в результате описания имеют один и тот же тип и структуру.
3)
type
Point = record
X, Y: Real;
end;
Vector = array[0.. 1] of Point;
Month = (Jan, Feb, Mar, Apr, May, Jun, Jly,
Aug, Sep, Oct, Nov, Dec);
Date= record
D: 1 . . 31;
M: Month;
Y: 1900 .. 1999;
end;
Доступ к конкретному полю записи осуществляется через идентификатор переменной - записи и идентификатор поля, которые разделяются точкой.
Примеры:
a.f
b.r
a. v
c.m
Переменные типа «запись» могут участвовать в операторах присваивания, но никакие операции над ними выполняться не могут. Арифметические или любые другие операции могут выполняться только над отдельными полями записи.
Примеры:
a . f := 'Иванов’ ;
a . i := 'Иван' ;
а . т := 12;
a . d := 23;
a . n : = 6 ;
a . r : = 1.78;
a . v := 63.5;
m: = m + a. r;
t:= а . r / a . v;
С целью облегчить выполнение многократных ссылок к полям одной записи используют оператор присоединения:
with <переменная-запись> do <оператор>;
Внутри оператора, входящего в оператор присоединения, компоненты записи обозначаются с помощью только имён полей (имя переменной-записи перед ними не указывается). Заголовок операторов может содержать список переменных-записей:
with <переменная-запись>{,<переменная-запись>} do <оператор>;
Пример (используем запись из приведённого выше примера):
1)
with a do
begin
f:=’Иванов’ ; n:=6; d:=23; r:=1.78; v:=63.5;
end;
2)
program p41;
{программа осуществляет ввод информации об учащихся класса, выводит на экран введенную информацию и отношение роста ученика к его массе}
const
n:= 30; {количество учеников в классе}
type
child = record {тип запись-информация об ученике}
f, i: String;
m, d, n: integer;
r, v: Real ;
end;
TKlass = array[1.. n] of child;{тип массивa - информация об учащихся класса}
Var
A: TKlass; {экземпляр массива}
i, nr: integer;
t: real;
begin
Write('Введите количество учеников – n , 0 < n < 30 ‘ );
Readln(nr);
{ввод данных}
for i:= 1 to nr do
begin
Writeln(' N ‘ , i) ;
Write('введите фамилию ');
Readln(A[i] . f);
Write('введите имя ');
Readln(A[i] . i);
Write('введите месяц рождения ');
Readln(A[i] . m);
Write('введите день рождения ');
Readln (A [i] .d);
Write('введите рост '); Readln(A[i].r);
Write('введите вес '); Readln(A[i].v);
Write('введите номер парты '}; Readln(A[i].n);
end;
{вывод на экран}
for i:= 1 to nr do
Writeln(i: 2, '/', A[i].f : 10, '/' , A[i].i : 10, '/' , A[i].d : 2,
'/' , A[i].m: 2, '/' , A[i].n : 2, '/ ' , A[i] . r : 4 : 1 , '/' ,
A[i].v: 4 : 1 , '/' , A[i] . r / A [i] .v : 6: 3) ;
end.
Множества
Множество относится к структурным типам данных. Тип «множество» задаёт интервал значений, который является множеством всех подмножеств базового типа. Базовый тип – это перечислимый тип, кроме word, integer, longint. Синтаксис определения типа множества:
<имя типа> = set of <базовый тип>;
Примеры:
Type
Tdigit = set of 0 .. 9;
Tsimv = set of ‘A’ .. ‘Z’ ;
Var
digit : Tdigit ;
simv : Tsimv;
Если переменная типа «множество» описана как set of 1 .. 3, то она может принимать следующие значения: (1, 2, 3), (1, 2), (1, 3), (2, 3), (1), (2), (3), ().
Размер множества равен числу компонент базового типа и может меняться от 0 до 256. Множество может быть пустым. В отличие от массивов, множества содержат переменное количество элементов, для которых порядок следования не важен.
Константы множественного типа записываются с помощью квадратных скобок и списка элементов в них.
Примеры:
Const
alpha = [‘A’ .. ‘Z’ , ‘a’ .. ‘z’ ];
empty = [] ;
digits = [ 0 .. 9] ;
Зарезервированное слово in для определения принадлежности элемента множеству:
if ch in alpha then …
В этом операторе выполняется проверка принадлежности элемента ch множеству alpha. Часто это гораздо проще, чем многократно сравнивать ch с некоторыми элементами.
Множества языка Паскаль обладают свойствами математических множеств. Над ними можно выполнять те же операции. Если S1 и S2 – константы или переменные множественного типа, то S1+ S2 будет их объединением, S1*S2 - пересечением, S1-S2 – разностью. Операции отношений = (равенство), <> (неравенство), <= (является подмножеством), >= (является надмножеством) к множествам применяются, а отношения строго включения < и > - не применяются.
Чтобы добавить в множество какой-либо элемент, можно добавить множество, состоящее из единственного элемента. Либо использовать процедуру include(S,a) , где S – множество, в которое добавляем, a – добавляемый элемент. Имеется и обратная процедура – exclude(S , a) - для исключения элемента из множества. Здесь параметры S и a имеют тот же смысл.
Пример:
program p43;
var
S: set of ‘A’ .. ‘Z’ ;
ch: char;
Begin
S := [ ];
ch := ‘A’;
repeat
S := S+[ch] ;
Inc(ch);
Until ch >= ‘Z’ ;
……………………..