12 CO2 + 6 H2O -> 2 C6H12O6 + 12 O2와 같이 사용자의 화학 반응식을 입력으로 사용하는 프로그램을 작성해야합니다. 원자 금액이 두 사이트 모두 같으면 쉽게 계산하고 분석 할 수있는 방법이 있습니까? 예를 들어화학 반응을 나타내는 문자열 파싱 및 반응 가능 여부 확인
:
12 CO2 + 6 H2O -> 2 C6H12O6 + 12 O2
12 * 2 + 6 * 2 -> 2 * 6 + 2 * 12 + 2 * 6 + 12 * 2
이 경우 Output "false"가 있어야합니다.
이 내 코드입니다하지만 실제로 뭔가 시도해 아니라 :
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
List<String> list = new ArrayList<String>();
String input = "";
while (!(input.equals("end"))) {
input = s.nextLine();
list.add(input);
}
list.remove(list.size() - 1);
for (int i = 0; i < list.size(); i++) {
int before = 0;
int after = 0;
String string = list.get(i);
string = besserUmwandeln(string);
System.out.println(string);
}
}
public static String besserUmwandeln(String string) {
string = string.replace("-", "");
string = string.trim().replaceAll(("\\s+"), " ");
string = string.replace(' ', '*');
StringBuilder builder = new StringBuilder(string);
System.out.println(string);
for (int k = 0; k < builder.length(); k++) {
if (Character.isUpperCase(builder.charAt(k))) {
builder.setCharAt(k, ':');
}
if (Character.isLowerCase(builder.charAt(k))) {
builder.setCharAt(k, '.');
}
if (Character.isDigit(builder.charAt(k))) {
} else {
}
}
for (int j = 0; j < builder.length(); j++) {
if (j < builder.length() && builder.charAt(j) == ':' && builder.charAt(j + 1) == '.') {
builder.deleteCharAt(j + 1);
}
}
for (int i = 0; i < builder.length(); i++) {
if (i < builder.length() - 1 && builder.charAt(i) == ':' && builder.charAt(i + 1) == ':') {
builder.deleteCharAt(i);
}
}
for (int i = 0; i < builder.length(); i++) {
if (i < builder.length() - 1 && builder.charAt(i) == '+' && builder.charAt(i + 1) == '*') {
builder.deleteCharAt(i + 1);
}
}
for (int i = 0; i < builder.length(); i++) {
if (i < builder.length() - 1 && builder.charAt(i) == '*' && builder.charAt(i + 1) == '+') {
builder.deleteCharAt(i);
}
}
for (int i = 0; i < builder.length(); i++) {
if (i < builder.length() - 1 && builder.charAt(i) == '*' && builder.charAt(i + 1) == '>') {
builder.deleteCharAt(i);
}
}
for (int i = 0; i < builder.length(); i++) {
if (i < builder.length() - 1 && builder.charAt(i) == '>' && builder.charAt(i + 1) == '*') {
builder.deleteCharAt(i + 1);
}
}
for (int i = 0; i < builder.length(); i++) {
if (i < builder.length() - 1 && builder.charAt(i) == '*' && builder.charAt(i + 1) == ':') {
builder.deleteCharAt(i + 1);
}
}
return builder.toString();
}
한 가지 방법은 EBNF 문법을 정의하고 구문 분석 도구를 작성하는 것입니다. 이 작업은 C++에서 ** 아름답게 할 수 있습니다. 멤버 연산자'->'에 대한 포인터를 오버로드 할 수도 있습니다. 부스트 스피릿을 참조하십시오. IMHO Java는 심각한 과학 프로그래밍을위한 것이 아닙니다. – Bathsheba
@ Bathsheba 답변 해 주셔서 감사합니다. 나는 자바가 심각한 과학 프로그램을 가지고 있지 않다고 생각하지만,이 경우 나는 다른 선택의 여지가 없기 때문에 자바로 개발할 필요가있다. –
호그 워시! C++로 빌드하고 JNI를 제공하십시오. Java의'native' 키워드를보십시오. 나는 광합성 장난 소리를 피할거야! – Bathsheba