Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <stdlib.h>
- #include <fstream>
- #include <string>
- using namespace std;
- int chooseWay(const int);
- void inputSubsequences(int*&, int&, int*&, int&, const int);
- int *inputFromConsole(int&);
- void showSubsequence(int*, const int);
- string inputFileName(const int);
- bool inputFromFile(ifstream&, int*&, int&);
- int *makeCombination(int*, const int, int*, const int, int&);
- void outputSubsequences(int*, const int, const int);
- void outputInFile(ofstream&, int*, const int);
- const int INPUT = 1, OUTPUT = 2;
- int main()
- {
- system("chcp 1251 > nul");
- int *subsequence1, *subsequence2, *combination;
- int choice, n1, n2, combinationSize;
- cout << "Программа строит объединение двух последовательностей целых чисел, в которых нет повторяющихся элементов.\n";
- choice = chooseWay(INPUT);
- inputSubsequences(subsequence1, n1, subsequence2, n2, choice);
- combination = makeCombination(subsequence1, n1, subsequence2, n2, combinationSize);
- delete[] subsequence1;
- delete[] subsequence2;
- choice = chooseWay(OUTPUT);
- outputSubsequences(combination, combinationSize, choice);
- }
- int chooseWay(const int IorOput)
- {
- int choice;
- bool isNotCorrect;
- switch (IorOput) {
- case INPUT:
- cout << "Выберите вариант ввода:\n";
- cout << "1.Данные вводятся из текстового файла.\n";
- cout << "2.Данные вводятся через консоль.\n";
- break;
- default:
- cout << "Выберите вариант вывода:\n";
- cout << "1.Данные выводятся в текстовый файл.\n";
- cout << "2.Данные выводятся в консоль.\n";
- }
- do {
- cin >> choice;
- if (cin.fail() || cin.get() != '\n') {
- isNotCorrect = true;
- cout << "Ошибка ввода. Выберите вариант 1 или 2." << '\n';
- cin.clear();
- while (cin.get() != '\n');
- }
- else if ((choice < 1) || (choice > 2)) {
- cout << "Ошибка ввода. Выберите вариант 1 или 2." << '\n';
- isNotCorrect = true;
- }
- else
- isNotCorrect = false;
- } while (isNotCorrect);
- return choice;
- }
- void inputSubsequences(int *&subsequence1, int &n1, int *&subsequence2, int &n2, const int choice)
- {
- switch (choice) {
- case 1: {
- string fileName;
- ifstream in;
- bool isNotCorrect;
- do {
- fileName = inputFileName(INPUT);
- in.open(fileName);
- isNotCorrect = inputFromFile(in, subsequence1, n1);
- if (!isNotCorrect) {
- isNotCorrect = inputFromFile(in, subsequence2, n2);
- if (!isNotCorrect && !in.eof()) {
- isNotCorrect = true;
- cout << "В файле присутствуют лишние данные! Повторите ввод имени файла:\n";
- }
- }
- in.close();
- } while (isNotCorrect);
- break;
- }
- default:
- subsequence1 = inputFromConsole(n1);
- subsequence2 = inputFromConsole(n2);
- }
- }
- int *inputFromConsole(int &n)
- {
- int *subsequence;
- bool isNotCorrect;
- cout << "Введите количество членов последовательности:\n";
- do {
- cin >> n;
- if (cin.fail() || cin.get() != '\n') {
- isNotCorrect = true;
- cout << "Ошибка ввода. Введите натуральное число в диапазоне [1; 20 000]" << '\n';
- cin.clear();
- while (cin.get() != '\n');
- }
- else if ((n < 1) || (n > 20000)) {
- cout << "Ошибка ввода. Введите натуральное число в диапазоне [1; 20 000]" << '\n';
- isNotCorrect = true;
- }
- else
- isNotCorrect = false;
- } while (isNotCorrect);
- subsequence = new int[n];
- cout << "Введите члены последовательности:\n";
- for (int i = 0; i < n; i++)
- do {
- isNotCorrect = false;
- cin >> subsequence[i];
- if (cin.fail() || cin.get() != '\n') {
- isNotCorrect = true;
- cout << "Ошибка ввода. Введите целое число." << '\n';
- cin.clear();
- while (cin.get() != '\n');
- }
- else
- for (int k = 0; k < i; k++)
- if (subsequence[k] == subsequence[i]) {
- isNotCorrect = true;
- cout << "Ошибка ввода. Вы ввели повторяющийся элемент. Повторите ввод элемента.\n";
- }
- } while (isNotCorrect);
- return subsequence;
- }
- void showSubsequence(int *subsequence, const int n)
- {
- for (int i = 0; i < n; i++)
- cout << subsequence[i] << ' ';
- }
- string inputFileName(const int inOrOut)
- {
- string fileName;
- switch (inOrOut) {
- case INPUT: {
- cout << "Введите имя файла, из которого будут вводиться данные (все входные величины в файле должны быть разделены пробелами, сначала идет число членов последовательности, затем ее члены):\n";
- ifstream in;
- do {
- getline(cin, fileName);
- in.open(fileName);
- if (in.is_open()) {
- in.close();
- return fileName;
- }
- else
- cout << "Невозможно открыть файл с таким именем! Повторите ввод имени файла:\n";
- } while (true);
- break;
- }
- default: {
- cout << "Введите имя файла, в который будут выводиться полученные данные:\n";
- ofstream out;
- do {
- getline(cin, fileName);
- out.open(fileName);
- if (out.is_open()) {
- out.close();
- return fileName;
- }
- else
- cout << "Невозможно открыть файл с таким именем! Повторите ввод имени файла:\n";
- } while (true);
- }
- }
- }
- bool inputFromFile(ifstream &in, int *&subsequence, int &n)
- {
- bool isNotCorrect;
- isNotCorrect = false;
- in >> n;
- if (in.fail()) {
- isNotCorrect = true;
- cout << "В файле содержатся неверные данные! Измените содержание файла и повторите ввод его имени." << '\n';
- in.clear();
- }
- else if ((n < 1) || (n > 20000)) {
- isNotCorrect = true;
- cout << "В файле содержатся неверные данные! Измените содержание файла и повторите ввод его имени." << '\n';
- }
- else {
- subsequence = new int[n];
- for (int i = 0; i < n; i++) {
- in >> subsequence[i];
- if (in.fail()) {
- cout << "В файле содержатся неверные данные! Измените содержание файла и повторите ввод его имени." << '\n';
- in.clear();
- return true;
- }
- else
- for (int k = 0; k < i; k++)
- if (subsequence[k] == subsequence[i]) {
- cout << "В файле содержатся повторяющиеся элементы последовательности! Измените содержание файла и повторите ввод его имени." << '\n';
- return true;
- }
- }
- }
- return isNotCorrect;
- }
- int *makeCombination(int *subsequence1, const int n1, int *subsequence2, const int n2, int &counter)
- {
- int *combination, k;
- bool isInclusion;
- counter = n1;
- combination = new int[n1 + n2];
- for (int i = 0; i < n1; i++)
- combination[i] = subsequence1[i];
- for (int i = 0; i < n2; i++) {
- isInclusion = false;
- k = 0;
- while (!isInclusion && k < n1) {
- if (subsequence1[k] == subsequence2[i])
- isInclusion = true;
- k++;
- }
- if (!isInclusion) {
- combination[counter] = subsequence2[i];
- counter++;
- }
- }
- return combination;
- }
- void outputSubsequences(int *combination, const int combinationSize, const int choice)
- {
- switch (choice) {
- case 1: {
- string fileName;
- ofstream out;
- fileName = inputFileName(OUTPUT);
- out.open(fileName);
- outputInFile(out, combination, combinationSize);
- out.close();
- cout << "Искомые данные выведены в файл " << fileName;
- break;
- }
- default:
- cout << "Искомая последовательность:\n";
- showSubsequence(combination, combinationSize);
- }
- }
- void outputInFile(ofstream &out, int *combination, const int combinationSize)
- {
- for (int i = 0; i < combinationSize; i++)
- out << combination[i] << ' ';
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement