PDA

Просмотр полной версии : нужна помощь в решении двух задач по паскалю (срочно)


вантуз
15.04.2008, 17:30
итак суть проблемы вот в чем : Описать логическую функцию same(T)t определяющего, есть ли в дереве Т хотя бы два одинаковых элемента.
саму программу по созданию дерева и его просмотре я написал а вот как написать эту функцию уже 3й час понять не могу .вот текст программы написанной мною :
program zada4a;
type link = ^element;
element = record
data : integer;
left : link;
right : link;
end;
var
m,x, depth, minim : integer;
pn : link;


procedure add(var n : link; arg:integer);
var
ind, neo : link;
begin
new(neo);
neo^.data:=arg;
neo^.left:=nil;
neo^.right:=nil;
if n=nil then n:= neo
else begin
ind:=n;
while neo<>nil do begin
if arg<ind^.data then begin
if ind^.left=nil then begin
ind^.left:=neo;
neo:=nil
end
else ind:=ind^.left
end
else
if arg>ind^.data then begin
if ind^.right=nil then begin
ind^.right:=neo;
neo:=nil
end
else ind:=ind^.right
end
else begin
if arg=ind^.data then begin
if ind^.left=nil then begin
ind^.left:=neo;
neo:=nil
end
else
neo:=nil;
end;
end;
end;
end;
end; { add }

procedure restruct(var d : link);
var
ind1, ind2 : link;
begin
ind1:=d;
if ind1^.right=nil then begin
ind2:=d;
d:=ind2^.left;
dispose(ind2)
end
else
if ind1^.left=nil then begin
ind2:=d;
d:=ind2^.right;
dispose(ind2)
end
else begin
ind2:=ind1^.left;
while ind2^.right<>nil do begin
ind1:=ind2;
ind2:=ind2^.right;
end;
ind1^.right:=ind2^.left;
ind2^.left:=d^.left;
ind2^.right:=d^.right;
dispose(d);
d:=ind2;
end;
end; { restruct }

procedure view( n : link; var d:integer);
var
i : integer;
begin
for i:=1 to d do begin
write(' ') end;
writeln(n^.data);
if (n^.left=nil) and (n^.right=nil) then d:=d-1
else begin
if n^.right<>nil then begin
d:=d+1;
view(n^.right,d);
end;
if n^.left<>nil then begin
d:=d+1;
view(n^.left, d);
end;
d:=d-1;
end;
end; { view }

begin
m:=1;
pn:=nil;
while m<>0 do begin
writeln;
writeln('--- Type "1" to ADD new element');
writeln('--- Type "2" to VIEW tree');
writeln('--- Type "3" to FIND same elements');
writeln('--- Type "0" to EXIT program');
writeln;
write('Enter : ');
readln(m);
writeln;
case m of
1 : begin
write('Enter new element : ');
readln(x);
add(pn, x);
end;

2 : begin
depth:=1;
if pn=nil then writeln('The tree is empty') else begin
writeln('The tree is : ');
view(pn, depth);
end;
end;
3 : begin

end;
end; { case }
end;
end.
прошу спасти от мучений:молись::help:

добавлено через 2 минуты
и вот втораябтут я уж вобще ничего не понимаю 17.12.Формулу вида:
<формула>::=<терминал> |
(<формула><знак><формула>)
<знак>::=+|—|*
<тернинал>::=0|1 |2|3|4 |5 | 6|7|8 |9
можно представить в виде двоичного дерева («дерева-формулы») с ТЭД=char согласно следующим правилам:формула из одного терминала (цифры) представляется; деревом из одной вершины с этим терминалом, а формула вида:
*тут были картинки*
(f1 s f2)—деревом, в котором корень—это знак s, а левое и правое поддеревья — это соответствующие представления формул , f1 и f2. (На рис. 20 показано дерево-формула, соответствующее формуле (5*(3+8)).)
Описать рекурсивную функцию или процедуру, которая:
a) вычисляет (как целое число) значение дерева-формулы Т;
б) по формуле из текстового файла f строит соответствующее дерево-формулу Т;
b) печатает дерево-формулу Т в виде соответствующей формулы;
г) проверяет, является ли двоичное дерево Т деревом- формулой..

добавлено через 1 минуту
ой чтото со вторым сообщением казус прошу удалить))

EvroStandart
16.04.2008, 09:58
Считай все элементы из дерева в массив и в нём ищи одинаковые.

вантуз
13.05.2008, 17:16
вобщем вот так до сих пор мучаюсь с этой задачей .уже написал через массив но вот беда оно мне заполняет его рендомайзными числами проверьте плз код может где напутал
procedure search(n:link;j:integer);
var i,buf :integer;
ik:boolean;
k,neo:link;
d :array[1..10] of integer;
begin

d[j]:=n^.data;
if n^.right<>nil then
begin
j:=j+1;
search(n^.right,j);
end;
if n^.left<>nil then
begin
j:=j+1;
search(n^.left,j);
end;
if (n^.left=nil) and (n^.right=nil) then
begin
for j:=1 to 10 do begin
write(d[j],' ');end;
repeat
ik:=true ;
for j:=1 to 9 do
if d[j]>d[j+1] then
begin
buf:=d[j];
d[j]:=d[j+1];
d[J+1]:=buf;
ik:=false;
end;
until ik;
end;
for j:=1 to 9 do begin
if d[j]=d[j+1] then begin
writeln ('est odinakovie elementi =',d[j]);
end;
end;
end; {search}

вантуз
24.05.2008, 17:27
ауууууууууууу
люди очнитесь помогите ну или раз не можете то скажите хоть шо хз

EvroStandart
26.05.2008, 10:02
А ты уверен что у тебя значение j везде правитльное?
Както стрёмно всё в одной куче. Лучше сделать выписывание дерава в массив и перебор массива в отдельных функцыях. А сам массив объявлять в основной программе, а не в переборе дерева.

вантуз
26.05.2008, 18:17
хм а это идея но боюсь не поможет тк при закрывании в скобки части где сортируется масив итд всеравно выдает рендомные числа(((оно просто не читает дерево((и я не могу понять почему

crawler
26.05.2008, 19:12
хм а это идея но боюсь не поможет
Поможет... у тебя проблема в том что код "грязный", поэтому и ошобку найти не можешь.

procedure search(n:link;j:integer);
var i,buf :integer;
ik:boolean;
k,neo:link;
d :array[1..10] of integer;
begin

d[j]:=n^.data;
writeln(' d[', j, ']=', d[j]); {добавь эту строку - поймешь как заполняется массив}
if n^.right<>nil then
begin
j:=j+1;
search(n^.right,j);
end;

if n^.left<>nil then
begin
j:=j+1;
search(n^.left,j);
end;

if (n^.left=nil) and (n^.right=nil) then
begin
for j:=1 to 10 do begin
write(d[j],' ');end;
repeat
ik:=true ;
for j:=1 to 9 do
if d[j]>d[j+1] then
begin
buf:=d[j];
d[j]:=d[j+1];
d[J+1]:=buf;
ik:=false;
end; { вообще проверяет только соседей }
until ik;
end;
for j:=1 to 9 do begin
if d[j]=d[j+1] then begin
writeln ('est odinakovie elementi =',d[j]);
end;
end;
end; {search}

вантуз
28.05.2008, 09:47
repeat
ik:=true ;
for j:=1 to 9 do
if d[j]>d[j+1] then
begin
buf:=d[j];
d[j]:=d[j+1];
d[J+1]:=buf;
ik:=false;
end; { вообще проверяет только соседей }
извиняюсь но вчитайся это цикл сортировки массива а не проверки. проверка идет дальше а строку врайтлн поставил оно всеравно мне левые числа выводит((((жду еще каких нибуть предложений но и на этом спс

EvroStandart
28.05.2008, 12:56
Так ты всю функцыю переделал или как?
Сейчас там может быть что угодно. Неправильное значение j, глюк с массивом.

Я уже сейчас вижу потенциальные глюки.
1) "for j:=1 to 9 do" тоже имя переменной используется в другом месте - это зло. Ты уверен что этот цикл один раз выполняется? Если нет, тогда у тебя значение j перескакивает с нужной цыфры на 9.
2) функция сама себя вызывает, а массив внутри функции объявляется. Я даже не берусь прогнозировать как такое месиво будет работать.

В общем, похоже на то, что такой код в принцыпе не может правильно работать. Про конкретную ошибку тут говорить не приходится.


левые числа выводит

Левые - это какие? Их небыло в дереве?

crawler
28.05.2008, 15:51
вантуз, я вчитался. Это неудачное исполнение пузырьковой сортировки.

а строку врайтлн поставил оно все равно мне левые числа выводит(((( значит у тебя мусор на входе.

Короче, перепиши все начисто - хуже не будет.

П.С. По любому надо учиться пользоваться дебаггером.

Gr@nd@d
26.06.2008, 20:27
Считай все элементы из дерева в массив и в нём ищи одинаковые.Массив для динамического списка? :eek:
Не лучше ли развернуть начальный список (который в виде дерева) в другой список (плоский, можно даже использовать тот же самый тип "Link") и по нему уже пройтись по типу пузырька?

PS: заодно и с "i" и "j" путаться не придется ;)

EvroStandart
27.06.2008, 10:54
Массив для динамического списка? :eek:


Ну я в паскале не спец.
Если он разрешит написать типа d :array[1..n] of integer; тогда вполне реально каждый раз правильный массив создавать.

А вариантов всегда много. :)

ЗЫ.
Конкретно про динамичность вопроса небыло. Может там домашняя работа с требованием сделать на 10 элементов.

Gr@nd@d
27.06.2008, 14:02
Конкретно про динамичность вопроса небыло. Может там домашняя работа с требованием сделать на 10 элементов.Вот как раз потому что не было оговорено и нужно исходить из заданных условий. В старые добрые времена в альма матер преподы любили так прикалываться. Потом попавшихся заставляли рисовать блок-схемы и прогонять алгоритм вручную с заведомо глючными исходными данными. Как они говорили "для лучшего усвоения материала".
:казнь:
В данном случае дерево в виде списка, вообще говоря безразмерного.
Динамических массивов в стандартном паскале (не путать с дельфийским обжектпаскалем) нет. Исходя из условий - клин клином ;)
А если на дельфе, тож с массивами заморачиваться смысла нет, там есть готовые механизмы проверки уникальности, которые можно использовать - чего лисипед изобретать.

EvroStandart
27.06.2008, 15:17
Динамических массивов в стандартном паскале (не путать с дельфийским обжектпаскалем) нет.

Если он разрешит написать типа d :array[1..n] of integer;

Я вообщето предлагал создавать массив нужного размера. Дерево передаётся в отдельную функцию где создаётся массив по нужному количеству элементов и убивается при выходе из функции. Данную функцию можно вечно вызывать с разными деревьями и никакой динамичности в массиве не нужно.

Примерно так:
procedure search(n:link;j:integer, n:integer);
var ...
d :array[1..n] of integer;
begin
...
end;

А если паскаль так не сработает - тогда мимо.

Gr@nd@d
30.06.2008, 06:25
Я вообщето предлагал создавать массив нужного размера. А если паскаль так не сработает - тогда мимо.
Стандартный не сработает - в нем строгое описание типов.
Строже разьве только модула.

PS: балует си программистов :biggrin: