2016-03-15 3 views
1

Я хочу, чтобы решить этот тип выражений после чтения из подачи с старшинства
2 + 3/5 * 9 + 3-4
Вот мой код для попытки решить эту задачу как я могу решить эту проблемуC++ Внеочередные с помощью подачи

while (!inputFile.eof()) { 
    getline(inputFile, read); 
    cout << read << endl; 
    for (int i = 0; i < read.length(); i++) { 
    if (read[i] == '/') { 
     result = static_cast<float>(read[i - 1])/static_cast<float>(read[i + 1]); 
     read[i - 1] = result; 
     for (int j = i; j < read.length() - 2; j++) { 
     read[j] = read[j + 2]; 
     } 
     read[read.length() - 1] = '\0'; 
     read[read.length() - 2] = '\0'; 
    } 
    } 
    cout << result << endl; 
    cout << read << endl; 
} 
+0

Вы оценивающих операнды как поплавки, но потом хранить его обратно в строку как символ, теряющий любую точность. Вы оцениваете операнды на основе их ascii-представления, а не фактического значения. Этот код предполагает, что каждый операнд имеет длину всего один символ. Вы показываете только разделение, но при реализации умножения вы, скорее всего, получите значения больше 9 и, следовательно, будут иметь проблемы. Я думаю, вы должны пересмотреть свое решение, и я советую не пытаться делать все это в одной строке. – vu1p3n0x

+0

Я не уверен, что понимаю, что вы пытаетесь сделать. Оценка выражений - это не тривиальная задача. [Это] (http://www.stroustrup.com/3rd_code.html) может помочь вам (посмотрите на Desk Calculator). – ZDF

ответ

2

Вам понадобится построить древовидную структуру с вашего входа. Прежде всего вам нужно lex (/ tokenize) ваше уравнение, чтобы вы получили список/массив/любой контейнер, который, по вашему мнению, подходит для ваших токенов (это числа, операторы, скобки). Они могут уже содержать правильные типы данных (float или int для чисел и т. Д.).

Затем вы можете проанализировать свои токены в древовидной структуре, используя правильный приоритет. Это сложная часть для создания калькуляторного приложения.

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

Ваша структура дерева для 2 + 3/5 * 9 + 3-4 потребности выглядеть следующим образом:

MINUS 
|- PLUS 
| |- PLUS 
| | |- 2 
| | |- MULTIPLY 
| | | |- DIVIDE 
| | | | |- 3 
| | | | |- 5 
| | | |- 9 
| |- 3 
|- 4 
1

ваш код имеет ряд проблем

  1. есть здесь скрыта ошибка индексации вне границ, в первой итерации цикла вы пытаетесь получить доступ к адресу чтения [-1], который предположительно не существует

  2. читать (предположительно) массив символов, это означает, что чтение [i] содержит символ ASCII, а не необработанное число. Итак, если read [i] содержит '5', результат применения static_cast < float > (read [i]) равен '53 .0 ', потому что код ASCII для' 5 'равен 53. Так что вам действительно нужно static_cast < float > (прочитайте [i] - '0')

  3. Вы не должны сохранять результат деления с плавающей запятой обратно в чтение [i-1], потому что, очевидно, вы смешиваете значение с плавающей запятой с символами. Если вы серьезно относитесь к этому, вы должны преобразовать в строку результат своей операции, но я бы посмел сказать, что это лишняя сложность: почему бы вам просто не использовать временную переменную с плавающей точкой для хранения частичных результатов?

  4. нет необходимости сокращать содержимое буфера чтения после того, как вы потребляете первые два операнда, просто продвигайте указатели.

+0

# 1 может произойти только в том случае, если ''/''является первым символом строки, который, если заданный корректный ввод не будет выполнен – vu1p3n0x

+0

Я бы не предполагал, что вход хорошо сформирован, поскольку он не проверен нигде , –

+0

достаточно справедливо .... – vu1p3n0x