IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Задача на стек и дек.
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


В общем задача заключается в том что надо из текстового файла заполнить дек и взять последние "Б" элементов и записать их в стек.Суть вопроса заключается в том какую реализацию выбрать.первый скособ это создать процедуру котора берет элемент из дека и пишет в стек,а вторая уже выполняет первую до выполнения условия(достижение Б),либо сделать лиш одну процедуру,которая делает все сразу.

TElem = integer;
TStack = ^TElement;
TElement = record
info:TElem;
Next:TStack;
end;
TData = integer;
PTDeqItem = ^TDeqItem;
TDeqItem = record
Data: TData;
next, prev: PTDeqItem;
End;

TDeq = Record
pStart, pFinish: PTDeqItem;
End;


Вот описание стека и дека.Вопрос в том можно ли создать лиш одну буферную переменную или делать через две.каждого типа.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


В общем я почитал пяток другой факов и немного пересмотрел концепцию.пришел я к такому варианту.

program laba11;
Uses Crt;

Type TInf=Record
pol: String;
name: String;
BirthB,BirthD: Integer;
end;
TTree=^Tree;
Tree=Record
Inf:TInf;
Left,Right: TTree;
end;

var
fin : text;
root : TTree;
list : Tinf;
walk : TTree;
{-------------------------------------------------------------------------}
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.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) then FindKey:=True;
End;

Function NewSheet(X:TInf): TTree; {размещение в куче нового элемента}
Var Temp: TTree;
Begin
New (Temp);
Temp^.Inf:=X;
Temp^.Right:=Nil;
Temp^.Left:=Nil;
NewSheet:=Temp;
End;

Procedure AddSheet(Var Root: TTree; tmp: TInf);{размещение нового элемента (листа) в структуре}
Begin
If Root<>Nil then begin
If SignKey(tmp) then begin
If Root^.Left=Nil then Root^.Left:=NewSheet(tmp) else AddSheet(Root^.Left,tmp);
end else begin
If Root^.Right=Nil then Root^.Right:=NewSheet(tmp) else AddSheet(Root^.Right,tmp);
end;
end else begin {дерево не создано, создаем его}
Root:=NewSheet(tmp);
end;
End;

Procedure AddTree(Var Root: TTree; New: TTree);{размещение нового в структуре}
Begin
If Root<>Nil then begin
If New<>Nil then begin
If SignKey(New^.Inf) then begin
If Root^.Left=Nil then Root^.Left:=New else AddTree(Root^.Left,New);
end else begin
If Root^.Right=Nil then Root^.Right:=New else AddTree(Root^.Right,New);
end;
end;
end else begin {дерево не создано, пытаемся создать его}
Root:=New;
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 ShowTree(R: TTree); {Вывод дерева на экран}
Begin
If R<>Nil then begin {Если ветвь не пуста}
Show(R^.Inf); {выводим информацию}
If R^.Left <> nil then ShowTree(R^.Left); {если слева имеется сук, выводим и его}
If R^.Right <> nil then ShowTree(R^.Right);{тоже самое справа...}
end;
End;


Procedure Print(T: TTree; g: integer); {Печать дерева. G-глубина (по лекции)}
Begin
If T=nil then Writeln ('Дерево пустое') else begin
g:=g+1;
If T^.Right <> nil then
Print (T^.Right, g);

Writeln (T^.Inf.pol,' ', T^.Inf.name);
If T^.Left <> nil then
Print (T^.Left,g);

g:=g-1;
End;
End;

{-------------------------------------------------------------------------}


begin
ClrScr; {Основная программа}
assign(fin,'C:\Tpascal\test.txt');
reset(fin);
Root:=Nil; {Начальные условия - пустое дерево}
while not eof(fin) do begin {В цикле вводим записи }
Input(list);
AddSheet(Root,list);{Добовляем данные}
end;
WriteLn;
WriteLn('Введённые данные: ');
ShowTree(Root); WriteLn;
ReadLn;

WriteLn('Отображение в виде дерева:');
Print(Root,0);
ReadLn;

Walk:=Find(Root);
If Walk=Nil Then WriteLn('Элемент не найден.');

WriteLn('Найден элемент:');
Show(Walk^.Inf); WriteLn;

close(fin);
END.

Но дерево все равно заполняется в виде пирамиды какой то.(текстовый файл все тот же)

Сообщение отредактировано: Krjuger -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Krjuger   Задача на стек и дек.   17.05.2009 20:54
volvo   Я уже задавал тебе этот вопрос, ты решил, что лучш…   17.05.2009 22:44
Krjuger   Не, стек и дек обязательно должны быть,это принцип…   18.05.2009 1:38
volvo   Нет, конечно... В смысле, неправильно. Сам же сказ…   19.05.2009 2:24
Krjuger   Могу удивить он компилируется в легкую.Так насчет …   19.05.2009 2:28
volvo   Ты сказки-то будешь внукам рассказывать... Это ком…   19.05.2009 2:59
Krjuger   Вот полная прога.Теперь, вроде, стек заполняется ,…   19.05.2009 16:50
volvo   Если б работало так, как задумывал, может и пригод…   20.05.2009 21:38
Krjuger   Извини,с этим разделом я не знаком.Программа рабо…   20.05.2009 23:11
volvo   Ты файл test.txt наконец покажешь или нет? Я ж не …   21.05.2009 22:29
Krjuger   Хорошо вот текстовый файл и оновленный вариант про…   21.05.2009 22:49
volvo   В результате ты хочешь получить вот такой результа…   21.05.2009 23:04
Krjuger   Вообще мне необходимо получить генеагогическое де…   22.05.2009 0:01
volvo   Значит, так. Дерево создается неправильно, пересма…   22.05.2009 0:26
Krjuger   В общем я почитал пяток другой факов и немного пер…   22.05.2009 19:42
volvo   Если , то дерево в принципе не будет заполняться, …   22.05.2009 20:49
Krjuger   Да это мой косяк,добавить добавил а упомянуть об …   22.05.2009 21:22
Krjuger   Вроде я понял о чем ты так усердно пытался мне ска…   22.05.2009 22:47
Krjuger   При этом,если сделать в процедуре Procedure AddS…   22.05.2009 23:24


 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 10.09.2025 20:28
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name