Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <set>
- #include <algorithm>
- #include <fstream>
- using namespace std;
- int readInt() {
- int number;
- bool isNotCorrect;
- number = 0;
- do {
- isNotCorrect = false;
- cin >> number;
- if (cin.fail()) {
- cout << "Неверный ввод данных!" << endl;
- isNotCorrect = true;
- cin.clear();
- while (cin.get() != '\n');
- }
- } while (isNotCorrect);
- return number;
- }
- set<int> intersection(set<int> set1, set<int> set2) {
- set<int> y;
- set_intersection(set1.begin(), set1.end(), set2.begin(), set2.end(), inserter(y, y.begin()));
- return y;
- }
- void writeNumbersMultiple3(set<int> a) {
- bool flag;
- flag = false;
- cout << "Элементы множества Y, которые кратны 3: " << endl;
- for (int i : a) {
- if (i % 3 == 0) {
- cout << i << " ";
- flag = true;
- }
- }
- if (!flag) {
- cout << "Таких элементов нет!" << endl;
- }
- }
- bool isSubset(set<int> subset, set<int> set1) {
- bool isCorrect;
- set<int> someSet;
- set_intersection(set1.begin(), set1.end(), subset.begin(), subset.end(),inserter(someSet, someSet.begin()));
- isCorrect = ((someSet == subset) && !subset.empty());
- return isCorrect;
- }
- bool valueRange(int input, int inputType) {
- int minValue, maxValue;
- bool isCorrect;
- minValue = 1;
- maxValue = 255;
- isCorrect = true;
- if ((input < minValue) or (input > maxValue)) {
- isCorrect = false;
- if (inputType == 1) {
- cout << "Элемент не попал в диапазон." << endl;
- }
- else {
- if (inputType == 2) {
- cout << "Размер не попал в диапазон." << endl;
- }
- }
- }
- return isCorrect;
- }
- int readSizeFromConsole(string forItem) {
- int size;
- bool isCorrect;
- do {
- cout << "Введите размер множества " << forItem << endl;
- size = readInt();
- isCorrect = valueRange(size, 2);
- } while (!isCorrect);
- return size;
- }
- set<int> createSetFromConsole(int size) {
- int element;
- bool isCorrect;
- set<int> someSet;
- someSet = {};
- for (int i = 0; i < size; i++) {
- do {
- cout << "Введите " << (i + 1) << " элемент множества: " << endl;
- element = readInt();
- isCorrect = valueRange(element, 1);
- } while (!isCorrect);
- someSet.insert(element);
- }
- return someSet;
- }
- int readConfiguration() {
- int configuration;
- bool isNotCorrect;
- do {
- isNotCorrect = false;
- configuration = readInt();
- if ((configuration != 1) and (configuration != 2)) {
- cout << "Ошибка! Попробуйте еще раз." << endl;
- isNotCorrect = true;
- }
- } while (isNotCorrect);
- return configuration;
- }
- int readSizeFromFile(string path, int lineToRead) {
- int size;
- int number;
- bool isNotCorrect;
- ifstream fin(path);
- isNotCorrect = false;
- size = 0;
- cout << "Читаю размер " << lineToRead << " строки.." << endl;
- for (int i = 2; i = lineToRead; i++) {
- fin;
- }
- while (!fin.eof()) {
- fin >> number;
- size++;
- }
- if (fin.fail()) {
- isNotCorrect = true;
- cout << "Не получилось считать размер. Перепроверьте файл" << endl;
- }
- fin.close();
- if (isNotCorrect) {
- isNotCorrect = !valueRange(size, 2);
- }
- if (!isNotCorrect) {
- size = 0;
- }
- return size;
- }
- set<int> readElementsFromFile(string path, int size, int lineToRead) {
- set<int> inputSet;
- bool isNotCorrect;
- int element;
- ifstream fin(path);
- isNotCorrect = false;
- inputSet = {};
- cout << "Читаю элементы " << lineToRead << " строки..." << endl;
- for (int i = 2; i = lineToRead; i++) {
- fin;
- }
- for (int i = 0; i < size; i++) {
- fin >> element;
- if (fin.fail()) {
- isNotCorrect = true;
- cout << "Не удалось считать элементы. Перепроверьте файл." << endl;
- }
- else {
- inputSet.insert(element);
- isNotCorrect = !valueRange(element, 1);
- }
- }
- fin.close();
- if (isNotCorrect) {
- inputSet = {};
- }
- return inputSet;
- }
- string findInputFile() {
- string filePath;
- bool isNotCorrect;
- do {
- isNotCorrect = false;
- cout << "Введите путь к файлу с данными: " << endl;
- cin >> filePath;
- ifstream fin(filePath);
- if (!fin.is_open()) {
- isNotCorrect = true;
- cout << "Файл по такому пути не найден." << endl;
- }
- else {
- if (!((filePath[size(filePath) - 1] == 't') and (filePath[size(filePath) - 2] == 'x') and (filePath[size(filePath) - 3] == 't') and (filePath[size(filePath) - 4] == '.'))) {
- isNotCorrect = true;
- cout << "Ошибка! Неправильный тип файла." << endl;
- }
- }
- } while (isNotCorrect);
- cout << "Файл найден." << endl;
- return filePath;
- }
- string findOutputFile() {
- string path;
- bool isNotCorrect;
- do {
- isNotCorrect = false;
- cout << "Введите путь к файлу вывода: " << endl;
- cin >> path;
- ofstream fout(path);
- if (!fout.is_open()) {
- isNotCorrect = true;
- }
- if (isNotCorrect or ((!((path[size(path) - 1] == 't') and (path[size(path) - 2] == 'x') and (path[size(path) - 3] == 't') and (path[size(path) - 4] == '.'))))) {
- isNotCorrect = true;
- cout << "Ошибка! Неправильный тип файла." << endl;
- }
- } while (isNotCorrect);
- return path;
- }
- set<int> createSetFromFile(string path, int lineToRead) {
- int size;
- set<int> someSet;
- bool isNotCorrect;
- isNotCorrect = false;
- someSet = {};
- size = readSizeFromFile(path, lineToRead);
- if (size == 0) {
- isNotCorrect = true;
- cout << "Проверьте строку " << lineToRead << endl;
- }
- if (!isNotCorrect) {
- someSet = readElementsFromFile(path, size, lineToRead);
- if (someSet.empty()) {
- isNotCorrect = true;
- cout << "Проверьте строку " << lineToRead << endl;
- }
- }
- return someSet;
- }
- void writeAnswerToFile(string path, set<int> y, bool isSubset) {
- bool flag;
- ofstream fout(path, fstream::app);
- if (fout.is_open()) {
- cout << "Файл открыт для записи!" << endl;
- fout << "Элементы множества Y, которые кратны 3:" << endl;
- if (!y.empty()) {
- for (int i : y) {
- fout << i << " ";
- }
- }
- else {
- cout << "Таких элементов нет.";
- }
- if (isSubset) {
- fout << "Множетсво Х3 является подмножеством множества Y" << endl;
- }
- else {
- fout << "Множетсво Х3 является подмножеством множества Y" << endl;
- }
- }
- else {
- cout << "Ошибка открытия файла для записи!" << endl;
- }
- fout.close();
- cout << "Результат записан в файл." << endl;
- }
- void writeAnswerToConsole(set<int> y, set<int> x3) {
- writeNumbersMultiple3(y);
- if (isSubset(x3, y)) {
- cout << "Множетсво Х3 является подмножеством множества Y" << endl;
- }
- else {
- cout << "Множетсво Х3 не является подмножеством множества Y" << endl;
- }
- }
- void rules(int input) {
- cout << "Обратите внимание" << endl;
- if (input == 1) {
- cout << "Диапазон допустимых чисел = 1..255 включительно." << endl;
- }
- else {
- cout << "В файле читаются только 3 первые строки." << endl;
- cout << "Первая строка файла должна содержать множество Х1, вторая - Х2, третья - Х3." << endl;
- cout << "Все строки должны содержать только числа, без запятых, скобок и т.д." << endl << endl;
- cout << "Вот пример правильной записи в файл:" << endl;
- cout << "1 2 3 4" << endl;
- cout << "2 3" << endl;
- cout << "5 6 7 9" << endl;
- }
- }
- void info() {
- cout << "Эта программа находит все элементы из пересечения множеств X1 и Х2, которые кратны 3" << endl;
- cout << "И выводит, является ли множество Х3 подмножеством пересечения Х1 и Х2." << endl;
- }
- int main() {
- set<int> x1, x2, x3, y;
- int configuration;
- string path;
- info();
- cout << "Введите 1, если хотите ввести данные с клавиатуры, 2, если с файла." << endl;
- configuration = readConfiguration();
- rules(configuration);
- if (configuration == 1) {
- x1 = createSetFromConsole(readSizeFromConsole("X1"));
- x2 = createSetFromConsole(readSizeFromConsole("X2"));
- x3 = createSetFromConsole(readSizeFromConsole("X3"));
- }
- else {
- do {
- path = findOutputFile();
- x1 = createSetFromFile(path, 1);
- x2 = createSetFromFile(path, 2);
- x3 = createSetFromFile(path, 3);
- } while ((x1.empty()) and (x2.empty()) and (x3.empty()));
- }
- y = intersection(x1, x2);
- cout << "Введите 1, если хотите вывести данные в консоль, 2, если в файл" << endl;
- configuration = readConfiguration();
- if (configuration == 1) {
- writeAnswerToConsole(y, x3);
- }
- else {
- path = findOutputFile();
- writeAnswerToFile(path, y, isSubset(x3, y));
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement