Помощь - Поиск - Пользователи - Календарь
Полная версия: Рекурсия
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Alex J'Root
Помогите с одной задачей:

Написать программу, которая по заданной "Сумме" вычисляет и выводит значение этой суммы.

<Сумма>::=<Целое>|(<Cумма><Знак_операции><Целое>)
<Целое>::=<Цифра>{<Цифра>}
<Знак_операции>::=+|-

Пример правильной "суммы": 24; 34+45; 7-121+32.
volvo
В чем проблема? Передаешь в рекурсивную функцию строку, если в ней нет ни "+" ни "-", то переводишь переданную строку в число (Val), и возвращаешь как результат; если есть один из этих знаков - ищешь тот, который находится ПРАВЕЕ (ближе к концу строки), все что ДО его вырезаешь и передаешь на очередной уровень рекурсии, все что ПОСЛЕ - преобразуешь в число и ... Ну, знак ты нашел, значит, знаешь что надо сделать с этими двумя частями.

Вот и все...
Alex J'Root
Я просто не совсем понимаю что от меня требуеться в этой задаче. Я должен написать программу, потом в программу надо будет ввести выражение (строку). Например, если будет 14+53-15+9 - то это будет правильное выражение, а если 32-+23+321 - то это будет не правильно. Просто выводить true или false выражение?
Coach
Цитата(Alex J'Root @ 1.06.2008 11:39) *

Я просто не совсем понимаю что от меня требуеться в этой задаче. Я должен написать программу, потом в программу надо будет ввести выражение (строку). Например, если будет 14+53-15+9 - то это будет правильное выражение, а если 32-+23+321 - то это будет не правильно. Просто выводить true или false выражение?

Ну тебе наверное надо,кроме проверки на правильность еще и вычислить значение ,если сумма верная.
volvo
Нет, тебе надо выводить сумму чисел переданной строки... Т.е.,
writeln(sum('7-121+32'));

должно вывести -82

Причем про проверку на правильность в задаче речи нет, так что подразумевается, что передаваться будут именно правильные данные...
Alex J'Root
Так, а если выражение такое: 32-+23+321, то просто вывести ошибку?
volvo
Это уже на твое усмотрение...
Alex J'Root
Что-то "немножко" не получилось.

Program Rek;
Uses Crt;
Var
i,j,rez,rez0,rezN,rez1,rezul,perem:integer;
strok,x:string;
p:array[1..20] of integer;
fl:boolean;
Procedure rekyrs(var strok:string);
Begin
For i:=1 to length(strok) do
Begin
If (strok[i]<>'+') or (strok[i]<>'-') then
Begin
Val(strok,rez0,rezul);
perem:=3;
End
else
Begin
x:=Copy(strok,1,i-1);
Val(x,rez1,rezul);
end;
rez1:=rezN;
case perem of
1: begin rez:=rezN+rez+rez1; fl:=true end;
2: begin rez:=(rezN+rez)-rez1; fl:=true end;
end;
If strok[i]='+' then perem:=1;
If strok[i]='-' then perem:=2;
If fl then rezN:=0;
Delete(strok,1,i);
If perem<>3 then rekyrs(strok);
End;
end;
End;
Begin
clrscr;
j:=1;
writeln('Vvedite virazhenie');
readln(strok);
rekyrs(strok);
rez:=rez+rez0;
writeln(rez);
readln;
End.
volvo
blink.gif Что это было?

function strtoint(s: string): integer;
var X, err: integer;
begin
val(s, X, err);
strtoint := X;
end;

function sum(s: string): integer;
var i: integer;
begin
if pos('-', s) + pos('+', s) = 0 then sum := strtoint(s)
else begin
i := length(s);
while not (s[i] in ['+', '-']) do dec(i);
case s[i] of
'+': sum := sum(copy(s, 1, i - 1)) + strtoint(copy(s, i + 1, 255));
'-': sum := sum(copy(s, 1, i - 1)) - strtoint(copy(s, i + 1, 255));
end;
end;
end;


begin
writeln(sum('24+21-16'));
writeln(sum('7-121+32'));
writeln(sum('24'));
end.
Alex J'Root
Я почти разобрался, спасибо. Мне интересно, вот почему здесь 255:

strtoint(copy(s, i + 1, 255))
volvo
Цитата
Мне интересно, вот почему здесь 255:
Потому что максимальная длина строки = 255, и с другой стороны:
Цитата(TP Help)
If Count specifies more characters than remain starting at the Indexth position, only the remainder of the string is returned
... Так зачем же заниматься высчитыванием, сколько там осталось, если можно просто передать 255 и скопируется все до конца строки?
Alex J'Root
Понял. Спасибо.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.