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

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

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

 
 Ответить  Открыть новую тему 
> Просьба пояснить код программы
сообщение
Сообщение #1





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

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


ситуация такая

есть задача, условие которой - вывести на экран все перестановки чисел от 1 до n, без повторов

есть полностью рабочий код, но с одним небольшим, но существенно непонятным моментом

огромная просьба пояснить, каким образом строятся и выводятся на экран подстановки

ниже привожу код программы, часть требующую пояснения выделяю жирным шрифтом

program perestanovki;
uses crt;
const maxN=100;
type massiv=array[1..maxN] of integer;
type proverka=array[1..maxN] of boolean;
var
b,n,c:integer;
w:massiv;
a:proverka;
otvet:char;

{ !!! начало непонятного кода !!! }

procedure print(a,b:integer;q:proverka);
var i,j:integer;
otv:char;
begin
b:=b+1;
for i:=1 to a do
begin
if q[i]=false then
begin
w[b]:=i;
q[i]:=true;
print(a,b,q);
q[i]:=false;
end;
end;
if b=a then
begin
for j:=1 to a do write(w[j]);
writeln;
end;
end;

{ !!! конец непонятного кода !!! }

begin
clrscr;
b:=0;
c:=0;
repeat
write('vvedite natural''noe chislo: ');
readln(N);
if n>maxN then writeln('chislo ne doljno prevyshat'' ',maxN);
if n<=0 then writeln('chislo doljno byt'' polojitel''nym');
until (n<=maxN) and (n>0);

print(n,b,a);
write('complete.. press any key..');
readkey;
end.

заранее спасибо!

Сообщение отредактировано: Sideful -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
часть требующую пояснения выделяю жирным шрифтом
Жирным шрифтом не выйдет - выделяй комментариями...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





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

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


готово smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Обычный переборный алгоритм с возвратом: для того, чтобы перебрать все комбинации, используется массив чисел и массив Boolean-ов, который показывает, задействовано ли уже число в соответствующей позиции, или еще нет...

Перед изменением элемента помечаем его, как задействованный, далее - рекурсивный вызов самой процедуры Print (в которой заполнение продолжается, пока не будут использованы ВСЕ числа), после возврата из рекурсии - снимаем отметку о том, что данный элемент задействован (т.е, возвращаемся к первоначальному состоянию).

Для того, чтобы понять это - надо понимать, что такое рекурсия, и как она работает... Ты это знаешь?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





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

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


Ну как я понимаю, есть исходный массив чисел, на его основе строим подобные ему массивы, но с иным расположением элементов.

То есть у нас есть исходный массив, на его основе формируем новый, используя все элементы исходногоsmile.gif

Но это только в моем понимании..

Еще одно для меня неясно.. в коде есть цикл с условиев for i:=1 to a

но переменная a же объявлена как логическая

каким же образом идете перебор?

p.s.: спасибо за отзывчивостьsmile.gif

Сообщение отредактировано: Sideful -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Цитата
но переменная a же объявлена как логическая
Не путай локальные переменные с глобальными... В данном случае у тебя A - локальная переменная типа Integer, которая перекрывает глобальный массив Boolean-ов...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7





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

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


тогда понятно

спасибо огромное за помощьsmile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





- Текстовая версия 22.09.2020 12:50
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name