Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие_2_изд_испр.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.27 Mб
Скачать

10.9. Пользовательские типы данных

В языке Basic отсутствует такой вид совокупности данных как структура, который весьма удобен при реализации многих приложений. Это ограничение можно обойти, используя определение пользовательского типа данных. В языке C структуры определены, однако при их объявлении необходимо записывать ключевое слово struct, которое нарушает единый стиль объявления объектов программы. Кроме того, иногда желательно подчеркнуть природу объекта программы, задав ему соответствующее имя типа. Например, массив из 2 элементов можно определить как точку на плоскости. Тогда имя типа point (точка) сразу подскажет, что данный массив определяет координаты точки на плоскости.

10.9.1. Инструкция type (b)

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

type <имя_типа>

<элемент>

[<элемент>]

...

end type

<элемент>:=<имя_элемента>[([индексы])] as <тип>

Пример. Описание звезды.

type star

nom_GC as long ' Номер по каталогу GC

mv as single ' Блеск (звездная величина)

spectr as string*5; ' Спектр. класс

alfa as double ' Прямое восхождение

delta as double ' Склонение

mu_alfa as double ' Собственное движение по alfa

mu_delta as double ' ------------------- ------------- по delta

rem as string*15 ' Особенности (примечания)

end type

После описания типа можно определить произвольное число переменных и массивов этого типа.

Пример.

dim RefStar as star, ViewStar as star, Pattern( ) as star

Элементы пользовательского типа (структуры) иногда называют полями. Обращение к элементу (полю) имеет вид:

<имя_типа>.<имя_поля>

Пример.

RefStar.alfa ViewStar.spectr

Замечание. Инструкция type должна записываться перед текстом процедуры в области деклараций.

10.9.2. Инструкция typedef (c)

Формат:

typedef

<описание_типа>

<имя-типа>;

Пример.

typedef struct{

long nom_GC; // Номер по каталогу GC

float mv; // Блеск (звездная величина)

char spectr[5]; // Спектр. класс

double alfa; // Прямое восхождение

double delta; // Склонение

double mu_alfa; // Собственное движение по alfa

double mu_delta; // ------------------- -------------- по delta

char rem[15]; // Особенности (примечания)

}star;

После описания типа star переменные объявляются без ключевого слова struct:

star RefStar, ViewStar;

Обращение к полям выполняются аналогично языку Basic:

RefStar.alfa ViewStar.rem[4]

Замечание. Указание имени структуры при обращении к ее элементу обязательно.

10.10. Преобразование типов

Различают автоматические преобразования, которые выполняются транслятором в случае вхождения в состав выражения объектов разных типов, и явные преобразования, задаваемые указанием программиста.

10.10.1. Автоматические преобразования

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

Для языка C это можно выразить следующими цепочками:

charshortintlongdouble floatdouble

Для языка Basic:

byteintegerlongdouble singledouble

Это позволяет не терять точности представления данных при преобразовании.

В языке Basic допустимо преобразование из числа в строку и обратно. Для успешного преобразования из строки в число необходимо, чтобы содержание строки могло быть интерпретировано как число в любой форме представления. Число в строку преобразуется всегда успешно.

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