Консультация № 183717
26.06.2011, 12:19
55.00 руб.
0 10 1
Здравствуйте! У меня возникли сложности с таким вопросом:

Нужно написать программу на Turbo Pascale под windows.

Построить бинарное дерево поиска целочисленного типа данных. Выполнить обход дерева слева направо (левое поддерево - корень - правое поддерево). При обходе подсчитать:
- кол-во вершин имеющих хотя бы одну ненулевую связь;
- кол-во вершин имеющих две ненулевые связи;
- кол-во вершин имеющих не более одной ненулевой связи.

Хотелось бы побольше объяснений в самой программе

Заранее спасибо!

Обсуждение

Неизвестный
26.06.2011, 12:28
общий
26.06.2011, 12:28
На Turbo Pascal - программу для Windows? Что-то тут не так... Может в bpw? Да и то, ИМХО, уже для маразматиков и извращенцев!
Писал я в нем когда-то. Неплохая школа, чтобы понять работу Windows, но ... Он, ведь, орентирован на Windows-95. Слышали о таком?
В Turbo Pascal, не в Borland Pascal (!), возможно удастся извернуться, но работы потребует раз в 10 больше. Если будете настаивать, то и плату увеличьте соответственно
Неизвестный
26.06.2011, 12:50
общий
Нужно чтобы программа просто открывалась в windows. Прошу прощения, если не правильно выразился.
давно
Мастер-Эксперт
319965
1463
26.06.2011, 19:29
общий
Turbo Pascal для Windows

Была такая программа (TPW) для Windows 3.1
давно
Мастер-Эксперт
319965
1463
26.06.2011, 19:31
общий
Может сначала Вы все же узнаете у своего преподавателя на чем нужно писать?
давно
Профессионал
304622
583
27.06.2011, 08:51
общий
Эта задача была здесь:
183102

(Там, конечно, про windows речь не идёт.)
давно
Профессионал
304622
583
27.06.2011, 08:57
общий
Адресаты:
Они, наверно, недавно обнаружили, что в Win7 стартер дос-программы не запускаются. Вот преподаватель и пытается решить проблему.
Неизвестный
27.06.2011, 14:17
общий
Ответ-ссылка Вас устраивает? Если нет, напишите, если да, то попросим Сергея Бендера перевести его замечание в ответ
Повторять и делать вид, что заново пишем - совестно
Неизвестный
28.06.2011, 07:26
общий
Да, можно считать что ответ получен. Спасибо.
давно
Профессионал
304622
583
28.06.2011, 21:21
общий
Вдогонку. Если есть проблемы с запуском Turbo Pascal под Win -- используйте DOSBox, http://www.dosbox.com
давно
Профессионал
304622
583
01.07.2011, 01:52
общий
01.07.2011, 11:05
это ответ
Здравствуйте, лыков валерий олегович!

Итак, сведём и оформим ответ с учётом исправлений сделанных в мини-форуме по упомянутой ссылке.

[code h=200]
Program derevo;
Uses Crt;

{ Варианты запуска обхода с подсчетом:
1 - количество вершин, имеющих хотя бы одну ненулевую связь;
2 - количество вершин, имеющих две ненулевые связи;
3 - количество вершин, имеющих не более одной ненулевой связи.
}
Const NeMensheOdnoj=1;
Dve=2;
NeBolsheOdnoj=3;

Type inform = Integer;
ss = ^zveno;
zveno = Record
key: Integer;
inf: Inform;
left, right: ss;
End;

Var t:ss;
n,nn,c,i,k: Integer;


{----формирование дерева----}

Procedure Vstavka (Var p: ss; x: Integer);
Begin
{Если добрались конца ветвления, то добавляем новый элемент}
If p = Nil Then
Begin
New (p);
p^.inf:=x;
p^.key:=1;
p^.left:=Nil;
p^.right:=Nil;
End
{Если это уже существующий элемент}
else begin
{Если вставляемый меньше имеющегося, то отправляем его в левую ветку}
If x<p^.inf Then Begin Vstavka (p^.left,x); End;
{Иначе -- в правую}
If x>=p^.inf Then Begin Vstavka (p^.right,x); End;
end;
End;

{----вывод дерева----}

Procedure Print (Var p: ss; h: Integer);
Var i: Integer;
Begin
If p <> Nil Then
Begin
{Сначала распечатываем правое поддерево, увеличив отступ}
Print(p^.right,h+4);
For i:=1 To h Do Write (' ');
{Потом сам элемент}
Writeln (p^.inf);
{Потом левое поддерево}
Print (p^.left,h+4);
End;
End;

{ Рекурсивная функция, деалющая подсчёт для текущего дерева }
Function Count(p: ss; v: integer):integer;
Begin
{ Нет элемента -- результата ноль }
IF p = Nil Then Count:=0
Else Begin
{ Рассматриваются варианты вызова функции с соответствующими условием }
{ Первый вариант -- либо left, либо right не равны Nil }
If ((v = NeMensheOdnoj) and ((p^.left <> Nil) or (p^.right <> Nil)))
or
{ Второй вариант -- и left, и right не равны Nil }
((v = Dve) and ((p^.left <> Nil) and (p^.right <> Nil)))
or
{ Третий вариант -- либо left, либо right равны Nil }
((v = NeBolsheOdnoj) and ((p^.left = Nil) or (p^.right = Nil)))
{ Какой-то из вариантов сработал => ставим 1
и добавляем результаты рекурсивных вызовов левой и правой ветви }
Then Count:=1 + Count(p^.left,v) + Count(p^.right,v)
{ Иначе берём 0 и добавляем рекурсивные вызовы }
else Count:=0 + Count(p^.left,v) + Count(p^.right,v)
End;

End;

{----обход дерева----}


Begin ClrScr;
Writeln ('Vvedite koli4estvo elementov dereva: ');
Readln (n);
randomize;
For i:=1 To n Do
Begin
Writeln('Vvedite o4erednoj element');
Read (c);
Vstavka (t,c);
End;
{ Тут было Print (t,с); -- это ошибка }
Print (t,0);

Writeln('Koli4estvo vershin c >= 1 nenulevoj svjazi: ',Count(t,NeMensheOdnoj));
Writeln('Koli4estvo vershin c 2 nenulevymi svjazjami: ',Count(t,Dve));
Writeln('Koli4estvo vershin c <= 1 nenulevoj svjazi: ',Count(t,NeBolsheOdnoj));

Readkey;
End.
[/code]
Форма ответа