Дан массив вещественных чисел X=(x1,x2,..,xn). Записать элементы
заданного массива Х в массив Y следующим образом: в начальной части
расположить положительные элементы в порядке возрастания, затем в
порядке убывания отрицательные элементы, нулевые элементы не
записывать. Оценить, как при этом изменилось положение максимального
и минимального элементов массива.
Использовать функции.
Задачка простая на вид. Приступаем. У нас есть массивы, целых два. с ними нужно уметь делать следующее:
- Создавать (Random)
- Выводить на экран
- Сортировать
- Дополнять элементами (для второго массива)
Алгоритм работы программы:
- Заполнить массив X
- Вывести массив X
- Выбрать положительные элементы записать их в Y, запомнить индекс последнего добавленного
- Выбрать отрицательные элементы массива X и дописать их в Y
- Вывести массив Y на консоль
- Отсортировать и вывести на экран массив Y
- Получить индексы минимального и максимального элементов сначала для X, а пото для Y и вывести эти данные на консоль.
Для заполнения массива опишу функцию void createRandArray(float x [], int n) принимает на вход вещественный массив и размер этого массива:
1 2 3 4 5 6 7 |
void createRandArray(float x [], int n) { for (int i = 0; i < n; i++) { x[i] = rand() % 100 - 50; } } |
Вообщепо-хорошему функцию нужно сделать немного другой, что бы можно было задавать границы, но я сделал константами, ибо не так важно.
Для вывода буду использовать функцию void printArray(float x [], int n) параметры ровно такие же как и у предыдущей — массив и его размер.
1 2 3 4 5 6 7 |
void printArray(float x [], int n) { for (int i = 0; i < n; i++) { cout << x[i] << " "; } } |
Далее мне потребуется функция, которая будет брать положительные элементы из массива X и писать их в Y. Это будет int createYArray(float x[], float y[], int n) Для работы ей нужно передать массив X — откуда брать элементы, массив Y, куда их помещать и n — количество элементов массива X. Функция возвращает целое число — индекс последнего помещенного элемента в Y.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
int createYArray(float x[], float y[], int n) { int last_positive_index = -1; for (int i = 0; i < n; i++) { if (x[i] > 0) { last_positive_index++; y[last_positive_index] = x[i]; } } return last_positive_index; } |
На шаге 4 нужно дописать отрицательные элементы в Y. Тоже оберну эту операцию в функцию с именем int addNegativeToY(float x[], float y[], int last_index, int n). По своему строению напоминает предыдущую, но с той разницей что добавился еще один параметр — int last_index. Это индекс в массиве Y, на котором остановилась предыдущая функция. То есть со следующего номера можно дописывать элементы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
int addNegativeToY(float x[], float y[], int last_index, int n) { for (int i = 0; i < n; i++) { if (x[i] < 0) { last_index++; y[last_index] = x[i]; } } last_index++; return last_index; } |
Функция сортировки взята отсюда без изменений.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void sort(float arr [], int f, int t, bool order) { for (int i=f; i<t-1; i++) { int min=i; for (int j=i+1; j<t; j++) { if (order ^ arr[min] > arr[j]) { min=j; } } float temp = arr[min]; arr[min] = arr[i]; arr[i] = temp; } } |
В прошлой задаче, так же нужно было искать индексы. Но функцией я тогда не оформил. Вот сейчас пришлось. Но мне как обычно лень, поэтому и min и max индексы получаются путем вызова одной единственной функции с разными параметрами. Для управления знаком неравенства внутри функции используется тот же прием что и в сортировке — логическое отрицание.
1 2 3 4 5 6 7 8 9 10 11 12 |
int getMaxMinIndex(float arr [], int size, bool maxORmin) { int imaxmin = 0; for (int i = 0; i < size; i++) { if (maxORmin ^ arr[i] > arr[imaxmin]) { imaxmin = i; } } return imaxmin; } |
Таким образом, собрав все воедино, получается такой код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
#include <stdlib.h> #include <iostream> #include <time.h> #include <locale.h> #define SIZE 100 using namespace std; void createRandArray(float x [], int n) { for (int i = 0; i < n; i++) { x[i] = rand() % 100 - 50; } } void printArray(float x [], int n) { for (int i = 0; i < n; i++) { cout << x[i] << " "; } } int createYArray(float x[], float y[], int n) { int last_positive_index = -1; for (int i = 0; i < n; i++) { if (x[i] > 0) { last_positive_index++; y[last_positive_index] = x[i]; } } return last_positive_index; } int addNegativeToY(float x[], float y[], int last_index, int n) { for (int i = 0; i < n; i++) { if (x[i] < 0) { last_index++; y[last_index] = x[i]; } } last_index++; return last_index; } void sort(float arr [], int f, int t, bool order) { for (int i=f; i<t-1; i++) { int min=i; for (int j=i+1; j<t; j++) { if (order ^ arr[min] > arr[j]) { min=j; } } float temp = arr[min]; arr[min] = arr[i]; arr[i] = temp; } } int getMaxMinIndex(float arr [], int size, bool maxORmin) { int imaxmin = 0; for (int i = 0; i < size; i++) { if (maxORmin ^ arr[i] > arr[imaxmin]) { imaxmin = i; } } return imaxmin; } int main() { setlocale(LC_ALL, "Russian"); srand((int)time(NULL)); float x [SIZE], y[SIZE]; int n = 0, last_positive_index = 0, last_index = 0; cout << "Введите n:"; cin >> n; createRandArray(x, n); printArray(x,n); cout << endl; last_positive_index = createYArray(x,y,n); last_index = addNegativeToY(x,y,last_positive_index,n); printArray(y, last_index); sort(y,0,last_positive_index+1,false); // Возрастание =) sort(y,last_positive_index+1,last_index,true); // Убывание. cout << endl << "Отсортированный массив:" << endl; printArray(y,last_index); cout << endl << "--------------------" << endl; cout << "min " << getMaxMinIndex(x,n, true) << " -> " << getMaxMinIndex(y,last_index, true) << endl; cout << "max " << getMaxMinIndex(x,n, false) << " -> " << getMaxMinIndex(y,last_index, false) << endl; system("pause"); return 0; } |
Пример работы программы: