IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> ЦИКЛ В ЦИКЛЕ
ipconnect
сообщение 20.04.2015 8:28
Сообщение #1





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


Столкнулся с проблемой такого порядка. Как ни крутил, решить оптимально не получается. Требуется мозговой штурм коллективного разума. Задача выглядит следующим образом.

Имеется одномерный массив с N ячейками. Необходимо, казалось бы, просто сделать следующее. По заданному максимальному взятому для использования количеству ячеек M (<=N), начинающихся с первой от начала массива, необходимо менять значения в них следующим образом. Объяснить могу только на примере.
Т.е. в начале необходимо взять две первые ячейки. Изначально в первую записать 1, во вторую - на единицу больше. Затем надо менять значение во второй ячейке до некоторого числа K (к примеру, 30)...
Выглядит это так
1 2
1 3
...
1 30
Будут образовываться пары чисел, которые нужно потом будет сохранить. Но это уже к делу не относится. Тут бы сделать основное. Далее, когда значение во второй ячейке достигнет К, надо значение в первой ячейке увеличить на 1. И повторить цикл заново. Т.е.
2 3
2 4
...
2 30 и т.д. До того момента пока последняя пара будет К-1 К (в примере 29 30).
Далее необходимо включить в цикл третью ячейку. И сделать тот же самый цикл по тем же самым критериям изменений. Т.е. изначально это 1 2 3, потом 1 2 4 ... вплоть до К-2 К-1 К (28 29 30). Итак пока мы не заполним все три ячейки таким перебором. Потом четыре ячейки и т.д.
Перебор из M ячеек закончится тогда, когда последним набором чисел будет
K-M+1 K-M ... K-2 K-1 K

Думал, что просто. Справлюсь на раз-два-три. Оказалось не всё так просто, как кажется. Задача имеет практическое значение, поэтому бросить не могу. Нужно решить. Сам не в состоянии. Впервые попал в ступор при решении подобных задач. Помогите выбраться из тупика.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Федосеев Павел
сообщение 20.04.2015 12:06
Сообщение #2


Бывалый
***

Группа: Пользователи
Сообщений: 298
Пол: Мужской
Реальное имя: Федосеев Павел

Репутация: -  8  +


Оно?
program Counter30;

const
M = 5;
K = 10;
type
TArray = array [0..M - 1] of integer;

procedure ShowArray(const a: TArray);
var
i: integer;
begin
for i := 0 to M - 1 do
Write(a[i]: 3);
writeln;
end;

var
a: TArray;
i, j, n: integer;
begin
for i := 0 to M - 1 do
a[i] := 0;
a[0] := 1;
a[1] := 1;
i := 1;
while a[M - 1] <> K do
begin
Inc(a[i]);
if a[i] > K then
begin
a[i] := a[i - 1] + 1 + 1;
{перенос}
for j := i - 1 downto 0 do
begin
Inc(a[j]);
if (a[j] <= K - j - i) then
begin
for n := j + 1 to i do
a[n] := a[n - 1] + 1;
break;
end
else
if j = 0 then
begin
Inc(i);
a[0] := 1;
for n := j + 1 to i do
a[n] := a[n - 1] + 1;
end;
end;
end;
ShowArray(a);
end;
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
ipconnect
сообщение 20.04.2015 21:53
Сообщение #3





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


Цитата(Федосеев Павел @ 20.04.2015 12:06) *

Оно?
program Counter30;

const
M = 5;
K = 10;
type
TArray = array [0..M - 1] of integer;





Почти ... гениально. Увы, почти. Я даже до этого не дошёл. Где-то в коде неточность есть. Я вывел результат в тестовый файл. По циклу всё идёт правильно до позиции
1 33 36
После неё должна следовать группа
1 34 35
Однако, почему-то идёт
2 3 4 и т.д.
Т.е. теряются группы
1 34 35
1 34 36
1 35 36
Тоже самое происходит и после группы
2 33 36
За ней следует не
2 34 35
2 34 36
2 35 36
а аналогичная по логике, но неправильная по сути задачи
3 4 5
Итак в конце каждого цикла по первому числу в тройках. Кроме последних троек, которые должны были оканчивать в таком порядке
33 34 35
33 34 36
33 35 36
34 35 36
а фактически получилось
32 33 36
33 34 35
33 34 36
34 35 36
Т.е. по трём чисел после пары циклы заканчиваются на ... 33 36 вместо ... 35 36.

Потом на четырёх позициях происходит тоже самое нарушение логики при смене цикла на второй позиции. Т.е. за
1 2 31 36 должно следовать 1 2 32 33 и т.к., а идёт 1 3 4 5.
Получается из логики выпадают группы
1 2 32 33
1 2 32 34
1 2 32 35
1 2 32 36
1 2 33 34
1 2 33 35
1 2 33 36
1 2 34 35
1 2 34 36
1 2 35 36
Цикл по первой позиции переключается с 1 32 33 36 на 2 3 4 5, пропуская ряд групп чисел. Т.е. цикл по третьей позиции заканчивается на ... ... 31 36 вместо ... ... 35 36.
И наконец, включается пятая позиция и ...её хватает всего на интервал
1 2 3 4 5 ... 1 2 3 4 36. Всё. Где же недочёт. Не могу найти.

Добавлено через 13 мин.
Т.е. получается такой вот файл... Вместо К=10 я взял 36 ... Но сути дело не меняет. М тоже самое оставил.

Сообщение отредактировано: ipconnect - 20.04.2015 22:08


Прикрепленные файлы
Прикрепленный файл  TZ.TXT ( 1 мегабайт ) Кол-во скачиваний: 906
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 22.06.2025 5:01
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"