evgeniy8705
@evgeniy8705
Повелитель вселенной

Как понять решение задачи на JS?

Надоел уже наверно тупыми вопросами по решению задач на JS, но все же разобраться и понять хочется.

Задача:

Напишите конструктор Calculator, который создаёт расширяемые объекты-калькуляторы.

Первый шаг задачи: вызов calculate(str) принимает строку, например «1 + 2», с жёстко заданным форматом «ЧИСЛО операция ЧИСЛО» (по одному пробелу вокруг операции), и возвращает результат. Понимает плюс + и минус -.
Пример использования:

var calc = new Calculator;

alert(calc.calculate("3 + 7")); // 10
Второй шаг — добавить метод addMethod(name, func), который учит калькулятор новой операции. Он получает имя операции name и функцию от двух аргументов func(a,b), которая должна её реализовывать.

Решение:

function isNumeric(n) {
		return !isNaN(parseFloat(n)) && isFinite(n);
	}

	function Calculator() {

		var methods = {
			"-": function(a, b) {
				return a - b;
			},
			"+": function(a, b) {
				return a + b;
			}
		};

		this.calculate = function(str) {

			var split = str.split(' '),
				a = split[0],
				op = split[1],
				b = split[2]

			if(!methods[op] || !isNumeric(a) || !isNumeric(b)) {
				return NaN;
			}

			return methods[op](+a, +b);
		}

		this.addMethod = function(name, func) {
			methods[name] = func;
		};
	}
	var calc = new Calculator;

	calc.addMethod("*", function(a, b) {
		return a * b;
	});
	calc.addMethod("/", function(a, b) {
		return a / b;
	});
	calc.addMethod("**", function(a, b) {
		return Math.pow(a, b);
	});

	var result = calc.calculate("2 ** 3");
	alert(result); // 8


Напишите кто может Коментарии к "каждой" строчке кода. А то сижу уже 100500 минут и понять как "программа" работает не могу...вообще почти не понимаю, как бы сказать, алгоритма.
  • Вопрос задан
  • 4774 просмотра
Решения вопроса 1
// просто функция проверяющая, является ли данное ей значение числом
function isNumeric(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

// конструктор объектов типа Калькулятор, считай определение класса
function Calculator() {

  // массив методов калькулятора, каждый из которых есть функция от двух чисел
  // виден только внутри объекта
  var methods = {
    "-": function(a, b) {
      return a - b;
    },
    "+": function(a, b) {
      return a + b;
    }
  };

  // публичный метод калькулятора, собственно его предназначение
  // принимает строку с выражением которое надо вычислить
  this.calculate = function(str) {

    // парсит строку с выражением
    // разбивая ее на 3 части по пробелам
    var split = str.split(' '),
      // создаются три переменные, два числа и операнд
      a = split[0],
      op = split[1],
      b = split[2]

    // валидация переменных
    if(!methods[op] || !isNumeric(a) || !isNumeric(b)) {
      return NaN;
    }

    // достается элемент массива methods под названием op
    // он является функцией
    // ей передаются оба числа и она с ними что-то делает
    // собственно результат ее выполнения возвращается из функции calculate
    return methods[op](+a, +b);
  }

// еще один публичный метод калькулятора
// принимает название функции и саму функцию
// нужен, чтобы в массив methods можно было добавлять новые операции
this.addMethod = function(name, func) {
methods[name] = func;
};
}

// создается новый объект класса Калькулятор
var calc = new Calculator;

// добавляется возможность умножать два числа, будет называться "*", объект функции прилагается
calc.addMethod("*", function(a, b) {
return a * b;
});

// аналогично, возможность делить одно число на другое
calc.addMethod("/", function(a, b) {
return a / b;
});

// аналогично, возведение в степень
calc.addMethod("**", function(a, b) {
return Math.pow(a, b);
});

// смотри описание this.calculate = function(str) {
var result = calc.calculate("2 ** 3");
alert(result); // 8
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы