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

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

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

> Задача на стек и дек.
Krjuger
сообщение 17.05.2009 16:54
Сообщение #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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Krjuger
сообщение 22.05.2009 15:42
Сообщение #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 - 22.05.2009 15:47
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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


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

 



- Текстовая версия 12.08.2025 6:16
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"