#include #include #include #include #include #include #include using namespace std; const char universum[] = "ABCDEFGHIJKMNLOPQRSTUVWXYZ"; const char filename[] = "Test_result.txt"; const int length = 26; const int durationCoeff = 1000000; int customTestAmount = 0; char stringA[length], stringB[length], stringC[length], stringD[length]; bool vectorA[length], vectorB[length], vectorC[length], vectorD[length], vectorF[length]; void setupConsole() { setlocale(LC_ALL, "Russian"); SetConsoleOutputCP(1251); SetConsoleCP(1251); cout << fixed << setprecision(7); } void outputGreeting() { cout << "Программа рассчитывает значение множества F согласно следующим законам - " << endl; cout << "F = D && (A || B) && !C, что равносильно F = D*(A + B) - C." << endl; cout << "Универсум: " << universum << endl; } void input() { cout << endl; cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl; cout << "Введите множество A: "; cin >> stringA; cout << "Введите множество B: "; cin >> stringB; cout << "Введите множество C: "; cin >> stringC; cout << "Введите множество D: "; cin >> stringD; cout << endl; } bool isCorrectSymbol(char symbol) { return ((symbol >= universum[0] && symbol <= universum[length - 1]) || symbol == '\0') ? 1 : 0; } bool isStringCorrect(char* string) { for (int i = 0; i < length && string[i] != '\0'; i++) if (!isCorrectSymbol(string[i])) return 0; return 1; } int memberToIndex(char member) { return member - universum[0]; } char indexToMember(int number) { return number + universum[0]; } void vectorFromString(bool* vector, const char string[]) { for (int i = 0; string[i]; i++) vector[memberToIndex(string[i])] = 1; }; void convertSets() { vectorFromString(vectorA, stringA); vectorFromString(vectorB, stringB); vectorFromString(vectorC, stringC); vectorFromString(vectorD, stringD); } void calculateAnswer() { for (int i = 0; i < length; i++) vectorF[i] = vectorD[i] && (vectorA[i] || vectorB[i]) && !vectorC[i]; } void outputSetToConsole(bool* vector) { for (int i = 0; i < length; ++i) if (vector[i]) cout << indexToMember(i); } void outputSetToFile(bool* vector, ofstream& output) { for (int i = 0; i < length; ++i) if (vector[i]) output << indexToMember(i); } bool isSetEmpty(bool* vector) { for (int i = 0; i < length; i++) if (vector[i] == 1) return 0; return 1; } void outputAnswer() { cout << "Ответ: F = "; if (isSetEmpty(vectorF)) cout << "пустое множество"; else outputSetToConsole(vectorF); cout << endl; } double calulateDuration() { double firstPoint, lastPoint, duration = 0; for (int i = 0; i < durationCoeff; i++) { firstPoint = clock(); calculateAnswer(); lastPoint = clock(); duration += lastPoint - firstPoint; } return duration / durationCoeff; } void outputDuration() { cout << endl; cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl; cout << "Временная сложность алгоритма - O(1), постоянное время" << endl; cout << "На выполнение алгоритма уходит " << calulateDuration() << " секунд." << endl; cout << endl; } float factorial(int number) { float factorial = 1; for (int i = 1; i <= number; i++) factorial *= i; return factorial; } bool randomVector() { return rand() % 2; } void fillVectors() { for (int i = 0; i < length; i++) { vectorA[i] = randomVector(); vectorB[i] = randomVector(); vectorC[i] = randomVector(); vectorD[i] = randomVector(); } } void clearAnswerVector() { for (int i = 0; i < length; i++) vectorF[i] = 0; } void badInputLoop() { while (cin.fail() || customTestAmount < 0) { cout << "Неправильный ввод, повторите еще раз:" << endl; cin.clear(); cin.ignore(32767, '\n'); cin >> customTestAmount; } } void testInfo() { cout << setprecision(0); cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl; cout << "Из 26 символов может быть составлено " << factorial(length) << " перестановок" << endl; cout << "Сколько программа должна проделать тестов со случайными комбинациями?" << endl; cin >> customTestAmount; badInputLoop(); if (customTestAmount > 0) cout << "Отчеты будут выведены в файл " << filename << endl; else cout << "Тесты не будут проделаны" << endl; } void executeTest() { ofstream output; output.open(filename); for (int i = 0; i < customTestAmount; i++) { fillVectors(); clearAnswerVector(); output << "Множество A: "; outputSetToFile(vectorA, output); output << endl; output << "Множество B: "; outputSetToFile(vectorB, output); output << endl; output << "Множество C: "; outputSetToFile(vectorC, output); output << endl; output << "Множество D: "; outputSetToFile(vectorD, output); output << endl; calculateAnswer(); output << "Ответ: F = "; outputSetToFile(vectorF, output); output << endl; output << '*' << endl; } output.close(); } int main() { setupConsole(); outputGreeting(); input(); while (!isStringCorrect(stringA) || !isStringCorrect(stringB) || !isStringCorrect(stringC) || !isStringCorrect(stringD)) { cout << "Некорректный ввод" << endl; input(); } convertSets(); calculateAnswer(); outputAnswer(); outputDuration(); testInfo(); executeTest(); }