Trädvy Permalänk
Medlem
Plats
stockholm
Registrerad
Jun 2009

Java problem

Hej jag är inte så erfaren inom javaprogrammering, men håller på och gör ett litet program här.

Tanken då är att man ska kunna ge olika inputs som till exempel dessa 4:

1. 4 + 5
2. 7.0 + 5.0
3. 5 < 5
4. "tjena" + "läget"

och sedan få programmet att känna igen vad det är för data man matat in. Vad den är av för typ: arithmetic, comparison, concantenation.
Vad det är för datatyp: int, boolean, string.

Hittils har jag fått programmet att fungera och göra uträkningar men skulle behöva lite hjälp för att kunna få det att känna igen vad det är för sorts input.

Jag klistrar in koden här nedan och tackar så mycket på förhand för hjälp.

import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.awt.Event.*;
import static javax.swing.JOptionPane.*;

import java.lang.NumberFormatException;

public class app3 {
public static void main(String[]args){

String data = showInputDialog ("input:");
String [] tokens = data.split (" ");

double a = Double.parseDouble(tokens[0]);
String resultA = "";
double b;
boolean compResult;

for (int i=2; i<tokens.length; i=i+2){
b=Double.parseDouble(tokens[i]);

if (tokens[i-1].equals("+")){
a=a+b;
resultA = String.valueOf(a);
}

else if(tokens[i-1].equals("-")){
a=a-b;
resultA = String.valueOf(a);
}
else if(tokens[i-1].equals("*")){
a=a*b;
resultA = String.valueOf(a);
}
else if(tokens[i-1].equals("/")){
a=a/b;
resultA = String.valueOf(a);
}
else if(tokens[i-1].equals("<")){
compResult = a<b;
resultA = String.valueOf(compResult);

} // else if <
else if(tokens[i-1].equals(">")){
compResult = a>b;
resultA = String.valueOf(compResult);

} // else if >
}
System.out.println("Type:x , Datatype:x , Answer: " + (resultA));
}

}

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Mar 2008

(Med reservation för att jag inte riktigt förstår vad du vill göra.)

Det korrekta sättet att göra det på är att göra en lexikalanalys, och att då skriva en scanner och kanske en form av enkel top-down-parser. Man läser då en sekvens av tecken och omvandlar den till en sekvens av tokens (scanning), och tar denna sekvens av tokens, tolkar och reagerar på (parsing). Men det var nog inte det du ville höra...

Om du bara har heltal, flyttal och strängar, kan du ju fulhacka på följande sätt...
Ta en strängtoken t.
Försök parsa till en int. Går det, så är det en int.
Annars, försök parsa till en double. Går det, så är det en double.
Annars, kolla första och sista tecknen i t. Är det citattecken, så är det en sträng.
Annars är det skräp som vi inte kan hantera.

Kodkladd:

// I klasskroppen...: enum TokenType { UNKNOWN("(unknown type)"), INT("integral type"), DOUBLE("floating point type"), STRING("string type"); private final String descr; private TokenType(String descr) { this.descr = descr; } @Override public String toString() { return descr; } } ... // I nån metod: String t = tokens[någotindex]; int iVal; double dVal; TokenType tType = TokenType.UNKNOWN; try { iVal = Integer.parseInt(t); tType = TokenType.INT; } catch (Exception e) { // Inte ett heltal } if (tType == TokenType.UNKNOWN) { try { dVal = Double.parseDouble(t); tType = TokenType.DOUBLE; } catch (Exception e) { // Inte ett flyttal } } if (tType == TokenType.UNKNOWN) { if (t.length() >= 2 && t.startsWith("\"") && t.endsWith("\"")) { tType = TokenType.STRING; } } // Nu säger tType vilken typ det är och du kan ta beslut därefter... // OBS att du kan skriva ut typen som en sträng direkt genom System.out.println(tType)

Observera att detta är riktigt fult och dåligt på många sätt, men en solid lösning kräver bra mycket mer kod och arbete.

P.S. Använd [ code ]-taggar i fortsättningen när du postar kod!