Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- using namespace std;
- void outputTask() {
- cout << "Данная программа находит НОД (наибольший общий делитель) среди заданных чисел." << endl;
- }
- bool chooseInput() {
- bool isNotCorrect;
- int num;
- do {
- isNotCorrect = false;
- cout << "Выберите откуда вводить данные: 0, если из консоли, 1 если из файла:" << endl;
- cin >> num;
- if ((cin.fail()) or ((num != 0) and (num != 1))) {
- isNotCorrect = true;
- cout << "Ошибка ввода! Повторите попытку." << endl;
- cin.clear();
- while (cin.get() != '\n');
- }
- } while (isNotCorrect);
- return (num == 1);
- }
- string choosePath() {
- string path;
- bool isNotCorrect;
- do {
- isNotCorrect = false;
- cout << "Введите путь к файлу для ввода информации:" << endl;
- cin >> path;
- ifstream fin(path);
- if ((!fin.is_open()) or (path.length() < 5)) {
- isNotCorrect = true;
- cout << "Ошибка ввода! Повторите попытку." << endl;
- }
- else {
- if (path[path.length() - 1] != 't' and path[path.length() - 2] != 'x' and path[path.length() - 3] != 't' and path[path.length() - 4] != '.') {
- isNotCorrect = true;
- cout << "Ошибка ввода! Повторите попытку." << endl;
- }
- }
- fin.close();
- } while (isNotCorrect);
- return path;
- }
- int inputSizeFromConsole() {
- int size;
- bool isNotCorrect;
- do {
- isNotCorrect = false;
- cout << "Введите количество чисел:" << endl;
- cin >> size;
- if (cin.fail() or (size < 2)) {
- isNotCorrect = true;
- cout << "Ошибка ввода! Повторите попытку." << endl;
- cin.clear();
- while (cin.get() != '\n');
- }
- } while (isNotCorrect);
- return size;
- }
- int inputSizeFromFile(string path) {
- int size;
- ifstream fin(path);
- cout << "Запись размера..." << endl;
- fin >> size;
- if (fin.fail() or (size < 2)) {
- cout << "Ошибка ввода! Введите размер с клавиатуры." << endl;
- size = inputSizeFromConsole();
- }
- fin.close();
- return size;
- }
- int exceptionRead(int i) {
- bool isNotCorrect;
- int num;
- do {
- isNotCorrect = false;
- cout << "Введите " << (i + 1) << "элемент:" << endl;
- cin >> num;
- if (cin.fail() or (num < 1)) {
- cout << "Ошибка ввода! Повторите попытку." << endl;
- isNotCorrect = true;
- cin.clear();
- while (cin.get() != '\n');
- }
- } while (isNotCorrect);
- return num;
- }
- void fillNumbersFromFile(int size, string path, int*& numbers) {
- string line;
- cout << "Запись чисел..." << endl;
- ifstream fin(path);
- fin >> line;
- for (int i = 0; i < size; i++) {
- fin >> numbers[i];
- if (fin.fail() or (numbers[i] < 1)) {
- cout << "Ошибка ввода! Введите " << (i + 1) << " элемент с клавиатуры." << endl;
- numbers[i] = exceptionRead(i);
- fin.clear();
- while (fin.get() != ' ');
- }
- }
- fin.close();
- }
- void inputFromFile(int*& numbers, int& size) {
- string path;
- cout << "При записи из файла учтите, что на 1 строке должно располагаться количество строк, а далее с новой строки через пробел сами числа." << endl;
- path = choosePath();
- size = inputSizeFromFile(path);
- numbers = new int[size];
- fillNumbersFromFile(size, path, numbers);
- }
- void fillNumbersFromConsole(int& size, int*& numbers) {
- bool isNotCorrect;
- for (int i = 0; i < size; i++) {
- do {
- isNotCorrect = false;
- cout << "Введите " << (i + 1) << " элемент:" << endl;
- cin >> numbers[i];
- if (cin.fail() or (numbers[i] < 1)) {
- cout << "Ошибка ввода! Повторите попытку." << endl;
- isNotCorrect = true;
- cin.clear();
- while (cin.get() != '\n');
- }
- } while (isNotCorrect);
- }
- }
- void inputFromConsole(int*& numbers, int& size) {
- size = inputSizeFromConsole();
- numbers = new int[size];
- fillNumbersFromConsole(size, numbers);
- }
- void inputNumbers(int*& numbers, int& size, bool isFromFile) {
- if (isFromFile) {
- inputFromFile(numbers, size);
- }
- else {
- inputFromConsole(numbers, size);
- }
- }
- int findNod(int* numbers, int size) {
- int min;
- int divider;
- bool isCorrect;
- min = numbers[0];
- for (int i = 0; i < size; i++) {
- if (numbers[i] < min) {
- min = numbers[i];
- }
- }
- for (int i = 1; i <= min; i++) {
- isCorrect = true;
- for (int j = 0; j < size; j++) {
- if (!(numbers[j]%i == 0)) {
- isCorrect = false;
- }
- }
- if (isCorrect) {
- divider = i;
- }
- }
- return divider;
- }
- string choosePathForOutput() {
- string path;
- bool isNotCorrect;
- do {
- isNotCorrect = false;
- cout << "Введите путь к файлу для вывода информации:" << endl;
- cin >> path;
- ofstream fout(path);
- if ((!fout.is_open()) or (path.length() < 5)) {
- isNotCorrect = true;
- cout << "Ошибка ввода! Повторите попытку." << endl;
- }
- else {
- if (path[path.length() - 1] != 't' and path[path.length() - 2] != 'x' and path[path.length() - 3] != 't' and path[path.length() - 4] != '.') {
- isNotCorrect = true;
- cout << "Ошибка ввода! Повторите попытку." << endl;
- }
- }
- fout.close();
- } while (isNotCorrect);
- return path;
- }
- void outputAnswerInFile(int nod) {
- string path;
- path = choosePathForOutput();
- ofstream fout(path);
- fout << "Максимальный общий делитель среди заданных чисел: " << nod << endl;
- cout << "Данные успешно записаны в файл!" << endl;
- fout.close();
- }
- void output(int nod) {
- cout << "Максимальный общий делитель среди заданных чисел: " << nod << endl;
- outputAnswerInFile(nod);
- }
- int main() {
- setlocale(LC_ALL, "Rus");
- bool isFromFile;
- int* numbers;
- int size;
- int nod;
- outputTask();
- isFromFile = chooseInput();
- inputNumbers(numbers, size, isFromFile);
- nod = findNod(numbers, size);
- output(nod);
- delete[] numbers;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement