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

using namespace std;

bool isPrime(int n);
bool isEven(int a);
int getRandomNumber(int min, int max);
int choose_number();
void keyboard(int n, vector<int> *array);
void randomNumbers(int n, vector<int> *array, int min, int max);
void printArray(vector<int> *array);
int numbersFromFile(vector<int> *array);
void processArray(vector<int> *array1, vector<int> *array2);
void processArray2(vector<int> *array1, vector<int> *array2, vector<int> *array3);

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

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

    srand(time(NULL));
    vector<int> arr;
    vector<int> fin;
    vector<int> odd;

    cout << "Введите количество элементов массива - целое положительное число. ";
    int size = 0;
    do{
        size = choose_number();
    } while (size < 2);
    cout << endl;

    cout << "Выберите способ заполнения массива:\n\t0 - ввести с клавиатуры\n\t1 - заполнить случайными числами\n\t2 - из текстового файла\n";
    int choice;
    do{
        choice = choose_number();
    } while (choice < 0 || choice > 2);
    cout << endl;

    arr.reserve(size);
    fin.reserve(size);
    odd.reserve(size);

    switch (choice){
        case 0:{
            keyboard(size, &arr);
            cout << "Массив введенный с клавиатуры:\n";
            printArray(&arr);
            break;
        }
        case 1:{
            int min = 0, max = 0;
            cout << "Выберите начальную точку для генерации случайных чисел.\n\tMIN ";
            min = choose_number();

            cout << "Выберите конечную точку диапазона.\n\tMAX ";
            do{
                max = choose_number();
            } while (max <= min);

            randomNumbers(size, &arr, min, max);

            cout << "Массив сгенерированный из случайных чисел вышеуказанного диапазона:\n";
            printArray(&arr);
            break;
        }
        case 2:{
            numbersFromFile(&arr);
            cout << "Массив заполнен числами из файла:\n";
            printArray(&arr);
            break;
        }
    }

    cout << "\nЗадание 1.\nУдалить все простые числа из массива.\n";
    cout << "\nОбработанный массив: ";
    processArray(&arr, &fin);
    printArray(&fin);

    cout << "\nЗадание 2.\nПеред каждым нечётным элементом первого массива вставить сумму положительных элементов второго массива\n";
    cout << "\nОбработанный массив: ";
    processArray2(&arr, &fin, &odd);
    printArray(&odd);

    return 0;
}


bool isPrime(int n)
{
    int d = 2;
    while (d*d <= n && n % d != 0){
        d += 1;
    }
    // if (n == 2)
    //     cout << "Простое число!" << endl;
    // else if (n % d == 0)
    //     cout << "Составное число!" << endl;
    // else
    //     cout << "Простое число!" << endl;
    return d*d > n;
}

bool isEven(int a){
    // if (a % 2 == 0)
    //     cout << "четное " << a % 2 << endl;
    // else
    //     cout << "нечетное" << endl;
    return a % 2;
}

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 choose_number(){
    int n = 0;
    while (true){
        cin >> n;
        if (cin.fail()){
            cin.clear();
            cin.ignore(32767, '\n');
            cout << "Ошибка ввода!\n";
        }
        else{
            cin.clear();
            cin.ignore(32767, '\n');
            return n;
        }
    }
}

void keyboard(int n, vector<int> *array){
    for (int i = 0; i < n; ++i){
        int k = choose_number();
        array->push_back(k);
    }
}

void randomNumbers(int n, vector<int> *array, int min, int max){
    for (int i = 0; i < n; i++){
        int temp = getRandomNumber(min, max);
        array->push_back(temp);
    }
}

void printArray(vector<int> *array){
    for  (int i = 0; i < array->size(); i++){
        cout << array->at(i) << ' ';
    }
    cout << endl;
}

int numbersFromFile(vector<int> *array){
    string path = "path9cpp.txt";

    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 < 100; i++){
            rand_number = getRandomNumber(0, 1000);
            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;
        while (!fin.eof()){
            if (count < array->capacity()){
                ch = "";
                getline(fin, ch);
                if (ch == "") break;
                count++;
                array->push_back(stoi(ch));
            }
            else break;
        }
        fin.close();
    }
    return 0;
}

void processArray(vector<int> *array1, vector<int> *array2){
    for (int i = 0; i < array1->size(); i++){
        if (isPrime(array1->at(i)) == 0){
            array2->push_back(array1->at(i));
        }
    }
}

void processArray2(vector<int> *array1, vector<int> *array2, vector<int> *array3){
    int sum = 0;
    for (int i = 0; i < array2->size(); i++){
        if (array2->at(i) > 0)
            sum += array2->at(i);
    }
    for (int i = 0; i < array1->size(); i++){
        if (isEven(array1->at(i)) == 1){
            array3->push_back(sum);
            array3->push_back(array1->at(i));
        }
        else
            array3->push_back(array1->at(i));
    }
}
Соседние файлы в папке 2 курс - Основы алгоритмизации _ вариант 3