![]() |
нужна помощь в решении двух задач по паскалю (срочно)
итак суть проблемы вот в чем : Описать логическую функцию 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 минуту ой чтото со вторым сообщением казус прошу удалить)) |
Считай все элементы из дерева в массив и в нём ищи одинаковые.
|
вобщем вот так до сих пор мучаюсь с этой задачей .уже написал через массив но вот беда оно мне заполняет его рендомайзными числами проверьте плз код может где напутал
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} |
ауууууууууууу
люди очнитесь помогите ну или раз не можете то скажите хоть шо хз |
А ты уверен что у тебя значение j везде правитльное?
Както стрёмно всё в одной куче. Лучше сделать выписывание дерава в массив и перебор массива в отдельных функцыях. А сам массив объявлять в основной программе, а не в переборе дерева. |
хм а это идея но боюсь не поможет тк при закрывании в скобки части где сортируется масив итд всеравно выдает рендомные числа(((оно просто не читает дерево((и я не могу понять почему
|
Цитата:
Код:
procedure search(n:link;j:integer); |
Цитата:
|
Так ты всю функцыю переделал или как?
Сейчас там может быть что угодно. Неправильное значение j, глюк с массивом. Я уже сейчас вижу потенциальные глюки. 1) "for j:=1 to 9 do" тоже имя переменной используется в другом месте - это зло. Ты уверен что этот цикл один раз выполняется? Если нет, тогда у тебя значение j перескакивает с нужной цыфры на 9. 2) функция сама себя вызывает, а массив внутри функции объявляется. Я даже не берусь прогнозировать как такое месиво будет работать. В общем, похоже на то, что такой код в принцыпе не может правильно работать. Про конкретную ошибку тут говорить не приходится. Цитата:
|
вантуз, я вчитался. Это неудачное исполнение пузырьковой сортировки.
Цитата:
Короче, перепиши все начисто - хуже не будет. П.С. По любому надо учиться пользоваться дебаггером. |
Цитата:
Не лучше ли развернуть начальный список (который в виде дерева) в другой список (плоский, можно даже использовать тот же самый тип "Link") и по нему уже пройтись по типу пузырька? PS: заодно и с "i" и "j" путаться не придется ;) |
Цитата:
Если он разрешит написать типа d :array[1..n] of integer; тогда вполне реально каждый раз правильный массив создавать. А вариантов всегда много. :) ЗЫ. Конкретно про динамичность вопроса небыло. Может там домашняя работа с требованием сделать на 10 элементов. |
Цитата:
:казнь: В данном случае дерево в виде списка, вообще говоря безразмерного. Динамических массивов в стандартном паскале (не путать с дельфийским обжектпаскалем) нет. Исходя из условий - клин клином ;) А если на дельфе, тож с массивами заморачиваться смысла нет, там есть готовые механизмы проверки уникальности, которые можно использовать - чего лисипед изобретать. |
Цитата:
Цитата:
Примерно так: procedure search(n:link;j:integer, n:integer); var ... d :array[1..n] of integer; begin ... end; А если паскаль так не сработает - тогда мимо. |
Цитата:
Строже разьве только модула. PS: балует си программистов :biggrin: |
Часовой пояс GMT +4, время: 12:46. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.