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