Показать сообщение отдельно

  #4  
Старый 30.10.2009, 13:46
new-sl
Познающий
Регистрация: 27.05.2009
Сообщений: 44
Провел на форуме:
105684

Репутация: -1
По умолчанию

Цитата:
Сообщение от Forcer  
неправильный подход. считывай всю строку, а потом парси. для разбора математических выражений есть специальный алгоритм.

етот калкулатор описан в книге от bjarne stroustrup она по с++ я просто перевел ето в жаву и столкнулся с множеством проблем

Код:
import java.util.*;


public class calculator {
	


	static final int NAME=0, NUMBER=1, END=2,
	PLUS='+', MINUS='-', MUL='*', DIV='/',
	PRINT=';', ASSIGN='=', LP='(', RP=')', POW='^';


	static int  curr_tok=PRINT;
	static double number_value;
	static String string_value;
	static int no_of_errors=0;
	


	static Scanner cin=new Scanner(System.in);
	

	static double expr(boolean get)
	{
		
		System.out.println("expr");
		double left=term(get);

		for(;;)
			switch (curr_tok)
			{
			
			case PLUS:
				
				left+=term(true);
				
				break;
			case MINUS: 
				left-=term(true);
				break;

			default: return left;
			

			}
	}


	static double term (boolean get)
	{
		System.out.println("term");
		
		double left=prim(get);

		for(;;)
			switch (curr_tok){
				
			case MUL: 
				left *=prim(true);
				break;
			case DIV: 
				 double d=prim(true);
				
					left/=d;
					break;
				
				
				
			default :
				return left;
			}

	}


	static double prim (boolean get)
	{
		System.out.println("prim");
		
		if(get)
			get_token();

		switch (curr_tok){
			case NUMBER :
				{
					double v=number_value;
					System.out.println("number value"+number_value);
					get_token();
					return v;
				}
			

			case MINUS: 
				return -prim(true);

			case LP:
				{
					double e=expr(true);
					if(curr_tok!=RP)
						return error(" ) erwartet");
					get_token();
					return e;
				}

			default:
				return error("primary erwartet");
		}

	}

	

	static  int get_token()
	{
		System.out.println("get_token");
		
		
		String token_string;
		char token_char;
		token_string=cin.next();
	
		
		token_char=token_string.charAt(0);
		
		
		System.out.println("String:"+token_string);
		
		



		switch(token_char){
			case 0:
				return curr_tok=END;
			case ';' :
			case '*' :
			case '/' :
			case '+' :
			case '-' :
			case '(' :
			case ')' :
			case '=' :
			
				System.out.println("Token");
				int ch=(int)token_char;
				return curr_tok=ch;
			case '0': case '1': case '2': case '3': case '4': 
			case '5': case '6': case '7': case '8': case '9': 
			case '.': 
				
				number_value=Double.parseDouble(token_string);
				System.out.println("Number");
				return curr_tok=NUMBER;
				
				
			default: string_value=token_string;
			
			return curr_tok=NAME;

			
		}
		

	}



	static double error(  String  ERROR_STRING)
	{
		System.out.println("error");
		no_of_errors++;
		
		return 1;
	}


public static void main (String []argv)
	{

		
			while(true)
			{
				System.out.println("main");
				get_token();

				if(curr_tok==END)
					break;
				
				
				System.out.println("RESULT"+expr(false));
			}
	}





}


вот в принципи сама прога я её патом убиру чтобы если припод будет искать тут как видеш постояно надо сапрашивать 1 символ ибо ты за 1 вызоф обрабативаеш 1 символ иначи некак а тут при простом счтение надо постоян нажимать пробел и писать следушьи символ мине ето неподходит надо чтоби в 1 строку считивая всю строку и патом парсить думаю непоидет
если можеш приведи пример

Последний раз редактировалось new-sl; 30.10.2009 в 13:50..
 
Ответить с цитированием