Top.Mail.Ru
Ответы

Встроить математические функции в калькулятор Java Script

Делаю тестовое задание, нужно написать калькулятор на римских и арабских (вычитание, сложение, деление, умножение)
Сможет кто-то дать наводку что писать и где искать или сам напишет если кому не сложно?

function calculator(string) {
const useStrict = {
z: 2000,
m: 2000,
cm: 900,
d: 500,
cd: 400,
c: 100,
xc: 90,
l: 50,
xl: 40,
x: 10,
ix: 9,
v: 5,
IV: 4,
i: 1
};

function rom2arab(string) {
return string.toUpperCase().split('').reduce(function (s, v, i, arr) {
const [a, b] = [
useStrict[arr[i]],
useStrict[arr[i + 1]],
useStrict[arr[i + 2]],
];
return b > a ? s - a : s + a;
}, 0);
}

function arab2rome(num) {
if (num < 1) return ' ';
let result = ' ';
for (var key in useStrict)
while (num >= useStrict[key]) {
result += key;
num -= useStrict[key];
}
return result;
}

let letter = [];
string = string.replace(/[^IVXLCDMZ\d+\-*\/]/gi, ch => {
if (ch !== ' ') letter.push(ch);
return ' ';
});

if (letter.length > 0)
throw Error('Символы не допустимы, Вы ввели это: ' + letter);
let vars = string.split(/[+\-*\/]/g);
if (vars.length !== 2)
throw Error('Должно быть 2 операнда');
const isRome = /^[IVXLCDMZ]+$/i;

const r = vars.reduce((s, v) => s + isRome.test(v), 0);
if (r === 1)
throw Error('Оба числа должны быть записаны арабскими или римскими цифрами');
else if (r === 2)
vars = vars.map (v => rom2arab(v));
if (vars.some(v => v < 1 || v > 10))
throw Error('Допустимое значение оператора от 1 до 10 включительно');
let acr = string.match(/[+\-*\/]/)[0];
let result = Math.floor((vars.join(acr)));
return r === 0 ? result.toString() : arab2rome(result);
}
//пишем код здесь
module.exports = calculator; // Не трогайте эту строчку

По дате
По рейтингу
Аватар пользователя
Новичок

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

Вот как вы можете определить эти функции:

123456789101112131415161718
 function add(a, b) { 
  return a + b; 
} 
 
function subtract(a, b) { 
  return a - b; 
} 
 
function multiply(a, b) { 
  return a * b; 
} 
 
function divide(a, b) { 
  if (b === 0) { 
    throw Error('Division by zero is not allowed'); 
  } 
  return a / b; 
} 

Затем вам нужно изменить вашу функцию calculator, чтобы вызывать эти операции в зависимости от оператора, обнаруженного во входной строке. Вы можете сделать это, создав внутри вашей функции calculator оператор switch:

1234567891011121314151617
 let result; 
switch (acr) { 
  case '+': 
    result = add(vars[0], vars[1]); 
    break; 
  case '-': 
    result = subtract(vars[0], vars[1]); 
    break; 
  case '*': 
    result = multiply(vars[0], vars[1]); 
    break; 
  case '/': 
    result = divide(vars[0], vars[1]); 
    break; 
  default: 
    throw Error('Invalid operator'); 
} 

Этот оператор switch вызовет соответствующую функцию в зависимости от оператора и сохранит результат в переменной result. В случае default будет выдана ошибка, если обнаружен недопустимый оператор.

Наконец, вам нужно вернуть результат в нужном формате (арабском или римском) в зависимости от ввода:

1
 return r === 0 ? result.toString() : arab2rome(result); 

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

Аватар пользователя
Высший разум

У тебя перебор с функциями, так что мне искать место ошибки лень
А ошибка явно в типе данных, т.к. выдаёт NaN