Описание
Тип данных в языке Pascal представляет собой древовидную структуру, в листьях которой записаны базовые (предопределенные) типы данных (такие, как Integer или Char), а во внутренних узлах – конструкторы, позволяющие из одних типов данных строить другие (например, Array или Record). Вершины, соответствующие листьям, называются элементами данного типа

Имеются описания типов данных, взятые из первых строк программы, написанной на языке Turbo Pascal 7.0 (см. пример входного файла), и последовательность запросов, каждый из которых касается одного из описанных типов. Всего существует три вида запросов:

  • SizeInBytes(<Имя типа>) - определить, какое количество байт памяти занимает переменная указанного типа

  • SizeInBits(<Имя типа>) - найти количество бит, необходимых для хранения переменной указанного типа при условии, что для каждого элемента этой переменной отводится минимально возможное число бит, способных закодировать все возможные значения этого элемента

  • <Имя типа>($<Последовательность 16-х цифр>) - по дампу (т.е. содержимому) участка памяти, занимаемому переменной указанного типа, определить значения всех элементов этой переменной.
     

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

Процесс разработки Вашей программы постройте по следующей схеме:

  1. Научите Вашу программу воспринимать стандартные типы данных, используемые в языке Turbo Pascal 7.0

  2. Введите перечислимый тип и тип-диапазон, граничные значения которого заданы константами

  3. Реализуйте конструкторы типов данных

  4. Добавьте возможность использования функций и операций при построении константного выражения

  5. Реализуйте остальные возможности, допускаемые языком
     

Входные данные
Входной файл начинается с ключевого слова "
Definitions", за которым следуют описания типов данных. Далее следует ключевое слово "Queries" и список запросов. Каждый запрос записан в отдельной строке входного файла. Учтите, что длина строки с запросом может превышать 255 символов

Выходные данные
Ваша программа должна вывести в выходной файл результаты обработки запросов в том же порядке, в котором запросы встречаются во входном файле. На запрос первого или второго вида в отдельную строку выходного файла следует выдать сообщение "
Type <Имя типа> requires x bytes/bits", где x - искомое целое число. На запрос третьего вида необходимо перечислить значения всех элементов переменной указанного типа в том порядке, в котором эти элементы хранятся в оперативной памяти. Для каждого из элементов в отдельную строку выходного файла следует выдать строку "<Имя элемента> = <Значение>". Формат выходного файла должен соответствовать приведенному ниже примеру


Например:

DATATYPE.IN
Definitions
Type TClass = 1..11;
        TScore = 0..100;
        TTour = 1..10;
        TStrange = Array [1..SizeOf(Input) Div Ord('A')] Of Boolean;
        TExample = Record a : Array [1..2] Of Record b,c : Set Of 0..2 End
                          End ;
        TShortStr = String [3];

Type TParticipant = Record Sex : (Male, Female);
        Name : String [20];
        Class : TClass;
        Place : ShortInt;
        TotalSum : 0..High(TScore)*(High(TTour)-Low(TTour)+1);
        DayScores : Array [TTour] Of TScore;
End ;

{ Команда России для участия в международной олимпиаде }
TTeam = Array [1..5] Of TParticipant;

Queries
SizeInBytes(TStrange)
SizeInBits(TClass)
SizeInBits(TShortStr)
TParticipant( $ 01118AAEABECE6AEA2A02091A2A5E2ABA0ADA00000000A0B4501461D082319501C280A00 )
TExample( $01020304 )
SizeInBits(TParticipant)



DATATYPE.OUT
Type TStrange requires 3 bytes
Type TClass requires 4 bits
Type TShortStr requires 26 bits
Sex = Female
Name = 'Кольцова Светлана'
Class = 10
Place = 11
TotalSum = 325
DayScores[1] = 70
DayScores[2] = 29
DayScores[3] = 8
DayScores[4] = 35
DayScores[5] = 25
DayScores[6] = 80
DayScores[7] = 28
DayScores[8] = 40
DayScores[9] = 10
DayScores[10] = 0
a[1].b = [0]
a[1].c = [1]
a[2].b = [0,1]
a[2].c = [2]
Type TParticipant requires 258 bits







Комментарии

Задача авторами не комментировалась
 



Решение
Учитывая, что объем исходного кода этой задачи значительный и составляет около 140Kb, что достаточно трудоемко для посетителей проекта, не использующих выделенные линии или спутниковую связь, принято решение разместить решение на отдельной странице, загрузить/закачать которую, при необходимости, можно с сервера проекта по этой ссылке (после загрузки расширение ххх замените на rar)

 


© Особенности национальных задач по информатике