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