Типы данных, определяемые пользователем



Язык Pascal имеет мощные возможности для конструирования пользователем собственных типов данных. Описание типов данных позволяет создавать такие структуры данных, которые позволяют решать задачи более оптимальными способами, делать решение более наглядным, установить соответствие между принятыми в теоретических исследованиях и реализуемыми в программировании структурами данных.

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

Основными типами структурных данных являются массивы (array) и записи (record).

Массивы

 

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

Формат записи массива через раздел описания типов имеет вид:

Type <имя типа>=array [тип индекса] of <тип компонента>;

Var <идентификатор,…>: <имя типа>;

Формат записи массива через раздал описания переменных:

Var <идентификатор,…>: array [тип индекса] of <тип компонента>;

Массивы различают по количеству индексов: одномермые (1 индекс), двумерные и N-мерные (N индексов).

Пример : Type Vector = array [1..25] of real; {одномерный массив}

                     Matrix = array [1..20, 1..30] of byte; {двумерный массив}

 

Рассмотрим работу с массивами на примере следующей задачи: Даны два массива целых чисел. Вычислить произведение максимального элемента первого массива на минимальный элемент второго массива. Удалить максимальный элемент из первого массива и добавить его во второй массив после минимального.

program example_9;

type massiv=array [1..40] of integer;

var a, b: massiv;

i, n, k, p, j, min, Imin, max, Imax: integer;

begin

                                                                       {ввод массива с клавиатуры}

write('Введите размерность массива А n=');

readln(n);

writeln('Введите элементы массива А');

for i:=1 to n do begin

    write('a[',i,']=');

    readln(a[i]);

    end;

{ввод массива случайным образом}

write('Введите размерность массива В k=');

readln(k);

randomize;                                      {подключение генератора случайный чисел}

for i:=1 to k do

b[i]:=random(16); {заполнение массива случайными числами от 0 до 15}

{Вывод массива на экран}

Writeln('Массив В');

for i:=1 to k do write(b[i],' ');

 

writeln;                                             {пустой оператор вывода}

{Поиск максимального элемента}

max:=a[1];

Imax:=1;

for i:=2 to n do

if a[i]>max then begin

                max:=a[i];                   {максимальный элемент}

                Imax:=i;                       {индекс максимального элемента}

                end;

                                                            {Поиск минимального элемента}

min:=b[1];

Imin:=1;

for i:=2 to n do

if b[i]<min then begin

                min:=b[i];                    {минимальный элемент}

                Imin:=i;                        {индекс минимального элемента}

                end;

                                    {вычисление произведения и его вывод на экран}

p:=min*max;

writeln('Произведение max и min равно ',p);

                                        

{Удаление элемента из массива с позиции Imax}

for i:=Imax to n-1 do

a[i]:=a[i+1];

n:=n-1;                       {Уменьшение количества элементов массива на 1}

                                        

{Вставка элемента в массив после элемента равного min}

i:=1;

while i<k do

begin

if b[i]=min then begin

    for j:=k+1 downto i+1 do b[j]:=b[j-1];     {смещение элементов на один вправо, начиная с последнего}

    k:=k+1;                                     {Увеличение количества элементов на один}

    b[i+1]:=max;                           {Вставка элемента на позицию i+1}

    end;

i:=i+1;                                          {Увеличение счетчика итераций}

end;

                 

{Вывод массивов А и В на экран в строку}

writeln(‘Массив А: ‘);

for i:=1 to n do write(a[i],' ');

writeln;

writeln(‘Массив В: ‘);

for i:=1 to k do write(b[i],' ');

end.

Записи

Запись представляет собой наиболее общий и гибкий структурированный тип данных, так как она может быть организована из не однотипных компонентов и в ней явным образом выражена связь между элементами данных, характеризующими реальный объект. Широко используется при программировании информационно-поисковых систем.

Формат записи:

Type <имя_типа>=record

          <имя_поля1>: тип;

          <имя_поля2>: тип;

              …………………;

           <имя_поля N >: тип

     end ;

Элементы записи называются полями, а обращение к ним производится через использование их имен – идентификаторов полей. Отличие от обычной переменной записи в том, что имена полей должны предваряться ссылкой на идентификатор записи и отделяться от него точкой. Такая запись называется уточняющий идентификатор: <имя_записи>.<имя_поля>

Пример: Описание личных данных учащегося.

Type svedenia=record

         f: string[40];

         dat_r: string[8];

pol: char;

         klass: string[4]

         end;

 

Задача. Пусть нам необходимо иметь сведения о всех учащихся нашего плавания. А затем из общего списка вывести фамилии учеников, которые учатся в 9 классе.

Для этого целесообразно организовать массив записей, потом отобрать только тех, у которых в поле klass есть цифра 9.

program anketa;

type svedenia=record

         f: string[40];

         dat_r: string[8];

       pol: char; 

          klass: string[4]

      end;

var ychen: array [1..100] of svedenia;

i, j: integer;

begin

{Последовательно вводим каждую запись}

for i:=1 to 100 do begin

writeln(‘введите сведения о’, i, ‘-м ученике’);

write (‘введите фамилию и имя ’);

readln (ychen [i].f);

write(‘введите дату рождения’);

readln (ychen [i].dat_r);

write(‘введите класс’);

readln(ychen[i].klass);

end;

writeln(‘ввод закончен’);

writeln;

 

{Просматриваем массив записей и выбираем только учеников 9-го класса}

for i:=1 to 100 do begin

       for j:=1 to Length(ychen [i]. klass) do

                   if ychen [i]. klass[j]=9 then

                           writeln(‘фамилия ученика: ’, ychen[i].fio);

end.

Множества

Множество – это структурированный тип данных, представляющий собой набор взаимосвязанных по какому-либо признаку объектов. В отличие от массивов порядок расположения элементов во множестве не важен.

В выражениях на языке Pascal значения элементов множества указываются в квадратных скобках: [1, 6, 3, 7, 2, 4], [‘a’..’z’]. Множество, не имеющее элементов, называется пустым и обозначается [].

Формат записи множественного типа:

Type <имя типа>=set of <элемент1,…, элемент N >;

Var <идентификатор>:<имя типа>;

Допустимыми операциями над множествами являются: «=», «<>», «>=», «<=», объединения (+), пересечения (*), разности (-) множеств и операция включения (in ). Операция in позволяет проверить принадлежность значения множеству.

Задача: Посчитать количество гласных и согласных букв в предложении.

program Glasn_Sogl;

Type mnoj= set of 'A'..'я';                  {Задаем множество букв русского алфавита}

var glasn, sogl: mnoj;                              

sr: string;                                {строковая переменная sr хранит вводимый текст}

i: byte;                                      {параметр цикла}

g, s: byte;                      {переменные накапливающие количество гласных и согласных букв соответственно}

 

begin

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

 

glasn:=['A','a','O','o','E','e', 'И','и','Ё','ё','У','у', 'Ы','ы','Э','э','Я','я','Ю','ю'];

sogl:=['A'..'я'] – glasn - 'Ъ' - 'ъ' - 'Ь' - 'ь';

 

write('Введите предложение: ');

readln(sr);

                                                      {Обнуляем счетчики количества}

g:=0;

s:=0;

                                     {Просматриваем все элементы предложения и смотрим, содержаться ли они во множествах glasn и sogl}

For i:=1 to Length(sr) do begin

    if sr[i] in glasn then g:=g+1;

    if sr[i] in sogl then s:=s+1;

    end;

 

writeln('В данном предложении ',g,' гласных и ',s,' согласных букв');

end.

 

Файлы

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

Файл – совокупность данных, записанная во внешней памяти под определенным именем.

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

§ ввод больших объемов данных, подлежащих обработке, утомителен и требует большого времени. Гораздо удобнее создать определенный файл данных, который может быть подготовлен заранее и, самое главное, применяться неоднократно;

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

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

Формат записи файла:

          Type <имя типа>=<тип компонентов>;

var < F > : File of <имя типа>;                    {F – файловая переменная, представитель файла в паскале}

< R > : <имя типа>;                                  {переменная доступа к полям записи}

Средства обработки файлов:

Процедура Assign (<Файловая переменная>; <полный путь к файлу >) – связывает файловую переменную с конкретным файлом на внешнем устройстве.

Процедура Reset (<файловая переменная>) – открывает уже существующий файл.

Процедура Rewrite (<файловая переменная>) – создает и открывает новый файл.

Процедура Close (<файловая переменная >) – закрывает открытый файл.

Процедура Rename (<файловая переменная >;<новое имя файла>) – переименование любого неоткрытого файла.

Процедура Erase (<файловая переменная >) – удаление неоткрытого файла.

Условно файлы можно разделить на текстовые, типизированные и нетипизированные.

Текстовый файл – последовательность символов, разбитая на строки длиной от 0 до 256 символов. Для описания используется стандартный тип Text:

                     var F : text;

К типизированным файлам относят файлы строго определенного типа. Чаще всего это файлы, состоящие из записи.

                     Type FR= record

                                 ………

                                 end;

                     var F: file of FR;

Нетипизированные файлы рассматриваются в Pascal как совокупность символов или байтов. для определения в программе нетипизированного файла служит зарезервированное слово File

                  var F : file;

Пример: Прочитать последовательность 6 символов из первой строки текстового файла Input . txt, записать их в обратном порядке в файл Output . txt. Файл Input . txt создан на c :\ temp \

 

program text_file;

var F, R: text;                                      

       st, ts: string[6];

  i: byte;

begin

       assign(F, 'c:\temp\Input.txt');         {связывает переменную F с файлом Input.txt}

       reset(F);                                                  {открывает F для чтения}

  assign(R, 'c:\temp\Output.txt');        {связывает переменную R с файлом Output.txt}

  rewrite(R);                                             {создает и открывает R для записи}

while not Eoln(F) do read(F, st);        {Проверка конца файла, чтение из F в переменную st}

       for i:= 6 downto 1 do ts:=ts+st[i];                {Создание строки перевертыша}

       writeln(R, ts);                                        {Запись в R значения переменной ts}

       close(F);                                                  {закрывает F}

       close(R);                                                  {закрывает R}        

end.

 

Процедуры и функции в Pascal

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

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

Различают два вида подпрограмм - процедуры и функции.

Процедура – это независимая именованная часть программы, которую можно вызвать по имени для выполнения определенных действий. Процедура не может выступать как операнд в выражении. Упоминание в тексте имени процедуры приводит к её активизации и называется вызовом.

Функция – аналогично процедуре, с двумя отличиями: (1) функция передает в точку вызова скалярное значение, (2) имя функции может использоваться в выражении как операнд.

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

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

Procedure <имя_процедуры> (<список формальных параметров>);

Function <имя_функции> (<список формальных параметров>): <тип результата>;

Все подпрограммы располагаются выше начала основной части программы (перед первым begin).

Рассмотрим примеры подпрограмм:

Задача: Организация ввода координат вектора. Вычислить длину вектора. Для начала определим список формальных параметров: входные и выходные данные. Нам потребуется Размерность векторного пространства (k: byte) и переменная х пользовательского типа vector=array[1..100] of real.

Для ввода координат будем использовать procedure, так как выходных данных будет много (его координаты), а так как длина вектора это число, поэтому используем function.

 

program pro;

type vector=array [1..100] of real;

var k: byte;

dl:real;

x: vector;

 

procedure vvod (var y:vector);                               {Процедура ввода вектора}       

var i:byte;

     begin

         writeln('Введите координаты вектора');

         for i:=1 to k do

         readln(y[i]);

     end;

 

function dlvec(y:vector):real;           {Функция вычисления длины вектора}          

var i:byte;

  s:real;

     begin

      for i:=1 to k do

      s:= s+ sqr(y[i]);

      dlvec:= sqrt(s);                {Обязательно в конце нужно имени функции присвоить вычисленное значение} 

     end;

begin

write(' Введите размерность векторного пространства k=');

readln(k);

vvod(x);                                                             {вызов процедуры}          

dl:=dlvec(x);                                                                 {вызов функции}   

writeln('Длина вектора Х равна', dl: 8: 2);

end.

 


Дата добавления: 2020-11-15; просмотров: 92; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!