|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
24.04.2008, 21:07 | #1 |
Пользователь
Регистрация: 23.04.2008
Сообщений: 27
|
ПОмогите с задачей на паскале!! очень прошу!
Значит так - прога почти у мну написана, осталось токо доделать! Задача такая - дан файл .тхт, в нем записаны имена студентов через запятую, из этого файла(а точнее из имен которые там записаны) формируется дерево, потом происходит обход дерева в обратном порядке! и потом уже результат обхода дерева записывается в другой файл .тхт! проблема заключается в том что я не знаю как сделать обход! помогите плиз с кодом обхода! там вроде не много должно быть! код своей проги выложу, если найдуться люди которые откликнуться и мне помогут! зарание спасибо
|
24.04.2008, 21:29 | #2 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
1) "вAAще" непонятно, что за дерево? Или Вы так называете последовательный односвязный список?!
2) без Вашего кода Вам помочь нельзя! (разве что заново написать :-(( приводите свои наработки, тогда, может быть, кто то и поможет! удачи. |
24.04.2008, 21:38 | #3 |
Пользователь
Регистрация: 23.04.2008
Сообщений: 27
|
{Программа загружает строку из файла в которой содержаться
слова, разделенные запятыми, затем отделяет эти слова, строит из них дерево, делает обход и сохраняет в другой файл} PROGRAM DEREVO; USES Crt;{Подключаем библиотеки} Type TreeLink = ^Tree; Tree = Record Number: Integer; Data : String; Left, Right : TreeLink; End; CONST n=100;{Максимально допустимое кол-во слов в массиве} VAR txtfile: text;{текстовый файл} st, st1: String;{Строковые переменные} i, count: Integer; inmas, outmas: array[1..n] of string;{Входные и выходные данные/массивы} kd: TreeLink; {Обратный Ввод дерева} Procedure InsTree(num: Integer; n: String; Var t: TreeLink); Begin if t=nil then begin new(t); with t^ do begin Left:=nil; Right:=nil; Data:=n; number:=num; end; end else if t^.left=nil then InsTree(num, n, t^.Left) else InsTree(num, n, t^.Right); End; {НЕПРАВИЛЬНО, СДЕСЬ ДОЛЖЕН БЫТЬ ОБХОД} {Вывод дерева} Procedure PrintTree(num: Integer; t : TreeLink); Begin {Здесь должен быть алгоритм обхода дерева и ЗАПИСЬ элементов в массив OUTMAS[i]} { if t<>Nil then begin PrintTree(num, t^.Left); Write('-'); Write(t^.Data:3); PrintTree(num, t^.Right); end;} End; {КОНЕЦ НЕПРАВИЛЬНОГО} BEGIN ClrScr;{Очищаем экран} count:=0;{Обнуляем счетчик слов} kd:=nil; {ЧТЕНИЕ И ВВОД СТРОКОВЫХ ДАННХ/СЛОВ} {$I-}{Отключаем ошибки ввода/вывода} Assign(txtfile, 'in.txt');{Сопоставляем файловую переменную с именем файла} Reset(txtfile);{Открываем файл для чтения} {$I+}{Включаем ошибки} If IOResult=0 Then{Если файл существует} begin WriteLn('Читаем файл.......'); While not eof(txtfile) do{Читаем файл пока нет признака его конца} begin Readln(txtfile, st);{Считываем строку из файла в переменную st} st:=st+st1; end; end else{Иначе, если файл ненайден} begin WriteLn('Файл не найден.'); WriteLn('Создаем файл......'); While length(st)=0 do{Пока данные не введены повторяем цикл} begin Writeln('vvedite slova,razdelennie zapyatimi,po okonchanii nagmite enter'); Readln(st);{Запрос ввода данных} end; if st[length(st)]<>',' then st:=st+',';{И добавляем к концу запятую, иначе последнее слове не будет считано} Rewrite(txtfile);{Создаем файл} Write(txtfile, st);{Записываем в него наши данные} end; for i:=1 to length(st) do{Проверяем на наличие пробелов и удаляем их} While Pos(' ', st) > 0 Do delete(st, Pos(' ', St) , 1); if st[length(st)]<>',' then st:=st+','; for i:=1 to length(st) do{Сканируем нашу строку данных до конца} While (Pos(',', st) > 0) Do{И при нахождении запятой, т е, при нахождении признака существования слова} begin inc(count);{Увеличиваем счетчик слов} inmas[count]:=copy(st, 1, Pos(',', St)-1);{И заносим слово во входной массив данных} delete(st, 1, Pos(',', St));{Удаляем прочитанное слово из строки чтобы не мешалось и сканируем дальше} end; Close(txtfile); Write('Входные данные загружены, количество элементов '); Writeln(count); Writeln; {================================== ====================} for i:=1 to count do InsTree(i, inmas[i], kd);{Вызов процедуры формирования дерева из массива} PrintTree(1, kd);{Вызов процедуры обхода дерева и вывод результатов} {================================== ====================} Assign(txtfile, 'out.txt'); Rewrite(txtfile); Writeln(txtfile, 'RESULTAT:'); Writeln(txtfile, ''); for i:=1 to count do Writeln(txtfile, outmas[i]);{Запись результатов в файл, для наглядности построчно} Close(txtfile); Writeln('Данные записаны в файл:'); Readln;{Ждем нажатия кнопки} END. |
24.04.2008, 21:41 | #4 |
Пользователь
Регистрация: 23.04.2008
Сообщений: 27
|
вот код с комментами! там написано где должен быть обход! а то что вы Serge_Bliznykov сказали про последовательный односвязный список - я вас не понял! деревья они и есть деревья - на паскале так и называются!
|
24.04.2008, 22:04 | #5 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
Обратный обход - это противоположный тому в котором добавлялись ?
Просто дерево у Вас как-то странно строится. Ваш insTree работает так: ..1 .2-3 ...4-5 т.е. сначала добавляется сам узел, потом его левая ветвь, потом правая. Обратный обход наоборот: Код:
Да, и пожалуйста, заключайте код в теги CODE - очень неудобно читать Последний раз редактировалось alexBlack; 24.04.2008 в 22:11. |
24.04.2008, 22:27 | #6 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
угу. забудьте что я Вам говорил про список... ;-)
Вашего кода достаточно. сейчас я посмотрю, как можно обход Вашего дерева можно сделать... пока маленькие исправления-замечания: 1) не иницилизируется строка st1 2) есть ошибка чтения файла (если он многострочный): Код:
Код:
не надо объединять и перебор всех элементов и поиск/удаление через while Более чем достаточно вместо: Код:
Код:
|
24.04.2008, 22:28 | #7 |
Пользователь
Регистрация: 23.04.2008
Сообщений: 27
|
Обратный обход это когда сначала посещается левая ветвь,потом правая, потом родитель! Потом потешаются элементы элементы так же которые идут от правой ветви корня по такому же принципу!а последним посещается корень! И я попробывал ваш код,что то у меня не работает! Можете мне готовый уже выложить? Просто я в паскале новичок,мне помогали эту задачу делать и я не совсем смогу разобраться - как и что сделать там
|
24.04.2008, 22:30 | #8 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
ну вот... разве за alexBlack успеешь?.. ;-)
всё, похоже задача решена?.. |
24.04.2008, 22:35 | #9 |
Пользователь
Регистрация: 23.04.2008
Сообщений: 27
|
Вроде еще не решена
|
24.04.2008, 22:37 | #10 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
ПОМОГИТЕ, ОЧЕНЬ ПРОШУ | Help me | Свободное общение | 4 | 01.09.2008 09:29 |
очень прошу помогите решить задачки | Марин@ | Помощь студентам | 1 | 24.04.2008 18:27 |
Помогите решить две задачи! очень прошу... | DmT | Фриланс | 1 | 23.10.2007 23:19 |