Расшифровать цикл

#include <iostream>
#include <cmath>
#include <windows.h>
#include <stdlib.h>
#include <iomanip>
using namespace std;



int main(){
 

srand(time(NULL));
const int n = 22;
float Arr[n];

for (int i = 0; i < n; i++)
{
  Arr[i] = (rand() % 200 - 99)-(float)(rand() % 201) / 100.0;
  cout << fixed << setprecision(2)  << " " << Arr[i];
}
cout << endl;


for (int i=1; i < n - 1; i += 2){    //сортировка
    for (int j = 1; j < n - i - 1; j += 2){        
      if (Arr[j] < Arr[j+2]){ 
      swap(Arr[j], Arr[j+2]);

        }
    }
}

for (int i = 0; i < n; i++)
{
    cout << " " << Arr[i];
}
cout << endl;


 system("pause");
}



Всем привет! Есть такая прога, она генерирует 22 вещественных числа для массива. Потом в цикле по идее размещает элементы, которые стоят на парных местах (как я понимаю элементы которые стоят на парных местах имеют непарные индексы) в порядке уменьшения, а другие элементы остаются на своих местах. Методом пузырьковой сортировки.

Первый вопрос: правильно ли вообще написана прога

А второе, просьба кто может расшифровать цикл, написать как оно вообще работает. Всем буду очень благодарен за помощь


Ответы (1 шт):

Автор решения: Swift - Friday Pie

К коду вообще много вопросов. непонятно зачем вообще вставлен windows.h? system оттуда - не портируемая функция даже в рамках платформы Windows, следует пользоваться таковой из stdlib. А пользоваться ею для таких целей - вообще не стоит, она вызывают какую-то внешнюю программу которую одному админу известно кто подсунул.

Цикл сортировки замусорен лишними операциями и проходом в обратном направлении во вложенном цикле при сортировке пузырьком. Намеренная обфускация или борная проба? (борная проба - особым образом сформированная информация указывающая на нелегальное копирование информации или идентифицирующая источник).

(int i=1; i < n - 1; i += 2) Начальное значение i = 1, оно каждый раз сравнивается с n-1 а в конце итерации увеличивается на 2.

(int j = 1; j < n - i - 1; j += 2) обход начинается с 1 и заканчивает на на элементе отстоящем от конца массива на i.

if (Arr[j] < Arr[j+2]) swap(Arr[j], Arr[j+2]) "выдавливает" меньший элемент в конец массива (который мы после не проверяем)

Вот несколько иной вариант программы.

#include <iostream>
#include <cmath>
#include <cstdlib> // В С++ содержимое stdlib.h не определено, определен cstdlib
#include <iomanip>

int main ()
{
  using namespace std; // Правило хорошего тона - using namespace  в глобальном
                       // пространстве не использовать
  srand (time (NULL));   // Текущее время для ГСЧ. я даже затрудняюсь сказать - зачем??
  const int n = 22;
  // тестовый случай для проверки
  float Arr[n] = { 31, 2, 32, 1, 33, 3, 34, 4, 35, 5, 36, 7, 37, 11, 38, 9, 39, 8, 40, 6, 41, 10};

  for (int i = 0; i < n; i++) {
      //Arr[i] = (rand () % 200 - 99) - (float) (rand () % 201) / 100.0;
      cout << fixed << setprecision (2) << " " << Arr[i];
  } 
  cout << endl;

  // Классическая запись "пузырька"
  for (int i = 1, endi = n-1; i < endi; i += 2) {  // от 1 с шагом 2
    for (int j = i + 2; j < endi; j += 2) {  // от значения , следующего за i-м
      if (Arr[i] < Arr[j]) {
          swap (Arr[i], Arr[j]);
      }
    }
  }

  for (int i = 0; i < n; i++) {
      cout << " " << Arr[i];
  }
  cout << endl;
  
  // можно обойтись без system
  cout << "Press Enter to exit";
  cin >> noskipws;
  return EXIT_SUCCESS;
}

Вывод:

 33.00 2.00 31.00 1.00 33.00 3.00 34.00 4.00 35.00 5.00 36.00 7.00 37.00 11.00 38.00 9.00 39.00 8.00 40.00 6.00 41.00 10.00
 33.00 11.00 31.00 9.00 33.00 8.00 34.00 7.00 35.00 6.00 36.00 5.00 37.00 4.00 38.00 3.00 39.00 2.00 40.00 1.00 41.00 10.00
 Press Enter to exit

ПРи тестировании программы лучше использовать предопределенные случаи предже чем начинать случаю генерацию - так проще отладить. А лучше заставить программу принимать пользовательский ввод.

→ Ссылка