IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Рекурсия
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской

Репутация: -  -1  +


Помогите с одной задачей:

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

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

Пример правильной "суммы": 24; 34+45; 7-121+32.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






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

Вот и все...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской

Репутация: -  -1  +


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


Новичок
*

Группа: Пользователи
Сообщений: 23
Пол: Мужской

Репутация: -  0  +


Цитата(Alex J'Root @ 1.06.2008 11:39) *

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

Ну тебе наверное надо,кроме проверки на правильность еще и вычислить значение ,если сумма верная.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






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

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

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

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской

Репутация: -  -1  +


Так, а если выражение такое: 32-+23+321, то просто вывести ошибку?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Это уже на твое усмотрение...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской

Репутация: -  -1  +


Что-то "немножко" не получилось.

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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






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.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской

Репутация: -  -1  +


Я почти разобрался, спасибо. Мне интересно, вот почему здесь 255:

strtoint(copy(s, i + 1, 255))
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Цитата
Мне интересно, вот почему здесь 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 и скопируется все до конца строки?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской

Репутация: -  -1  +


Понял. Спасибо.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 2.12.2021 17:25
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name