1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
В общем задача заключается в том что надо из текстового файла заполнить дек и взять последние "Б" элементов и записать их в стек.Суть вопроса заключается в том какую реализацию выбрать.первый скособ это создать процедуру котора берет элемент из дека и пишет в стек,а вторая уже выполняет первую до выполнения условия(достижение Б),либо сделать лиш одну процедуру,которая делает все сразу.
Вроде я понял о чем ты так усердно пытался мне сказать и в общем добавил указатель на ветку,но тут такая проблема Root^.inf.stat не обновляется и продолжает висеть на значении первого(root) и поэтому все элементы улетают в правую ветвь.
program laba11; Uses Crt;
Type TInf=Record stat : string; pol: String; name: String; BirthB,BirthD: Integer; end; TTree=^Tree; Tree=Record Inf:TInf; Left,Right: TTree; end;
var fin : text; root : TTree; walk : TTree; tmp : Tinf; {-------------------------------------------------------------------------} Procedure ReadFile(var fin: text; var str: string); var tmp: char; begin str:=''; repeat read(fin, tmp); if not (tmp = ' ') and not (tmp=';') then str:=str+tmp; until (tmp=' ') or eoln(fin) or (tmp=';'); end;
Procedure Show(List: TInf);{Отображение данных записи} Begin Write(List.pol,' ',List.name,' ',list.BirthB,' ',list.BirthD); WriteLn; {Перевод строки} End;
Procedure Input(Var list: TInf);{Заполнение записи путём ввода данных из файла} Begin Readfile(fin,list.stat); Readfile(fin,list.pol); Readfile(fin,list.name); Read(fin,list.BirthB); Read(fin,list.BirthD); readln(fin); End;
Function SignKey(B: TInf): Boolean; Begin SignKey:=False; If B.pol='male' then SignKey:=True; End;
Function FindKey(A: TInf): Boolean; Begin FindKey:=False; If (A.BirthB<1942) and (A.BirthD>1942) and (A.pol='male') then FindKey:=True; End;
Function NewSheet(X:TInf): TTree; {размещение в куче нового элемента} Var Temp: TTree; Begin New (Temp); Temp^.Inf:=X; temp^.inf.stat:=X.stat; Temp^.Right:=Nil; Temp^.Left:=Nil; NewSheet:=Temp; End;
Procedure AddSheet(Var Root: TTree; tmp: TInf);{размещение нового элемента (листа) в структуре} Begin If Root<>Nil then begin if tmp.stat='father' then begin If Root^.Left=Nil then Root^.Left:=NewSheet(tmp) else begin If SignKey(tmp) then AddSheet(Root^.Left,tmp) else AddSheet(Root^.right,tmp); end; end else begin If Root^.Right=Nil then Root^.Right:=NewSheet(tmp) else begin If SignKey(tmp) then AddSheet(Root^.Left,tmp) else AddSheet(Root^.Right,tmp); end; end; end else begin {дерево не создано, создаем его} Root:=NewSheet(tmp); end; End;
Function Find(Root: TTree): TTree;{Поиск элемента} Var temp: Ttree; Begin temp:=Nil; If Root<>Nil then begin {Если дерево не пустое} If FindKey(Root^.Inf) then begin {Проверяем значение ключевого поля} temp:=Root; {Если нашли нужный элемент, запоминаем его значение} end else begin {если не нашли} temp:=Find(Root^.Left); {пытаемся найти в других ветвях дерева (сначала слева)} If temp=Nil then temp:=Find(Root^.Right); {Потом справа, если слева ничего не нашли} end; end; Find:=temp; {Результат функции - значение временной переменной temp} End;
procedure printKLP(root:TTree);
procedure print(level: integer; root:TTree); begin if root<>NIL then begin writeln('':2*level, root^.inf.name); print(level+1, root^.left); print(level+1, root^.right); end; end;
begin if (root=NIL) then writeln('Дерево пусто!') else Print(0, root);
writeln; writeln('Нажмите любую клавишу для выхода в главное меню'); end;
begin ClrScr; {Основная программа} assign(fin,'C:\Tpascal\test.txt'); reset(fin); Root:=Nil; {Начальные условия - пустое дерево} while not eof(fin) do begin {В цикле вводим записи } Input(tmp); AddSheet(Root,tmp);{Добовляем данные} end; WriteLn; WriteLn('Введённые данные: '); ShowTree(Root); WriteLn; ReadLn;
WriteLn('Отображение в виде дерева:'); printKLP(root); readln; Walk:=Find(Root); If Walk=Nil Then WriteLn('Элемент не найден.') else begin WriteLn('Найден элемент:'); Show(Walk^.Inf); WriteLn; end; readln;
close(fin); END.
Тьфу извиняюсь эту оплошность я исправил,то вот по тому,как дерево выводится я все эще не мгу понять правильно ли оно собирается,а выглядеть оно должно так.