Добавил:
wso_studf
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#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));
}
}