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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2011, 22:37   #1
Lara12
 
Регистрация: 15.10.2011
Сообщений: 3
По умолчанию Рекурсия на паскале

Здравствуйте! Очень прошу помочь! Не пойму суть задачи, и следовательно не могу ее написать... Помогите разобраться и составить код. Рекурсия!!

Задача: Вывести значение целочисленного выражения, заданного в виде строки S. Выражение определяется следующим образом:

<выражение> ::= <цифра>|<выражение> + <цифра>|<выражение> - <цифра>

Буду очень благодарна за помощь!!!!

http://www.cyberforum.ru/pascal/thread66712.html Вот тут нашла подобную задачу, только для логического выражения.
Может, кто посмотрит и переделает для моего случая??
Сама я вообще не понимаю суть этого строкового выражения((((
Lara12 вне форума Ответить с цитированием
Старый 16.10.2011, 04:13   #2
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Lara12 Посмотреть сообщение
Может, кто посмотрит и переделает для моего случая??
Ну уж нет, пусть лучше они заглянут сюда и поучатся - тот их бред нуждается в исправлениях..

Что тут писать вообще? Все же написано в определении выражения.. Требуется только пара минут, чтоб перевести на Pascal.
Код:
{ recursive expression calculation
  by TinMan, programmersforum.ru }

function Calculate(s: string): integer;
begin
  if Length(s)=1 then Calculate:= Ord(s[1])-Ord('0')
  else case s[Length(s)-1] of
    '+': Calculate:= Calculate(Copy(s,1,Length(s)-2))+Ord(s[Length(s)])-Ord('0');
    '-': Calculate:= Calculate(Copy(s,1,Length(s)-2))-Ord(s[Length(s)])+Ord('0');
  end
end;

begin
  writeln(Calculate('1+2+3-8+9'))
end.
Разберешься? Спрашивай, что неясно.
Только учти: тут нет абсолютно никакой диагности ошибок в выражении! Выражение ДОЛЖНО быть правильным (то есть написанным по так, как сказано в условии).
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 16.10.2011, 10:57   #3
Lara12
 
Регистрация: 15.10.2011
Сообщений: 3
По умолчанию

Оуу, спасибо большое!!! куда только не писала, нигде не помогли(((
Неясно только что там есть <цифра>|<выражение>, как я понимаю это или цифра или выражение, так?
И как в самой строке S сделать чтобы вместо цифр было выражение?
Можно вот так??


writeln(Calculate('1+2+3-S+9'));



Или значок "|" означает что то другое?
Lara12 вне форума Ответить с цитированием
Старый 16.10.2011, 14:03   #4
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Lara12 Посмотреть сообщение
Неясно только что там есть <цифра>|<выражение>, как я понимаю это или цифра или выражение, так?
И как в самой строке S сделать чтобы вместо цифр было выражение?
Можно вот так??

writeln(Calculate('1+2+3-S+9'));

Или значок "|" означает что то другое?
Да, вертикальная черта означает "или". Это определение:

<выражение> ::= <цифра>|<выражение> + <цифра>|<выражение> - <цифра>

- надо понимать так: выражение состоит из цифр, между которыми либо +, либо -. И этому нужно следовать БУКВАЛЬНО. То есть, например, две цифры подряд (то есть двузначное число) быть НЕ МОЖЕТ. В определении не сказано, чему равно ЗНАЧЕНИЕ выражения. Из этого можно сделать вывод, что значение определяется, так сказать, "обычным" образом. То есть значение цифры равно числу, которое она выражает (однозначному), а сумма и разность считаются тоже как обычная сумма и обычная разность. И в результате получается, что это выражение - это просто сумма и разность цифр, и ничего больше!

Ты где учишься и на кого? Понимаешь, такие определения носят формальный и абсолютно точный характер. Подобные вещи хорошо знакомы математикам. Но если ты не совсем математик, то тебе может показаться, что я вообще несу ахинею )). Постарайся усвоить одно: нужно ЧЕТКО следовать данному определению. В определении нигде нет никаких S. Значит, их не должно быть и в выражении. Еще раз повторю:

<выражение> ::= <цифра>|<выражение> + <цифра>|<выражение> - <цифра>

- это значит, что к цифре можно добавить "+ цифра" или "- цифра" - причем сколько угодно раз.


На самом деле, все ОЧЕНЬ просто. Но формализация простых и привычных вещей часто кажется предельно сложной. Нужно уметь за всем этим видеть суть, схватывать ее и не давать себя сбить с толку. Правда же, просто?
Предпочитаю на "ты".

Последний раз редактировалось TinMan; 16.10.2011 в 14:11.
TinMan вне форума Ответить с цитированием
Старый 16.10.2011, 18:17   #5
Lara12
 
Регистрация: 15.10.2011
Сообщений: 3
Хорошо

Цитата:
Сообщение от TinMan Посмотреть сообщение

Ты где учишься и на кого? Понимаешь, такие определения носят формальный и абсолютно точный характер. Подобные вещи хорошо знакомы математикам.
Да, я математик))) программист недоделанный))

Все, дошло до меня это все))) Спасибо огромное, все так внятно и понятно рассказал Действительно, все просто))
Lara12 вне форума Ответить с цитированием
Старый 16.10.2011, 22:41   #6
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Lara12 Посмотреть сообщение
Да, я математик))) программист недоделанный))
..
Действительно, все просто))
Не расстраивайся, все учатся )). Доделаешься!
Спрашивай еще.
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсия на Си Хитман Помощь студентам 3 10.04.2011 15:48
Рекурсия Наташок Паскаль, Turbo Pascal, PascalABC.NET 0 08.04.2011 18:44
Рекурсия. KOPC1886 Помощь студентам 1 09.12.2010 21:37
Задача в паскале (рекурсия) Feil Помощь студентам 2 25.12.2009 12:04
Рекурсия seeton Помощь студентам 0 08.12.2009 17:41