Правильное ли решение этой задании таким образом?

191
27 ноября 2021, 20:00

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

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

function Calculator(add, sub) { 
  this.add = add; 
  this.sub = sub; 
  this.addition = function() { 
    let arrAdd = add.split(" + "); 
    console.log(arrAdd) 
    let array = []; 
    for (let i = 0; i < arrAdd.length; i++) { 
      array.push(parseInt(arrAdd[i])); 
    } 
    console.log(array) 
    let plus = array[0] + array[1]; 
    console.log(plus); 
  }; 
 
  this.subtraction = function() { 
    let arrSub = sub.split(" - "); 
    console.log(arrSub); 
    let array = []; 
    for (let i = 0; i < arrSub.length; i++) { 
      array.push(parseInt(arrSub[i])); 
    } 
    console.log(array) 
 
    let minus = array[0] - array[1]; 
    console.log(minus); 
 
  } 
 
} 
 
let calculator = new Calculator("1 + 2", "12 - 4"); 
calculator.addition(); 
calculator.subtraction();

P.S. Думаю каждый раз придется добавить метод и для других операций. Наверное можно было создать один метод, и код меньше было бы тогда и скорость выполнения уменьшилось бы.

Более соответствующее решение задании

function Calculator(str){ 
  this.str=str; 
  this.calculate=function(){ 
    let array=str.split(" "); 
    console.log(array); 
    let a=+(array[0]); 
    let b=+(array[2]); 
    if(array[1]=="+"){ 
      let plus=a+b; 
      console.log(plus); 
    } 
 
    else if(array[1]=="-"){ 
      let minus=a-b; 
      console.log(minus); 
    } 
  } 
} 
let calc=new Calculator("4 + 7"); 
calc.calculate(); 
let calc1=new Calculator("120 - 10"); 
calc1.calculate();

Version 3

function Calculator(str){ 
   
  this.str=str, 
  this.calculate=function(str){ 
    let array=str.split(" "); 
    let a=+(array[0]); 
    let b=+(array[2]); 
 
    if(array[1]==="+"){ 
      let plus=a+b; 
      console.log("10 + 9=" + plus);  
    } 
 
    else if(array[1]==="-"){ 
      let minus=a-b; 
      console.log("1111 - 1=" + minus); 
    } 
 
    else if(array[1]==="*"){ 
      let multi=a*b; 
      console.log("5 * 5=" + multi); 
    } 
    else if(array[1]==="/"){ 
      let del=a/b; 
      console.log("164 / 4=" + del); 
    } 
 
    else if(array[1]==="%"){ 
      let modulo=a%b; 
      console.log("19 % 5=" + modulo); 
    } 
     
  } 
} 
 
let calc= new Calculator(); 
calc.calculate("10 + 9"); 
calc.calculate("1111 - 1"); 
calc.calculate("5 * 5"); 
calc.calculate("164 / 4"); 
calc.calculate("19 % 5");

Version 4

function Calculator(str){ 
  this.str=str, 
  this.calculate=function(str){ 
    let array=str.split(" "); 
    let a=+(array[0]); 
    let b=+(array[2]); 
 
    if(array[1]==="+"){ 
      let plus=a+b; 
      return plus; 
    } 
  } 
   
} 
 
let calc= new Calculator(); 
let result=calc.calculate("10 + 9"); 
console.log(result);

Answer 1
Не работает с отрицательными числами

Я бы сделал вот так:

function Calculator(funcs) { 
  this.funcs = funcs 
} 
 
Calculator.prototype.calculate = function (str) { 
  var parts = str.match(/\d+\.?\d*|\.\d+|((?!\s)\D)+/g) 
  return parts && this.funcs[parts[1]] && this.funcs[parts[1]](+parts[0], +parts[2]) 
} 
 
var c1 = new Calculator({ 
  '+': (x, y) => x + y, 
  '-': (x, y) => x - y, 
}) 
 
var c2 = new Calculator({ 
  '+': (x, y) => x + y, 
  '-': (x, y) => x - y, 
  '*': (x, y) => x * y, 
}) 
 
for (var c of [c1, c2]) { 
  console.log(c.calculate("12-2")) 
  console.log(c.calculate("12 + 4")) 
  console.log(c.calculate("12 * 3")) 
  console.log(c.calculate("4.8 + .5")) 
}
.as-console-wrapper.as-console-wrapper { max-height: 100vh }

Работает с отрицательными числами

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

function Calculator(funcs) { 
  this.funcs = funcs 
} 
 
Calculator.prototype.calculate = function (str) { 
  var parts = str.split(/\s+/) 
  return parts && this.funcs[parts[1]] && this.funcs[parts[1]](+parts[0], +parts[2]) 
} 
 
var c1 = new Calculator({ 
  '+': (x, y) => x + y, 
  '-': (x, y) => x - y, 
}) 
 
var c2 = new Calculator({ 
  '+': (x, y) => x + y, 
  '-': (x, y) => x - y, 
  '*': (x, y) => x * y, 
}) 
 
function check(s) { 
  console.log([s, c1.calculate(s), c2.calculate(s)].map(x => (""+x).padStart(16)).join(" ")) 
} 
 
check("12 - 2") 
check("12 + 4") 
check("12 + -4") 
check("-12 + -4") 
check("-12 + 4") 
check("12 * 3") 
check("4.8 + .5")
.as-console-wrapper.as-console-wrapper { max-height: 100vh }

Если хочется без пробелов, то можно так:

function Calculator(funcs) { 
  this.funcs = funcs 
} 
 
Calculator.prototype.calculate = function (str) { 
  var [l, o, r] = str.match(/-?\d+\.?\d*|-?\.\d+|((?!\s|-\d)\D)+/g) || [] 
  if (!r&& o[0] === '-') r = o.slice(1), o = o[0] 
  return this.funcs[o] && this.funcs[o](+l, +r) 
} 
 
var c1 = new Calculator({ 
  '+': (x, y) => x + y, 
  '-': (x, y) => x - y, 
}) 
 
var c2 = new Calculator({ 
  '+': (x, y) => x + y, 
  '-': (x, y) => x - y, 
  '*': (x, y) => x * y, 
}) 
 
function check(s) { 
  console.log([s, c1.calculate(s), c2.calculate(s)].map(x => (""+x).padStart(16)).join(" ")) 
} 
 
check("12 - 2") 
check("12 + 4") 
check("12 + -4") 
check("-12 + -4") 
check("-12 + 4") 
check("12 * 3") 
check("12-2") 
check("12+4") 
check("12+-4") 
check("-12+-4") 
check("-12+4") 
check("12--4") 
check("-12--4") 
check("-12-4") 
check("4.8 + .5")
.as-console-wrapper.as-console-wrapper { max-height: 100vh }

Answer 2

Понимаю, что это троллинг, но самая короткая реализация метода это:

function calculate(str) {
  //  Проверяем регулярным выраженем str
// Если не соответствует образцу число оп число 
// возвращаем NaN
  return eval(str);
}
READ ALSO
Confirm с альтернативными ответами в JavaScript

Confirm с альтернативными ответами в JavaScript

Возможно ли сделать confirm где кнопки будут содержать не 'ОК' и 'Отмена', а другие значения, к примеру 'Да' и 'Нет'?

83
Удалить все элементы содержание класс

Удалить все элементы содержание класс

Начал изучать чистый javascriptПредставим проверку формы, где ошибки выводится под каждым тегом input элементом <span class="error"></span>

104
Удаление элемента массива и выдача случайного элемента в строку

Удаление элемента массива и выдача случайного элемента в строку

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

209
Как избавиться от ошибки Uncaught TypeError [закрыт]

Как избавиться от ошибки Uncaught TypeError [закрыт]

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение

177