Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2015, 21:55   #1
Тамерлан Абилов
Пользователь
 
Регистрация: 03.03.2013
Сообщений: 70
Радость строковый калькулятор с приоритетом

Люди добрые,писал на Яве.прошу уделить несколько минут.Все работает как надо.не учитывая структуру данных(Стек не учитываю в данном коде)..очень ли запутанный код?или явно тут видно что не правильно?что тут лишнее, можно по короче, и т.д.
Спасибо всем за любую критику
Код:
import java.util.*;

public class Calc
{

		// (15+25)+((-15+25)+5)+(-5--5+5*2/-2.5)  +приоритет соблюдается


		public static String calc(String a, String b, String operator){

		
				switch (operator) {

						case "+": return Double.valueOf(a) + Double.valueOf(b)+"";

						case "~": return Double.valueOf(a) - Double.valueOf(b)+"";

						case "*": return Double.valueOf(a) * Double.valueOf(b)+"";

						case "/": return Double.valueOf(a) / Double.valueOf(b)+"";

					}
				
				return null;

			}
			
			
		//чтобы отличать  знак "-" от оператора "-", заменяю оператор на тильду.
		
		public static String minustotild(String s){

				String result = ""+s.charAt(0);
				
				for (int i = 1; i < s.length(); i++){

						if ((s.charAt(i) == '-') && ("+-*(/~".indexOf(s.charAt(i-1)) == -1))   // если предыдущий символ не является оператором то меняем на тильду..

							result += ""+'~';

						else result +=""+s.charAt(i);

					}
	
				return result;

			}

		public static String operate(String expression){


				String num[];	int index = -1;  
				Character priorityOperator='/';  // default
				String operators;
				while (!((  operators = expression.replaceAll("[^*+/~]","")  ).isEmpty()))     // пока имеються операторы
					{	
						
						if ( (index = operators.indexOf('/')) == -1){        // выбираем приоритетный оператор..
							priorityOperator = '*';
							if 	( (index = operators.indexOf('*')) == -1){
									priorityOperator=operators.charAt(0);
									index = operators.indexOf(priorityOperator);
								}
						}
						num = expression.split("[^0-9\\-.]"); // сплитим все числа..
						
						// заменяем строкое представление арифметики,на строковой результат с помощью калк(). 
						expression=expression.replaceFirst(num[index]+"\\"+priorityOperator+num[index+1], calc(num[index],num[index+1],""+priorityOperator)); 

					}

				return expression;

			}


		public static String operateBracket(StringBuilder s, int startIndex){
				// ''
				// 3+4+(4+(3+3)+5)+(4+)
				if (startIndex == -1) {        // если скобок нету то оперируем .
						return (operate(s.toString()));
					}
				else {   
						int k = 1;
						for (int i=startIndex+1; i < s.length(); i++){

							if (s.charAt(i) == '(')  
									k++;
								else if ((s.charAt(i) == ')')) 
									{
										if (k == 1) {    // нашли конец первой скобки. не знаю как лучше сделать)

												String newBracket = s.substring(startIndex+1, i);
	
												s=s.replace(startIndex,i+1,operateBracket(new StringBuilder(newBracket), newBracket.indexOf(""+'(')));
												
											}
										k--;
									}
								
							}
					}

				return operate(s.toString());

			}





		public static void main(String[] args){
				
			Scanner s = new Scanner( System.in );
			String b = s.next();
			
				 do  {
				
					   StringBuilder a = new StringBuilder(minustotild(b));
			  		   System.out.println(" result = "+operateBracket(a,a.indexOf(""+'(')));
					
				  }	  while ( (b = s.next()) != "null");
	

			}

	}
Тамерлан Абилов вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Строковый калькулятор NewLamer&Programer Общие вопросы Delphi 4 08.05.2013 17:27
Строковый калькулятор, используя mathparser, не работает с дробями efkar Помощь студентам 1 12.06.2012 20:03
Очередь с приоритетом revaldo666 Общие вопросы C/C++ 4 26.06.2011 21:13
Строковый калькулятор Blad47 Помощь студентам 9 08.10.2010 00:23
строковый калькулятор *Лена* Фриланс 4 06.05.2008 00:41