#include "pch.h"
#include <time.h>
#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
// Вектор с которым проводятся ВСЕ операции
vector<int> i_vec(NULL);
void description()
{
cout << "\n В одномерном массиве, состоящем из n целых элементов, вычислить:\n"
<< "\n 1) номер максимального элемента массива;\n"
<< "\n 2) произведение элементов массива, расположенных между первым и вторым нулевыми элементами.\n"
<< "\n 3) Преобразовать массив таким образом, чтобы в первой его половине располагались элементы, "
<< "\n стоявшие в нечетных позициях, а во второй половине — элементы, стоявшие в четных позициях.\n\n"
<< " Будете вводить вручную? ( y / n )\n Если нет, то будет создан массив из ста случайных чисел : ";
}
void i_print()
{
cout << endl << " № | №" << setw(3) << 0 << setw(5) << 1 << setw(5) << 2 << setw(5) << 3 << setw(5) << 4
<< setw(5) << 5 << setw(5) << 6 << setw(5) << 7 << setw(5) << 8 << setw(5) << 9 << endl
<< " |___________________________________________________";
int i(0), j(0);
for (vector<int>::const_iterator it = i_vec.cbegin(); it != i_vec.cend(); it++)
{
if ((i == 0) or (i % 10 == 0)) // Выводить на экран строки по 10 значений
{
cout << endl << " " << j << setw(3) << '|'; // Для чисел слева
j++;
}
i++;
if (*it == 0)
{
cout << "\033[31m"; // Красный цвет в консоли
}
cout << setw(5) << *it;
cout << "\033[1m\033[32m"; // Зеленый цвет в консоли
}
}
bool yes_no()
{
char y;
cin.clear();
cin >> y;
return(y == 'y');
}
void arr()
{
string str;
cout << endl << " Введите значения через пробел : ";
cin.ignore();
getline(cin, str);
vector<int> temp_vec;
istringstream is(str);
copy(istream_iterator<int>(is), {}, back_inserter(temp_vec));
i_vec.reserve(temp_vec.size()); // Резервируем место по размеру временного вектора
for (int i = 0; i < temp_vec.size(); i++)
{
i_vec.push_back(temp_vec[i]);
}
}
void rand_arr()
{
cout << "\n Массив заполненный случайными числами :\n";
i_vec.reserve(100); // Резервируем место для ста элементов
for (int i = 0; i < 100; i++)
{
i_vec.push_back(round(rand() % 21)); // Рандом от 0 до 20
}
}
void i_max()
{
int j(-99999);
for (int i = 0; i < i_vec.size(); i++)
{
if (j < i_vec[i]) j = i_vec[i]; // Ищем максимальный элемент массива
}
cout << "\n\n Максимальный элемент массива : " << j;
cout << "\n Номер максимального элемента массива : ";
for (int i = 0; i < i_vec.size(); i++)
if (j == i_vec[i]) cout << i << ' ';
}
int how_much_0()
{
int j(0);
for (int i = 0; i < i_vec.size(); i++)
{
if (i_vec[i] == 0) j++;
}
return j;
}
void calculation()
{
int i(0), a1(0), a2(0);
double e(1);
for (i; i < i_vec.size(); i++)
if (i_vec[i] == 0) // Находим первый элемент == 0
{
a1 = i; // Записываем 1й элемент == 0
break; // Переходим к следующему for
}
for (++i; i < i_vec.size(); i++) // Считаем от 1го элемента == 0, прибавляем 1
if (i_vec[i] != 0) // До тех пор пока не найдем второй элемент == 0
{
e *= i_vec[i]; // Умножаем элементы
a2 = i + 1; // Записываем 2й элемент == 0
}
else break;
cout << "\n Произведение элементов массива, расположенных между первым "
<< '[' << a1 << ']' << " и вторым " << '[' << a2 << ']'
<< " нулевыми элементами : " << e << endl;
}
void less_2()
{
cout << "\033[31m"; // Красный цвет в консоли
cout << "\n Количество элементов == 0 меньше двух !!!";
cout << "\033[1m\033[32m"; // Зеленый цвет в консоли
cout << endl;
}
int main()
{
setlocale(LC_ALL, "rus");
srand((unsigned)time(NULL));
system("color 0A");
description();
bool y = yes_no();
if (y) arr();
else rand_arr();
//cout << i_vec.capacity() << endl;
i_vec.shrink_to_fit(); // Убираем лишнее capacity
//cout << i_vec.capacity() << endl;
i_print();
i_max();
cout << endl <<" Количество элементов == 0 : "<< how_much_0();
if (how_much_0() > 1) calculation();
else less_2();
//####################################################################################################################
// Меняем местами четные и нечетные индексы
int j;
for (int i = 0; i < i_vec.size() / 2; i++)
{
int temp = i_vec[i];
for (j = i; j < i_vec.size() - 1; j++)
{
i_vec[j] = i_vec[j + 1];
}
i_vec[j] = temp;
}
i_print();
//####################################################################################################################
cout << endl << endl; system("pause"); return 0;
}