Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2008, 21:07   #1
Astor
Пользователь
 
Регистрация: 23.04.2008
Сообщений: 27
Печаль ПОмогите с задачей на паскале!! очень прошу!

Значит так - прога почти у мну написана, осталось токо доделать! Задача такая - дан файл .тхт, в нем записаны имена студентов через запятую, из этого файла(а точнее из имен которые там записаны) формируется дерево, потом происходит обход дерева в обратном порядке! и потом уже результат обхода дерева записывается в другой файл .тхт! проблема заключается в том что я не знаю как сделать обход! помогите плиз с кодом обхода! там вроде не много должно быть! код своей проги выложу, если найдуться люди которые откликнуться и мне помогут! зарание спасибо
Astor вне форума Ответить с цитированием
Старый 24.04.2008, 21:29   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) "вAAще" непонятно, что за дерево? Или Вы так называете последовательный односвязный список?!
2) без Вашего кода Вам помочь нельзя! (разве что заново написать :-(( приводите свои наработки, тогда, может быть, кто то и поможет!

удачи.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.04.2008, 21:38   #3
Astor
Пользователь
 
Регистрация: 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.
Astor вне форума Ответить с цитированием
Старый 24.04.2008, 21:41   #4
Astor
Пользователь
 
Регистрация: 23.04.2008
Сообщений: 27
По умолчанию

вот код с комментами! там написано где должен быть обход! а то что вы Serge_Bliznykov сказали про последовательный односвязный список - я вас не понял! деревья они и есть деревья - на паскале так и называются!
Astor вне форума Ответить с цитированием
Старый 24.04.2008, 22:04   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Обратный обход - это противоположный тому в котором добавлялись ?
Просто дерево у Вас как-то странно строится.
Ваш insTree работает так:

..1
.2-3
...4-5

т.е. сначала добавляется сам узел, потом его левая ветвь, потом правая.
Обратный обход наоборот:

Код:
Procedure PrintTree(t : TreeLink);
begin
   if t <> nil then begin    
       // Сначала выводим правый узел 
       PrintTree(t^.right)
       // Потом левый 
       PrintTree(t^.left)
       // а потом данные самого узла 
       write(t^.data   -  или куда он у Вас выводится
   end;
end;
------------------------
Да, и пожалуйста, заключайте код в теги CODE - очень неудобно читать

Последний раз редактировалось alexBlack; 24.04.2008 в 22:11.
alexBlack вне форума Ответить с цитированием
Старый 24.04.2008, 22:27   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

угу. забудьте что я Вам говорил про список... ;-)
Вашего кода достаточно. сейчас я посмотрю, как можно обход Вашего дерева можно сделать...
пока маленькие исправления-замечания:
1) не иницилизируется строка st1
2) есть ошибка чтения файла (если он многострочный):
Код:
    WriteLn('Читаем файл.......');
    while not eof(txtfile) do {Читаем файл пока нет признака его конца}
    begin
      Readln(txtfile, st); {Считываем строку из файла в переменную st}
      st := st + st1;
    end;
надо так:
Код:
    WriteLn('Читаем файл.......');
    st1 := '';
    while not eof(txtfile) do {Читаем файл пока нет признака его конца}
    begin
      Readln(txtfile, st1); {Считываем строку из файла в переменную st1}
      if st[length(st1)] <> ',' then st1 := st1 + ','; {И добавляем к концу запятую}
      st := st + st1;
    end;
3) удаление пробелов сделано КРАЙНЕ неоптимально!
не надо объединять и перебор всех элементов и поиск/удаление через while
Более чем достаточно вместо:

Код:
  for i := 1 to length(st) do {Проверяем на наличие пробелов и удаляем их}
    while Pos(' ', st) > 0 do delete(st, Pos(' ', St), 1);
так:
Код:
{Проверяем на наличие пробелов и удаляем их}
    while Pos(' ', st) > 0 do delete(st, Pos(' ', St), 1);
4) Не забывайте обрамлять Ваш код тэгами CODE /CODE
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.04.2008, 22:28   #7
Astor
Пользователь
 
Регистрация: 23.04.2008
Сообщений: 27
По умолчанию

Обратный обход это когда сначала посещается левая ветвь,потом правая, потом родитель! Потом потешаются элементы элементы так же которые идут от правой ветви корня по такому же принципу!а последним посещается корень! И я попробывал ваш код,что то у меня не работает! Можете мне готовый уже выложить? Просто я в паскале новичок,мне помогали эту задачу делать и я не совсем смогу разобраться - как и что сделать там
Astor вне форума Ответить с цитированием
Старый 24.04.2008, 22:30   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну вот... разве за alexBlack успеешь?.. ;-)
всё, похоже задача решена?..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.04.2008, 22:35   #9
Astor
Пользователь
 
Регистрация: 23.04.2008
Сообщений: 27
По умолчанию

Вроде еще не решена
Astor вне форума Ответить с цитированием
Старый 24.04.2008, 22:37   #10
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
ну вот... разве за alexBlack успеешь?.. ;-)
всё, похоже задача решена?..
Сорри, Серж. Задача не решена. У ТС еще есть вопросы.
И мне не все понятно в последнем вопросе. Вот только пока не сформулировал. Может есть предложения.
alexBlack вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ПОМОГИТЕ, ОЧЕНЬ ПРОШУ Help me Свободное общение 4 01.09.2008 09:29
очень прошу помогите решить задачки Марин@ Помощь студентам 1 24.04.2008 18:27
Помогите решить две задачи! очень прошу... DmT Фриланс 1 23.10.2007 23:19