Лабораторная №6 — задание 6.1A #
Нужно написать спецификацию семантики типов данных в своём языке программирования и внести связанные изменения в другие файлы спецификаций.
Порядок выполнения. #
Изменения зависят от особенностей вашего языка — это описано далее.
- Определите, какие три типа данных вы будете поддерживать — см. варианты ниже
- Напишите примеры программ под каждый тип данных — см. информацию ниже
- Создайте в проекте файл
docs/specification/types.mdдля спецификации семантики типов - Напишите спецификацию, учитывая предлагаемую структуру и список особенностей ниже
- Проверьте остальные документы в
docs/specifications- не допускаются противоречия между разными документами
- нежелательно дублировать информацию между разными документами
Варианты наборов типов данных #
Выберите для своего языка три типа данных из списка ниже:
- Строковый тип — как
stringв C# - Целые числа (32-битные либо 64-битные) — как
intилиlongв C# - Числа с плавающей точкой — как
doubleв C# - Числа с плавающей точкой в десятичной системе счисления — как
decimalв C# - Булев тип — как
boolв C# - Символьный тип — как
charв C# либо какchar8_t,char16_tилиchar32_tв C++
Кроме того, надо поддерживать пустой (выражение без возвращаемого типа) — как void в C#
Уточнения:
- Вы можете поддерживать большее число типов, но это не рекомендуется.
- Как минимум один из типов должен быть числовым
- Как минимум один из типов должен быть нечисловым — то есть строковым, символьным или булевым
Выбор примеров программ #
Выберите и напишите два-три примера программ так, чтобы продемонстрировать работу каждого из типов данных.
Список возможных примеров:
- ReverseString — читает строку, переворачивает её символы и печатает результат
- Пример: “Hello world!” → “!dlrow olleH”
- Подсказка: используйте технику двух указателей (two pointers) для переворота строки
- CheckPalindrome — читает строку и печатает “yes”, если это палиндром, а иначе печатает “no”
- Палиндром — это строка, которая читается одинаково как слева направо, так и справа налево
- Подсказка: используйте технику двух указателей (two pointers) для проверки на палиндром
- Вы должны сделать проверку нечувствительной к регистру
- Пример: “Hello” → “no”
- Пример: “Anna” → “yes”
- ToLower — читает строку, переводит все её символы в нижний регистр и печатает результат
- Пример: “Hello world!” → “hello world!”
- CountVowels — читает строку и выводит число гласных букв английского алфавита в этой строке
- Пример: “Hello world!” → “3”
- ValidateIpv4 — читает строку и проверяет, что это допустимый IPv4 адрес
- Для допустимых адресов печатает “yes”
- Для недопустимых печатает “no”
- FizzBuzz — читает число за числом в цикле и далее печатает:
- “Fizz”, если число делится на 3
- “Buzz”, если делится на 5
- “FizzBuzz”, если число делится и на 3, и на 5
- Само число в остальных случаях
- ValidateDate — читает дату в формате “YYYY-MM-DD” и проверяет корректность указанной даты
- Для допустимых дат печатает “yes”
- Для недопустимых печатает “no”
- Следует поддерживать как минимум даты в диапазоне от 1000-01-01 до 2999-12-31
- Пример: “2025 february 10” → “no”
- Пример: “2025-02-10” → “yes”
- Пример: “2025-02-29” → “no”
- IsLeapYear — читает номер года, проверяет, является ли он високосным, печатает “yes” или “no”
- Проверять надо согласно григорианскому календарю
- Пример: “2025” → “no”
- Пример: “2024” → “yes”
- Пример: “1600” → “no”
- Пример: “2000” → “yes”
Предлагаемая структура документа #
Можно задать следующие разделы:
| Название | Что содержит |
|---|---|
| Краткое описание | Список типов данных и ключевые принципы |
| Литералы | Описание литералов для всех типов данных |
| Операторы | Семантика операторов для всех типов данных |
| Переменные | Семантика объявлений и присваиваний переменных |
Вопросы на подумать #
Ниже перечислены вопросы, над которыми стоит подумать при написании спецификации.
Объявление переменных и присваивания #
- Обязательно ли указывать тип переменной? Если нет, то как выводятся типы (как работает type inference)?
- Можно ли изменить тип переменной присваиванием?
Преобразования типов #
- Разрешены ли неявные преобразования?
- Разрешены ли явные преобразования?
- Какие встроенные функции позволяют преобразовывать типы данных?
- Пример: функция
ord(c: char): intпреобразует символ в число, представляющее его ASCII-код - Пример: функция
parseInt(s: string): intпреобразует строку в число, интерпретируя входную строку как запись числа в десятичной системе счисления
- Пример: функция
Целочисленный тип #
- Сколько байт вмещает целочисленный тип?
- Как преобразовать целое число в другие поддерживаемые типы данных?
Числа с плавающей точкой #
- Какие операции поддерживаются для чисел с плавающей точкой?
- Какой формат чисел с плавающей точкой — IEEE 754 binary32 (как float в C#), IEEE 754 binary64 (как double в C#) или иной?
Булев тип данных #
- Для каких операторов следует реализовать вычисление по короткой схеме (short-circuit evaluation)?
- Как преобразовать число в булев тип?
- Как напечатать значение булева типа?
Строковый тип #
- Как преобразовать строку в число и обратно?
- Строки поддерживают только ASCII или ещё и подмножество Unicode?
- В какой кодировке хранятся символы в строке (ASCII, UTF-8, UTF-16, UTF-32)?
- Как конкатенировать строки?
- Как выделить подстроку?
Символьный тип #
- К какой кодировке относится символ?
- ASCII — 1-байтные символы с кодами 0..127
- UCS-2 — 2-байтные символы, соответствующие символам Basic Multilingual Plane в Unicode
- Unicode — 4-байтные символы
- Как преобразовать символ в целое число и обратно?