#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]; char 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(char* vector, const char string[]) { for (int i = 0; string[i]; i++) { int j = 0; for (j = 0; j < i; j++) { if (memberToIndex(string[i]) < memberToIndex(vector[j])) { for (int k = i + 1; k > j; k--) { vector[k] = vector[k - 1]; } break; } if (memberToIndex(string[i]) == memberToIndex(vector[j])) { j = -1; break; } } if(j != -1) vector[j] = string[i]; } }; void convertSets() { vectorFromString(vectorA, stringA); vectorFromString(vectorB, stringB); vectorFromString(vectorC, stringC); vectorFromString(vectorD, stringD); } void calculateAnswer() { for (int i = 0; vectorA[i]; i++) vectorF[i] = vectorA[i]; int j = 0; for (int i = 0; vectorB[i]; i++) { while (j < strlen(vectorF) && memberToIndex(vectorB[i]) > memberToIndex(vectorF[j])) j++; if (memberToIndex(vectorB[i]) != memberToIndex(vectorF[j])) { for (int k = strlen(vectorF); k >= j; k--) vectorF[k + 1] = vectorF[k]; vectorF[j] = vectorB[i]; } } j = 0; for (int i = 0; vectorC[i]; i++) { while (j < strlen(vectorF) && memberToIndex(vectorC[i]) > memberToIndex(vectorF[j])) j++; if (memberToIndex(vectorC[i]) == memberToIndex(vectorF[j])) { for (int k = j; k < strlen(vectorF); k++) vectorF[k] = vectorF[k + 1]; } } j = 0; for (int i = 0; vectorD[i]; i++) { while (j < strlen(vectorF) && memberToIndex(vectorD[i]) > memberToIndex(vectorF[j])) { for (int k = j; k < strlen(vectorF); k++) vectorF[k] = vectorF[k + 1]; } if (memberToIndex(vectorD[i]) == memberToIndex(vectorF[j])) j++; } for (j; j < strlen(vectorF); j++) { vectorF[j] = '\0'; } } void outputSetToConsole(char* vector) { for (int i = 0; vector[i]; i++) cout << vector[i]; } void outputSetToFile(char* vector, ofstream& output) { for (int i = 0; vector[i]; i++) output << vector[i]; } bool isSetEmpty(char* vector) { return (vector[0] == '\0') ? true : false; } 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] = '\0'; vectorB[i] = '\0'; vectorC[i] = '\0'; vectorD[i] = '\0'; } for (int i = 0; i < length; i++) { if (randomVector()) vectorA[strlen(vectorA)] = indexToMember(i); if (randomVector()) vectorB[strlen(vectorB)] = indexToMember(i); if (randomVector()) vectorC[strlen(vectorC)] = indexToMember(i); if (randomVector()) vectorD[strlen(vectorD)] = indexToMember(i); } } void clearAnswerVector() { for (int i = 0; i < strlen(vectorF); 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(); }