diff --git a/lab10/README.md b/lab10/README.md
new file mode 100644
index 0000000..d64662c
--- /dev/null
+++ b/lab10/README.md
@@ -0,0 +1,14 @@
+# Лабораторна робота № 10
+
+Тема Реалізація програмних модулів оброблення даних складових типів з файловим введенням/виведенням
+
+Мета роботи полягає у набутті ґрунтовних вмінь і практичних навичок реалізації у Code::Blocks IDE мовою програмування С++ програмних модулів створення й оброблення даних типів масив, структура, об’єднання, множина, перелік, перетворення типів даних, використання файлових потоків та функцій стандартних бібліотек для оброблення символьної інформації.
+
+Завдання
+1. Реалізувати програмні модулі розв’язування задач 10.1–10.3 як складові статичної бібліотеки libModulesMykhailenko.а (проект ModulesMykhailenko лабораторних робіт No 8–9).
+2. Реалізувати тестовий драйвер автоматизованої перевірки програмних модулів розв’язування задач 10.1–10.3.
+
+Варіант № 1
+
+
+Кропивницький | ЦНТУ | 2023
diff --git a/lab10/Report/Report.pdf b/lab10/Report/Report.pdf
new file mode 100644
index 0000000..f9c7dfb
Binary files /dev/null and b/lab10/Report/Report.pdf differ
diff --git a/lab10/Software/TestDriver.exe b/lab10/Software/TestDriver.exe
new file mode 100755
index 0000000..ad831fe
Binary files /dev/null and b/lab10/Software/TestDriver.exe differ
diff --git a/lab10/TestSuite/TS_Unit1.doc b/lab10/TestSuite/TS_Unit1.doc
new file mode 100644
index 0000000..b12c2d2
Binary files /dev/null and b/lab10/TestSuite/TS_Unit1.doc differ
diff --git a/lab10/TestSuite/TS_Unit2.doc b/lab10/TestSuite/TS_Unit2.doc
new file mode 100644
index 0000000..756025b
Binary files /dev/null and b/lab10/TestSuite/TS_Unit2.doc differ
diff --git a/lab10/TestSuite/TS_Unit3.doc b/lab10/TestSuite/TS_Unit3.doc
new file mode 100644
index 0000000..061e004
Binary files /dev/null and b/lab10/TestSuite/TS_Unit3.doc differ
diff --git a/lab10/prj/ModulesMykhailenko.h b/lab10/prj/ModulesMykhailenko.h
new file mode 100644
index 0000000..4ad7780
--- /dev/null
+++ b/lab10/prj/ModulesMykhailenko.h
@@ -0,0 +1,34 @@
+#ifndef MODULESMYKHAILENKO_H_INCLUDED
+#define MODULESMYKHAILENKO_H_INCLUDED
+
+#include
+
+using std::string;
+
+float s_calculation(int x, int y, int z);
+
+typedef struct Deposit {
+ float totalInterest;
+ float monthlyInterestPaid;
+} Deposit;
+
+typedef struct Size {
+ int french;
+ string international;
+} Size;
+
+Deposit getPayment(float value, int months);
+
+Size getSize(int slovakSize);
+
+int t9_3(int number);
+
+bool validateCharacter(wchar_t character);
+
+int t10_1(string inputFile, string outputFile);
+
+int t10_2(string file);
+
+int t10_3(string file, int x, int y, int z, int b);
+
+#endif // MODULESMYKHAILENKO_H_INCLUDED
diff --git a/lab10/prj/ModulesMykhailenko/ModulesMykhailenko.cbp b/lab10/prj/ModulesMykhailenko/ModulesMykhailenko.cbp
new file mode 100644
index 0000000..ae8b833
--- /dev/null
+++ b/lab10/prj/ModulesMykhailenko/ModulesMykhailenko.cbp
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lab10/prj/ModulesMykhailenko/ModulesMykhailenko.cpp b/lab10/prj/ModulesMykhailenko/ModulesMykhailenko.cpp
new file mode 100644
index 0000000..1392e70
--- /dev/null
+++ b/lab10/prj/ModulesMykhailenko/ModulesMykhailenko.cpp
@@ -0,0 +1,188 @@
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include "ModulesMykhailenko.h"
+
+using namespace std;
+
+wstring characters = L".,!?:;)\" (₴ʼ'№%*_-+=\\/0123456789абвгґдеєжзиіїйклмнопрстуфхцчшщьюя";
+
+float s_calculation(int x, int y, int z) {
+ return fabs(sin(fabs(y-pow(z,2)))+sqrt(x)-sqrt(pow(y*z, x)+(y/(2*M_PI))));
+}
+
+Deposit getPayment(float value, int months) {
+ Deposit deposit;
+ if (months == 6 || months == 12) {
+ float interest;
+ deposit.totalInterest = months == 12 ? 13 : 11/(float)2;
+ interest = deposit.totalInterest / 100 / months;
+ deposit.monthlyInterestPaid = round(value*interest*100)/100;
+ } else {
+ deposit.totalInterest = -1;
+ deposit.monthlyInterestPaid = -1;
+ }
+ return deposit;
+}
+
+Size getSize(int slovakSize) {
+ Size size;
+ if (slovakSize >= 6 && slovakSize <= 10) {
+ size.french = slovakSize - 4;
+ switch (slovakSize)
+ {
+ case 6:
+ size.international = "S";
+ break;
+ case 7:
+ size.international = "M";
+ break;
+ case 8:
+ size.international = "L";
+ break;
+ case 9:
+ size.international = "XL";
+ break;
+ case 10:
+ size.international = "XXL";
+ break;
+ default:
+ size.international = "Error";
+ }
+ } else {
+ size.french = -1;
+ size.international = "Error";
+ }
+ return size;
+}
+
+int t9_3(int number) {
+ unsigned int count = 0;
+ if (number > 0 || number <= 7483650) {
+ bool set = number & 1;
+ while (number) {
+ count += (number & 1) == set;
+ number >>= 1;
+ }
+ } else {
+ return -1;
+ }
+ return count;
+}
+
+bool validateCharacter(wchar_t character) {
+ for (int i = 0; i < characters.length(); i++)
+ if (character == characters.at(i))
+ return true;
+ return false;
+}
+
+int t10_1(string inputFile, string outputFile) {
+ wstring line;
+ wstring words[4] = {L"програма", L"модуль", L"студент", L"програміст"};
+ bool found = false;
+ int number = 0;
+ wifstream indata;
+ indata.open(inputFile);
+ ofstream outdata;
+ outdata.open(outputFile);
+
+ if (!indata || !outdata)
+ return 1;
+
+ indata.imbue(locale(locale(), new codecvt_utf8));
+
+ while (getline(indata,line)) {
+ number += line.length();
+
+ for (int i = 0; i < line.length(); i++) {
+ line[i] = towlower(line[i]);
+ if (!validateCharacter(line[i]))
+ return 2;
+ }
+
+ if (!found) {
+ for (int i = 0; i < 4; i++) {
+ int index = line.find(words[i]);
+ if (index != wstring::npos && line.length()-words[i].length()-index == 0) { // слово у кінці
+ found = true;
+ goto out_found;
+ }
+
+ for (int j = 0; j < 9; j++) { // крапка, кома, знак оклику, знак питання, двокрапка, крапка з комою, закриваюча дужка, лапки, пробіл
+ wstring wordToFind = words[i] + characters.at(j);
+ if (line.find(wordToFind) != wstring::npos) {
+ found = true;
+ goto out_found;
+ }
+ }
+ }
+ }
+ out_found: continue;
+ }
+
+ outdata << "Розробник: Михайленко Станіслав" << endl << "Установа/організація: Центральноукраїнський національний технічний університет" << endl << "Місто: Кропивницький" << endl << "Країна: Україна" << endl << "Рік розробки: 2023" << endl << endl;
+
+ outdata << "Кількість символів у файлі: " << number << endl;
+
+ outdata << "У вхідному файлі " << ((found) ? "наявні" : "відсутні") << " слова \"програма\", \"модуль\", \"студент\", \"програміст\"." << endl;
+
+ return 0;
+}
+
+int t10_2(string file) {
+ wchar_t character;
+ time_t rawtime;
+ time(&rawtime);
+ int number = 0;
+
+ wifstream indata;
+ indata.open(file);
+ ofstream outdata;
+ outdata.open(file, ios_base::app);
+
+ if (!indata || !outdata)
+ return 1;
+
+ indata.imbue(locale(locale(), new codecvt_utf8));
+
+ while (indata >> character) {
+ if (!validateCharacter(towlower(character)))
+ return 2;
+ for (int i = 0; i < 10; i++)
+ if (character == characters[i + 22]) // 0-9
+ number += 1;
+ }
+
+ outdata << endl << "Кількість цифр у файлі: " << number << endl;
+ outdata << "Дата й час дозапису: " << ctime(&rawtime);
+ return 0;
+}
+
+int t10_3(string file, int x, int y, int z, int b) {
+ wchar_t character;
+ time_t rawtime;
+ time(&rawtime);
+ int number = 0;
+
+ ofstream data;
+ data.open(file, ios_base::app);
+
+ if (!data)
+ return 1;
+
+ data << endl << "s = " << s_calculation(x, y, z) << endl;
+ if (b > 0) {
+ string binary = bitset::digits>(b).to_string();
+ binary.erase(0, binary.find_first_not_of('0'));
+ data << "b у двійковому коді: " << binary << endl;
+ }
+ else
+ data << "b — не натуральне число" << endl;
+
+ return 0;
+}
diff --git a/lab10/prj/ModulesMykhailenko/ModulesMykhailenko.depend b/lab10/prj/ModulesMykhailenko/ModulesMykhailenko.depend
new file mode 100644
index 0000000..4dea1bd
--- /dev/null
+++ b/lab10/prj/ModulesMykhailenko/ModulesMykhailenko.depend
@@ -0,0 +1,10 @@
+# depslib dependency file v1.0
+1677874156 source:z:\bmtp10\prj\modulesmykhailenko\modulesmykhailenko.cpp
+
+
+
+
+
+
+ "ModulesMykhailenko.h"
+
diff --git a/lab10/prj/ModulesMykhailenko/ModulesMykhailenko.layout b/lab10/prj/ModulesMykhailenko/ModulesMykhailenko.layout
new file mode 100644
index 0000000..4e5da4b
--- /dev/null
+++ b/lab10/prj/ModulesMykhailenko/ModulesMykhailenko.layout
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/lab10/prj/ModulesMykhailenko/bin/Debug/libModulesMykhailenko.a b/lab10/prj/ModulesMykhailenko/bin/Debug/libModulesMykhailenko.a
new file mode 100644
index 0000000..5a66f78
Binary files /dev/null and b/lab10/prj/ModulesMykhailenko/bin/Debug/libModulesMykhailenko.a differ
diff --git a/lab10/prj/ModulesMykhailenko/obj/Debug/ModulesMykhailenko.o b/lab10/prj/ModulesMykhailenko/obj/Debug/ModulesMykhailenko.o
new file mode 100644
index 0000000..18cc818
Binary files /dev/null and b/lab10/prj/ModulesMykhailenko/obj/Debug/ModulesMykhailenko.o differ
diff --git a/lab10/prj/TestDriver/TestDriver.cbp b/lab10/prj/TestDriver/TestDriver.cbp
new file mode 100644
index 0000000..e6c55f3
--- /dev/null
+++ b/lab10/prj/TestDriver/TestDriver.cbp
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lab10/prj/TestDriver/TestDriver.depend b/lab10/prj/TestDriver/TestDriver.depend
new file mode 100644
index 0000000..5749bbf
--- /dev/null
+++ b/lab10/prj/TestDriver/TestDriver.depend
@@ -0,0 +1,13 @@
+# depslib dependency file v1.0
+1677244734 source:z:\bmtp9\prj\testdriver\main.cpp
+ "ModulesMykhailenko.h"
+
+
+
+1677873860 source:z:\bmtp10\prj\testdriver\main.cpp
+
+
+
+
+
+
diff --git a/lab10/prj/TestDriver/TestDriver.layout b/lab10/prj/TestDriver/TestDriver.layout
new file mode 100644
index 0000000..e00b0b8
--- /dev/null
+++ b/lab10/prj/TestDriver/TestDriver.layout
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/lab10/prj/TestDriver/bin/Debug/TestDriver.exe b/lab10/prj/TestDriver/bin/Debug/TestDriver.exe
new file mode 100755
index 0000000..ad831fe
Binary files /dev/null and b/lab10/prj/TestDriver/bin/Debug/TestDriver.exe differ
diff --git a/lab10/prj/TestDriver/input.txt b/lab10/prj/TestDriver/input.txt
new file mode 100644
index 0000000..1443058
--- /dev/null
+++ b/lab10/prj/TestDriver/input.txt
@@ -0,0 +1,4 @@
+00000
+
+Кількість цифр у файлі: 5
+Дата й час дозапису: Fri Mar 03 22:30:28 2023
diff --git a/lab10/prj/TestDriver/main.cpp b/lab10/prj/TestDriver/main.cpp
new file mode 100644
index 0000000..23077b5
--- /dev/null
+++ b/lab10/prj/TestDriver/main.cpp
@@ -0,0 +1,192 @@
+#include "ModulesMykhailenko.h"
+#include
+#include
+#include
+#include
+#include
+
+using namespace std;
+
+string input = "input.txt";
+string output = "output.txt";
+
+bool createInput(wstring content) {
+ wofstream data;
+ data.open(input);
+
+ data.imbue(locale(locale(), new codecvt_utf8));
+
+ if (!data) {
+ cout << "Помилка запису вхідних даних." << endl;
+ return false;
+ }
+
+ data << content << endl;
+
+ return true;
+}
+
+bool test1_1() {
+ wstring line;
+ const wstring lines[3] = {L"Розробник: Михайленко Станіслав", L"Установа/організація: Центральноукраїнський національний технічний університет", L"Рік розробки: 2023"};
+ bool linesFound[3] = {false, false, false};
+ int currentLine = 0;
+ if(!createInput(L"тест"))
+ return false;
+
+ t10_1(input, output);
+
+ wifstream indata;
+ indata.open(output);
+
+ indata.imbue(locale(locale(), new codecvt_utf8));
+
+ while (getline(indata,line)) {
+ if (line.find(lines[currentLine]) != wstring::npos) {
+ linesFound[currentLine] = true;
+ currentLine++;
+ }
+ if (linesFound[0] && linesFound[1] && linesFound[2])
+ return true;
+ }
+ return false;
+}
+
+bool test1(wstring data, bool wordPresent) {
+ wstring line;
+
+ if(!createInput(data))
+ return false;
+
+ t10_1(input, output);
+
+ wifstream indata;
+ indata.open(output);
+
+ indata.imbue(locale(locale(), new codecvt_utf8));
+
+ while (getline(indata,line)) {
+ if ((wordPresent && line.find(L"наявні") != wstring::npos) || (!wordPresent && line.find(L"відсутні") != wstring::npos))
+ return true;
+ }
+
+ return false;
+}
+
+bool test2_1() {
+ wstring line;
+ if(!createInput(L"тест"))
+ return false;
+
+ t10_2(input);
+
+ wifstream indata;
+ indata.open(input);
+
+ indata.imbue(locale(locale(), new codecvt_utf8));
+
+ while (getline(indata,line)) {
+ if (line.find(L"Дата й час дозапису: ") != wstring::npos)
+ return true;
+ }
+
+ return false;
+}
+
+bool test2(wstring data, int digits) {
+ wstring line;
+ if(!createInput(data))
+ return false;
+
+ t10_2(input);
+
+ wifstream indata;
+ indata.open(input);
+
+ indata.imbue(locale(locale(), new codecvt_utf8));
+
+ while (getline(indata,line)) {
+ if (line.find(L"Кількість цифр у файлі: " + digits) != wstring::npos)
+ return true;
+ }
+
+ return false;
+}
+
+bool test3(int x, int y, int z, int b, wstring s, wstring bin) {
+ wstring line;
+ bool firstValid = false;
+ t10_3(output, x, y, z, b);
+
+ wifstream indata;
+ indata.open(output);
+
+ indata.imbue(locale(locale(), new codecvt_utf8));
+
+ while (getline(indata,line)) {
+ if (!firstValid && (line.find(L"s = " + s) != wstring::npos))
+ firstValid = true;
+ else if (firstValid && (line.find(L"b у двійковому коді: " + bin) != wstring::npos))
+ return true;
+ }
+
+ return false;
+}
+
+int main() {
+ const wstring data1_1[] = {L"Студент", L"Студентка", L"модуль!", L"модульчик"};
+ const bool wordPresent[] = {true, false, true, false};
+
+ const wstring data2_1[] = {L"Програміст", L"0123456789", L"12", L"00000"};
+ const int digits[] = {0, 10, 2, 5};
+
+ const int x[] = {7, 2, 9, 0, 7};
+ const int y[] = {2, 45, 0, 0, 5};
+ const int z[] = {1, 6, 1, 0, 4};
+ const int b[] = {1, 3, 8, 100, 127};
+ const wstring s[] = {L"7.84054", L"268.187", L"3.84147", L"1", L"35775.4"};
+ const wstring bin[] = {L"1", L"11", L"1000", L"1100100", L"1111111"};
+
+
+ setlocale(LC_ALL, "");
+
+ for (int i = 0; i < 3; i++) {
+ for (int j = 0; j < 5; j++) {
+ bool value = false;
+ wstring description;
+ if (i < 2 && j == 0) {
+ description = L"виведення повідомлення";
+ if (i == 0)
+ value = test1_1();
+ else if (i == 1)
+ value = test2_1();
+ }
+ else if (i == 0) {
+ value = test1(data1_1[j-1], wordPresent[j-1]);
+ description = L"вхідні дані: " + data1_1[j-1] + L", очікуваний результат: слова " + (wordPresent[j-1] ? L"наявні" : L"відсутні");
+ }
+ else if (i == 1) {
+ value = test2(data2_1[j-1], digits[j-1]);
+ string tmpstr = to_string(digits[j-1]);
+ wstring wstr(tmpstr.begin(), tmpstr.end());
+ description = L"вхідні дані: " + data2_1[j-1] + L", очікуваний результат: кількість чисел: " + wstr;
+ }
+ else if (i == 2) {
+ value = test3(x[j], y[j], z[j], b[j], s[j], bin[j]);
+ string xtmpstr = to_string(digits[j-1]);
+ wstring xwstr(xtmpstr.begin(), xtmpstr.end());
+ string ytmpstr = to_string(digits[j-1]);
+ wstring ywstr(ytmpstr.begin(), ytmpstr.end());
+ string ztmpstr = to_string(digits[j-1]);
+ wstring zwstr(ztmpstr.begin(), ztmpstr.end());
+ string btmpstr = to_string(digits[j-1]);
+ wstring bwstr(btmpstr.begin(), btmpstr.end());
+ description = L"вхідні дані: x = " + xwstr + L", y = " + ywstr + L", z = " + zwstr + L", b = " + bwstr + L", очікуваний результат: s = " + s[j] + L", b у двійковому коді: " + bin[j];
+ }
+ wcout << "Test " << i + 1 << "." << j + 1 << " (" << description << ") " << (value ? "passed" : "failed") << endl;
+ }
+
+ }
+
+ return 0;
+}
diff --git a/lab10/prj/TestDriver/obj/Debug/main.o b/lab10/prj/TestDriver/obj/Debug/main.o
new file mode 100644
index 0000000..083b501
Binary files /dev/null and b/lab10/prj/TestDriver/obj/Debug/main.o differ
diff --git a/lab10/prj/TestDriver/output.txt b/lab10/prj/TestDriver/output.txt
new file mode 100644
index 0000000..aad963f
--- /dev/null
+++ b/lab10/prj/TestDriver/output.txt
@@ -0,0 +1,23 @@
+Розробник: Михайленко Станіслав
+Установа/організація: Центральноукраїнський національний технічний університет
+Місто: Кропивницький
+Країна: Україна
+Рік розробки: 2023
+
+Кількість символів у файлі: 9
+У вхідному файлі відсутні слова "програма", "модуль", "студент", "програміст".
+
+s = 7.84054
+b у двійковому коді: 1
+
+s = 268.187
+b у двійковому коді: 11
+
+s = 3.84147
+b у двійковому коді: 1000
+
+s = 1
+b у двійковому коді: 1100100
+
+s = 35775.4
+b у двійковому коді: 1111111
diff --git a/lab10/tasks/L10-var--001.jpg b/lab10/tasks/L10-var--001.jpg
new file mode 100644
index 0000000..14cc785
Binary files /dev/null and b/lab10/tasks/L10-var--001.jpg differ