Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Всего один цикл

Ответить
Настройки темы
C/C++ - [решено] Всего один цикл

Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: Balbec
Дата: 16-05-2008
Вот алгоритм, который мне нужно реализовать.
1) просматривая перестановку справа налево, ищем самую пер-вую позицию i такую, что (если такой позиции нет, значит текущая подстановка и процесс генерации завершается);
2) просматривая от слева направо, ищем наименьший из элементов такой, что ;
3) меняем местами элементы и ; затем все элементы записываем в обратном порядке (т.е. меняем местами симметрично расположенные элементы и ).
А вот код, который я написал. Ошибка где-то в закомментированном цикле, не пойму где. Помогите-а?
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
void main()
{
//------------------Cozdali massiv, vveli ego elementi------------------
clrscr();
randomize();
int *massiv;
int n;
massiv=new int [n];
printf ("Vvedite razmernost' perestanovki\n");
scanf ("%d",&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;

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<n;b++)
// {
// int obmen=massiv[b];
// massiv[b]=massiv[(-1)*(b+1)+n];
// massiv[(-1)*(b+1)+n]=obmen;
// }

//-------------Pe4at' massiva pri perestanovke-----------
printf("Perestanovka: \n");
for (int p=0;p<n;p++)
{
printf("%5d",massiv[p]);
}
printf("\n");
// break;
}
delete massiv;
getch();
}

Отправлено: 20:37, 15-05-2008

 

Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Balbec, а задачу в словах можно написать? Что нужно, содержание самой задачи какое? Код очень нечитабельный, на будущее, используйте тег [code]

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 21:36, 15-05-2008 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


Нужно вывести перестановоки в лексикографическом порядке, т.е. если у множества 4 элемента, то вывести надо 16 строк
1234
2341
3412
....
и так далее

Отправлено: 10:40, 16-05-2008 | #3


редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


Цитата 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;
}
Рекомендую вам его отформатировать по человечески.

-------
http://ivank.ru

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:37, 16-05-2008 | #4


Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибо большое! Учту замечания

Отправлено: 15:09, 16-05-2008 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Всего один цикл

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Цикл с использованием имен файлов Bastet Скриптовые языки администрирования Windows 5 05-07-2010 19:28
[решено] Цикл... Как его правельно использовать в моём случае??? sashadeg AutoIt 3 24-03-2009 16:53
В ноутбуках HP Recovery disc создается всего один раз Sparkster Ноутбуки 1 16-10-2008 05:22
Разное - [решено] Всего один вопрос =) Balbec Программирование и базы данных 2 14-05-2008 12:56
CMD/BAT - [решено]*.cmd: цикл перебирает значения и каждое значение проверяется skeletor Скриптовые языки администрирования Windows 1 15-03-2007 16:11




 
Переход