C/C++

Нужно решить задачу с массивами на C++

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

1) произведение отрицательных элементов массива;

2) сумму положительных элементов массива, расположенных до максимального элемента;

3) изменить порядок следования элементов в массиве на обратный.

Размерности массивов вводятся на этапе выполнения и затем выделяется память под элементы массивов. В третьем задании дополнительный массив не использовать.
#include <iostream>
#include <ctime>

using namespace std;

int main()
{
int n;
do
{
cout << "Введите размер массива: ";
cin >> n;
}while(n <= 0);
int * A;
A = new int[n]; // выделили память

srand(time(nullptr)); // чтобы генерировать случайные числа
rand();

for(int x = 0; x < n; x++)
{
A[x] = rand() % 21 - 10; // диапазон [-10;10]
cout << A[x] << ' '; // сразу на экран
}
cout << endl << endl;

long long int P = 1; // для произведения
for(int x = 0; x < n; x++)
{
if(A[x] < 0)
{
P *= A[x];
}
}
cout << "Произведение отрицательных элементов равно ";
cout << P << '.' << endl;

int i_max = 0; // для индекса максимального элемента
for(int x = 0; x < n; x++)
if(A[x] > A[i_max]) i_max = x;
int sum = 0; // для суммы положительных элементов массива
for(int x = 0; x < i_max; x++)
{
if(A[x] > 0) sum += A[x];
}
cout << "Сумма положительных элементов массива, расположенных до максимального элемента равна " << sum << '.' << endl;

// меняем порядок элементов
int tmp;
for(int x = 0; x < n/2; x++)
{
tmp = A[x];
A[x] = A[n - 1 - x];
A[n - 1 - x] = tmp;
}
// на экран
for(int x = 0; x < n; x++)
cout << A[x] << ' ';
cout << endl;

if(A!=(int*)nullptr)
{
delete [] A; // освобождение памяти
A = (int*) nullptr;
}
return 0;
}
Игорь Кравцов
Игорь Кравцов
71 569
Лучший ответ
#include <algorithm>
#include <numeric>
#include <iostream>
#include <iomanip>
#include <random>
using namespace std;
double* create(const size_t len) {
return new(nothrow) double[len];
}
void destroy(double* vec) {
if (vec != nullptr) {
delete[] vec;
vec = nullptr;
}
}
size_t length(const char* msg) {
auto len = 0U;
while (!len) {
cout << msg;
cin >> len;
}
return len;
}
void fill(double* vec, const size_t len) {
uniform_int_distribution<> uid(-99, 99);
mt19937 gen{ random_device()() };
for (auto i = 0U; i < len; ++i) {
vec[i] = uid(gen) / 10.0;
}
}
void show(double* vec, const size_t len, const streamsize w = 5U) {
for (auto i = 0U; i < len; ++i) {
cout << fixed << setprecision(1U) << setw(w) << vec[i];
}
puts("");
}
double product_negative(double* vec, const size_t len) {
auto acc = 1.0;
for (auto i = 0U; i < len; ++i) {
if (vec[i] < 0) {
acc *= vec[i];
}
}
return acc;
}
double sum_positive(double* vec, const size_t len) {
auto acc = 0.0;
for (auto i = 0U; i < len; ++i) {
if (vec[i] > 0) {
acc += vec[i];
}
}
return acc;
}
int main() {
const auto len = length("n: ");
auto box = create(len);
const auto end = box + len;
if (!box) exit(0);
fill(box, len);
show(box, len);
if (find_if(box, end, [](double x) { return x < 0; })) {
const auto product = product_negative(box, len);
cout << "Product: " << product << '\n';
} else {
puts("Negative not found!");
}
if (find_if(box, end, [](double x) { return x > 0; })) {
const auto sum = sum_positive(box, len);
cout << "Sum: " << sum << '\n';
} else {
puts("Positive not found!");
}
reverse(box, end);
show(box, len);
destroy(box);
}
Евгений Ляхов
Евгений Ляхов
59 506