imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 15.04.2008, 17:30     # 1
вантуз
Guest
 
Сообщения: n/a

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

итак суть проблемы вот в чем : Описать логическую функцию 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.
прошу спасти от мучений

добавлено через 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 минуту
ой чтото со вторым сообщением казус прошу удалить))
 
Старый 16.04.2008, 09:58     # 2
EvroStandart
Full Member
 
Аватар для EvroStandart
 
Регистрация: 20.01.2004
Адрес: Таллинн
Пол: Male
Сообщения: 623

EvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собой
Считай все элементы из дерева в массив и в нём ищи одинаковые.
EvroStandart вне форума  
Старый 13.05.2008, 17:16     # 3
вантуз
Guest
 
Сообщения: n/a

вобщем вот так до сих пор мучаюсь с этой задачей .уже написал через массив но вот беда оно мне заполняет его рендомайзными числами проверьте плз код может где напутал
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     # 4
вантуз
Guest
 
Сообщения: n/a

ауууууууууууу
люди очнитесь помогите ну или раз не можете то скажите хоть шо хз
 
Старый 26.05.2008, 10:02     # 5
EvroStandart
Full Member
 
Аватар для EvroStandart
 
Регистрация: 20.01.2004
Адрес: Таллинн
Пол: Male
Сообщения: 623

EvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собой
А ты уверен что у тебя значение j везде правитльное?
Както стрёмно всё в одной куче. Лучше сделать выписывание дерава в массив и перебор массива в отдельных функцыях. А сам массив объявлять в основной программе, а не в переборе дерева.
EvroStandart вне форума  
Старый 26.05.2008, 18:17     # 6
вантуз
Guest
 
Сообщения: n/a

хм а это идея но боюсь не поможет тк при закрывании в скобки части где сортируется масив итд всеравно выдает рендомные числа(((оно просто не читает дерево((и я не могу понять почему
 
Старый 26.05.2008, 19:12     # 7
crawler
Full Member
 
Регистрация: 11.12.2002
Сообщения: 864

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

Код:
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}
crawler вне форума  
Старый 28.05.2008, 09:47     # 8
вантуз
Guest
 
Сообщения: n/a

Цитата:
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; { вообще проверяет только соседей }
извиняюсь но вчитайся это цикл сортировки массива а не проверки. проверка идет дальше а строку врайтлн поставил оно всеравно мне левые числа выводит((((жду еще каких нибуть предложений но и на этом спс
 
Старый 28.05.2008, 12:56     # 9
EvroStandart
Full Member
 
Аватар для EvroStandart
 
Регистрация: 20.01.2004
Адрес: Таллинн
Пол: Male
Сообщения: 623

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

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

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


Цитата:
Сообщение от вантуз Посмотреть сообщение
левые числа выводит
Левые - это какие? Их небыло в дереве?
EvroStandart вне форума  
Старый 28.05.2008, 15:51     # 10
crawler
Full Member
 
Регистрация: 11.12.2002
Сообщения: 864

crawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собой
вантуз, я вчитался. Это неудачное исполнение пузырьковой сортировки.

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

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

П.С. По любому надо учиться пользоваться дебаггером.
crawler вне форума  
Старый 26.06.2008, 20:27     # 11
Gr@nd@d
Full Member
 
Аватар для Gr@nd@d
 
Регистрация: 15.09.2004
Адрес: Палата74@Дурдом.RU
Пол: Male
Сообщения: 593

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

PS: заодно и с "i" и "j" путаться не придется
__________________
Количество ума на Земле постоянно, а население растёт...
Gr@nd@d вне форума  
Старый 27.06.2008, 10:54     # 12
EvroStandart
Full Member
 
Аватар для EvroStandart
 
Регистрация: 20.01.2004
Адрес: Таллинн
Пол: Male
Сообщения: 623

EvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собой
Цитата:
Сообщение от Gr@nd@d Посмотреть сообщение
Массив для динамического списка?
Ну я в паскале не спец.
Если он разрешит написать типа d :array[1..n] of integer; тогда вполне реально каждый раз правильный массив создавать.

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

ЗЫ.
Конкретно про динамичность вопроса небыло. Может там домашняя работа с требованием сделать на 10 элементов.
EvroStandart вне форума  
Старый 27.06.2008, 14:02     # 13
Gr@nd@d
Full Member
 
Аватар для Gr@nd@d
 
Регистрация: 15.09.2004
Адрес: Палата74@Дурдом.RU
Пол: Male
Сообщения: 593

Gr@nd@d ГуруGr@nd@d ГуруGr@nd@d ГуруGr@nd@d ГуруGr@nd@d ГуруGr@nd@d ГуруGr@nd@d ГуруGr@nd@d ГуруGr@nd@d ГуруGr@nd@d ГуруGr@nd@d ГуруGr@nd@d ГуруGr@nd@d ГуруGr@nd@d ГуруGr@nd@d ГуруGr@nd@d Гуру
Цитата:
Сообщение от EvroStandart Посмотреть сообщение
Конкретно про динамичность вопроса небыло. Может там домашняя работа с требованием сделать на 10 элементов.
Вот как раз потому что не было оговорено и нужно исходить из заданных условий. В старые добрые времена в альма матер преподы любили так прикалываться. Потом попавшихся заставляли рисовать блок-схемы и прогонять алгоритм вручную с заведомо глючными исходными данными. Как они говорили "для лучшего усвоения материала".

В данном случае дерево в виде списка, вообще говоря безразмерного.
Динамических массивов в стандартном паскале (не путать с дельфийским обжектпаскалем) нет. Исходя из условий - клин клином
А если на дельфе, тож с массивами заморачиваться смысла нет, там есть готовые механизмы проверки уникальности, которые можно использовать - чего лисипед изобретать.
__________________
Количество ума на Земле постоянно, а население растёт...
Gr@nd@d вне форума  
Старый 27.06.2008, 15:17     # 14
EvroStandart
Full Member
 
Аватар для EvroStandart
 
Регистрация: 20.01.2004
Адрес: Таллинн
Пол: Male
Сообщения: 623

EvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собой
Цитата:
Сообщение от Gr@nd@d Посмотреть сообщение
Динамических массивов в стандартном паскале (не путать с дельфийским обжектпаскалем) нет.
Цитата:
Сообщение от EvroStandart Посмотреть сообщение
Если он разрешит написать типа d :array[1..n] of integer;
Я вообщето предлагал создавать массив нужного размера. Дерево передаётся в отдельную функцию где создаётся массив по нужному количеству элементов и убивается при выходе из функции. Данную функцию можно вечно вызывать с разными деревьями и никакой динамичности в массиве не нужно.

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

А если паскаль так не сработает - тогда мимо.
EvroStandart вне форума  
Старый 30.06.2008, 06:25     # 15
Gr@nd@d
Full Member
 
Аватар для Gr@nd@d
 
Регистрация: 15.09.2004
Адрес: Палата74@Дурдом.RU
Пол: Male
Сообщения: 593

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

PS: балует си программистов
__________________
Количество ума на Земле постоянно, а население растёт...
Gr@nd@d вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 08:31.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.