![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
Dmitry |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 4 Пол: Мужской Репутация: ![]() ![]() ![]() |
Добрый день.
В файле записана формула, например (5*(3+8)) . (Формула может состоять и из одного числа. Тогда в скобки она не берётся). Файл записан в папке D:\Work. Необходимо представить её в виде двоичного дерева----------*------------------- -----------------/----\----------------- ---------------5------+---------------- ---------------------/--\-------------- -------------------3-----8------------- и вычислить (с помощью рекурсии) значение полученного дерева-формулы. (5*(3+8)) будет равно 55. Я попытался создать программу для решения этой проблемы, для формулы, состоящей из одного числа она работает, а вот для описанного выше выражения выдаёт неправильный результат. И ещё: при пошаговом выполнении в случае для описанной формулы со скобками выкидывает на рабочий стол. Помогите подкорректировать текст программы.(код программы прилагается) Код program Proga; const Chisla: set of Char = ['0', '1','2','3','4','5','6','7','8','9']; Znaki: set of Char = ['+','-','*']; type bt = string; Adr = ^Derevo; Derevo = record L: Adr; R: Adr; Inf: Integer; end; var TextFile: Text; Der1, Der2: Adr; Dat: bt; N: Integer; A1: Integer; function Pered(TT: Adr; var N: Integer): Adr; {строим дерево} var C: Char; D, X: Integer; const A: bt = ''; begin if N <= Length(Dat) then begin A := ''; Inc(N); C := Dat[N]; if C in Chisla then begin D := N; while (Dat[D] in Chisla) and (D <= Length(Dat)) do begin A := A + Dat[D]; Inc(D); end; if D - 1 = N then A := Dat[N]; Val(A, A1, X); N := D; TT^.L := nil; TT^.R := nil; TT^.Inf := A1; end else begin TT^.L := Pered(TT^.L, N); if Dat[N] = '-' then TT^.Inf := -1 else if Dat[N] = '+' then TT^.Inf := -2 else if Dat[N] = '*' then TT^.Inf := -3; TT^.R := Pered(TT^.R, N); end; end; end; function Rezult(Tree: Adr): Integer; {считаем значение дерева} var B: Integer; begin if Tree^.L = nil then Rezult := Tree^.Inf else begin case Tree^.Inf of -1: Rezult := Rezult(Tree^.L) - Rezult(Tree^.R); -2: Rezult := Rezult(Tree^.L) + Rezult(Tree^.R); -3: Rezult := Rezult(Tree^.L) * Rezult(Tree^.R); end; end; end; begin Assign(TextFile, 'D:\Work\TextFile.txt'); Reset(TextFile); New(Der1); New(Der2); Der1 := nil; Der2 := Der1; Readln(TextFile, Dat); N := 0; Pered(Der1, N); Writeln(Rezult(Der1)); end. Прикрепленные файлы ![]() |
![]() ![]() |
![]() |
Текстовая версия | 27.07.2025 8:30 |