![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
Krjuger |
![]()
Сообщение
#1
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
В общем задача заключается в том что надо из текстового файла заполнить дек и взять последние "Б" элементов и записать их в стек.Суть вопроса заключается в том какую реализацию выбрать.первый скособ это создать процедуру котора берет элемент из дека и пишет в стек,а вторая уже выполняет первую до выполнения условия(достижение Б),либо сделать лиш одну процедуру,которая делает все сразу.
Вот описание стека и дека.Вопрос в том можно ли создать лиш одну буферную переменную или делать через две.каждого типа. |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Я уже задавал тебе этот вопрос, ты решил, что лучше создать новую тему, что-ли? Авось не заметят? Как ты дек заполняешь? Можно заполнять его с начала, а потом читать с конца (или наоборот, но чтение и запись - с разных сторон), тогда достаточно просто взять первые B элементов из файла и записать в стек, дек напрочь не нужен. Если дек и пишется и потом читается с одно и той же стороны - то никуда не денешься, придется заполнять дек, а потом брать последние B элементов и переносить их в стек. Дублировать ничего не надо, в худшем случае потребуется один TStack, один TDeque, и одна переменная типа TElem...
Кстати, во избежание проблем, которые у тебя обязательно возникнут с твоим стилем программирования, я бы посоветовал тебе сделать так: TElem = integer;, так ошибиться будет гораздо сложнее, скажем, если понадобится сделать стек/дек не целых, а Char-ов или Real-ов... |
Krjuger |
![]()
Сообщение
#3
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
Не, стек и дек обязательно должны быть,это принципи и есть суть задания.а запись у меня с конца.
Ту тему я подотру,чтобы если кому пригодится,не засорять.потому что темы немножко разные,потом может еще появится третья тема в моем исполнении про деревья. Добавлено через 19 часов: Как вам такая реализация?
Просьба сильно ботинками не бить) Добавлено через 6 часов: Ну так кто нибуть может прокоментировать,прально ли я все делаю?? Добавлено через 30 минут: процедура создания стека пересмотрена,но все равно не работает.
|
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Нет, конечно... В смысле, неправильно. Сам же сказал, ботинками не бить, вот все и молчат.
НА кой черт ты при создании Стека, когда Дек уже готов, опять создаешь Цитата CurrDeq:= new(PTDeqItem); Что за условие Цитата while CurrDeq<V do |
Krjuger |
![]()
Сообщение
#5
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
Могу удивить он компилируется в легкую.Так насчет ошибок щас посмотрим,ты далеко не уходи.
Добавлено через 12 мин. Ну получилось что то в этом духе . Сообщение отредактировано: Krjuger - 18.05.2009 22:42 |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Цитата Могу удивить он компилируется в легкую. Ты сказки-то будешь внукам рассказывать... Это компилироваться не может по определению: пост №4 - строка №26, что такое TDeq? Нет такого типа, у тебя есть только TDeque... Дальше продолжать? Влегкую у него компилируется... Ты ПОЛНОСТЬЮ программу выложи, а я тебе скажу, компилируется она или нет. |
Krjuger |
![]()
Сообщение
#7
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
Вот полная прога.Теперь, вроде, стек заполняется ,но не печатается.
Ну я надеюсь,хоть кто нибудь ответит,или только волво со мной мучаться будет.. Добавлено через 7 часов: Ауууу желающие помоч отзовитесь,у меня есть еще задачка на деревья,но пока я с этой недомараюсь,ту спрашивать не стану,ибо слишком жирно будет для меня) Добавлено через 2 часа: Так же выношу на суд божий еще одно мое творение, которое нефига не рабоатет.В этот раз выдает ошибку 16 разрядной подсистемы дос,типа процессор обнарушил неизвестную инстукцию
Добавлено через 16 часов: В общем по поводу первой задачи я ее сделал своими силами и она работает,только почему то она работает не так,как задумывал.Если кому надо:
Да по поводу задачи с деревьями,она еще в силе.Стоит ли создавать отделью тему или мне кто нибудь в этой поможет? Еще хотелось бы услышать коменрарии к момему способу реализации задачи на стек и дек. |
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
Цитата Если кому надо: Если б работало так, как задумывал, может и пригодилось бы кому. А так кодов на просторах сети - океан, только вот работает правильно очень малая часть...Цитата Еще хотелось бы услышать коменрарии к момему способу реализации задачи на стек и дек. Трудно ожидать от программы, вываливающейся по RTE 216 корректной работы... То, что твой компилятор не отлавливает эту ошибку времени выполнения, не значит, что ее нет:![]() Как ты думаешь, куда указывает CurrDeq, и что произойдет, когда ты попробуешь туда обратиться? А все происходит по той же причине: ты только даешь всем советы, как делать правильно, а сам - непонятно что творишь... Где инициализация переменной CurrDeq? Что в ней хранится при входе в процедуру, с учетом того, что она описана локально? Цитата Так же выношу на суд божий еще одно мое творение, которое нефига не рабоатет Как оно ДОЛЖНО работать - это нам предстоит догадаться? Без задания, без тестового файла данных - это типа квест такой, да? |
Krjuger |
![]()
Сообщение
#9
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
Цитата Трудно ожидать от программы, вываливающейся по RTE 216 корректной работы... Извини,с этим разделом я не знаком.Программа работает,просто когда я делал ,то я ожидал,что при записи в стек моя последовательность чисел опять перевернеться,а получилось что она выводит в том же порядке,что и записана в дек,но о этой причине я уже разобрался. Цитата ты только даешь всем советы, как делать правильно, а сам - непонятно что творишь... Скажм так советы я даю в той области,которую понимаю.Разве мои советы не несут никакого смысла?и не могут помоч в решении.А эту область, по которой я задаю вопросы,я не очень понимаю,поэтому у меня и глупые ошибки.Поэтому и прошу выносить критику. Цитата Как оно ДОЛЖНО работать - это нам предстоит догадаться? дерево должно заполниться из файла. P.S.можно как нить помягче,а то такое ощущение,что ты на меня кричиш))))Что я полный дебил,и вообще нихрена не знаю. А еще у меня вопрос.Почему,если из процедуры CreateStack я удалю reset(fin); То в этой строке мне выдает Division by zero. Добавлено через 30 минут: Изменил.После того, как добавил new(CurrDeq); при удалении reset(fin); перестала выдаваться ошибка.Просьба обьяснить взаимосвязь. И еще по поводу дерева..В приведенном ниже коде я пытаюсь создать деверо из информации,берущейся из текстового файла(Stat-пол мужчина-женщина,name-мня человека,Data-дата рождения данного человека)Сначала считываются пол,затем имя и в конце дата.печать чисто формальна,чтобы просто проверить заполнение дерева.
Выдает ошибку 16 разрядной подсистемы дос, процессор NTVDM обнарушил недопустимую инстукцию Добавлено через 18 часов: volvo,а мне тоже надо создавать отдельюную тему для дерева,или ты в этой поможеш.А то я вон смотрю,ты на многих ругаешся,когда по несколько задач в одной теме.И почему хоть и изредка,но я получаю ответ только от тебя,остальным впадлу чтоли читать код:)Или у вас есть какое то разделение по "сферам влияния".В общем жду ответов,вроде все твои коментарии я учел,если правильно их понял.Если что поправлясь. Добавлено через 3 часа: В общем я немного пересмотрел программу с деревьями и получилось так.Ошибка про подсистему изчезла,но дерево все еще упорно не заполняется.
|
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
Цитата В общем я немного пересмотрел программу с деревьями и получилось так.Ошибка про подсистему изчезла,но дерево все еще упорно не заполняется. Ты файл test.txt наконец покажешь или нет? Я ж не могу ползать по твоей программе взад и вперед и подбирать файл так, чтобы дерево успешно из файла было создано, правильно? Присоединил бы файл, который должен быть прочитан - все было бы гораздо проще... А так... Сомневаюсь, что найдется время на подбор тестовых данных, да еще потом и ты скажешь: а у меня не такой файл был, программа все равно не работает. Это мы уже проходили, больше я на это не иду. |
Krjuger |
![]()
Сообщение
#11
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
Хорошо вот текстовый файл и оновленный вариант программы.
Код program laba11; Uses CRT; type DTree = record Data: integer; Name: string; stat: String; end; PTree = ^TTree; TTree = record head : DTree; left,right: PTree; end; var fin:text; temp:PTree; root:PTree; ch: char; Procedure Trash(var ch:char); begin if (ch =#13) or (ch =#10) or (ch =' ') or (ch =#0) then begin read(fin,ch); Trash(ch); end; end; Procedure ReadStat(var fin: text; ch : char; var str: string); begin str:=''; read(fin, ch); Trash(ch); str:=str+ch; repeat read(fin, ch); if not (ch = ' ') and not (ch=';') then str:=str+ch; until (ch=' ') or eoln(fin) or (ch=';'); end; Procedure ReadFile(var fin: text; ch : char; var str: string); begin str:=''; repeat read(fin, ch); if not (ch = ' ') and not (ch=';') then str:=str+ch; until (ch=' ') or eoln(fin) or (ch=';'); end; 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; Procedure AddItem(Var root: PTree; temp: PTree); { Функция, создающая новый лист дерева с заданным значением Data } var parent, pwalk: PTree; Begin if root = nil then CreateNode(temp,root) else begin pWalk := root; { "гулять" начнем с корня } while pWalk <> nil do begin { пока не добрались до пустого указателя - делаем следующее } parent := pWalk; if pWalk^.head.stat='male' then pWalk := pWalk^.left else pWalk := pWalk^.right end; if temp^.head.stat='male' then CreateNode(temp,root^.left) else CreateNode(temp,root^.right); end; End; Procedure CreateTree(var root: PTree;var fin : text); var temp : PTree; begin new(temp); while not eof(fin) do begin readstat(fin,ch,temp^.head.stat); readfile(fin,ch,temp^.head.name); read(fin,temp^.head.data); AddItem(root,temp); end; end; procedure printKLP(root:PTree); begin if (root<>NIL) then (* Если дерево не пустое *) begin write(root^.head.name,' '); (* Распечатать корень дерево *) printKLP(root^.left); (* Распечатать левое поддерево *) printKLP(root^.right);(* Распечатать правое поддерево *) end; end; procedure printKLP_wrapper(root:PTree); begin clrscr; if (root=NIL) then (* Если дерево пустое *) writeln('Дерево пусто!') (* Сообщить об этом *) else (* Иначе *) PrintKLP(root); (* Распечатать дерево *) writeln; writeln('Нажмите любую клавишу для выхода в главное меню'); end; begin clrscr; chdir('C:\TPascal'); assign(fin,'test.txt'); reset(fin); CreateTree(root,fin); printKLP_wrapper(root); close(fin); readkey; end. Прикрепленные файлы ![]() |
volvo |
![]()
Сообщение
#12
|
Гость ![]() |
В результате ты хочешь получить вот такой результат:
boris kor bob bob rita ksenia maria |
Krjuger |
![]()
Сообщение
#13
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
Вообще мне необходимо получить генеагогическое дерево,а уж как выводить его на экран,но тут без разници,потому что это не цель моего задания.А вообще задание звучит,заполнить генеалогическое дерево до 3 поколения данными из файла и вывести на экран,участвовал ли кто нибудь во второй мировой войше,и если такие есть то вывести их на экран. тобиш по суди дожно выводится boris kor bob ksenia rita bob maria
Сообщение отредактировано: Krjuger - 21.05.2009 20:03 |
volvo |
![]()
Сообщение
#14
|
Гость ![]() |
Цитата тобиш по суди дожно выводится boris kor bob ksenia rita bob maria Значит, так. Дерево создается неправильно, пересматривай алгоритм создания. Это минус. Плюс - в том, что оно-таки создается, и все итемы, прочитанные из файла в него попадают и благополучно выводятся на печать. Что я поменял (относительно программы из поста №18):{ 1 - реализацию CreateNode } Хотя я бы процедуру CreateTree и AddItem переписал. Зачем создавать и удалять временный буфер, если можно прочесть данные в строки и число, и передавать их в AddItem... Хотя с другой стороны, тогда придется тянуть все параметры по многим подпрограммам, можешь оставить как есть... Теперь о твоем многострадальном Деке + Стеке. Оно работает, выдает корректный результат. Все было бы хорошо, если бы не утечки памяти. Ты не чистишь память за собой, это плохо, и преподаватели (хорошие преподаватели) знают, как это проверяется. А для себя - это еще хуже. Привыкаешь работать, "не убирая мусор" за собой - потом при программировании под Win получаешь на пустом, казалось бы, месте ошибки типа "не хватает памяти для ресурсов", или что-нибудь в таком роде. А памяти-то гигабайты. И все равно, все очень быстро забрасывается мусором. Привыкай прямо сейчас: память выделил - значит надо вернуть. |
Krjuger |
![]()
Сообщение
#15
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
В общем я почитал пяток другой факов и немного пересмотрел концепцию.пришел я к такому варианту.
Но дерево все равно заполняется в виде пирамиды какой то.(текстовый файл все тот же) Сообщение отредактировано: Krjuger - 22.05.2009 15:47 |
volvo |
![]()
Сообщение
#16
|
Гость ![]() |
Если
Цитата текстовый файл все тот же , то дерево в принципе не будет заполняться, ибо уже при чтении первой записи у тебя будет вылет: { не является целым числом. Точка, все дальнейшее - неправда.Если чуть-чуть изменить входной файл (продублировать целое число, находящееся в каждой строке), то дерево будет построено, и даже выведено на экран: Введённые данные: Следующий баг: Цитата Walk:=Find(Root); В общем, пока я не вижу ничего измененного. Ты по-прежнему как партизан молчишь, ЧТО ты за дерево такое особенное хочешь получить (говоришь, что главное - создать дерево, но как только оно у тебя НЕ ТАКОЕ, как ты хочешь - ты тут же говоришь, что оно неправильное). Как правильно - ведомо только тебе, вот и делай сам. Здесь телепатов нет. Что ты хотел, чтоб Паскаль по твоему хотению проник тебе в мысли, узнал вот из этого бреда: male boris 1995 {корень} Извини, я не вижу прогресса у тебя в теме, посему.... Мне надоело переливать из пустого в порожнее. Ты не хочешь видеть того, что тебе говорят. А я не хочу говорить то, чего потом не видят. |
Krjuger |
![]()
Сообщение
#17
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
Цитата Если Цитата текстовый файл все тот же, то дерево в принципе не будет заполняться, ибо уже при чтении первой записи у тебя будет вылет: { не является целым числом. Точка, все дальнейшее - неправда. Если чуть-чуть изменить входной файл (продублировать целое число, находящееся в каждой строке), то дерево будет построено, и даже выведено на экран: Введённые данные:male boris 1995 1995male kor 1955 1955male bob 1912 1912male bob 1912 1912fomale maria 1965 1965fomale ksenia 1915 1915fomale rita 1915 1915Отображение в виде дерева:fomale ritafomale kseniafomale mariamale borismale kormale bobmale bob Да это мой косяк,добавить добавил а упомянуть об этом забыл. Цитата Walk:=Find(Root); If Walk=Nil Then WriteLn('Элемент не найден.'); WriteLn('Найден элемент:'); Show(Walk^.Inf); WriteLn; Что это? То есть, ты сообщаешь, что элемент не найден, и тут же разыменовываешь nil? Интересная концепция... если я правильно понял,то должно быть так Код Walk:=Find(Root); If Walk=Nil Then WriteLn('Элемент не найден.') else begin WriteLn('Найден элемент:'); Show(Walk^.Inf); WriteLn; end; Сообщение отредактировано: Krjuger - 22.05.2009 17:23 |
Krjuger |
![]()
Сообщение
#18
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
Вроде я понял о чем ты так усердно пытался мне сказать и в общем добавил указатель на ветку,но тут такая проблема Root^.inf.stat не обновляется и продолжает висеть на значении первого(root) и поэтому все элементы улетают в правую ветвь.
Тьфу извиняюсь эту оплошность я исправил,то вот по тому,как дерево выводится я все эще не мгу понять правильно ли оно собирается,а выглядеть оно должно так. Код boris kor maria bob ksenia bob rita А выходит с использованием твоей печати Код boris kor bob bob maria ksenia rita Сообщение отредактировано: Krjuger - 22.05.2009 19:10 Прикрепленные файлы ![]() |
Krjuger |
![]()
Сообщение
#19
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
При этом,если сделать в процедуре
и стало выводиться Код boris kor bob rita maria ksenia bob Что уже больше похоже на правду.поэтому либо я не совсем понимаю вывод дерева.либо я хз как эту ошибку исправить. Код boris kor bob rita maria bob ksenia Вот на мой взгляд правильный вывод,каким должен быть,либо Volvo поясти,может я чтото не понимаю. |
![]() ![]() |
![]() |
Текстовая версия | 12.08.2025 2:33 |