// 2025-2026 Богданович Давид Когут Прихожденко (кдб.дійсність.укр)
взяти визначення КД;
взяти визначення мавка;
взяти визначення мавка/розбирач;
простір мавка {
внутрішня дія КД_виділити_сиру_памʼять(система: *КД::Система, розмір: природне) -> *п8 {
змінна М = система.дані як *Машина;
вернути виділити<п8>(М, розмір);
}
внутрішня дія КД_перевиділити_сиру_памʼять(система: *КД::Система, значення: *п8, новий_розмір: природне) -> *п8 {
змінна М = система.дані як *Машина;
вернути перевиділити<п8>(М, значення, новий_розмір);
}
внутрішня дія КД_звільнити_сиру_памʼять(система: *КД::Система, значення: адреса) {
змінна М = система.дані як *Машина;
звільнити(М, значення);
}
дія перекодувати_ю8_в_кд(М: *Машина, значення: ю8, вихід: *кд, вихід_позиції_помилки: *природне) -> логічне {
змінна система_КД = КД::Система {
дані = М,
виділити_сиру_памʼять = КД_виділити_сиру_памʼять,
звільнити_сиру_памʼять = КД_звільнити_сиру_памʼять,
перевиділити_сиру_памʼять = КД_перевиділити_сиру_памʼять
};
вернути КД::перекодувати_з_ю8(
система_КД::адреса,
значення,
ні,
так,
вихід,
вихід_позиції_помилки
);
}
дія перекодувати_кд_в_ю8(М: *Машина, значення: кд, вихід: *ю8, вихід_позиції_помилки: *природне) -> логічне {
змінна система_КД = КД::Система {
дані = М,
виділити_сиру_памʼять = КД_виділити_сиру_памʼять,
звільнити_сиру_памʼять = КД_звільнити_сиру_памʼять,
перевиділити_сиру_памʼять = КД_перевиділити_сиру_памʼять
};
вернути КД::перекодувати_в_ю8(
система_КД::адреса,
значення,
так,
вихід,
вихід_позиції_помилки
);
}
дія розібрати_число_з_кд(М: *Машина, значення: кд, вихід: *р64) -> логічне {
змінна відʼємне = ні;
змінна результат = р64(0.0);
змінна п = природне(0);
змінна знак = п8(0);
якщо значення.дані[п] == мавка::розбирач::Велика_буква_Е або значення.дані[п] == мавка::розбирач::КД_мала_буква_е { // е або Е
вернути ні;
}
якщо значення.дані[п] == мавка::розбирач::КД_РИСКА { // -
відʼємне = так;
п += 1;
}
знак = значення.дані[п];
поки п < значення.розмір {
знак = значення.дані[п];
якщо знак >= мавка::розбирач::КД_0 і знак <= мавка::розбирач::КД_9 {
результат = результат * 10.0 + (р64(знак) - р64(мавка::розбирач::КД_0));
} інакше якщо знак == мавка::розбирач::КД_ПІДРИСКА { // _
// ігноруємо
} інакше якщо знак == мавка::розбирач::КД_КРАПКА { // .
п += 1;
знак = значення.дані[п];
змінна дробна_частина = р64(0.0);
змінна дільник = р64(1.0);
поки п < значення.розмір {
знак = значення.дані[п];
змінна ігнор = ні;
якщо знак >= мавка::розбирач::КД_0 і знак <= мавка::розбирач::КД_9 {
дробна_частина = дробна_частина * 10.0 + (р64(знак) - р64(мавка::розбирач::КД_0));
} інакше якщо знак == мавка::розбирач::КД_ПІДРИСКА { // _
ігнор = так;
} інакше якщо знак == мавка::розбирач::Велика_буква_Е або знак == мавка::розбирач::КД_мала_буква_е { // е (наукова нотація)
результат = результат + дробна_частина / дільник;
якщо відʼємне {
результат = -результат;
}
// Розбираємо експоненту
п += 1;
якщо п >= значення.розмір {
вернути ні;
}
змінна експонента_відʼємна = ні;
знак = значення.дані[п];
якщо знак == мавка::розбирач::КД_РИСКА { // -
експонента_відʼємна = так;
п += 1;
} інакше якщо знак == мавка::розбирач::КД_ХРЕСТИК { // +
п += 1;
}
якщо п >= значення.розмір {
вернути ні;
}
змінна експонента = ц32(0);
поки п < значення.розмір {
знак = значення.дані[п];
якщо знак >= мавка::розбирач::КД_0 і знак <= мавка::розбирач::КД_9 {
експонента = експонента * 10 + (ц32(знак) - ц32(мавка::розбирач::КД_0));
} інакше якщо знак == мавка::розбирач::КД_ПІДРИСКА { // _
// ігноруємо
} інакше {
вернути ні;
}
п += 1;
}
якщо експонента_відʼємна {
експонента = -експонента;
}
// Застосовуємо експоненту: результат * 10**експонента
змінна степінь = мавка::піднести_до_степеня_р64(М, 10.0, р64(експонента));
результат = результат * степінь;
вихід::вміст = результат;
вернути так;
} інакше {
вернути ні;
}
п += 1;
якщо не ігнор {
дільник = дільник * 10.0;
}
}
результат = результат + дробна_частина / дільник;
якщо відʼємне {
результат = -результат;
}
вихід::вміст = результат;
вернути так;
} інакше якщо знак == мавка::розбирач::Велика_буква_Е або знак == мавка::розбирач::КД_мала_буква_е { // е (наукова нотація)
якщо відʼємне {
результат = -результат;
}
// Розбираємо експоненту
п += 1;
якщо п >= значення.розмір {
вернути ні;
}
змінна експонента_відʼємна = ні;
знак = значення.дані[п];
якщо знак == мавка::розбирач::КД_РИСКА { // -
експонента_відʼємна = так;
п += 1;
} інакше якщо знак == мавка::розбирач::КД_ХРЕСТИК { // +
п += 1;
}
якщо п >= значення.розмір {
вернути ні;
}
змінна експонента = ц32(0);
поки п < значення.розмір {
знак = значення.дані[п];
якщо знак >= мавка::розбирач::КД_0 і знак <= мавка::розбирач::КД_9 {
експонента = експонента * 10 + (ц32(знак) - ц32(мавка::розбирач::КД_0));
} інакше якщо знак == мавка::розбирач::КД_ПІДРИСКА { // _
// ігноруємо
} інакше {
вернути ні;
}
п += 1;
}
якщо експонента_відʼємна {
експонента = -експонента;
}
// Застосовуємо експоненту: результат * 10**експонента
змінна степінь = мавка::піднести_до_степеня_р64(М, 10.0, р64(експонента));
результат = результат * степінь;
вихід::вміст = результат;
вернути так;
} інакше {
вернути ні;
}
п += 1;
}
якщо відʼємне {
результат = -результат;
}
вихід::вміст = результат;
вернути так;
}
}