Дан массив вещественных чисел X=(x1,x2,..,xn). Записать элементы
заданного массива Х в массив Y следующим образом: в начальной части
расположить положительные элементы в порядке возрастания, затем в
порядке убывания отрицательные элементы, нулевые элементы не
записывать. Оценить, как при этом изменилось положение максимального
и минимального элементов массива.
Использовать функции.
Задачка простая на вид. Приступаем. У нас есть массивы, целых два. с ними нужно уметь делать следующее:
- Создавать (Random)
- Выводить на экран
- Сортировать
- Дополнять элементами (для второго массива)
Алгоритм работы программы:
- Заполнить массив X
- Вывести массив X
- Выбрать положительные элементы записать их в Y, запомнить индекс последнего добавленного
- Выбрать отрицательные элементы массива X и дописать их в Y
- Вывести массив Y на консоль
- Отсортировать и вывести на экран массив Y
- Получить индексы минимального и максимального элементов сначала для X, а пото для Y и вывести эти данные на консоль.
Для заполнения массива опишу функцию void createRandArray(float x [], int n) принимает на вход вещественный массив и размер этого массива:
void createRandArray(float x [], int n)
{
for (int i = 0; i < n; i++)
{
x[i] = rand() % 100 - 50;
}
}
Вообщепо-хорошему функцию нужно сделать немного другой, что бы можно было задавать границы, но я сделал константами, ибо не так важно.
Для вывода буду использовать функцию void printArray(float x [], int n) параметры ровно такие же как и у предыдущей — массив и его размер.
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.
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, на котором остановилась предыдущая функция. То есть со следующего номера можно дописывать элементы.
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;
}
}
В прошлой задаче, так же нужно было искать индексы. Но функцией я тогда не оформил. Вот сейчас пришлось. Но мне как обычно лень, поэтому и min и max индексы получаются путем вызова одной единственной функции с разными параметрами. Для управления знаком неравенства внутри функции используется тот же прием что и в сортировке — логическое отрицание.
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;
}
Таким образом, собрав все воедино, получается такой код:
#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;
}
Пример работы программы: