![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Всего один цикл |
|
C/C++ - [решено] Всего один цикл
|
Новый участник Сообщения: 8 |
Вот алгоритм, который мне нужно реализовать.
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 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать Balbec, а задачу в словах можно написать? Что нужно, содержание самой задачи какое? Код очень нечитабельный, на будущее, используйте тег [code]
|
------- Отправлено: 21:36, 15-05-2008 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 8
|
Профиль | Отправить PM | Цитировать Нужно вывести перестановоки в лексикографическом порядке, т.е. если у множества 4 элемента, то вывести надо 16 строк
1234 2341 3412 .... и так далее |
Отправлено: 10:40, 16-05-2008 | #3 |
редкий гость Сообщения: 1696
|
Профиль | Сайт | Отправить PM | Цитировать Цитата Balbec:
Теперь по коду. Демонстрирую как работает закоментированный кусок, если 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; } |
|
------- Отправлено: 12:37, 16-05-2008 | #4 |
Новый участник Сообщения: 8
|
Профиль | Отправить PM | Цитировать Спасибо большое! Учту замечания
![]() |
|
Отправлено: 15:09, 16-05-2008 | #5 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|