2015-11-30 4 views
0

У меня есть двойной вопрос для вас. Я довольно новичок в C++, и я пытаюсь изменить эту программу, чтобы он мог принимать переменные и хранить их на карте. Моя проблема в том, что я действительно понятия не имею, где программа получает свои данные от пользователя!Получение ввода cin с помощью cin.get()?

Я понимаю, как он проходит через cin для оценки персонажей, но там, где он получает исходную строку, немного ошеломляет.

Я предполагаю, что он принимает его вход здесь?

int result = 0; 
    char c = cin.peek(); 

Основная проблема заключается в том, что я пытаюсь заставить программу принимать «x + 3» в качестве входных данных. Если x раньше не использовался, как пользователь для ввода, а затем сохраняет значение на карте. Если он был использован, извлеките его с карты. Я не хочу, чтобы вы, ребята, решили это для меня, но общее направление было бы действительно полезно.

Так что я думаю, мои два вопроса:

1.Where ли программа получить пользовательский ввод?

2.Что лучший способ узнать, есть ли символ в потоке? (Я вижу isalpha() может работать, это правильное направление?) Должен ли я копировать поток строку или что-то работать с ней?

#include <iostream> 
#include <cctype> 

using namespace std; 

int term_value(); 
int factor_value(); 

/** 
    Evaluates the next expression found in cin. 
    @return the value of the expression. 
*/ 
int expression_value() 
{ 
    int result = term_value(); 
    bool more = true; 
    while (more) 
    { 
     char op = cin.peek(); 
     if (op == '+' || op == '-') 
     { 
     cin.get(); 
     int value = term_value(); 
     if (op == '+') result = result + value; 
     else result = result - value; 
     } 
     else more = false; 
    } 
    return result; 
} 

/** 
    Evaluates the next term found in cin. 
    @return the value of the term. 
*/ 
int term_value() 
{ 
    int result = factor_value(); 
    bool more = true; 
    while (more) 
    { 
     char op = cin.peek(); 
     if (op == '*' || op == '/') 
     { 
     cin.get(); 
     int value = factor_value(); 
     if (op == '*') result = result * value; 
     else result = result/value; 
     } 
     else more = false; 
    } 
    return result; 
} 

/** 
    Evaluates the next factor found in cin. 
    @return the value of the factor. 
*/ 
int factor_value() 
{ 
    int result = 0; 
    char c = cin.peek(); 
    if (c == '(') 
    { 
     cin.get(); 
     result = expression_value(); 
     cin.get(); // read ")" 
    } 
    else // Assemble number value from digits 
    { 
     while (isdigit(c)) 
     { 
     result = 10 * result + c - '0'; 
     cin.get(); 
     c = cin.peek(); 
     } 
    } 
    return result; 
} 

int main() 
{ 

    cout << "Enter an expression: "; 
    cout << expression_value() << "\n"; 
    return 0; 
} 

EDIT 1: Моя идея заключается в следующем:

Возьмите вход и скопировать его на stringstream, что я буду проходить по отношению к функциям. Таким образом, я могу использовать peek и такие как stringstream.

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

ответ

0

Я бы рекомендовал вам прочитать ввод пользователя с помощью std::getline и применить алгоритм синтаксического анализа выражения к прочитанным строкам. Разбор пользовательского ввода слишком сложный, чтобы его можно было сделать таким образом. Большинство людей используют генераторы парсеров, такие как ANTLR или boost :: spirit для таких задач.