This repository has been archived on 2022-06-05. You can view files and clone it, but cannot push or open issues or pull requests.
Files
AiSD/Part1/Lab1/Massiv_simv/Lab1_3.cpp
2022-05-14 15:22:55 +03:00

288 lines
7.3 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>
#include <cstdio>
#include <time.h>
#include <iomanip>
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();
}