Другие языки программирования и технологии

Помогите с С++. Надо найти произведение элементов одномерного массива между первым и последним 0.

В одномерном массиве, вводимом с клавиатуры и состоящем из N вещественных элементов, вычислить произведение элементов массива, расположенных между первым и вторым нулевыми элементами.

#include
using namespace std;

void input (float x[20], int m)
{
for (int i = 0; i < m; i++)
cin >> x[i];
}
void show (float x[20], int m)
{
for (int i = 0; i < m; i++)
cout << x[i] << " \t ";
}

void proizvedenie (float x[20], int m)
{
int p = 1; // p = 1, потому что, если мы умножем на 0 - все значения обнулятся
for (int i = 0; i < m; i++)
{
if (x[i] == 0 && x[m - 1] == 0)
x[i] = x[m - 1];
p *= x[i];
}
cout << p;
}

int main ()
{
setlocale (LC_ALL, "Russian");
float n, a[20], b[20], i;
cout << "n = ";
cin >> n;
cout << endl;
cout << "Введите одномерный массив A: " << endl;
input (a, n);
cout << endl;
cout << endl << "Одномерный массив A: " << endl;
show (a, n);
cout << endl << endl;
cout << "Произведение элементов массива, расположенных между первым и вторым нулевыми элементами: ";
proizvedenie (a, n);
return 0;
}

Он выводит неправильно.
#include <iostream>
using namespace std;
void fill(double* box, const size_t n) {
cout << "Input " << n << " elements >>> ";
for (auto i = 0U; i < n; ++i) cin >> box[i];
system("cls");
}
void show(double* box, const size_t n) {
for (auto i = 0U; i < n; ++i) cout << box[i] << '\t';
cout.put('\n');
}
pair<double*, double*> find(double* box, const size_t n, const double value) {
auto next = box;
double* first = nullptr;
double* second = nullptr;
auto end = box + n;
while (next != end) {
if (*next == 0) {
first = next;
break;
}
++next;
}
while (++next != end) {
if (*next == 0) {
second = next;
break;
}
}
return { first, second };
}
double mbz(double* box, const size_t n) {
auto [first, second] = find(box, n, 0);
if (!(first && second)) return 0;
auto next = first;
if (++next == second) return 0;
auto m = 1.;
do m *= *next; while (++next != second);
return m;
}
int main() {
setlocale(LC_CTYPE, "Russian");
cout << "Введите размер массива: ";
size_t n;
cin >> n;
// Если в массиве менее трёх элементов, то задача не имеет смысла.
if (n < 3) exit(0);
auto box = new double[n];
fill(box, n);
show(box, n);
auto multiply = mbz(box, n);
if (multiply != 0) {
cout << "Произведение между первым и вторым нулевыми элементами: " << multiply << '\n';
} else {
// 1. Первый и второй нулевые элементы могут стоять рядом.
// 2. В массиве может быть только один нулевой элемент.
// 3. Нулевых элементов в массиве может совсем не быть.
cout << "Данные в массиве не соответствуют условию задания! \n";
}
delete[] box;
system("pause");
}
Тамара Гвоздович
Тамара Гвоздович
97 273
Лучший ответ
int i;
// ищем первый 0
for (i = 0; i < m && x[i]; ++i);
// умножаем до второго 0
while (++i < m && x[i]) { p *= x[i]; }
Паша Аксёнов Спасибо, получилось!

Похожие вопросы