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

304
15 декабря 2016, 16:16

На вход подается описание бинарного дерева. На листьях (висячих вершинах) этого дерева написаны целые числа (от -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))

Answer 1

Чтобы преобразовать число в строке 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() игнорирует пробелы до числа, игнорирует произвольные символы после числа в строке и не разрешает пробелы между минусом и целой частью числа.

Answer 2

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

Обновление

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

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

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

int number = (c - '0');

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

if ((chr!='(') && (chr!=')' && (chr!=' ')))
READ ALSO
Проблема с наследованием C++, среда Borland Builder 6.0

Проблема с наследованием C++, среда Borland Builder 6.0

Есть такая проблема: имеется иерархия классовВ производных появляются новые методы

265
Строки и слова

Строки и слова

Программа должна выводить, сколько раз каждое слово встречается в строке, но этого не происходитВот код:

225
Как уменьшить размер изображения в Qt?

Как уменьшить размер изображения в Qt?

Как реализовать программу, которая бы получала на вход изображение, изменяла его, а потом сохраняла новый вариант куда-нибудь в другое место?

371