Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

problem sa javom i logickim iskazima

[es] :: Java :: problem sa javom i logickim iskazima

[ Pregleda: 2239 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Pro igrac
http://www.teretanac.com/

Član broj: 305495
Poruke: 14
*.dynamic.sbb.rs.



Profil

icon problem sa javom i logickim iskazima02.12.2014. u 23:34 - pre 114 meseci
Pravim neki program koji treba da određuje da li je izraz tautologija, kontradikcija ili zadovoljiva.
I sada, lepo radi u nekom slučajevima kada treba redom da određuje ali kada treba da ispoštuje pravila prednosti tipa recimo u primeru
(p||q=>r)<=>(p=>r)&&(q=>r)
prvo će da radi (p||q=>r)<=>(p=>r)
pa tek ostalo a meni treba da odradi prvo (p||q=>r) pa (p=>r)&&(q=>r) i tek onda ekvivalenciju.
Recimo tako bi računalo 4+3*2 = 14
Rađeno je preko obrnute poljske notacije. Ako neko zna šta dodati kodu i gde(još sam slab sa javom a trebam da predam ovo ubrzo).


import java.util.ArrayList;
import java.util.HashMap;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ReversePolishNotation {

// Spisak operatora
public static final String[] OPERATORS = { "=>", "<=>", "&&", "||", "^",
"(", ")", "^" };

public static boolean evaluate(String expression,
HashMap<String, Boolean> values) {
// Dodaje default 0 i 1 vrednosti u slucaju negacije samo jedne vrednost
values.put("0", false);
values.put("1", true);

// Uklanja sve razmake
expression = expression.replaceAll("\\s+", "");

// Pretraga karaktera za negaciju i zamenja njegovom default obrnutom
// vrednoscu
Pattern PATTERN = Pattern.compile("\\^[A-Za-z0-9]");
Matcher m = PATTERN.matcher(expression);
while (m.find()) {
String s = m.group(0).substring(1, 2);

if (values.get(s) == false)
expression = expression.replaceAll("\\^[A-Za-z0-9]", "1");
else
expression = expression.replaceAll("\\^[A-Za-z0-9]", "0");
}

// Regularni izraz za splitovanje zadatog izraza po operatorima
String regex = "((?<=\\))|(?=\\)))|((?<=\\()|(?=\\())|((?<=\\b\\w+\\b)|(?=\\b\\w+\\b))";

String[] tokens = expression.split(regex);

Stack<String> operators = new Stack<String>();
Stack<Boolean> operands = new Stack<Boolean>();

ArrayList<String> output = new ArrayList<String>();

for (String clan : tokens) {

if (!clan.equals(")")) {
if (isOperator(clan))
operators.push(clan);
else
output.add(clan);

} else {
while (operators.peek().equals("(") == false) {
output.add(operators.pop());
}

operators.pop();
}
}

// Racunanje and sit
while (operators.size() != 0) {
output.add(operators.pop());
}

for (String item : output) {

if (!isOperator(item)) {

operands.push(values.get(item));

} else if (item.equals("=>")) {

boolean item1 = operands.pop();
boolean item2 = operands.pop();

if (item2 == true && item1 == false)
operands.push(false);
else
operands.push(true);

} else if (item.equals("&&")) {

boolean item1 = operands.pop();
boolean item2 = operands.pop();
if (item1 == true && item2 == true)
operands.push(true);
else
operands.push(false);

}

else if (item.equals("||")) {

boolean item1 = operands.pop();
boolean item2 = operands.pop();
if (item1 == true || item2 == true)
operands.push(true);
else
operands.push(false);

}

else if (item.equals("^")) {

boolean item1 = operands.pop();

operands.push(!item1);

}

else if (item.equals("<=>")) {

boolean item1 = operands.pop();
boolean item2 = operands.pop();

if (item1 == item2)
operands.push(true);
else
operands.push(false);

}

}

return operands.pop();

}

private static boolean isOperator(String s) {
for (String operator : OPERATORS) {
if (s.equals(operator))
return true;
}

return false;
}

}

 
Odgovor na temu

Googladzija

Član broj: 199719
Poruke: 63
*.gprs.19522256-79.bih.net.ba.



+1 Profil

icon Re: problem sa javom i logickim iskazima03.12.2014. u 06:35 - pre 114 meseci
(p||q=>r)<=>((p=>r)&&(q=>r))
:)
 
Odgovor na temu

Pro igrac
http://www.teretanac.com/

Član broj: 305495
Poruke: 14
*.dynamic.sbb.rs.



Profil

icon Re: problem sa javom i logickim iskazima03.12.2014. u 07:35 - pre 114 meseci
Googladzija
nemoj me zajebavati
 
Odgovor na temu

hyle
Perica Milošević
Belgrade

Član broj: 30030
Poruke: 150
*.dynamic.isp.telekom.rs.

Sajt: www.linkedin.com/in/peric..


+4 Profil

icon Re: problem sa javom i logickim iskazima03.12.2014. u 11:39 - pre 114 meseci
Izraz u obrnutoj poljskoj notaciji bi morao da ima već obrađen prioritet operatora.

http://en.wikipedia.org/wiki/Operator-precedence_parser
http://sourcemaking.com/design_patterns/Interpreter/java/1
 
Odgovor na temu

[es] :: Java :: problem sa javom i logickim iskazima

[ Pregleda: 2239 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.