Цитата Balbec:
Нужно вывести перестановоки в лексикографическом порядке, т.е. если у множества 4 элемента, то вывести надо 16 строк »
|
24
Теперь по коду. Демонстрирую как работает закоментированный кусок, если i=0 n=4
было: 1 2 3 4
1-й проход: 4 2 3 1
2-1 проход 4 3 2 1
3-й проход: 1 3 2 4
4-й прохож 1 2 3 4
в результате ничего не поменялось
Нужно менять только _половину_ элементов с элементами с другой стороны. Это первая ошибка. Вторая заключается в том, что вы индексы неправильно считаете. Третья, в том, что неправильно элементы, которые надо менять местами (неинициализированные max и index, неправильная расстановка фигурных скобочек). Ещё вы память под массив неправильно выделяете, что вам ваш компилятор прощает.
Вот слега исправленный (и работающий) код:
Код:

#include <stdio.h>
#include <stdlib.h>
int main()
{
//------------------Cozdali massiv, vveli ego elementi------------------
int *massiv;
int n;
printf ("Vvedite razmernost' perestanovki\n");
scanf ("%d",&n);
massiv=new int [n];
for (int q=0;q<n;q++)
{
massiv[q]=q+1;
}
//--------------------------------Pe4at' massiva---------------------------------------------
printf ("Elementi perestanovki:\n");
for (int j=0;j<n;j++)
{
printf ("%5d ", massiv[j]);
}
int i,m,max=32767;
int iminus1=0;
int index=0;
int temp=0;
printf("\n");
//---------------------Generaciya perestanovok v leksikografi4eskom poryadke-----------------
for(;;)
{
for(i=n-1;i>0;i--)
{
if (massiv[i]>massiv[i-1]) { iminus1=i-1; break;}
}
if(i==0) break;
index=i;
max=massiv[i];
for (m=i;m<n;m++)
{
if((massiv[iminus1]<massiv[m])&&(massiv[m]<max)) { max=massiv[m]; index=m;}
}
temp=massiv[iminus1];
massiv[iminus1]=massiv[index];
massiv[index]=temp;
//Вот цикл в котором ошибка
for(int b=i;b<i+(n-i)/2;b++)
{
int obmen=massiv[b];
massiv[b]=massiv[n+i-b-1];
massiv[n+i-b-1]=obmen;
}
//-------------Pe4at' massiva pri perestanovke-----------
printf("Perestanovka: \n");
for (int p=0;p<n;p++)
{
printf("%5d",massiv[p]);
}
printf("\n");
}
delete[] massiv;
}
Рекомендую вам его отформатировать по человечески.