Расшифровать цикл
#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 шт):
К коду вообще много вопросов. непонятно зачем вообще вставлен 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
ПРи тестировании программы лучше использовать предопределенные случаи предже чем начинать случаю генерацию - так проще отладить. А лучше заставить программу принимать пользовательский ввод.