| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Калькулятор с одним полем TEdit. |
| Автор: Dilettante 15.10.2012, 18:12 | ||||||
Приветствую вас! Имеется калькулятор, состоящий из следующих частей:
Переменные в области private:
Код для кнопки очистки:
Подскажите пожалуйста, всё ли здесь корректно в части вычислений? Попробовал посчитать разные выражения - вроде нормально. Но не уверен, что всё предусмотрено. |
| Автор: artsb 16.10.2012, 12:06 | ||
Можно просто писать this->MyVar. Так точно не запутаешься ) |
| Автор: Dem_max 16.10.2012, 12:15 |
| Я так понял если вводить такое выражение 1+6*7-3/8 = ???? какое число выведет твой калькулятор ? |
| Автор: Dilettante 16.10.2012, 16:44 | ||
| 2borisbn, artsb Спасибо за замечания. Об отдельном обработчике для равенства я не подумал. Как-то включил его машинально к операциям. Вообще у меня изначально обработка всего поведения, связанного с полем TEdit, скопилась в одном методе. Насчёт очереди из символов, с одной стороны, я к ней ещё обращаюсь при выводе строки, хранящей последовательность операций:
Ну а с другой - опять же, не подумал. Совет про именование переменных класса учту. 2Dem_max Выведет 5,75, т.к. не соблюдает приоритеты операций и считает такое: ((1+6)*7-3)/8. 2All Спасибо вам за внимание к моей проблеме! Попытаюсь сдать (лабораторная, как вы, возможно, догадались). |
| Автор: borisbn 16.10.2012, 16:59 | ||||||
на здоповье. сравнивай так
а для их отображения сделай функцию перевода enum'а в символ и вызывай её
сама функция op_2_char, как ты понимаешь, будет совсем несложная )) |
| Автор: Dilettante 16.10.2012, 17:12 |
| 2borisbn Да, удачно получается |
| Автор: Dem_max 16.10.2012, 17:32 | ||
Ну что тогда покритикую как просил - реализация фиговая. |
| Автор: Dilettante 16.10.2012, 17:57 |
| 2Dem_max Тут вы правы. На большее не хватило. Но я надеюсь, что для моих нужд будет достаточно. |
| Автор: artsb 16.10.2012, 20:02 | ||||
Тут всё намного проще:
И теперь можно так:
Это будет работать быстрее, чем вызов функции. Надеюсь, идея понятна. |
| Автор: borisbn 16.10.2012, 21:41 |
| > Это будет работать быстрее, чем вызов функции. Готов поспорить, что дааааааааапалеко не всегда. Сферических коней в вакууме не предлагать |
| Автор: artsb 16.10.2012, 23:09 |
Ну, смысла спорить я не вижу, т.к. тут всё очевидно, ИМХО. При обращении к элементу массива ничего особенного не происходит. А вот при вызове функции, происходт много чего. Например, передача параметра; переключение на вызываемую функцию; работа в самой функции (скорее всего, там будет switch); возвращение значения из функции, что влечёт за собой создание временного объекта. Возможно, ещё что-то упустил. Как бы там ни было, на всё это нужно время. Поправьте меня, если я не прав. |
| Автор: borisbn 17.10.2012, 06:24 |
| > Поправьте меня, если я не прав. Теоретически (как в том анекдоте) Вы правы, а практически компилятор сделает из switch'а таблицу, и заинлайнит функцию. Проверьте. Сделайте два варианта и посмотрите ассемблерный код (с включенной оптимизацией, ессно) |
| Автор: artsb 17.10.2012, 07:51 |
Вот. Ключевой момент ) И тем не менее, даже если функция будет оптимизирована и заинлайнится, неужели простая операция с адресом (указатель на массив + смещение) будет длить дольше? Добавлено через 2 минуты и 17 секунд Кстати, обе операции (мой вариант и ваш вариант с функцией) будут отрабатывать очень быстро. Настолько, что разницу заметить очень тяжело. |
| Автор: Dilettante 17.10.2012, 16:18 |
| Использование массива мне нравится (и кажется наиболее быстрым, т.к., наверное, O(1) не идёт из головы borisbn, artsb, Dem_max, Спасибо вам за помощь и внимание к теме! |