Помогите решить что добавить в функцию, я уже извертелся...
Задача.
Функция получает строку и указатель на переменную. Возврат функции это число которое должно получиться, а в переменной должна быть длина строки.
Алгоритм рекурсивный.
Здравствуйте, Лис, Вы писали:
Лис>Помогите решить что добавить в функцию, я уже извертелся...
Лис>Задача. Лис>Функция получает строку и указатель на переменную. Возврат функции это число которое должно получиться, а в переменной должна быть длина строки. Лис>Алгоритм рекурсивный.
Лис>Примеры: Лис>Получает --> Возвращает Лис> 5 --> 5, len=1 Лис> (4+9) --> 13, len=5 Лис>((7-9)+(6+3)) --> 7, len=13 Лис>(4+(7-(4+1))) --> 6, len=13
Здравствуйте, Лис, Вы писали:
Лис>Помогите решить что добавить в функцию, я уже извертелся...
Лис>Задача. Лис>Функция получает строку и указатель на переменную. Возврат функции это число которое должно получиться, а в переменной должна быть длина строки.
Тут одной функцией вряд ли обойдешься. Читай про синтаксический анализ.
Здравствуйте, Socrat, Вы писали:
S>Здравствуйте, Лис, Вы писали:
Лис>>Помогите решить что добавить в функцию, я уже извертелся...
Лис>>Задача. Лис>>Функция получает строку и указатель на переменную. Возврат функции это число которое должно получиться, а в переменной должна быть длина строки.
S>Тут одной функцией вряд ли обойдешься. Читай про синтаксический анализ.
К сожалению ничего добавлять или изменять нельзя, только заполнить пропущенное.
Здравствуйте, Лис, Вы писали:
Лис>Функция получает строку и указатель на переменную. Возврат функции это число которое должно получиться, а в переменной должна быть длина строки.
Пусть функции на вход подали такое:
((1+2)+(3+(4+5)))
Сколько раз и с какими аргументами calc должна вызвать себя?
Например, в самом начале она пойдет по первой ветке, увидев, что *s == '('. s[1] явно начинает первый операнд сложения или вычитания. Теперь нужно выяснить, где он заканчивается, что за знак стоит за ним и где начинается второй. Как здесь нужно вызвать calc? Обрати внимание на то, что len передается по указателю — к чему бы это?
Здравствуйте, Лис, Вы писали:
Лис>Помогите решить что добавить в функцию, я уже извертелся...
Лис>Задача. Лис>Функция получает строку и указатель на переменную. Возврат функции это число которое должно получиться, а в переменной должна быть длина строки. Лис>Алгоритм рекурсивный.
int Calc(char * c, int* len )
{
if (*c == '(')
{ // begin new layerint newLen = 0;
(*len)++; // ++ to skip '('int left = Calc(c + 1, &newLen);
c+=(++newLen);// ++ to skip +/-int right = Calc(c + 1, &newLen);
(*len)+=(++newLen); // ++ to skip ')'return (*c == '+')?(left + right):(left - right);
}
else
{
(*len)++;
return *c - '0';
}
}
Здравствуйте, Socrat, Вы писали:
S>Здравствуйте, Лис, Вы писали:
Лис>>К сожалению ничего добавлять или изменять нельзя, только заполнить пропущенное.
S>Примерно так: S>
S>int calc( char* s, int* len )
S>{
S> if( *s == '(' )
S> {
S> // We're in the beginning of a complex expression
S> int left_len, right_len, left_val, right_val;
S> left_val = calc( s+1, &left_len );
S> char op = s[left_len];
S> right_val = calc( s+left_len+1, &right_len);
S> *len = left_len+right_len+3;
S> if( op == '+' )
S> left_val+right_val;
S> else if( op == '-' )
S> left_val-right_val;
S> }
S> else
S> {
S> // We're on a simple, one-digit number
S>// А тут уж сам подумай...
S> *len = ______;
S> return ______;
S> }
S>}
S>
давай теперь ты "сам подумай" ...
"((7-9)+(6+(3-1)))" — получи 6
Здравствуйте, Roman Odaisky, Вы писали:
RO>Здравствуйте, Лис, Вы писали:
Лис>>Функция получает строку и указатель на переменную. Возврат функции это число которое должно получиться, а в переменной должна быть длина строки.
RO>Пусть функции на вход подали такое:
((1+2)+(3+(4+5)))
Сколько раз и с какими аргументами calc должна вызвать себя?
RO>Например, в самом начале она пойдет по первой ветке, увидев, что *s == '('. s[1] явно начинает первый операнд сложения или вычитания. Теперь нужно выяснить, где он заканчивается, что за знак стоит за ним и где начинается второй. Как здесь нужно вызвать calc? Обрати внимание на то, что len передается по указателю — к чему бы это?
У меня есть такое решение, но в len на выходе всегда остается 1, что не достаточно по требования программы.
int calc( char* s, int* len )
{
if( *s == '(' )
{
// We're in the beginning of a complex expressionint left_len, right_len, left_val, right_val;
left_val = calc(s+1, &left_len );
char op = s[(strlen(s)-left_len)+1];
right_val = calc(s+(strlen(s)-left_len+2), &right_len);
*len = right_len-1;
if( op == '+' )
return left_val+right_val;
else if( op == '-' )
return left_val-right_val;
}
else
{
// We're on a simple, one-digit number
*len = strlen(s);
return *s-'0';
}
}
Вообще странно... Вы уверены что в вашей задаче должны использоваться только две арифмитические операции: "+" и "-"? Наличие скобок в примере смущает, так как не вижу особого смысла в них для операций с одинаковым приоритетом. У меня такое чувство, что задача сильно упрощена... Хотя вполне возможно что так и есть.