![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Linchx |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 31.7.2011 Репутация: нет Всего: нет |
Здравствуйте!
Суть задачи следующая: необходимо считать из файла выражение и на выходе получить результат его вычисления. Написал программу, за основу взял алгоритм "Обратной польской записи", на вход идет файл с выражением, программа его считывает производит операции арифметические, но не верно. Помогите разобраться с этой задачей.
вот, что подавал на вход: 5+5/2 6+9*7+10*5 5+5/2 итог на выходе: 5+5/2=1 6+9*7+10*5=0 5+5/2=2 |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
||||
|
||||
Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: нет Всего: 6 |
Гляди комментарии. Условие первого цикла неверно. В общем, смысл тот, что stack еще не содержит тех элементов, которые должны быть считаны из файла, а с ними уже пытаешься проводить операции. |
|||
|
||||
Linchx |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 31.7.2011 Репутация: нет Всего: нет |
Да, я понимаю, что вы хотите сказать. Нужно подавать вот в такой форме?
но у меня даже, если так вводить, то выдаст не верный ответ |
||||
|
|||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Откуда вы знаете верный или не верный? если вы думаете что 5 5 2 + / это эквивалент 5+5/2 то вы ошибаетесь. Еще раз, разберитесь сначала с польской записью, а только потом кодить. Как вы можете писать программу, которая не знаете что должна делать? |
|||
|
||||
Linchx |
|
||||||||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 31.7.2011 Репутация: нет Всего: нет |
Спасибо, Teleport! Так понятно, что программа считывает изначально 5 потом идущий за ней символ "+" и после 5. Хотя должен на вход получить 5 5 +, только как изначально из инфиксной в постфиксную перевести? Спасибо ещё на счет size_t, теперь понятно на, что жаловался компилятор:
Добавлено через 6 минут и 33 секунды Да, ошибся извиняюсь:
приоритет перепутал=) |
||||||||
|
|||||||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
||||
|
||||
Teleport |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: нет Всего: 6 |
Ну вот смотри. В первой итерации у тебя считывается 5 и заносится как stack[ 0 ] m увеличивается на 1 и равно 1 Во второй итерации у тебя считывается '+' и в switch у тебя оператор сложения
получается складывается stack[ 1 - 2 ] + stack [ 1 - 1 ]. В stack[ -1 ] - неизвестно что. Отсюда и надо думать. Либо неправильный алгоритм чтения, либо неправильные данные на вход. Это сообщение отредактировал(а) Teleport - 31.7.2011, 20:13 |
||||
|
|||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Teleport, там алгоритм обратной польской записи. подробнее здесь.
За исключением небольших неточностей (типа сравнения сигнед с ансигнед) программа делает именно то, что и должна делать. |
|||
|
||||
Linchx |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 31.7.2011 Репутация: нет Всего: нет |
Скорее неправильные данные на вход, просто они уже должны быть в "постфиксной форме", а я их по-глупости в "инфиксной форме" ввожу. Сейчас проверил выражение в "постфиксной форме", считает. |
||||||
|
|||||||
Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: нет Всего: 6 |
2 volatile - это мне понятно и вы тоже об этом писали, но я хотел указать именно на то как работает код автора дабы можно было четко увидеть почему идет расчет именно так, а не как положено.
![]() А сравнение типов я уже поправил еще в посте номер 3. 2 Linchx - самое важное - понять почему программа работала не так как ожидалось. Вроде, ты все понял ![]()
Надо всегда разбираться с ошибками и знать точно - в чем именно каждая ошибка ![]() Это сообщение отредактировал(а) Teleport - 31.7.2011, 22:47 |
|||
|
||||
Linchx |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 31.7.2011 Репутация: нет Всего: нет |
Teleport и volatile, спасибо большое! ![]() |
||||
|
|||||
Linchx |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 31.7.2011 Репутация: нет Всего: нет |
Я ещё один вопрос возник. Как можно для входного выражения:
обработать ошибку и пропустить его. Таким образом отбросить не верно составленные выражения. Знаю, что можно при помощи оператора 'continue' пропустить, но условие не могу составить.
а как запретить делить на ноль и ввод не верного арифметического выражения, не имею понятия. Это сообщение отредактировал(а) Linchx - 1.8.2011, 06:29 |
||||
|
|||||
volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Не совсем понял откуда вы взяли последний код,
Если мои телепатические способности меня не подвели, ![]() то вероятно этот код должен вызывать процедуру eval_exp(), которая и вычисляет выражение? Обработку ошибок нужно проводить именно в eval_exp(), и она должна возвращать код ошибки, или 0 если ошибок нет. Обработать ошибку в eval_exp() - просто. например деление на 0
Там же обязательно проверку стека. Ну и много чего еще предусмотреть... Все это надо делать в в eval_exp(); а никак не в общем цикле. |
||||
|
|||||
Linchx |
|
||||||||||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 31.7.2011 Репутация: нет Всего: нет |
Спасибо, но я код изменил, теперь считаю инфиксные выражения. Пытаюсь присвоить переменной answer значение sn в случае ошибки она бы выводила сигнал, чтобы увидеть надпись wrong example, выводит но надпись "nan". Как можно изменить эту надпись? Может кто встречался с подобным!?
в syntax.cpp передается prog и answer, так же в syntax.cpp объявлено, что в случае недопустимых операций и арифметических выражений возвращать NaN для типа double. Но вот почему он вместо can't calculate записывает nan непонятно.
Это сообщение отредактировал(а) Linchx - 1.8.2011, 14:41 |
||||||||||
|
|||||||||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |