Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
6
Добавлен:
19.08.2022
Размер:
9.73 Кб
Скачать
#include <iostream>
#include <string>
#include <ctime>
#include <fstream>
#include <vector>

using namespace std;

int getRandomNumber(int min, int max);
int check();

int main()
{
    setlocale(LC_ALL, "rus");

    cout << "Вариант №3" << endl;
    cout << "Лабораторная работа №8" << endl;

    srand(time(NULL));

    int size = 0;

    cout << "Введите количество элементов массива - целое положительное число. ";
    while (true)
    {
        cin >> size;
        if (cin.fail())
        {
            cin.clear();
            cin.ignore(32767, '\n');
            cout << "Ошибка ввода!\n";
        }
        if (size <= 1)
        {
            cout << "Массив должен содержать хотя бы 2 элемента. ";
            cin.clear();
            cin.ignore(32767, '\n');
            continue;
        }
        else
        {
            cin.clear();
            cin.ignore(32767, '\n');
            break;
        }
    }
    cout << endl;

    const int SIZE = size;

    int arr[SIZE]; // пустой массив инициализированный нулями длинною SIZE

    int choice = 0; // выбор варианта заполнения массива
    cout << "Выберите способ заполнения массива.\n\t0 - ввести с клавиатуры.\n\t1 - выбрать из текстового файла.\n\t2 - сгенерировать случайными числами.\n";
    while (true){
        cin >> choice;
        if (cin.fail())
        {
            cin.clear();
            cin.ignore(32767, '\n');
            cout << "Ошибка ввода значения.\n";
        }
        if (choice < 0 || choice > 2)
        {
            cin.clear();
            cin.ignore(32767, '\n');
            cout << "Ошибка ввода значения.\n";
        }
        else
        {
            cin.ignore(32767, '\n');
            break;
        }
    }

    //  обработка варианта создания массива
    switch (choice)
    {
        case 0: // ввести с клавиатуры
        {
            int num;
            cout << "Выбран вввод числовой последовательности с клавиатуры. Начали:\n";
            
            for (int i = 0; i < SIZE; i++)
            {
                num = check();
                arr[i] = num;
            }
            cout << endl;
            cout << "Элементы введенного массива: [";
            for (int j = 0; j < SIZE; j++)
            {
                if (j == (SIZE - 1)){
                    cout << arr[j] << "]" << endl;
                }
                else cout << arr[j] << " ";
            }
            break;
        }
        case 1: // выбрать из текстового файла
        {
            string path = "path.txt";
            const int size_8 = 8;
            ofstream fout;
            fout.open(path, std::ios::trunc);
            if (!fout.is_open())
            {
                cout << "Ошибка открытия файла." << endl;
                return 1;
            }
            else
            {
                int rand_number = 0;
                for (int i = 0; i < size_8; i++)
                {
                    rand_number = getRandomNumber(0, 90);
                    fout << rand_number << '\n';
                }
            }
            fout.close();
            
            ifstream fin;
            fin.open(path);
            if (!fin.is_open())
            {
                cout << "Ошибка открытия файла!" << endl;
                return -1;
            }
            else
            {
                string ch;
                int count = 0, n;
                while (!fin.eof())
                {
                    if (count <= SIZE)
                    {
                        ch = "";
                        getline(fin, ch);
                        if (ch == "") break;
                        count++;
                        n = stoi(ch);
                    }
                    else break;
                }
                fin.close();
            }

            cout << "Элементы массива: [";
            for (int j = 0; j < SIZE; j++)
            {
                if (j == (SIZE - 1)){
                    cout << arr[j] << "]" << endl;
                }
                else cout << arr[j] << " ";
            }
            break;
        }
        case 2: // сгенерировать
        {
            int min = 0, max = 0, num;
            cout << "\nВыбран вариант генерации числовой последовательности. Выберите диапазон min и max: \n";
            min = check();
            max = check();
            cout << "Выбор сделан.\nПроизводится генерация последовательности случайных чисел.\n";
            for (int i = 0; i < SIZE; i++)
            {
                num = getRandomNumber(min, max);
                arr[i] = num;
            }
            cout << endl;

            cout << "Элементы массива: \n[";
            for (int j = 0; j < SIZE; j++)
            {
                if (j == (SIZE - 1)){
                    cout << arr[j] << "]" << endl;
                }
                else cout << arr[j] << ", ";
            }
            break;
        }
    }

    cout << "\nЗадание 1.\n";
    cout << "Введите целое число для проверки на кратность элементов.\n";
    unsigned int number = 0;
    number = check();
    if (number == 0)
    {
        cout << "Условие невозможно." << endl;
    }
    else
    {
        vector<int> numbers;
        int multiply_result = 0;

        for (int i = 0; i < (sizeof(arr)/sizeof(arr[0])); i++)
        {
            if (arr[i] == 0)
                continue;
            else if (arr[i] % number == 0 && arr[i] != 0)
            {
                numbers.push_back(arr[i]);
            }
        }

        if (numbers.empty()) cout << "Кратных чисел нет." << endl;
        else
        {
            for (int k = 0; k < numbers.size(); k++)
            {
                cout << numbers[k] << " ";
            }
            cout << endl;

            multiply_result = numbers[0];
            for (int t = 1; t < numbers.size(); t++)
            {
                multiply_result *= numbers[t];
            }
            cout << "Результат перемножения кратных числу " << number << " чисел массива = " << multiply_result << endl;
            cout << endl;
        }
    }

    
    cout << "\nЗадание 2.\n";
    vector<int> null_elements;
    int sum = 0;
    for (int i = 0; i < (sizeof(arr)/sizeof(arr[0])); i++)
    {
        null_elements.push_back(arr[i]);
        cout << null_elements[i] << " ";
    }
    cout << endl;
    
    if (!null_elements.empty())
    {
        vector<int> index;
        bool flag = false;
        int null_element = 0;
        
        
        for (int i = 0; i < null_elements.size(); i++)
        {
            if (flag == false && null_elements[i] == 0)
            {
                flag = true;
                null_element++;
                continue;
            }
            if (flag == true && null_elements[i] != 0)
            {
                index.push_back(null_elements[i]);
                // cout <<  null_elements[i] << ' ';
            }
            else if (flag == true && null_elements[i] == 0)
            {
                null_element++;
                break;
            }
        }

        for (int l = 0; l < index.size(); l++)
        {
            sum += index[l];
        }

        if (null_element == 2)
        {
            if (null_elements.back() == 0 && (null_elements[(null_elements.size() - 2)] == 0))
            {
                cout << "Элементы равные 0 последний и предпоследний в массиве. Задание не может быть вычислено." << endl;
            }
            else cout << "Сумма элементов от 0 элемента массива до следующего 0 элемента = " << sum << endl;
        }
        else if (null_element == 1)
        {
            if (null_elements.back() == 0) cout << "Элемент равный 0 последний в массиве. Задание не может быть вычислено." << endl;
            else cout << "Сумма элементов от 0 элемента массива до конца массива = " << sum << endl;
        }
        else if (null_element == 0) cout << "Массив не содержит элементов равных 0." << endl;
        else cout << "Сумма элементов от 0 элемента массива до конца массива = " << sum << endl;

    }
    else cout << "Массив пуст." << endl;

    return 0;
}

int getRandomNumber(int min, int max)
{
    const double fraction = 1.0 / (static_cast<double>(RAND_MAX) + 1.0);
    return static_cast<int>(rand() * fraction * (max - min + 1) + min);
}

int check()
{
    int x;
    while (true)
    {
        cin >> x;
        if (cin.fail())
        {
            cin.clear();
            cin.ignore(32767, '\n');
            cout << "Ошибка ввода.\n";
        }
        else {
            break;
        }
    }
    return x;
}
Соседние файлы в папке 2 курс - Основы алгоритмизации _ вариант 3