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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 21.05.2009 20:26
Сообщение #2


Гость






Цитата
тобиш по суди дожно выводится boris kor bob ksenia rita bob maria
Значит, так. Дерево создается неправильно, пересматривай алгоритм создания. Это минус. Плюс - в том, что оно-таки создается, и все итемы, прочитанные из файла в него попадают и благополучно выводятся на печать. Что я поменял (относительно программы из поста №18):

{ 1 - реализацию CreateNode }
Procedure CreateNode(temp : PTree; var root:PTree);
Begin
new(root); { !!! вот только в этом месте выделяем память под элемент !!! }

root^.head.stat := temp^.head.stat;
root^.head.name := temp^.head.name;
root^.head.data := temp^.head.data;
root^.left := nil;
root^.right := nil;
End;

{ 2 - процедура печати дерева теперь такая: }
procedure printKLP(root:PTree);

procedure print(level: integer; root:PTree);
begin
if root<>NIL then begin
writeln('':2*level, root^.head.name);
print(level+1, root^.left);
print(level+1, root^.right);
end;
end;

begin
clrscr;
if (root=NIL) then writeln('Дерево пусто!')
else Print(0, root);

writeln;
writeln('Нажмите любую клавишу для выхода в главное меню');
end;

{ 3 - ну, и само создание дерева: }
Procedure CreateTree(var root: PTree; var fin : text);
var
temp : PTree;
begin
while not eof(fin) do begin
new(temp); { <--- Временное хранилище: создали ... }
readfile(fin,temp^.head.stat); { читаем stat }
readfile(fin,temp^.head.name); { читаем имя }
read(fin,temp^.head.data); { читаем дату рождения }
readln(fin); { все остальное - пропускаем !!! }
AddItem(root,temp); { и добавляем прочитанное в дерево }
dispose(temp); { <--- Временное хранилище: удалили}
end;
end;

Хотя я бы процедуру CreateTree и AddItem переписал. Зачем создавать и удалять временный буфер, если можно прочесть данные в строки и число, и передавать их в AddItem... Хотя с другой стороны, тогда придется тянуть все параметры по многим подпрограммам, можешь оставить как есть...

Теперь о твоем многострадальном Деке + Стеке. Оно работает, выдает корректный результат. Все было бы хорошо, если бы не утечки памяти. Ты не чистишь память за собой, это плохо, и преподаватели (хорошие преподаватели) знают, как это проверяется. А для себя - это еще хуже. Привыкаешь работать, "не убирая мусор" за собой - потом при программировании под Win получаешь на пустом, казалось бы, месте ошибки типа "не хватает памяти для ресурсов", или что-нибудь в таком роде. А памяти-то гигабайты. И все равно, все очень быстро забрасывается мусором. Привыкай прямо сейчас: память выделил - значит надо вернуть.
 К началу страницы 
+ Ответить 

Сообщений в этой теме
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 8:45
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"