자바 문자열 계산기 - jaba munjayeol gyesangi

티스토리 뷰

자바 문자열 계산기 - jaba munjayeol gyesangi
import java.util.Scanner;

public class Calc {
    // 재귀
    public static int calc(String input) {
        int pos;
        // indexof(); - 문자가 없으면 -1반환
        pos = input.indexOf('+'); // +의 위치를 알려줘!
        System.out.println(input);
        if (pos != -1) { // 문자가 있으니까 -1이 아니여야 함
            return calc(input.substring(0, pos)) + calc(input.substring(pos + 1));
        } else {
            pos = input.indexOf('-');
            if (pos != -1) {
                return calc(input.substring(0, pos)) - calc(input.substring(pos + 1));
            } else {
                pos = input.indexOf('*');
                if (pos != -1) {
                    return calc(input.substring(0, pos)) * calc(input.substring(pos + 1));
                } else {
                    pos = input.indexOf('/');
                    if (pos != -1) {
                        return calc(input.substring(0, pos)) / calc(input.substring(pos + 1));
                    }
                }
            }
        }

        String r = input.trim(); // 공백 제거
        if (r == null || r.isEmpty()) // 예외처리
            return 0;

        return Integer.parseInt(r); // r을 int로 변환하여 return
    }

    public static void main(String[] argv) {
        Scanner sc = new Scanner(System.in);
        System.out.print("식 입력 : ");
        String input = sc.next();
        int output = calc(input);

        System.out.println(output);
    }
}

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

[Java/자바] - 문자열 수식 계산 라이브러리 - 자바스크립트 엔진

자바 문자열 계산기 - jaba munjayeol gyesangi
주현2020. 4. 25. 22:55

안녕하세요 ~ 보통 계산기에서 두 개의 정수를 입력받고, 더하거나 빼기 곱하기 마이너스 등과 같은 계산을 하게되는데, 정수를 입력받는게 아닌 수식 자체를 입력받고 계산을 해야할때!

직접적으로 구현하는 방법도 있지만, 자바스크립트 엔진을 사용하면 간결하게 해결할 수 있습니다 !

예전 파이썬을 배울때도 수식을 계산해주는 라이브러리가 있었는데, 찾아보니 eval 함수로 동일합니다.

이번에는 자바로 알아볼게요~

수식이 문자열로 "3 +4" , "(1+2)*3" 과 같이 주어졌을때, 계산하는 방법

package Silver; import java.util.Scanner; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class Test3 { public static void main(String[] args) throws ScriptException { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript"); Scanner scan = new Scanner(System.in); while(true) { System.out.print("수식을 입력하세요: "); String s = scan.nextLine(); if(s == "exit") break; Object result = engine.eval(s); System.out.println(result); } scan.close(); } }

자바 문자열 계산기 - jaba munjayeol gyesangi

공백이나 괄호, 연산자에 상관없이 수식을 정확히 입력해주네요, 획기적입니다 !!

** 자바 1.6 이상에서 사용 가능합니다.

투케이2K

Java

194. (java/자바) string 문자열 형식 사칙 연산식을 사용해 연산자 우선순위로 사칙연산 계산 실시

투케이2K 2021. 4. 7. 12:15

/* =========================== */

[ 개발 환경 설정 ]

개발 툴 : Eclipse

개발 언어 : Java

자바 문자열 계산기 - jaba munjayeol gyesangi

/* =========================== */

/* =========================== */

[소스 코드]

package ex5;

import java.util.Scanner;

public class MainActivity {
	
	public static void main(String[] args) { 
		System.out.println("[string 문자열 형식 사칙 연산식을 사용해 연산자 우선순위로 사칙연산 계산 실시]");
		
		/*[설 명]
		 * 1. Scanner : 사용자로부터 문자열을 입력받음
		 * 2. input.indexOf(문자) : 찾을려는 문자가 없으면 -1 값을 반환합니다
		 * 3. 사칙 연산자 우선 순위 : * , / , + , -
		 * 4. 로직 : 사용자가 입력한 문자열 파악 > 올바른 사칙 연산 식이면 > 사칙연산 계산 수행	
		 * 5. 5+2*10/5-5 계산 설명 : [2]*[10] = 20 > 20/[5] = 4 > [5]+4 = 9 > 9-[5] = 4 	 
		 * */
		
		//TODO Scanner 객체 선언해 사용자로부터 문자열을 입력 받습니다
		Scanner scan = new Scanner(System.in);
		
		System.out.print("사칙 연산 식  입력 : ");		
		String input = scan.next();
		System.out.println("");	
		
		//TODO 입력된 문자열이 한글, 영문 포함여부 확인 및 정수, 사칙연산부호 포함여부 확인 수행
		boolean ke_check = false;
		boolean ns_check = false;
		for(int i=0; i<input.length(); i++) {
			String word = getWordType(String.valueOf(input.charAt(i)));
			//System.out.println(input.charAt(i)+" : "+word);
			if(word.contains("english") || word.contains("korean")) {		
				ke_check = true;
			}
			if(word.contains("number") || word.contains("special")) {
				ns_check = true;
			}
		}
		
		//TODO 사칙연산 수행 실시
		if(ke_check != true && ns_check == true) { //입력된 문자열이 한글, 영문이 아닌 경우 
			System.out.println("[Success] 사칙연산 수행을 시작합니다 ");
			System.out.println("사칙 연산 식 : "+input);
			int output = calc(input); //calc 메소드 호출 실시
			System.out.println("사칙 연산 결과 : "+output);
		}
		else {
			System.out.println("[Fail] 한글 및 영문, 사칙연산 외 특수 문자열이 포함되어있습니다 ... ");		
		}		
		
	}//메인 종료
	
	//TODO 문자열을 판별하는 메소드
	public static String getWordType(String word){				
		//문자열 판별을 위한 변수 선언 실시
		String data = "";
		boolean number = false;
		boolean english = false;
		boolean korean = false;
		boolean special = false;

		//for 반목문을 수행해 문자열을 한글자씩 분리해 decimal로 변환 후 문자열 판별 실시		
		for(int i=0; i<word.length(); i++){
			int value = word.charAt(i);
			if(value >= 48 && value <= 57){ //숫자
				number = true;
			}
			else if(value >= 65 && value <= 90 //대문자 
					|| value >= 97 && value <= 122){ //소문자
				english = true;
			}
			else if(value == 42 || value == 43 || 
					value == 45 || value == 47) { //사칙연산 특수문자
				special = true;
			}
			else{ //한글
				korean = true;
			}
		}
	      
		if(number){
			data = "number";		        
		}
		if(english){
			data = "english";			
		}
		if(korean){
			data = "korean";			
		}
		if(special) {
			data = "special";
		}
		return data;
	}
	
	//TODO 사칙 연산을 수행하는 재귀 메소드
	public static int calc(String input) { 
		int idx; 		
		idx = input.indexOf('+'); //TODO [+] 문자의 인덱스 위치 확인
				
		if (idx != -1) { //TODO [+] 문자가 있으니까 -1이 아니여야 함 (indexOf는 찾을려는 문자가 없으면 -1 반환)			
			return calc(input.substring(0, idx)) + calc(input.substring(idx + 1)); 
		} 
		else { //TODO [+] 문자가 없을 경우는 [-], [*], [/] 연산자 포함 여부를 확인합니다
			idx = input.indexOf('-'); 
			if (idx != -1) { 
				return calc(input.substring(0, idx)) - calc(input.substring(idx + 1)); 
			} 
			else {
				idx = input.indexOf('*'); 
				if (idx != -1) {
					return calc(input.substring(0, idx)) * calc(input.substring(idx + 1)); 
				} 
				else { 
					idx = input.indexOf('/'); 
					if (idx != -1) { 
						return calc(input.substring(0, idx)) / calc(input.substring(idx + 1));
					} 
				} 
			} 
		}
			
		String data = input.trim();
		if (data == null || data.isEmpty()) {
			return 0;
		}  
			 			
		return Integer.parseInt(data); 
	} 
	
}//클래스 종료

/* =========================== */

[결과 출력]

자바 문자열 계산기 - jaba munjayeol gyesangi

/* =========================== */

/* =========================== */

[요약 설명]

* 1. Scanner : 사용자로부터 문자열을 입력받음

* 2. input.indexOf(문자) : 찾을려는 문자가 없으면 -1 값을 반환합니다

* 3. 사칙 연산자 우선 순위 : * , / , + , -

* 4. 로직 : 사용자가 입력한 문자열 파악 > 올바른 사칙 연산 식이면 > 사칙연산 계산 수행

* 5. 5+2*10/5-5 계산 설명 : [2]*[10] = 20 > 20/[5] = 4 > [5]+4 = 9 > 9-[5] = 4

/* =========================== */