14.10.2016, 16:52
|
Интересующийся
|
|
Регистрация: 03.10.2016
Сообщений: 11
|
|
Вот такая заготовочка, пытаюсь избавится от кнопки =, лучший вариант наверно реакция
на нажатие цифр
<!DOCTYPE HTML>
<html>
<head> </head>
<body>
<font color="RED" size="18"> <B>CALC</B></font> <br/>
<form name="sci-calc">
<table table border="1" >
<tbody>
<tr>
<td align="center" style="background-color: red" ><input type="button" value="1" onclick="addChar(this.form.display, '1') "></td>
<td align="center" ><input type="button" value="2" onclick="addChar(this.form.display, '2' compute();)"></td>
<td align="center" ><input type="button" value="3" onclick="addChar(this.form.display, '3')"></td>
<td align="center" ><input type="button" value="4" onclick="addChar(this.form.display, '4')"></td>
<td align="center" ><input type="button" value="5" onclick="addChar(this.form.display, '5')"></td>
<td align="center" ><input type="button" value="6" onclick="addChar(this.form.display, '6')"></td>
<td align="center"><input type="button" value="7" onclick="addChar(this.form.display, '7')"></td>
<td align="center"><input type="button" value="8" onclick="addChar(this.form.display, '8')"></td>
<td align="center"><input type="button" value="9" onclick="addChar(this.form.display, '9')"></td>
<td align="center"><input type="button" value="0" onclick="addChar(this.form.display, '0')"></td>
<td align="center"><input type="button" value="." onclick="addChar(this.form.display, '.') "></td>
</tr>
<tr>
<td colspan="6" align="center"><input name="display" value="0" size="55" maxlength="55"></td>
<td align="center"><input type="button" value="X" onclick="this.form.display.value = 0 "></td>
<td align="center" ><input type="button" value="<" onclick="deleteChar(this.form.display)"></td>
<td align="center"><input type="button" value="=" name="enter" onclick="if (checkNum(this.form.display.value)) { compute(this.form) }"></td>
<td colspan="3" align="center"><input name="result" size="20" maxlength="20"></td>
<td align="center"><input type="button" value="X" onclick="this.form.result.value = 0 "></td>
<td align="center" ><input type="button" value="<" onclick="deleteChar(this.form.result)"></td>
<td align="center"><input type="button" value="№" onclick="if (checkNum(this.form.display.value)) { sqrt(this.form) }"></td>
<td align="center"><input type="button" value="^2" onclick="if (checkNum(this.form.display.value)) { square(this.form) }"></td>
<td align="center"><input type="button" value="exp" onclick="if (checkNum(this.form.display.value)) { exp(this.form) }"></td>
</tr>
<tr>
<td align="center"><input type="button" value="*" onclick="addChar(this.form.display, '*')"></td>
<td align="center"><input type="button" value="-" onclick="addChar(this.form.display, '-')"></td>
<td align="center"><input type="button" value="/" onclick="addChar(this.form.display, '/')"></td>
<td align="center"><input type="button" value="+/-" onclick="changeSign(this.form.display)"></td>
<td align="center"><input type="button" value="+" onclick="addChar(this.form.display, '+')"></td>
<td align="center"><input type="button" value="(" onclick="addChar(this.form.display, '(')"></td>
<td align="center"><input type="button" value=")" onclick="addChar(this.form.display, ')')"></td>
<td align="center"><input type="button" value="ln" onclick="if (checkNum(this.form.display.value)) { ln(this.form) }"></td>
<td align="center"><input type="button" value="cos" onclick="if (checkNum(this.form.display.value)) { cos(this.form) }"></td>
<td align="center"><input type="button" value="sin" onclick="if (checkNum(this.form.display.value)) { sin(this.form) }"></td>
<td align="center"><input type="button" value="tan" onclick="if (checkNum(this.form.display.value)) { tan(this.form) }"></td>
</tr>
</tbody></table>
</form>
<script>
element.addEventListener('click',compute(form));
function addChar(input, character) {
if(input.value == null || input.value == "0")
input.value = character;
else
input.value += character;
return form.display.value
}
form.display.addEventListener('input', compute);
function cos(form) {
form.result.value = Math.cos(form.display.value);
}
function sin(form) {
form.result.value = Math.sin(form.display.value);
}
function tan(form) {
form.result.value = Math.tan(form.display.value);
}
function sqrt(form) {
form.result.value = Math.sqrt(form.display.value);
}
function ln(form) {
form.result.value = Math.log(form.display.value);
}
function exp(form) {
form.result.value = Math.exp(form.display.value);
}
function deleteChar(input) {
input.value = input.value.substring(0, input.value.length - 1)
}
function changeSign(input) {
if(input.value.substring(0, 1) == "-")
input.value = input.value.substring(1, input.value.length)
else
input.value = "-" + input.value
}
function compute(form) {
form.result.value = eval(form.display.value)
}
function square(form) {
form.result.value = eval(form.display.value) * eval(form.display.value)
}
function checkNum(str) {
for (var i = 0; i < str.length; i++) {
var ch = str.substring(i, i+1)
if (ch < "0" || ch > "9") {
if (ch != "/" && ch != "*" && ch != "+" && ch != "-" && ch != "."
&& ch != "(" && ch!= ")") {
alert("invalid entry!")
return false
}
}
}
return true
}
</script>
</body>
</html>
|
|
14.10.2016, 21:41
|
Профессор
|
|
Регистрация: 08.07.2016
Сообщений: 1,332
|
|
В общем очистка кодов от разложения обнажила кошмарную модель куркулятора. Обычно применяются 2 подхода - я не уверен в терминологии, своими словами - операционной и токенизатор. Первый - кнопки давишь, потом = и результат. Второй - производит вычисления из введенной строки раскладывая ее на токены. В рамках js можно записать вместо математических символов сразу названия методов и натравить на строку eval() - так и сделано, но, пилять - в кошмарном соединении с операционной моделью и к тому же с функциями текстового редактора. В итоге быстро формализовать эту бнопню не удалось. Похоже будет проще найти куда нафтыкать чего там надо в оригинале.
На чем остановился на данный момент процитировано ниже.
|
|
14.10.2016, 21:41
|
Профессор
|
|
Регистрация: 08.07.2016
Сообщений: 1,332
|
|
<!DOCTYPE html>
<html lang="ru" dir="ltr">
<head>
<meta charset="utf-8">
<style>
.mega-calc{
border-collapse:collapse;
}
.mega-calc tr {
border:1px solid #eee;
}
.mega-calc td {
text-align:center;
padding:3px;
}
</style>
</head>
<body>
<font color="RED" size="18"><B>CALC</B></font> <br/>
<form name="sci-calc" id="form-mega-calc">
<table class="mega-calc"><tbody>
<tr>
<td><input type="button" value="1"></td>
<td><input type="button" value="2"></td>
<td><input type="button" value="3"></td>
<td><input type="button" value="4"></td>
<td><input type="button" value="5"></td>
<td><input type="button" value="6"></td>
<td><input type="button" value="7"></td>
<td><input type="button" value="8"></td>
<td><input type="button" value="9"></td>
<td><input type="button" value="0"></td>
<td><input type="button" value="."></td>
</tr>
<tr>
<td colspan="6"><input name="display" value="0" size="55" maxlength="55"></td>
<td><input type="button" d="display" value="X"></td> <!-- reset display -->
<td><input type="button" d="display" value="<"></td> <!-- deleteChar -->
<td><input name="enter" type="button" value="="></td> <!-- ENTER -->
<td colspan="3"><input name="result" size="20" maxlength="20"></td>
<td><input type="button" d="result" value="X"></td> <!-- reset -->
<td><input type="button" d="result" value="<"></td> <!-- delete char-->
<td><input type="button" d="result" value="№"></td> <!-- sqrt -->
<td><input type="button" d="result" value="^2"></td> <!-- square -->
<td><input type="button" d="result" value="exp"></td> <!-- exp -->
</tr>
<tr>
<td><input type="button" value="*"></td> <!-- addChar -->
<td><input type="button" value="-"></td> <!-- addChar -->
<td><input type="button" value="/"></td> <!-- addChar -->
<td><input type="button" value="+/-"></td> <!-- changeSign -->
<td><input type="button" value="+"></td> <!-- addChar -->
<td><input type="button" value="("></td> <!-- addChar -->
<td><input type="button" value=")"></td> <!-- addChar -->
<td><input type="button" value="ln"></td>
<td><input type="button" value="cos"></td>
<td><input type="button" value="sin"></td>
<td><input type="button" value="tan"></td>
</tr>
</tbody></table>
</form>
<script>
var MegaCalc= new function(){
var
D=document,
form=D.getElementById('form-mega-calc'),
fres=form.result,
fdisp=form.display,
M=function(n){
if(['cos','sin','tan','sqrt','ln','exp'].indexOf(n)>-1)
return fres.value = Math[n](fdisp.value);
else if(n=='sqrt')
return fres.value = eval(fdisp.value)*eval(fdisp.value);
},
delChar=function(el){
el.value=el.value.substring(0,el.value.length-1);
},
chSign=function(el) {
if(el.value.substring(0, 1) == "-")
el.value = el.value.substring(1, el.value.length);
else
el.value = "-" + el.value;
},
checkNum=function(str) {
for (var ch, i=0; i<str.length; i++) {
ch=str.substring(i,i+1);
if ((ch < 0 || ch > 9) && '/*+-.()'.indexOf(ch)==-1)
return false
}
return true;
},
compute=function() {
fres.value=eval(fdisp.value);
},
route=function(e){
var el=e.target,v,d;
if(el.type && el.type=='button'){
v=el.value;
d=el.getAttribute('d');
/* todo */
if(!M(v))
fdisp.value+=v;
}
};
form.addEventListener('click',route);
};
</script>
</body>
</html>
|
|
15.10.2016, 10:31
|
Интересующийся
|
|
Регистрация: 03.10.2016
Сообщений: 11
|
|
Сасибо что возитесь с моей проблемой))
А почему нельзя задать выполнение
function compute(form) {
form.result.value = eval(form.display.value)}
при каждом нажатий цифровых кнопок?
нажал 1, в поле появился 1 и выполнилась функция compute(form)
В input name="result" 1
нажал + появился +
input name="result" 1
нажал 2 появилось 2 и выполнилась функция compute(form)
input name="result" 3
|
|
15.10.2016, 12:39
|
Профессор
|
|
Регистрация: 08.07.2016
Сообщений: 1,332
|
|
Конечно можно, профессор до меня так и написал, просто он запутал нечаянно тебя листенером, листенер не нужен, впиши compute(this.form) во все онклики после того, что там уже написано через точку-запятая ;
Ты для себя пишешь, да? Это нереальный колхоз если задумывается для людей. Ну вот, если пишешь для себя, то спешить некуда и спокойно разберись. Я ниасилил индустриальное решение этого колхоза, умываю руки.
|
|
15.10.2016, 17:28
|
Интересующийся
|
|
Регистрация: 03.10.2016
Сообщений: 11
|
|
Не получается, впиши compute(this.form) во все онклики после ;
ТАК НЕ ПОЛУЧАЕТСЯ
<td align="center" ><input type="button" value="2" onclick="addChar(this.form.display, '2')""compute(this.form)"></td>
ТАК НЕ ПОЛУЧАЕТСЯ
<td align="center" ><input type="button" value="2" onclick="addChar(this.form.display, '2') ;compute(this.form)"></td>
ТАК НЕ ПОЛУЧАЕТСЯ
<td align="center" ><input type="button" value="2" onclick="addChar(this.form.display, '2') ;compute(this.form);"></td>
КАКОЙ ЖЕ ПРАВИЛЬНЫЙ ВАРИАНТ?
|
|
16.10.2016, 14:28
|
Профессор
|
|
Регистрация: 08.07.2016
Сообщений: 1,332
|
|
Сообщение от svinin_1989
|
onclick="addChar(this.form.display, '2') ;compute(this.form);"
|
По идее должно работать. Открой консоль и посмотри может там ошибки какие-то. Оставь один компуте
onclick="compute(this.form);"
посмотри работает или нет.
И еще, ты вручную передаешь значение, которое уже записано в валуе
addChar(this.form.display, '2') == addChar(this.form.display, this.value)
|
|
16.10.2016, 16:28
|
Интересующийся
|
|
Регистрация: 03.10.2016
Сообщений: 11
|
|
обратно не работает
onclick="addChar(this.form.display, '2') ;compute(this.form);"
добавляет двойку просто, в поле result не выводит результат
результат выводит только равно
<td align="center"><input type="button" value="=" name="enter" onclick="if (checkNum(this.form.display.value)) { compute(this.form) }"></td>
там присутствует compute(this.form)
плевая по идее ведь задача, никто решить не может))
|
|
17.10.2016, 08:05
|
Профессор
|
|
Регистрация: 08.07.2016
Сообщений: 1,332
|
|
Никто не может, кроме тебя. Придумать такую запутанную хрень тямы хватило, значит хватит и на распутывание. Иначе это несправедливо: запутал ты - а требуешь с других. Кстати, в истории был такой случай, про царя Гордия почитай. )
Последний раз редактировалось warren buffet, 17.10.2016 в 08:07.
|
|
|
|