罗马数字计算器开发问题:实现罗马数字算术运算
罗马数字计算器实现方案
问题核心点
- 你用
objRome.userInput1返回undefined,是因为点语法只能访问对象的固定字面量键名,当键名是变量(比如用户输入的userInput1)时,必须使用方括号语法objRome[userInput1]来访问。 - 现有代码缺少阿拉伯数字转回罗马数字的逻辑,也没有对输入的罗马数字有效性做验证。
完整实现代码
// 罗马数字转阿拉伯数字的映射(键名要和用户输入的罗马数字完全匹配) const romeToArab = { I: 1, II: 2, III: 3, IV: 4, V: 5, }; // 阿拉伯数字转罗马数字的映射数组(按数值从大到小排列,方便转换) const arabToRome = [ ["V", 5], ["IV", 4], ["III", 3], ["II", 2], ["I", 1], ]; // 阿拉伯数字转罗马数字的函数 function convertArabToRome(num) { let result = ""; for (const [romeChar, value] of arabToRome) { while (num >= value) { result += romeChar; num -= value; } } return result; } // 获取用户输入 let userInput1 = prompt("请输入第一个数字(阿拉伯或罗马数字):"); let userInput2 = prompt("请输入第二个数字(阿拉伯或罗马数字):"); let mathCalc = prompt("请输入运算符(+、-、*、/):"); // 处理计算逻辑 if (!isNaN(userInput1) && !isNaN(userInput2)) { // 阿拉伯数字计算逻辑 let num1 = Number(userInput1); let num2 = Number(userInput2); let result; switch (mathCalc) { case "+": result = num1 + num2; break; case "-": result = num1 - num2; break; case "*": result = num1 * num2; break; case "/": result = num1 / num2; break; default: alert("请输入有效的运算符!"); result = null; } if (result !== null) { console.log(`${num1} ${mathCalc} ${num2} = ${result}`); } } else if (romeToArab[userInput1] && romeToArab[userInput2]) { // 罗马数字计算逻辑 let num1 = romeToArab[userInput1]; let num2 = romeToArab[userInput2]; let arabResult; switch (mathCalc) { case "+": arabResult = num1 + num2; break; case "-": arabResult = num1 - num2; break; case "*": arabResult = num1 * num2; break; case "/": arabResult = Math.floor(num1 / num2); // 罗马数字一般为整数,此处取整处理 break; default: alert("请输入有效的运算符!"); arabResult = null; } if (arabResult !== null && arabResult > 0) { // 罗马数字无0和负数,做合法性判断 let romeResult = convertArabToRome(arabResult); console.log(`${userInput1} ${mathCalc} ${userInput2} = ${romeResult}`); } else { alert("计算结果无法转换为有效的罗马数字!"); } } else { alert("请输入两个有效的阿拉伯数字或罗马数字!"); }
关键逻辑说明
- 罗马数字转阿拉伯数字:使用
romeToArab[userInput1]访问映射对象,同时通过该表达式是否存在值,来验证输入的罗马数字是否合法。 - 阿拉伯数字转罗马数字:定义按数值从大到小排列的映射数组,循环遍历数组,每次将当前最大的罗马字符拼接进结果,直到数值减为0,这种方式能正确处理IV(4)这类特殊组合。
- 输入区分与验证:通过
isNaN判断是否为阿拉伯数字,通过映射对象判断是否为合法罗马数字,同时对运算符和计算结果的有效性做了校验。
内容的提问来源于stack exchange,提问作者mr_facer_man
相关产品推荐
相关产品推荐

