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

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

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

> Просьба пояснить код программы
Sideful
сообщение 25.10.2007 17:24
Сообщение #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 - 25.10.2007 17:41
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 6)
volvo
сообщение 25.10.2007 17:33
Сообщение #2


Гость






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





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

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


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


Гость






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

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

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





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

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


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

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

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

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

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

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

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

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


Гость






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





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

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


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

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

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

 



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