Произведение элементов массива с четными номерами
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
В одномерном массиве, состоящем из «целых элементов, вычислить:
Превратить массив так, чтобы сначала располагались все положительные элементы, а потом — все отрицательные (элементы, равные 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; }
Спасибо.
Юрий, так гораздо лучше ))