
30.10.2009, 13:46
|
|
Познающий
Регистрация: 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..
|
|
|