Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <sstream>
- #include <cmath>
- #include <string>
- using namespace std;
- int exceptionRead(int i) {
- bool isNotCorrect;
- int number;
- number = 0;
- do {
- isNotCorrect = false;
- cout << "Введите " << (i + 1) << " элемент массива" << endl;
- cin >> number;
- if (cin.fail()) {
- isNotCorrect = true;
- cout << "Неверный ввод данных!" << endl;
- cin.clear();
- while (cin.get() != '\n');
- }
- } while (isNotCorrect);
- return number;
- }
- int inputSizeFromConsole() {
- bool isNotCorrect;
- int size;
- do {
- isNotCorrect = false;
- cout << "Введите количество элементов в массиве: " << endl;
- cin >> size;
- if (cin.fail() or (size < 1)) {
- isNotCorrect = true;
- cout << "Неверный ввод данных!" << endl;
- cin.clear();
- while (cin.get() != '\n');
- }
- } while (isNotCorrect);
- cout << "Количество элементов: " << size << endl;
- return size;
- }
- void taskEssence() {
- setlocale(LC_ALL, "Rus");
- cout << "Данная программа сортирует массив методом подсчета." << endl;
- }
- string pathChoice() {
- string path;
- bool isNotCorrect;
- do {
- isNotCorrect = false;
- cout << "Введите путь к файлу." << endl;
- cin >> path;
- ifstream fin(path);
- if (fin.is_open()) {
- cout << "Файл успешно открыт!" << endl;
- }
- else {
- cout << "Ошибка открытия файла" << endl;
- isNotCorrect = true;
- }
- fin.close();
- } while (isNotCorrect);
- return path;
- }
- int inputSizeFromFile(const string& path) {
- int size;
- bool isNotCorrect;
- ifstream fin(path);
- do {
- isNotCorrect = false;
- cout << "Ввод количества элементов массива..." << endl;
- fin >> size;
- if (fin.fail() or (size < 1)) {
- isNotCorrect = true;
- cout << "Данные введены неккоректно. Впишите данные с клавиатуры." << endl;
- fin.clear();
- while (fin.get() != '\n');
- size = inputSizeFromConsole();
- }
- } while (isNotCorrect);
- fin.close();
- cout << "Количество элементов массива: " << size << endl;
- return size;
- }
- int* inputArrayFromFile(const string& path, int size, int* array) {
- ifstream fin(path);
- string line;
- cout << "Запись матрицы..." << endl;
- std::getline(fin, line);
- for (int i = 0; i < size; i++) {
- fin >> array[i];
- if (fin.fail()) {
- cout << "Данные введены неккоректно. Введите значение с клавиатуры." << endl;
- fin.clear();
- while (fin.get() != ' ');
- array[i] = exceptionRead(i);
- }
- }
- return array;
- }
- int* sorting(int* arr, int n) {
- int minVal;
- int maxVal;
- int range;
- int* count;
- int k;
- minVal = arr[0];
- maxVal = arr[0];
- for (int i = 1; i < n; i++) {
- if (arr[i] < minVal) {
- minVal = arr[i];
- }
- if (arr[i] > maxVal) {
- maxVal = arr[i];
- }
- }
- range = maxVal - minVal + 1;
- count = new int[range];
- for (int i = 0; i < n; i++) {
- count[i] = 0;
- }
- for (int i = 0; i < n; i++) {
- count[arr[i] - minVal]++;
- }
- k = 0;
- for (int i = 0; i < range; i++) {
- for (int j = 0; j < count[i]; j++) {
- arr[k] = i + minVal;
- k++;
- }
- }
- delete[] count;
- return arr;
- }
- void output(int* sortedArray, int size) {
- string path;
- cout << "\nМассив чисел после сортировки методом подсчета: " << endl;
- for (int i = 0; i < size; i++) {
- cout << sortedArray[i] << " ";
- }
- bool isNotCorrect;
- do {
- isNotCorrect = false;
- cout << "\nВведите путь к файлу для вывода." << endl;
- cin >> path;
- ofstream fout(path, fstream::app);
- if (fout.is_open()) {
- cout << "Файл успешно открыт!" << endl;
- fout << "Массив чисел после сортировки методом подсчета: " << endl;
- for (int i = 0; i < size; i++) {
- fout << sortedArray[i] << " ";
- }
- }
- else {
- cout << "Ошибка открытия файла" << endl;
- isNotCorrect = true;
- }
- fout.close();
- cout << "Ответ записан в файл." << endl;
- } while (isNotCorrect);
- delete[] sortedArray;
- }
- int* inputFromFIle(int* array) {
- string path;
- int size;
- int* sortedArray;
- cout << "При записи данных из файла, учтите, что на первой строке написано количество элементов массива, а далее с следующей строки через пробел сам массив" << endl;
- path = pathChoice();
- size = inputSizeFromFile(path);
- array = new int[size];
- array = inputArrayFromFile(path, size, array);
- sortedArray = sorting(array, size);
- output(sortedArray, size);
- return sortedArray;
- }
- int* inputArrayFromConsole(int* array, int size) {
- bool isNotCorrect;
- for (int i = 0; i < size; i++) {
- do {
- isNotCorrect = false;
- cout << "Введите " << (i + 1) << " элемент массива" << endl;
- cin >> array[i];
- if (cin.fail()) {
- isNotCorrect = true;
- cout << "Неверный ввод данных!" << endl;
- cin.clear();
- while (cin.get() != '\n');
- }
- } while (isNotCorrect);
- }
- return array;
- }
- int* inputFromConsole(int* array) {
- int size;
- int* sortedArray;
- sortedArray = 0;
- size = inputSizeFromConsole();
- array = new int[size];
- array = inputArrayFromConsole(array, size);
- sortedArray = sorting(array, size);
- output(sortedArray, size);
- return sortedArray;
- }
- int* sourceChoice(int* array) {
- int choiceNumber;
- bool isNotCorrect;
- int* sortedArray;
- cout << "Выберите, откуда будут выводиться данные: " << endl;
- do {
- isNotCorrect = false;
- cout << "Введите 0, если с консоли; введите 1, если с файла." << endl;
- cin >> choiceNumber;
- if (cin.fail() or ((choiceNumber != 0) and (choiceNumber != 1))) {
- isNotCorrect = true;
- cout << "Данные введены неккоректно" << endl;
- cin.clear();
- while (cin.get() != '\n');
- }
- } while (isNotCorrect);
- if (choiceNumber == 0) {
- sortedArray = inputFromConsole(array);
- }
- else {
- sortedArray = inputFromFIle(array);
- }
- return sortedArray;
- }
- int main() {
- int* array;
- int* sortedArray;
- array = nullptr;
- taskEssence();
- sortedArray = sourceChoice(array);
- delete[] array;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement