Производные типы

К. Хоор, «О структурной  организации данных»

Абстракция - один из основных способов познания и представления явлений окружающего мира. Абстракция – мысленное выделение существенных свойств и связей предметов и отвлечение от других частных свойств.
Часто программа должна имимтировать объекты реального мира. Так как каждый реальный объект уникален, для его описания требуется перечислить бесконечное множество свойств (большинству из которых даже не придумано названий). Человек не любит бесконечности, боится ее. Примерами бесконечности являются Космос и Вечность. И то и другое является манящим, но в то же время загадочным, пугающим, недостижимым. Поэтому в обычной жизни человек пользуется более простыми понятиями (если не хочет произвести впечатление на окружающих). Определение любого реального объекта мы сводим к небольшому набору свойств. Например, для того чтобы описать конкретную собаку, мы опишем ее размер, цвет, породу, может быть еще какие-нибудь свойства. Но мы не сможем описать описать каждый волосок этой собаки. Мы можем рассказать, как она играет, как она ест, но это не определит ее поведения во всех остальных случаях. Мы создаем некоторый фонтом, обладающий некоторыми свойствами данного объекта.

Это объясняется также тем, что человек может воспринимать только очень ограниченный набор свойств, причем у отдельных представителей конкретное свойство (например, цвет) воспринимается слегка по-разному. Поэтому нет смысла описывать цвет собаки по имени Дик в ультрафиолетовом диапазоне – никто не сможет это оценить без специальных приборов.
Резюме: для описания объекта человек пользуется конечным множеством  свойств.
Можно описать объект двумя основными способами – через набор основных свойств (собака Дик: живое существо, млекопитающее, 4 конечности, хвост, …, цвет коричневый, рост – 54 см, ….), или описав отличительные свойства данного экземпляра по сравнению с остальными экземплярами подобного типа (собака Дик: цвет коричневый, рост – 54 см, ….). Второй способ существенно короче первого. Но представьте себе недоумение индейца из глухих лесов Амазонки, который впервые оказался в современном городе и на вопрос о существе, довезшем его до гостиницы, получившем ответ: «Это автомобиль Кадилак».

Возвращаясь к программированию, можно вспомнить, что программа - это набор действий над объектами (данными). Эти объекты могут быть описаны с помощью каких-то свойств. Язык программирования Fortran предлагает программисту несколько наборов этих свойств - стандартные типы данных (real, integer,...). Если этих наборов не хватает, можно создать свой собственный тип и использовать его для создания объектов с заданным нобором свойств.
Синтакс описания пользовательского типа днных:
TYPE [[, access] :: ] name
     component-definition
     [component-definition]. . .
END TYPE [ name ]

name - имя нового типа данных, component-definition - описание компонента. Описание компонента - это обычный оператор описания типа. Компоненты - это и есть свойства этого типа.

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


TYPE pair
     INTEGER i, j
END TYPE

Теперь существует тип pair, который содержит 2 компонента - i и j.

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

TYPE (pair) a
TYPE (pair),  DIMENSION (2, 2) :: ar, b(3)

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

имя_переменной%имя_компонента.

Например:

a%i=5
a%j=12

Студент для деканата после сессии выглядит так: ФИО, оценки.

Тогда его можно описать следующим типом данных:

TYPE Student 
    character*20 NAME
    character*20 SNAME 
    character*20 TNAME
    integer MARKS(5)
end TYPE Student

Тогда для вызова подпрограммы печати оценок необходимо написать

call PrtStdMarks( NAME,SNAME, TNAME,MARKS )

Значительно удобнее

module m_student
! создаем новый тип данных 
 TYPE Student 
    character*20 NAME
    character*20 SNAME 
    character*20 TNAME
    integer MARKS(5)
 end TYPE Student
end module m_student

subroutine PrtStdMarks(std)
 use m_student	! для того, чтобы подпрограмма "видела" описание 
 TYPE (Student) std
 print*,std%NAME,std%marks(2)
end

use m_student	! для того, чтобы программа "видела" описание 
TYPE (Student) Ivanov
! задание начальных значений с помощью конструктора
Ivanov=Student('Ivanov','ivan','ivanovich',[1,2,3,4,5])
Ivanov%marks(2)=4
call  PrtStdMarks(Ivanov)
end 


Hosted by uCoz