Считывание строки

Рейтинг: 0Ответов: 2Опубликовано: 18.11.2014

На вход подается описание бинарного дерева. На листьях (висячих вершинах) этого дерева написаны целые числа (от -10^6 до 10^6). Идем от корня дерева, случайно поварачивая направо или налево (с вероятностями 0.5).

Чему равно cреднее значение числа на листе, в который мы в конечном счете придем? Ответ вывести с точностью до двух знаков после запятой.

Данную задачу можно решить без дерева. Когда встречаешь "(" - уменьшать вероятность, когда ")" - увеличивать: res=a[i]*(0.5)^(b[i]), где a[i] — это какое-то число из строки ввода, b[i] — скобочный итог к моменту, когда мы встретили это число. И суммировать результаты. Т.е. когда скобка, он должен прибавлять или вычитать к s. А когда число - выполнять действия с ним. Подскажите.

using namespace std;

int main()
{
    string str,st;

int index = 0,k=0,i=0;
double s=0,res=0;
res = 0;
char chr;
getline(cin,str);

while (index < str.length())
{
    chr = str[index];

    if ((chr!='(')||(chr!=')'||(chr!=' ')))
        {
            st = chr;
            k = atoi(st.c_str()); cout << "k=" << k << endl;
            res = res + k*pow(0.5, s); cout << "s=" << s << endl;
        }

    if (chr == '(')
    {
        s = s+1 ;

    }
    if (chr == ')')
    {
        s = s-1;

    }
    cout << "ravn" << res<<endl;

    index++;
}
    cout << "ravn" << res;
        system("pause");
}

На вход подавться будет вот такое: (1 3(2 4))

Ответы

▲ 2Принят

Чтобы преобразовать число в строке str в тип int: int i = stoi(str);

Пример

#include <iostream>
#include <string>

int main() {
    using namespace std;
    for (string line; getline(cin, line); ) {
      int i = stoi(line);
      cout << i << endl;
   }
}

Ввод

1
-1
             2
             3 rest
- 4

Вывод

1
-1
2
3
terminate called after throwing an instance of 'std::invalid_argument'
what():  stoi

Вывод показывает, что stoi() игнорирует пробелы до числа, игнорирует произвольные символы после числа в строке и не разрешает пробелы между минусом и целой частью числа.

▲ 2

В с++ стандартных средств нету для таких целей. Следует либо найти библиотеку, либо написать самостоятельно дынный функционал. Логика такова: считывается строка, делится на токены по whitespace, проверяется каждый токен, если он состоит только из цифр, то это число. В вашем случае на токены разделение будет хитрее из-за скобочных последовательностей.

Обновление

В вашем случае удобно читать на лету, то есть:

char c;
while((c = getchar()) != '\n'){
    if(c >= '0' && c <= '9') //....
}

а преобразование символа-цифры в число:

int number = (c - '0');

@doomsday, и у вас логическая ошибка.
Нужно так:

if ((chr!='(') && (chr!=')' && (chr!=' ')))