Создайте функцию конструктор 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);
Я бы сделал вот так:
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 }
Понимаю, что это троллинг, но самая короткая реализация метода это:
function calculate(str) {
// Проверяем регулярным выраженем str
// Если не соответствует образцу число оп число
// возвращаем NaN
return eval(str);
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Возможно ли сделать confirm где кнопки будут содержать не 'ОК' и 'Отмена', а другие значения, к примеру 'Да' и 'Нет'?
Начал изучать чистый javascriptПредставим проверку формы, где ошибки выводится под каждым тегом input элементом <span class="error"></span>
Я совсем новичок и имею проблемы с синтаксисом и русским языкомПомогите сделать чтобы программа загружала список имен из массив и при нажатии...
Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение