Произведение элементов массива с четными номерами

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

  1. произведение элементов массива с четными номерами;
  2. сумму элементов массива, расположенных между первым и последним нулевыми элементами.:

Превратить массив так, чтобы сначала располагались все положительные элементы, а потом — все отрицательные (элементы, равные 0, считать положительных).

Срочно нужен код программы =\

Олег, как должна осуществляться инициализация массива, с клавиатуры или массив инициализируется случайными числами?

Олег, у меня пока есть два варианта, с инициализацией массива случайными числами и с клавиатуры. Программы считают произведение четных элементов массива (кстати если значение четного элемента массива == 0, то произведение тоже == 0) и переинициализируют массив сначала положительными, а затем отрицательными числами с выводом их на экран.
Задание

сумму элементов массива, расположенных между первым и последним нулевыми элементами.

если честно не понятно, если можешь объясни и постарайся выкладывать свои наброски кода с пояснениями ;)
Олег, в общем, есть такой код с инициализацией массива случайными числами:

#include <iostream>
#include <ctime>        // заголовочный файл для функции srand()

using namespace std;

const int MAXSIZE = 100;

int main(void)
{
    cout << "Enter array size (max = 100): ";
    int*arrsize = new int;
    cin >> *arrsize;
// цикл проверки ввода значения размера массива
    do
    {
        if (*arrsize < 1 || *arrsize > MAXSIZE)
        {
        cout << "\nThe array size must be less than or equal to 100 & positive.\n"
            << "Try agane, please.\n\n";
        cout << "Enter array's size (max = 100): ";
        cin >> *arrsize;
        }
    }while (*arrsize < 1 || *arrsize > MAXSIZE);
    const int ArrSize = *arrsize;
    delete arrsize;

// создание массива под инициализацию
    signed int*arr = new signed int[ArrSize];
// заполнение массива случайными числами заданного диапазона (от -150 до 301)
    srand(time(NULL)||clock());
    for (int i = 0; i < ArrSize; i++)
        arr[i] = ((-150) + rand()%301);
// отображение массива
    for (int i = 0; i < ArrSize; i++)
        cout << "Array's element #" << i << ": " << arr[i] << endl;

// произведение элементов массива с четными номерами
    long long*product = new long long(1);
    for (int i = 0; i < ArrSize; i++)
    {
        if (i%2 == 0)   // проверка на четность элем. массива
            *product *= arr[i];
    }
    cout << "\nThe product of even numbers of the array: " << *product << endl;
    delete product;

// создание массива под сортировку
    signed int*postv_negtv = new signed int[ArrSize];
// обнуление массива
    for (int i = 0; i < ArrSize; i++)
        postv_negtv[i] = 0;

// разбиение значений массива arr на отриц. и положит. числа
    int k = 0;
    int j = (ArrSize-1);
    for (int i = 0; i < ArrSize; i++)
    {
        if (arr[i] >= 0)
        {
            postv_negtv[k] = arr[i];
            k++;
        }
        if (arr[i] < 0)
        {
            postv_negtv[j] = arr[i];
            j--;
        }
    }
// вывод значений массива (сначала положительные
// числа за ними отрицательные)
    cout << "\nChanged array: \n\n"; 
    for (int i = 0; i < ArrSize; i++)
        cout << postv_negtv[i] << endl;

    delete [] postv_negtv;
    delete [] arr;
    return 0;
}

и есть код с инициализацией массива с клавиатуры:

 #include <iostream>

    using namespace std;

    const int MAXSIZE = 100;
    // прототип функции для нахождения произведения
    // и возврата инициализированого массива
    signed int* Product(int ArrSize);
    // прототип функции для сортировки сначала положит.
    // затем отрицат. числами
    void Mix(int ArrSize, signed int*arr);

    int main(void)
    {
        cout << "Enter array's size (max = 100): ";
        int*arrsize = new int;
        cin >> *arrsize;
    // цикл проверки ввода значения размера массива
        do
        {
            if (*arrsize < 1 || *arrsize > MAXSIZE)
            {
            cout << "\nThe array's size must be less than or equal to 100 & positive.\n"
                << "Try agane, please.\n\n";
            cout << "Enter array size (max = 100): ";
            cin >> *arrsize;
            }
        }while (*arrsize < 1 || *arrsize > MAXSIZE);
        const int ArrSize = *arrsize;

        signed int*arr = new signed int[ArrSize];
        arr = Product(ArrSize); 
        delete arrsize;

        Mix(ArrSize, arr);

       delete arr;
        return 0;
    }
    signed int* Product (int AS)
    {
        cout << "\nEnter integers into array both positive as negative:\n\n";
    // создание массива под инициализацию
        signed int*arr = new signed int[AS];
    // заполнение массива с клавиатурного ввода
        for (int i = 0; i < AS; i++)
            cin >> arr[i];
    // отображение массива
        for (int i = 0; i < AS; i++)
            cout << "Array's element #" << i << ": " << arr[i] << endl;
        cout << endl;
    // произведение элементов массива с четными номерами
        long long*product = new long long(1);
        for (int i = 0; i < AS; i++)
        {
            if (i%2 == 0)   // проверка на четность элем. массива
                *product *= arr[i];
        }
        cout << "\nThe product of even array's elements: " << *product << endl;

        return arr;
        delete product;
        delete [] arr;
    }
    void Mix(int AS, signed int*arr)
    {
    // создание массива под сортировку
        signed int*postv_negtv = new signed int[AS];
    // обнуление массива 
        for (int i = 0; i < AS; i++)
            postv_negtv[i] = 0;

    // разбиение значений массива arr на отриц. и положит. числа
        int k = 0;
        int j = (AS-1);
        for (int i = 0; i < AS; i++)
        {
            if (arr[i] >= 0)
            {
                postv_negtv[k] = arr[i];
                k++;
            }
            if (arr[i] < 0)
            {
                postv_negtv[j] = arr[i];
                j--;
            }
        }
    // вывод значений массива (сначала положительные
    // числа за ними отрицательные)
        cout << "\nChanged array: \n\n";
        cout << "Positive numbers:\n";
        for (int i = 0; i < AS; i++)
        {
            if (postv_negtv[i] >= 0)
            cout << postv_negtv[i] << endl;
        }
        cout << "Negative numbers:\n";
        for (int i = 0; i < AS; i++)
        {
            if (postv_negtv[i] < 0)
            cout << postv_negtv[i] << endl;
        }
        delete [] postv_negtv;
    }

Юрий, не пояснишь, какой смысл вот в этом пассаже:

    int*arrsize = new int;
    cin >> *arrsize;
// ...
    const int ArrSize = *arrsize;
    delete arrsize;

И далее, почти аналогичный кусок с long long*product = new long long(1);

Почему ты просто не использовал автоматические переменные?

Тоже интересный кусок:

        for (int i = 0; i < AS; i++)
        {
            if (i%2 == 0)   // проверка на четность элем. массива
                *product *= arr[i];
        }

Не проще было написать

        for (int i = 0; i < AS; i += 2)
        {
                *product *= arr[i];
        }

Первый вариант программы мне понравился больше: всё сделано брутально, в лоб, без извращений ))

Во втором варианте появились подленькие функции, которые не только запутали код, но и автора.

Почему, например, функция Product() отвечает не только за вычисление произведения элементов массива в чётных позициях, но и за ввод массива с клавиатуры?

В конце функции Product() есть занимательный фрагмент:

        return arr;
        delete product;
        delete [] arr;
    }

Уничтожение динамических переменных после return'а — не прокатит. Утечка памяти «по маленькому» — только переменная product, поскольку arr уничтожать вообще-то нельзя, потому что этот массив возвращается вызывающему коду.

Зато здесь (в вызывающем коде):

        signed int*arr = new signed int[ArrSize];
        arr = Product(ArrSize);
        // ...
         delete arr;

получаем утечку памяти «по большому»: выделили память под массив и присвоили переменной arr адрес первого элемента, затем в функции Product() ещё раз выделили память под массив, вернули указатель на первый элемент и присвоили его опять переменной arr, оставив тем самым первый блок памяти бесхозным. Ну и в завершение уничтожили arr, но как простую динамическую переменную, а не как массив.

И это всё ещё и работает?!

Учусь, Алан, учусь :)
Спасибо, за комментарии тебе и Черепу, вы меня держите в тонусе :)

 int*arrsize = new int;
    cin >> *arrsize;
// ...
    const int ArrSize = *arrsize;
    delete arrsize;

в этом месте, я решил таким образом обезопасить значение введенного значения от дальнейших изменений (я не мог сразу создать автоматическую переменную, так как значение вводит пользователь)
Этот кусок long long*product = new long long(1); ты прав, нужно было объявить, как автоматическую переменную.
Твой код с нахождением четного элемента мне нравиться больше — лаконичнее.
Алан, подскажи, выделенную память в подпрограмме Product() , дабы избежать путаницы, мне, наверное, нужно было удалить не в подпрограмме, а в вызывающей функции?

Вроде, с учетом сделанных замечаний, получилось довольно брутально и с присутствием подленьких функций :)))

#include <iostream>

using namespace std;

const int MAXSIZE = 100; // max размер массива
// прототип функции для нахождения произведения
// и возврата инициализированого массива
void Product(signed int*arr, int ArrSize);
// прототип функции для сортировки сначала положит.
// затем отрицат. числами
void Mix(signed int*arr, int ArrSize);

int main(void)
{
    cout << "Enter array's size (max = 100): ";
    int arrsize;
    cin >> arrsize;
// цикл проверки ввода значения размера массива
    do
    {
        if (arrsize < 1 || arrsize > MAXSIZE)
        {
        cout << "\nThe array's size must be less than or equal to 100 & positive.\n"
            << "Try agane, please.\n\n";
        cout << "Enter array size (max = 100): ";
        cin >> arrsize;
        }
    }while (arrsize < 1 || arrsize > MAXSIZE);

    cout << "\nEnter integers into array both positive as negative:\n\n";
// создание массива под инициализацию
    signed int*arr = new signed int[arrsize];
// заполнение массива с клавиатурного ввода
    for (int i = 0; i < arrsize; i++)
        cin >> arr[i];
// отображение массива и номеров его элементов
    cout << endl;
    for (int i = 0; i < arrsize; i++)
        cout << "Array's element #" << i << ": " << arr[i] << endl;
    cout << endl;

    Product(arr, arrsize);

    Mix(arr, arrsize);

    delete [] arr;
    return 0;
}
void Product (signed int*arr, int AS)
{

// произведение элементов массива с четными номерами
    long long product = 1;
    for (int i = 0; i < AS; i += 2)
    {
            product *= arr[i];
    }
    cout << "\nThe product of even array's elements: " << product << endl;
}
void Mix(signed int*arr, int AS)
{
// создание массива под сортировку
    signed int*postv_negtv = new signed int[AS];
// обнуление массива 
    for (int i = 0; i < AS; i++)
        postv_negtv[i] = 0;

// разбиение значений массива arr на отриц. и положит. числа
    int k = 0;
    int j = (AS-1);
    for (int i = 0; i < AS; i++)
    {
        if (arr[i] >= 0)
        {
            postv_negtv[k] = arr[i];
            k++;
        }
        if (arr[i] < 0)
        {
            postv_negtv[j] = arr[i];
            j--;
        }
    }
// вывод значений массива (сначала положительные
// числа за ними отрицательные)
    cout << "\nChanged array: \n\n";
    cout << "Positive numbers:\n";
    for (int i = 0; i < AS; i++)
    {
        if (postv_negtv[i] >= 0)
        cout << postv_negtv[i] << endl;
    }
    cout << "Negative numbers:\n";
    for (int i = 0; i < AS; i++)
    {
        if (postv_negtv[i] < 0)
        cout << postv_negtv[i] << endl;
    }
    delete [] postv_negtv;
}

Спасибо.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.