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

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

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

> Графы. Фундаментальная система циклов связного графа
Юлия92
сообщение 6.05.2012 14:25
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 21
Пол: Женский
Реальное имя: Джули

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


Написала программу по псевдокоду...Но результат работы процедур не выдается....Не пойму в чем проблема...Пседокод прилагаю..заранее благодарю за помощь))

uses crt;
const
max=50;
type
TMatrix = array [1..max,1..max] of byte;
TArray = array [1..max] of integer;

var
i,j,m,k,z : integer;
num,ftr,masQ: TArray;
Matrix : TMatrix; {матрица смежности}
n ,nz: integer; {количество вершин графа}

procedure save(i,j,nz:integer);
begin
z:=i;
while z<>j do
begin
masQ[nz]:=z;
z:=ftr[z];
masQ[nz]:=j;
masq[nz]:=i;
end;
end;
procedure cicle(i:integer);
var
j:integer;

begin
k:=k+1;
num[i]:=k;
for j:=1 to n do
begin
if (Matrix[i, j]<>0) and (num[j]=0) then
begin
ftr[j]:=i;
cicle(j);
end
else if ftr[i]<>j then
begin
nz:=nz+1;
save(i,j,nz);
end;
end;
end;

begin
clrscr;

writeln('=======Фундаментальная система циклов связного графа====');

write('Введите количество вершин графа:');
readln(n);
writeln('Заполнение матрицы смежности');
for i:=1 to n do
for j:=1 to n do
begin
Write('(',i,',',j,')=');
read(Matrix[i,j]);
if Matrix[i,j] <> 0 then Matrix[i,j]:=1;
end;
{$endif}
//вывод матрицы смежностиж;
writeln('Матрица смежности');
for i:=1 to n do
begin
for j:=1 to n do
write(Matrix[i,j],' ');
writeln;
end;
writeln;


writeln('Результат :');
n:=0; m:=0;
for i:=1 to n do
begin
num[i]:=0; {ни одна вершина не посещалась}
ftr[i]:=0;
n:=n+1;
m:=m+(n*n);
m:= round(m / 2);
k:=1;
end;
for i:=1 to m-n+1 do
begin
masQ[i]:=0;
k:=0;
nz:=0;
cicle(i);

//вывод массивов num ftr;
write('num: ');
for i:=1 to n do
write(num[i]:3);
writeln;
write('ftr: ');
for i:=1 to n do
write(ftr[i]:3);
writeln;
write('masQ: ');
for i:=1 to n do
write(masQ[i]:3);
writeln;
write('nz: ');
write(nz);
writeln;
readln;
end;
end.

Прикрепленное изображение


--------------------
ДЖУЛИ
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Федосеев Павел
сообщение 10.05.2012 18:47
Сообщение #2


Бывалый
***

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

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


masQ? Он представляет из себя массив от 1 до nZ - первый (внешний цикл от 1 до nZ), каждый стек представляет из себя массив переменной длины, в котором элемент с нулевым индексом содержит длину стека (внутренний цикл от 1 до masQ[i][0]):
  writeln('nZ:  ', nZ);
writeln('masQ: ');
for i:=1 to nZ do
begin
write(i, '. ');
for j:=1 to masQ[i][0] do
write(masQ[i][j]:3);
writeln;
end;


А можно замечания к коду?
- переменная n вводится, а чуть ниже ей присваивается 0.
- переменной m присваивается не то значение. смотри внимательно псевдокод
- стек странно инициализируется. достаточно обнулить длины каждого стека for i:=1 to m-n+1 do masQ[i][0]:=0;
- из основной программы cicle вызывается один раз с параметром 1 (см. псевдокод)
Это из того, что бросается в глаза.

Далее, когда я попытался несколько дней назад отладить собственный вариант псевдокода, по ходу выполнения программы возникали исключения вида "полез в чужую память". Пришлось дополнить условия в save. Это увидишь отладчиком включив опци проверки диапазонов {$R+, Q+}.

Плюс к этому, в circle формировалась пара-тройка "левых" циклов. Также лечится усложнением условия сохранения вновь найденного цикла.

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

Сообщений в этой теме
Юлия92   Графы. Фундаментальная система циклов связного графа   6.05.2012 14:25
Федосеев Павел   1. Обрати внимание, что в этой задаче граф предлаг...   6.05.2012 21:11
Юлия92   спасибо большое за помощь,просто мне преподаватель...   8.05.2012 20:41
Федосеев Павел   Если непонятно - задавай вопросы. Конечно, если во...   8.05.2012 21:33
Юлия92   Если быть честной непонятно мне вообще в процедуре...   9.05.2012 11:26
Федосеев Павел   Я вижу так:procedure Save(i, j, nZ : integer); var...   9.05.2012 13:52
Юлия92   спасибо за помощь...как отблагодарить не знаю... :...   9.05.2012 17:55
Федосеев Павел   Недорого - 3 месяца активной помощи (ответов) стра...   9.05.2012 18:47
Юлия92   Ой этим я и так занимаюсь....помогаю бедным и обез...   10.05.2012 15:28
Юлия92   uses crt; const max=50; type TMatrix = arra...   10.05.2012 15:59
Федосеев Павел   masQ? Он представляет из себя массив от 1 до nZ - ...   10.05.2012 18:47
Юлия92   Павел это снова я с вопросами...))))Почему n потом...   16.05.2012 14:28
Федосеев Павел   Юль, ты делаешь все механически, не вникая. Мне пр...   16.05.2012 18:42
Юлия92   Спасибо тебе большое,но я вникала я перерыла все у...   17.05.2012 18:21


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

 



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