 
			
				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.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |