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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.02.2013, 12:27   #1
apostol584
Пользователь
 
Регистрация: 29.11.2012
Сообщений: 11
По умолчанию Построение бинарного дерева из формулы (Pascal)

Я первый раз столкнулся с деревьями, помогите решить.

Формулу вида
<формула>::=<терминал>|(<формула><з нак><формула>)
<знак>::=+|-|*
<терминал>::=0|1|2|3|4|5|6|7|8|9 можно представить в виде двоичного дерева

1.вычислить значение дерева
2.по формуле из текстого файла f построить дерево
3.напечатать дерево в виде соответствующей формулы, определить высоту заданного дерева.

Мне бы код построения дерева, с остальным я разберусь.
apostol584 вне форума Ответить с цитированием
Старый 05.02.2013, 14:33   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Вообще, хотелось бы знать, соответствующий тип (узел) описан? Если да, то покажите. А то нужно с чего-то начать.

Последний раз редактировалось Sibedir; 05.02.2013 в 15:06.
Sibedir вне форума Ответить с цитированием
Старый 05.02.2013, 16:08   #3
apostol584
Пользователь
 
Регистрация: 29.11.2012
Сообщений: 11
По умолчанию

Код:
type 
    tnode=^pnode;
    pnode=record
        info: char;
		left, right: tnode;
	end;
	
var
    formyla:string;
    root:tnode;
apostol584 вне форума Ответить с цитированием
Старый 05.02.2013, 17:18   #4
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

apostol584, извините, сразу не спросил.
Формат строки-формулы? В каком виде записыватся формула? Как обычно (8+3*5-1)? Или можно использовать упрощенные формы записи типа польской (-+8*351)?

-----------------------------------------------------------------
Короче, будем считать, что запись имеет обычный вид. Как создать дерево из польской записи, думаю и так понятно.

Последний раз редактировалось Sibedir; 05.02.2013 в 17:34.
Sibedir вне форума Ответить с цитированием
Старый 05.02.2013, 17:38   #5
apostol584
Пользователь
 
Регистрация: 29.11.2012
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
apostol584, извините, сразу не спросил.
Формат строки-формулы? В каком виде записыватся формула? Как обычно (8+3*5-1)? Или можно использовать упрощенные формы записи типа польской (-+8*351)?
формула вводится в обычном виде, при построении дерева можно использовать любую, а при построении формулы она долна иметь первоночальный вид.
apostol584 вне форума Ответить с цитированием
Старый 05.02.2013, 17:44   #6
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

OK
___________________________________ ______________________________
Сразу позволю себе некоторую своевольность.
Код:
  PNode = ^TNode;
  TNode = record
    Data: Char;
    Parent: PNode;
    Left, Right: PNode;
  end;
Так будет немного помнемоничней
Да и Parent нам пригодится, чтоб не насиловать стек. Хотя можно было и без него

___________________________________ ______________________________
Ща сделаем, но это займет какое-то время. Потому-что доча

Последний раз редактировалось Sibedir; 05.02.2013 в 17:46.
Sibedir вне форума Ответить с цитированием
Старый 05.02.2013, 17:54   #7
apostol584
Пользователь
 
Регистрация: 29.11.2012
Сообщений: 11
По умолчанию

огоромное спасибо.
apostol584 вне форума Ответить с цитированием
Старый 06.02.2013, 06:31   #8
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Пока незачто
___________________________________ _________________________
70% готовности
- составлена блок-схема (фотку сделать не смог, не нашел SD-карту)
- набросал часть кода
Код:
program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, SysUtils, CustApp
  { you can add units after this };

type
  PNode = ^TNode;
  TNode = record
    Data: Char;
    Parent: PNode;
    Left, Right: PNode;
  end;

  TCharType = (chtTerm, chtZnak, chtSpace, chtNil, chtError);

procedure Error (Mes: String);
begin
  WriteLn (Mes);
  ReadLn;
  Halt;
end;

procedure ErrorInPosition (Pos: Integer);
begin
  Error ('Error in ' + IntToStr(Pos) + ' position');
end;

function CharType (const ch: Char): TCharType;
begin
  case ch of
    '0'..'9'         : Result := chtTerm ;
    '+', '-', '*'    : Result := chtZnak ;
    #9, #10, #13, ' ': Result := chtSpace;
    #0               : Result := chtNil  ;
  else
    Result := chtError;
  end;
end;

function ZnakVes (const ch: Char): Byte;
begin
  case ch of
    '+', '-': Result := 1;
    '*'     : Result := 2;
  else
    Error ('Invalid argument in ZnakVes (' + ch + ')');
  end;
end;

function NewNode (const ch: Char): PNode;
begin
  New (Result);
  with Result^ do begin
    Data   := ch;
    Parent := nil;
    Left   := nil;
    Right  := nil;
  end;
end;

function ReadBuf (buf: String): PNode;
var
  Cur, New: PNode;
  i, Count: Integer;
  ch: Char;
  Ojid: TCharType; // признак ожидания
begin
  // подготовка
  Cur := NewNode (#0);
  Ojid := chtTerm;
  Count := Length (buf);

  for i := 1 to Count do begin
    // читаем посимвольно
    ch := buf[i];
    case CharType (ch) of
      chtError, chtNil: ErrorInPosition (i);
    end;
  end;

  Result := Cur;
end;

function GetFormula (Root: PNode): String;
begin
  if Root = nil then
    Error ('Invalid argument in GetFormula (nil)')
  else begin
    Result := '';
  end;
end;

function CalcFormula (Root: PNode): Integer;
begin
  if Root = nil then
    Error ('Invalid argument in CalcFormula (nil)')
  else begin
    Result := 0;
  end;
end;

var
  Formyla: string;
  Root: PNode;

begin
  Formyla := '8 + 3*5*4 - 1 + 3*5'; //82
  Root := ReadBuf (Formyla);
  WriteLn (GetFormula (Root), ' = ', CalcFormula (Root));
end.
Sibedir вне форума Ответить с цитированием
Старый 06.02.2013, 09:19   #9
apostol584
Пользователь
 
Регистрация: 29.11.2012
Сообщений: 11
По умолчанию

Что делают эти модули cthreads, Classes, SysUtils, CustApp? Если я правильно понял, то программа написана да делфи или лазурусе.
apostol584 вне форума Ответить с цитированием
Старый 06.02.2013, 10:25   #10
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Сообщение от apostol584 Посмотреть сообщение
Что делают эти модули cthreads, Classes, SysUtils, CustApp?
Не важно. Все, что вам нужно, находится ниже
Код:
type
Цитата:
Сообщение от apostol584 Посмотреть сообщение
Если я правильно понял, то программа написана да делфи или лазурусе.
На Лазарусе
Sibedir вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод бинарного дерева. C++ vadmaruschak Помощь студентам 0 11.12.2012 13:07
Построение бинарного дерева LordAlex91 Общие вопросы C/C++ 2 18.02.2012 15:49
Построение дерева-формулы по формуле из файла proser93 Помощь студентам 0 17.12.2011 16:20
построение бинарного дерева по инфиксной записи Екатерина Семенова Помощь студентам 1 23.05.2011 20:45