Вот это модуль. Он должен содержать описание объекта, который представляет бинарное дерево. Объект должен обладать возможностью добавления новых элементов, удаления существующих, поиска элемента по ключу, обхода дерева а также определять число вхождений элемента Е в дерево.
unit u_lr11;
interface
type
rabotnik=record
number:integer;
FIO:string[15];
godroj:integer;
pol:char;
cem:string[12];
koldet:integer;
oklad:integer;
end;
Ptree=^Ttree;
Ttree=object
data:rabotnik;
left,right:Ptree;
function addtree(top:Ptree;newnode:rabotnik):Ptree;
procedure prosmotr(top:Ptree);
function search(top:Ptree;x:integer):boolean;
procedure Count_E(Root:Ptree;Var n:Integer;E:rabotnik);
procedure delete(var top:Ptree;node:integer);
end;
ftype=file of rabotnik;
procedure orgtree(var f:ftype;top:Ptree);
implementation
function Ttree.addtree(top:Ptree;newnode:rabotnik):Ptree;
begin
if top=nil then
begin
new(top);
top^.data:=newnode;
top^.left:=nil;
top^.right:=nil;
end
else
if top^.data.fio>newnode.fio then
top^.left:=addtree(top^.left,newnode)
else
top^.right:=addtree(top^.right,newnode);
addtree:=top
end;
procedure Ttree.prosmotr(top:Ptree);
{процедура просмотра значений узлов дерева слева направо}
begin
writeln('N ','ФИО':15,' год рожд',' пол',' семсост':12,' дети',' оклад');
if top<>nil then
begin
prosmotr(top^.left);
with top^.data do
writeln(number,' ',fio:15,' ',godroj:9,' ',pol:4,' ',cem:12,' ',koldet:5,' ',oklad:6);
prosmotr(top^.right);
end;
end;
procedure orgtree(var f:ftype;top:Ptree);
var
z:rabotnik;
begin
writeln('выполняется процедура организации дерева');
readln;
reset(f);
top:=nil;
while not eof(f) do
begin
read(f,z);
top:=top^.addtree(top,z);
end;
end;
procedure Ttree.Count_E(Root:Ptree;Var n:Integer;E:rabotnik);
Begin
If Root<>Nil then begin
With Root^.data do
If (FIO=E.FIO) then Inc(n);
Count_E(Root^.left,n,E);
Count_E(Root^.right,n,E);
end;
End;
function Ttree.search(top:Ptree;x:integer):boolean;
begin
search:=false;
while top<>nil do
if top^.data.oklad=x then
begin
search:=true;
exit;
end
else
if top^.data.oklad>x then top:=top^.left
else top:=top^.right;
end;
procedure Ttree.delete(var top:Ptree; node:integer);
var
q:Ptree;
procedure delR(var x:Ptree);
begin
if x^.right<>nil then delR(x^.right)
else begin
q^.data:=x^.data;
q:=x;
x:=x^.left;
end;
end;
begin
if top=nil then exit {элемента нет}
else if node<top^.data.oklad then delete(top^.left, node)
else if node>top^.data.oklad then delete(top^.right,node)
else begin
q:=top;
if q^.right=nil then top:=q^.left
else if q^.left=nil then top:=q^.right
else delR(q^.left);
dispose(q);
end;
end;
begin
end.
program lab11;
uses crt,u_lr11;
var
top,fnd,Root,addtree:PTree;
f:ftype;
nbr,n:integer;
key1,fdl,E:string;
begin
assign(f,'cotrydnik.dat');
top:=nil;
repeat
clrscr;
writeln('1-Организация дерева');
writeln('2-Просмотр дерева');
writeln('3-Добавление листа в дерево');
writeln('4-Удаление элемента из дерева');
writeln('5-Поиск в дереве по ключу');
writeln('6-Число вхождений элемента Е в дерево');
writeln('7-Выход');
writeln('--------------------------------------------------------------------------------');
writeln;
writeln('Введите номер пункта меню');
readln(nbr);
case nbr of
1:orgtree(f,top);
2:begin
writeln;
writeln('Выполняется процедура просмотра дерева');
writeln;
top^.prosmotr(top);
writeln;
readln;
end;
3:addtree:=(top,newnode);
4:begin
writeln;
writeln('Введите фамилию удаляемого элемента');
readln(fdl);
top^.delete(top,fdl);
end;
5:begin
writeln;
writeln('Введите ключевую фамилию');
readln(key1);
fnd:=top^.poisk(top,key1);
writeln;
if fnd<>nil then
writeln('Найдено')
else writeln('Не найдено');
readln;
end;
6:begin
writeln;
writeln('Введите фамилию сотрудника');
readln(E);
writeln;
n:=0;
top^.Count_E(Root,n,E);
writeln('Число сотрудников с фамилией ',E,' равно ',n);
readln;
end;
end;
until nbr=7;
end.
Судя по ошибке - ты пытаешься запустить модуль... В меню Compile в строке Distination должно стоять Disk.
После этого жмешь F9 - создается .TPU файл, т.е. сам модуль. (можно из командной строки набрать TPC.EXE <имя файла>.PAS - результат тот же)
Убедись, что модуль лежит в том же каталоге, что и файл с программой, к которой ты его подключаешь.
-Катюшка-, значится так... Я тут кое-что нашаманил (подправил все несоответствия, которые были в программе, и между программой и модулем). Смотри внимательно - изменений много...
Модуль:
u_lr11.pas ( 2.74 килобайт )
Кол-во скачиваний: 509
Программа:
lab11.pas ( 1.91 килобайт )
Кол-во скачиваний: 473
Теперь о компиляции. Скопируй и программу и модуль в одну папку, открой в TP файл программы, и нажми F9, или меню Compile -> Make... Паскаль сам откомпилирует модуль, а потом - саму программу...
Да, чуть не забыл... Поскольку у меня не было файла данных, я подставил "пустышку":
assign(f,'employ.dat'); rewrite(f);
Так, уже лучше, спасибки)
Вот только у меня ошибка-- при создании дерева меня "выкидывают" из программы и пишут ошибку №100: disk read error... выбрасывают в окно с модулем на строку
procedure orgtree(var f:ftype;var top:Ptree);
var
z:rabotnik;
begin
writeln('выполняется процедура организации дерева');
readln;
reset(f);
top:=nil;
while not eof(f) do begin
read(f,z); { ==========ВОТ НА ЭТОЙ СТРОКЕ СТОИТ КУРСОР=======}
top:=top^.addtree(top,z);
end;
end;
Погоди, ты что, вручную данные набирала? Файл-то типизированный... Должна программно делать это.
Прикрепила бы файл, мы бы посмотрели, может с файлом все нормально, тогда в другом месте ошибку будем искать.
Не хочет загружать этот файлик. не то разрешение, говорят( правов нету
Тогда в архив его, и присоединяй (rar или zip)...
ПухачОк, а ты пробивала добавить seek (f,0) в свою процедуру( читай мои посты выше)
Вот файл(наконец-то!)
Файл битый однозначно. Прошел по программе в пошаговом режиме: нормально прочиталась только первая запись. Вторая уже содержит какой-то мусор...
Придется файл создавать заново.
И еще одно. Скажи мне, как по-твоему, при размере записи в 38 байт размер файла равен 287 байт - это нормально? Так сколько записей содержит файл?
Показывай код, которым создаешь файл, может там что-то не так?
Там вроде правильно...Если это вообще то, что надо)
Прикрепленные файлы
L101.PAS ( 1.01 килобайт )
Кол-во скачиваний: 271
Ну, ПухачОк, надо же быть внимательнее!!!
Это описание типа из модуля u_lr11:
rabotnik=record
number:integer;
FIO:string[15];
godroj:integer;
pol:char;
cem:string[12]; // <--- Запомни это число: 12 !!!
koldet:integer;
oklad:integer;
end;
rabotnik=record
number:integer;
FIO:string[15];
godroj:integer;
pol:char;
cem:string[15]; // <--- Ничего странного не видишь?
koldet:integer;
oklad:integer;
end;
Эхъ, я дусяк!)))) пасибо огромное!!!
Блина!!!! Не пашут мои процедурки поиска и количества эл-тов Е!!!
В чём дело????!!!!!
top^.Count_E(Top, n, newnode); { <--- Top вместо Root }
Тэкс, ща попытаюсь переделать, можить даже получится...
УУУУУУУУУРРРРРРРРРРАААААААААА!!!!!!!!!!!!!
ПОЛУЧИЛОСЬ!!! Вы все гении!!!!!!)))
вот прога работающая!!!!!
Прикрепленные файлы
U_LR11.PAS ( 2.75 килобайт )
Кол-во скачиваний: 210
LAB11.PAS ( 1.93 килобайт )
Кол-во скачиваний: 233