C++: Массивы, сортировка и нахождение минимальных-максимальных индексов

Дан массив вещественных чисел X=(x1,x2,..,xn). Записать элементы
заданного массива Х в массив Y следующим образом: в начальной части
расположить положительные элементы в порядке возрастания, затем в
порядке убывания отрицательные элементы, нулевые элементы не
записывать. Оценить, как при этом изменилось положение максимального
и минимального элементов массива.
Использовать функции.

Задачка простая на вид. Приступаем. У нас есть массивы, целых два. с ними нужно уметь делать следующее:

  • Создавать (Random)
  • Выводить на экран
  • Сортировать
  • Дополнять элементами (для второго массива)

Алгоритм работы программы:

  1. Заполнить массив X
  2. Вывести массив X
  3. Выбрать положительные элементы записать их в Y, запомнить индекс последнего добавленного
  4. Выбрать отрицательные элементы массива X и дописать их в Y
  5. Вывести массив Y на консоль
  6. Отсортировать и вывести на экран массив Y
  7. Получить индексы минимального и максимального элементов сначала для 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;
}

Пример работы программы:

Добавить комментарий