Корректный перевод с плюсов на си


#include <iostream>
using namespace std;
void swap(int *a, int i, int j)
{
  int s = a[i];
  a[i] = a[j];
  a[j] = s;
}
bool NextSet(int *a, int n, int m)
{
  int j;
  do  // повторяем пока не будет найдено следующее размещение
  {
    j = n - 1;
    while (j != -1 && a[j] >= a[j + 1]) j--;
    if (j == -1)
      return false; // больше размещений нет
    int k = n - 1;
    while (a[j] >= a[k]) k--;
    swap(a, j, k);
    int l = j + 1, r = n - 1; // сортируем оставшуюся часть последовательности
    while (l < r)
      swap(a, l++, r--);
  } while (j > m - 1);
  return true;
}
void Print(int *a, int n)  // вывод размещения
{
  static int num = 1; // номер размещения
  cout.width(3); // ширина поля вывода номера размещения
  cout << num++ << ":  ";
  for (int i = 0; i < n; i++)
    cout << a[i] << " ";
  cout << endl;
}
int main() 
{
  int n, m, *a;
  cout << "N = ";
  cin >> n;
  cout << "M = ";
  cin >> m;
  a = new int[n];
  for (int i = 0; i < n; i++)
    a[i] = i + 1;
  Print(a, m);
  while (NextSet(a, n, m))
    Print(a, m);
  cin.get(); cin.get();
  return 0;
}

Это С++ код, а вот то, что я попытался сделать, но где-то прокололся и теперь не работает так как надо:

#include "stdafx.h" 
#include <Windows.h>
#include<stdio.h>
#include<malloc.h>
#pragma warning(disable : 4996)
void swap(int *a, int i, int j)
{
    
    int s = a[i];
    a[i] = a[j];
    a[j] = s;

} 
bool Next(int *a, int n, int m)
{
    int j=0;
do
{
    
    int j = n - 2;
    while (j != -1 && a[j] >= a[j + 1]) j--;
    if (j == -1)
        return false;
    int k = n - 1;
    while (a[j] >= a[k])k--;
    swap(a, j, k);
    int l = j + 1, r = n - 1;
    while (l < r)
        swap(a, l++, r--);
    
} while (j > m - 1);
return true;
} 
void Print(int *a, int n)
{
 int num = 1;
 printf("%3d: ", num++);
 for (int i = 0; i < n; i++)
    {
        
        printf("%d", a[i]);
        printf("\n");
    }
}
int main()
{
    int n, m, *a;
    printf("N= ");
    scanf("%d", &n);
    printf("M= ");
    scanf("%d", &m);
    a = (int*)malloc(n * sizeof(int));
    for (int i = 0; i < n; i++)
    {
        a[i] = i + 1;
        Print(a, m);
        while (Next(a, n, m))
            Print(a, m);
        
    }
    free(a);
    system("pause");
    return 0;
} 

Смысл программы состоит в том, чтобы показать все возможные размещения из n по k элементов, но мой перевод превратил все в бесконечный цикл, вопрос:"Как исправить?" Вот результат вывода программы на плюсах: введите сюда описание изображения

А это, то, что я сделяль:

введите сюда описание изображения


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

Автор решения: Qwertiy

diff 1

diff 2

PS: Что-то весь вопрос на троллинг смазивает. Ну как первое можно было сделать случайно? А если и можно, то в diff'е же сразу видно косяк.

→ Ссылка