imho.ws |
![]() |
![]() |
|
Сообщения:
Перейти к новому /
Последнее
|
Опции темы |
![]() |
# 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 минуту ой чтото со вторым сообщением казус прошу удалить)) |
![]() |
# 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} |
![]() |
# 5 |
Full Member
Регистрация: 20.01.2004
Адрес: Таллинн
Пол: Male
Сообщения: 623
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
А ты уверен что у тебя значение j везде правитльное?
Както стрёмно всё в одной куче. Лучше сделать выписывание дерава в массив и перебор массива в отдельных функцыях. А сам массив объявлять в основной программе, а не в переборе дерева. |
![]() |
![]() |
# 7 | |
Full Member
Регистрация: 11.12.2002
Сообщения: 864
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
Код:
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} |
|
![]() |
![]() |
# 8 | |
Guest
Сообщения: n/a
|
Цитата:
|
|
![]() |
# 9 |
Full Member
Регистрация: 20.01.2004
Адрес: Таллинн
Пол: Male
Сообщения: 623
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Так ты всю функцыю переделал или как?
Сейчас там может быть что угодно. Неправильное значение j, глюк с массивом. Я уже сейчас вижу потенциальные глюки. 1) "for j:=1 to 9 do" тоже имя переменной используется в другом месте - это зло. Ты уверен что этот цикл один раз выполняется? Если нет, тогда у тебя значение j перескакивает с нужной цыфры на 9. 2) функция сама себя вызывает, а массив внутри функции объявляется. Я даже не берусь прогнозировать как такое месиво будет работать. В общем, похоже на то, что такой код в принцыпе не может правильно работать. Про конкретную ошибку тут говорить не приходится. Левые - это какие? Их небыло в дереве? |
![]() |
![]() |
# 10 | |
Full Member
Регистрация: 11.12.2002
Сообщения: 864
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
вантуз, я вчитался. Это неудачное исполнение пузырьковой сортировки.
Цитата:
Короче, перепиши все начисто - хуже не будет. П.С. По любому надо учиться пользоваться дебаггером. |
|
![]() |
![]() |
# 11 |
Full Member
Регистрация: 15.09.2004
Адрес: Палата74@Дурдом.RU
Пол: Male
Сообщения: 593
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Массив для динамического списка?
![]() Не лучше ли развернуть начальный список (который в виде дерева) в другой список (плоский, можно даже использовать тот же самый тип "Link") и по нему уже пройтись по типу пузырька? PS: заодно и с "i" и "j" путаться не придется ![]()
__________________
Количество ума на Земле постоянно, а население растёт... |
![]() |
![]() |
# 12 |
Full Member
Регистрация: 20.01.2004
Адрес: Таллинн
Пол: Male
Сообщения: 623
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Ну я в паскале не спец.
Если он разрешит написать типа d :array[1..n] of integer; тогда вполне реально каждый раз правильный массив создавать. А вариантов всегда много. ![]() ЗЫ. Конкретно про динамичность вопроса небыло. Может там домашняя работа с требованием сделать на 10 элементов. |
![]() |
![]() |
# 13 | |
Full Member
Регистрация: 15.09.2004
Адрес: Палата74@Дурдом.RU
Пол: Male
Сообщения: 593
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
![]() В данном случае дерево в виде списка, вообще говоря безразмерного. Динамических массивов в стандартном паскале (не путать с дельфийским обжектпаскалем) нет. Исходя из условий - клин клином ![]() А если на дельфе, тож с массивами заморачиваться смысла нет, там есть готовые механизмы проверки уникальности, которые можно использовать - чего лисипед изобретать.
__________________
Количество ума на Земле постоянно, а население растёт... |
|
![]() |
![]() |
# 14 | |
Full Member
Регистрация: 20.01.2004
Адрес: Таллинн
Пол: Male
Сообщения: 623
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
Примерно так: procedure search(n:link;j:integer, n:integer); var ... d :array[1..n] of integer; begin ... end; А если паскаль так не сработает - тогда мимо. |
|
![]() |
![]() |
# 15 | |
Full Member
Регистрация: 15.09.2004
Адрес: Палата74@Дурдом.RU
Пол: Male
Сообщения: 593
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
Строже разьве только модула. PS: балует си программистов ![]()
__________________
Количество ума на Земле постоянно, а население растёт... |
|
![]() |