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;
- void sortArr(double*&, const int);
- int chooseFileOrConsole(const int);
- void inputArr(double*&, int&, const int);
- string inputFileName(const int);
- void inputInFileName(string&);
- void inputOutFileName(string&);
- bool checkFile(string&);
- void inputFromFile(string, double*&, int&);
- void inputFromConsole(double*&, int&);
- void outputArr(const double*, const int, const int);
- void outputInFile(string&, const double*, const int);
- void outputInConsole(const double*, const int);
- const int INPUT = 1,
- OUTPUT = 2,
- MIN_QUANTITY = 1,
- MAX_QUANTITY = 100000,
- FILE_CHOICE = 1,
- CONSOLE_CHOICE = 2;
- int main()
- {
- double* sortableArr;
- int choice, arrLength;
- system("chcp 1251 > nul");
- cout << "Программа сортирует массив методом простых вставок.\n";
- choice = chooseFileOrConsole(INPUT);
- inputArr(sortableArr, arrLength, choice);
- sortArr(sortableArr, arrLength);
- choice = chooseFileOrConsole(OUTPUT);
- outputArr(sortableArr, arrLength, choice);
- }
- void sortArr(double*& sortableArr, const int arrLength)
- {
- cout << "Исходный массив:\n";
- outputInConsole(sortableArr, arrLength);
- cout << '\n';
- int position;
- double checkNum;
- for (int checkPosition = arrLength - 2; checkPosition > -1; checkPosition--) {
- position = arrLength - 1;
- while ((position > checkPosition) && (sortableArr[position] > sortableArr[checkPosition]))
- position--;
- checkNum = sortableArr[checkPosition];
- for (int moveNumPosition = checkPosition; moveNumPosition < position; moveNumPosition++)
- sortableArr[moveNumPosition] = sortableArr[moveNumPosition + 1];
- sortableArr[position] = checkNum;
- cout << "Массив на " << arrLength - checkPosition - 1 << "-м шаге сортировки:\n";
- outputInConsole(sortableArr, arrLength);
- cout << '\n';
- }
- }
- int chooseFileOrConsole(const int InOrOutput)
- {
- int choice;
- bool isNotCorrect;
- switch (InOrOutput) {
- 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 inputArr(double*& inputArr, int& arrLength, const int choice)
- {
- switch (choice) {
- case FILE_CHOICE: {
- string fileName;
- bool isCorrect;
- do {
- fileName = inputFileName(INPUT);
- isCorrect = checkFile(fileName);
- } while (!isCorrect);
- inputFromFile(fileName, inputArr, arrLength);
- break;
- }
- case CONSOLE_CHOICE:
- inputFromConsole(inputArr, arrLength);
- }
- }
- void inputInFileName(string& fileName)
- {
- cout << "Введите имя файла, из которого будут вводиться данные:\n";
- ifstream in;
- bool isCorrect;
- do {
- isCorrect = true;
- getline(cin, fileName);
- if (fileName.ends_with(".txt")) {
- in.open(fileName);
- if (in.is_open()) {
- in.close();
- }
- else {
- cout << "Невозможно открыть файл с таким именем! Повторите ввод имени файла:\n";
- isCorrect = false;
- }
- }
- else {
- cout << "Файл должен иметь расширение .txt! Повторите ввод имени файла:\n";
- isCorrect = false;
- }
- } while (!isCorrect);
- }
- void inputOutFileName(string& fileName)
- {
- cout << "Введите имя файла, в который будут выводиться полученные данные (если файл вводится без расширения, то ему автоматически будет добавлено расширение .txt):\n";
- ofstream out;
- bool isCorrect;
- do {
- isCorrect = true;
- getline(cin, fileName);
- if (fileName.find(".") == string::npos)
- fileName = fileName + ".txt";
- out.open(fileName);
- if (out.is_open()) {
- out.close();
- }
- else {
- cout << "Невозможно открыть или создать файл с таким именем! Повторите ввод имени файла:\n";
- isCorrect = false;
- }
- } while (!isCorrect);
- }
- bool checkFile(string& fileName)
- {
- ifstream in;
- bool isCorrect;
- int arrLength, i;
- double arrNumber;
- isCorrect = true;
- in.open(fileName);
- in >> arrLength;
- if (in.fail()) {
- isCorrect = false;
- cout << "В файле содержатся неверные данные! Измените содержание файла и повторите ввод его имени.\n";
- in.clear();
- }
- else if ((arrLength < MIN_QUANTITY) || (arrLength > MAX_QUANTITY)) {
- isCorrect = false;
- cout << "Длинна массива вне допустимого диапазона! Измените содержание файла и повторите ввод его имени.\n";
- }
- else {
- i = 0;
- while (isCorrect && (i < arrLength)) {
- in >> arrNumber;
- if (in.fail()) {
- cout << "В файле содержатся неверные данные! Измените содержание файла и повторите ввод его имени.\n";
- in.clear();
- isCorrect = false;
- }
- i++;
- }
- if (isCorrect && !in.eof()) {
- cout << "В файле содержатся лишние данные! Измените содержание файла и повторите ввод его имени.\n";
- isCorrect = false;
- }
- }
- in.close();
- return isCorrect;
- }
- void inputFromFile(string fileName, double*& inputArr, int& arrLength)
- {
- ifstream in;
- in.open(fileName);
- in >> arrLength;
- inputArr = new double[arrLength];
- for (int i = 0; i < arrLength; i++)
- in >> inputArr[i];
- in.close();
- }
- void outputArr(const double* sortedArr, const int arrLength, const int choice)
- {
- switch (choice) {
- case FILE_CHOICE: {
- string fileName;
- fileName = inputFileName(OUTPUT);
- outputInFile(fileName, sortedArr, arrLength);
- cout << "Искомые данные выведены в файл " << fileName;
- break;
- }
- case CONSOLE_CHOICE:
- cout << "Отсортированный массив:\n";
- outputInConsole(sortedArr, arrLength);
- }
- }
- void outputInFile(string& fileName, const double* sortedArr, const int arrLength)
- {
- ofstream out;
- out.open(fileName);
- for (int i = 0; i < arrLength; i++)
- out << sortedArr[i] << ' ';
- out.close();
- }
- void outputInConsole(const double* sortedArr, const int arrLength)
- {
- for (int i = 0; i < arrLength; i++)
- cout << sortedArr[i] << ' ';
- }
- string inputFileName(const int inOrOut)
- {
- string fileName;
- switch (inOrOut) {
- case INPUT:
- inputInFileName(fileName);
- break;
- case OUTPUT:
- inputOutFileName(fileName);
- }
- return fileName;
- }
- void inputFromConsole(double*& inputArr, int& arrLength)
- {
- bool isNotCorrect;
- cout << "Введите длину массива:\n";
- do {
- cin >> arrLength;
- if (cin.fail() || cin.get() != '\n') {
- isNotCorrect = true;
- cout << "Ошибка ввода. Введите натуральное число в диапазоне [" << MIN_QUANTITY << "; " << MAX_QUANTITY << "]\n";
- cin.clear();
- while (cin.get() != '\n');
- }
- else if ((arrLength < MIN_QUANTITY) || (arrLength > MAX_QUANTITY)) {
- cout << "Ошибка ввода. Введите натуральное число в диапазоне [" << MIN_QUANTITY << "; " << MAX_QUANTITY << "]\n";
- isNotCorrect = true;
- }
- else
- isNotCorrect = false;
- } while (isNotCorrect);
- inputArr = new double[arrLength];
- cout << "Введите элементы массива (построчно):\n";
- for (int i = 0; i < arrLength; i++)
- do {
- isNotCorrect = false;
- cin >> inputArr[i];
- if (cin.fail() || cin.get() != '\n') {
- isNotCorrect = true;
- cout << "Ошибка ввода! Введите действительное число:" << '\n';
- cin.clear();
- while (cin.get() != '\n');
- }
- } while (isNotCorrect);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement