Добавляем! оператор и sqrt (), pow () и т. д. для примера приложения калькулятора

В дополнение к тому, что сказал lshettyl (текущий верхний пост) - дополнительная работа заключается в привязке нового прослушивателя событий непосредственно к элементу, который вы пытаетесь удалить слушателя, и вызвать stopPropagation () в нем.

Что это будет делать, так это предотвращать перемещение события по DOM и попадание на обработчик событий, который первоначально привязан к документу. Также это позволит вам сохранить некоторые функции при нажатии кнопки, например, предупреждение пользователю, что эта кнопка уже нажата - или что-то в этом роде.

$(document).on('click', 'button', function(ev) {
    // Your logic to occur on button click

    // Prevent further click on just this button
    $(this).click(function(event) {
        event.stopPropagation();
    }):
});
29
задан Will 20 March 2013 в 14:02
поделиться

4 ответа

  1. На Stroustrup - Programming опубликовано несколько решений, и со временем появятся новые.

  2. Попробуйте выполнять упражнения только с использованием представленных языковых функций и возможностей библиотеки. пока что в книге - настоящие начинающие пользователи больше ничего не могут. Затем вернитесь позже, чтобы увидеть, как можно улучшить решение.

212
ответ дан 28 November 2019 в 00:32
поделиться

Я бы переместил обнаружение 'sqrt' в другой метод обнаружения функций. По сути, я бы удалил обнаружение 's' и добавил бы что-то внутри регистра по умолчанию, которое считало бы строку до '('.

Если не обнаружено '(', то ошибка.

Если вы успешно прочитали строку, передайте ее синтаксическому анализатору имени функции, который использует сравнение строк для генерации токена, который представляет вызов sqrt или sin или любой другой функции, которая вам нравится. Метод, который проверяет имена функций, также может ошибаться, если он читает строку, которую он не распознает.

0
ответ дан 28 November 2019 в 00:32
поделиться

Я подумал, что отображение строк в указатели на функции может быть кратким способом представления таких вещей, как sqrt, sin, cos и т. Д., Которые принимают одинарное двойное и возвращают двойное:

map<std::string, double (*)(double)> funcs;
funcs["sqrt"] = &sqrt;
funcs["sin"] = &sin;
funcs["cos"] = &cos;

Тогда когда синтаксический анализатор обнаруживает правильную строку (str), он может вызвать функцию с аргументом ( arg ) следующим образом:

double result = funcs[str](arg);

С помощью этого метода один вызов может обрабатывать все случаи функций (этого типа ).

На самом деле я не уверен, правильный ли это синтаксис, может кто-нибудь подтвердить?

Кажется ли это полезным методом?

10
ответ дан 28 November 2019 в 00:32
поделиться

С производными классами и виртуальными функциями легче работать: каждый специализированный класс читает свой собственный ввод ...

class base {
    public:
        virtual double calc() = 0;
};

class get_sqrt : public base {
    int useless;

    public:
        virtual double calc() {
            cin >> number;
            return sqrt(number);
        }
}

get_sqrt;

Теперь мы организуем их в карту, и мы будем использовать только их указатели :

map<string,base*> func;
func["sqrt"] = &get_sqrt;

Существует также специальный метод, который смотрит только на следующий символ: peek ();

char c = cin.peek();

Вы можете избавиться от переключателя, используя 1, если помещаете ! , + , - и т.д. в func ; (они должны работать с left_param для простоты):

 if (c>='0' && c<='9')
     cin >> right_param; // Get a number, you don't have to put the
                         // character back as it hasn't been removed
 else {
     string s;
     cin >> s;
     right_param = func[s]->calc();
 }

Так что в основном это какие-то указатели на функции, но без беспорядочного синтаксиса и в которых вы могли бы хранить данные между вычислениями.

Я подумал о проблеме пробелов; его можно добавить до начала вычислений. Я также думаю, что есть способ установить разные разделители, например числа, но я не знаю, как это сделать.

4
ответ дан 28 November 2019 в 00:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: