
Готовое_КР_Калькулятор_индекса_массы_тела
.pdfВ ходе выполнения курсовой работы были выполнены следующие задачи:
1.Проведен анализ существующих инструментов для разработки ПО под ОС «Аврора» и определен среди них наиболее подходящий;
2.Спроектирован пользовательский интерфейс приложения в соответствии с принятыми стандартами целевой операционной системы;
3.Реализована логика расчета массы тела по модифицированной формуле Кетле с учетом пола и индекса Соловьева;
4.Проведено ручное тестирование разработанного приложение для
обеспечения ее корректной работы.
С использованием среды разработки «Аврора SDK» было разработано мобильное приложение, которое полностью соответствует техническому заданию и реализующее следующий функционал:
▪ввод данных должен производиться с использованием экранной клавиатуры;
▪вывод на экран результатов должен происходить после заполнение всех полей;
▪после вывода на экран информация, должна содержать в себе сведение о типе телосложение, коэффициент индекса массы тела, цветовые категории индекса массы тела, диапазон верхнего и нижнего предела нормального веса;
▪приложение должно краткую информацию о себе и лицензию.
Курсовой проект был разработан и защищен в срок, согласно датам,
указанным этапах разработки находящихся техническом задание. Разработанное приложение функционально и позволяет в полной мере выполнять поставленные задачи по расчету индекса массы тела человека.
44
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1.Указ Президента Российской Федерации "О мерах по обеспечению технологической независимости и безопасности критической информационной инфраструктуры Российской Федерации." от 30.03.2022. № 166 // Официальный интернет-портал правовой информации. – 2022
2.Sailfish OS - MeeGo revived to give best alternative to Tizen OS : // techtracker.in URL: https://www.techtracker.in/2022/04/sailfish-os-jolla-revives- meego-and.html (дата обращения: 29.05.2025).
3.Операционная система Аврора 5.1.3 // Портал разработчиков ОС Аврора URL: https://developer.auroraos.ru/release_notes/os_5.1.3.85 (дата обращения:
29.05.2025).
4. Аврора сертификат ФСБ // Документация ОС Аврора URL: https://docs.auroraos.ru/files/%D0%90%D0%B2%D1%80%D0%BE%D1%80%D0
%B0%20%D0%A4%D0%A1%D0%91.pdf (дата обращения: 29.05.2025).
5. Муравейко А.Ю. Альтернативные операционные системы / А.Ю. Муравейко // Материалы научно-технической конференции. «Перспективное развитие науки и технологий – 2020». – Курск : ЮЗГУ 30 октября 2020. – С. 169–
173.
6.Балабаев С.А. Оценка вычислительных возможностей мобильных устройств на платформе ОС Аврора / С.А. Балабаев, С.А. Лупин // Материалы научно-технической конференции. «Микроэлектроника и информатика – 2023».
–Зеленоград : НИУ МИЭТ 20–21 апреля 2023. – С. 51–56.
7.Мобильные устройства на ОС Аврора // auroraos.ru URL: https://auroraos.ru/devices (дата обращения: 29.05.2025).
8.Неретин В.М. Исследование возможности подключения к устройствам умного дома с помощью Aurora OS // В.М. Неретин, П.С. Новиков // Вестник науки : журнал. – 2024. № 1. – С. 490–497.
9.About Qt // Qt wiki URL: https://wiki.qt.io/About_Qt (дата обращения:
29.05.2025).
45

ПРИЛОЖЕНИЕ А
Листинг A.1 — Mainpage.qml
import QtQuick 2.0
import Sailfish.Silica 1.0
Page {
objectName: "mainPage"
SilicaListView {
anchors.fill: parent
header: Column {
width: parent.width
height: header.height + mainColumn.height + Theme.paddingLarge
PageHeader { id: header
title: "ИМТ" extraContent.children: [
IconButton {
objectName: "aboutButton"
icon.source: "image://theme/icon-m-about" anchors.verticalCenter: parent.verticalCenter onClicked:
pageStack.push(Qt.resolvedUrl("AboutPage.qml"))
}
]
}
Column {
id: mainColumn width: parent.width
spacing: Theme.paddingLarge
TextField { id: weight
focus: true
inputMethodHints: Qt.ImhFormattedNumbersOnly label: qsTrId("введите вес в кг")
EnterKey.iconSource: "image://theme/icon-m-enter-next" EnterKey.onClicked: height.focus = true
}
TextField { id: height
focus: true
inputMethodHints: Qt.ImhFormattedNumbersOnly label: qsTrId("введите рост в см")
EnterKey.iconSource: "image://theme/icon-m-enter-next" EnterKey.onClicked: circle.focus = true
}
TextField { id: circle
focus: true
inputMethodHints: Qt.ImhFormattedNumbersOnly label: qsTrId("окружность запястья в см")
}
ComboBox {
id: combo
46

Продолжение листинга A.1
label: qsTrId("Выберите пол:") currentIndex: 0
menu: ContextMenu {
MenuItem {
//% "automatic"
text: qsTrId("мужской")
}
MenuItem {
//% "manual"
text: qsTrId("женский")
}
}
}
Button {
id: calculateButton
anchors.horizontalCenter: parent.horizontalCenter text: "ВЫЧИСЛИТЬ"
onClicked: onCalculateClicked()
}
Label {
id: result1
anchors.horizontalCenter: parent.horizontalCenter
}
Label {
id: result2
anchors.horizontalCenter: parent.horizontalCenter
}
Label {
id: result3
anchors.horizontalCenter: parent.horizontalCenter
}
}
function onCalculateClicked(){ var h=Number(height.text); var w=Number(weight.text); var c=Number(circle.text); if
(isNullInField(height.text)||isNullInField(weight.text)||isNullInField(circle.
text)){
result1.text = "Заполните все поля!"; result2.text = "";
result3.text = ""; return;
}
var gen,index,s;
if (combo.currentIndex===0){ gen=19;
}else{
gen=16;
}
h=h/100;
index=w/(h*h);
index=index*(gen/c); if(index<16)s="дефицит веса";
else if(index>=16&&index<20)s="Недостаточный вес"; else if(index>=20&&index<25)s="Норма";
47

Продолжение листинга A.1
else if(index>=25&&index<30)s="Предожирение";
else if(index>=30&&index<35)s="Первая степень ожирения"; else if(index>=35&&index<40)s="Вторая степень ожирения"; else s="Морбидное ожирение";
result1.text = somatoType(gen,c) + "\nИМТ="+index.toFixed(2);
result2.text = s if(s==="Норма"){
result2.color = "green" }else{
result2.color = "red"
}
result3.text = normalMassMin(c,h,gen) + "\n" + normalMassMax(c,h,gen);
}
function isNullInField(p){ return p.length === 0;
}
function normalMassMin(x,y,z){ var im=x*(y*y)/z;
return "Нижний предел нормального веса:\n"+20*im.toFixed(2)+" кг";
}
function normalMassMax(x,y,z){ var im=x*(y*y)/z;
return "Верхний предел нормального веса:\n"+25*im.toFixed(2)+"
кг";
}
function somatoType(a,b){ var s="";
var asthenic = "Тип телосложения: астенический.";
var normosthenic = "Тип телосложения: нормостенический"; var hypersthenic = "Тип телосложения: гиперстенический"; switch(a){
case 19: if(b<18)s=asthenic;
else if(b>=18&&b<=20)s=normosthenic; else s=hypersthenic;
break; case 16:
if(b<15)s=asthenic;
else if(b>=15&&b<=17)s=normosthenic; else s=hypersthenic;
break;
default:
break;
}
return s;
}
}
VerticalScrollDecorator {}
}
}
Листинг A.2 — AboutPage.qml
import QtQuick 2.0
import Sailfish.Silica 1.0 Page {
objectName: "aboutPage" allowedOrientations: Orientation.All SilicaFlickable {
objectName: "flickable" anchors.fill: parent
48

Продолжение листинга A.2
contentHeight: layout.height + Theme.paddingLarge Column {
id: layout objectName: "layout" width: parent.width PageHeader {
objectName: "pageHeader"
title: qsTr("About Application")
}
Label {
objectName: "descriptionText"
anchors { left: parent.left; right: parent.right; margins: Theme.horizontalPageMargin }
color: palette.highlightColor font.pixelSize: Theme.fontSizeSmall textFormat: Text.RichText
wrapMode: Text.WordWrap
text: qsTr("#descriptionText")
}
SectionHeader {
objectName: "licenseHeader"
text: qsTr("3-Clause BSD License")
}
Label {
objectName: "licenseText"
anchors { left: parent.left; right: parent.right; margins: Theme.horizontalPageMargin }
color: palette.highlightColor font.pixelSize: Theme.fontSizeSmall textFormat: Text.RichText
wrapMode: Text.WordWrap text: qsTr("#licenseText")
}
}
}
}
Листинг A.3 — bmi.qml
import QtQuick 2.0
import Sailfish.Silica 1.0 ApplicationWindow {
objectName: "applicationWindow"
initialPage: Qt.resolvedUrl("pages/MainPage.qml") cover: Qt.resolvedUrl("cover/DefaultCoverPage.qml") allowedOrientations: defaultAllowedOrientations
}
Листинг A.4 — main.cpp
#include <auroraapp.h> #include <QtQuick>
int main(int argc, char *argv[])
{
QScopedPointer<QGuiApplication> application(Aurora::Application::application(argc, argv));
application->setOrganizationName(QStringLiteral("ru.alexkdeveloper")); application->setApplicationName(QStringLiteral("bmi")); QScopedPointer<QQuickView> view(Aurora::Application::createView()); view-
>setSource(Aurora::Application::pathTo(QStringLiteral("qml/bmi.qml"))); view->show();
return application->exec();
}
49