Mar 03, 08 17:48 Page 1/3 class List * Representerar en länkad lista av godtyckliga objekt public class List { ListNode * Noder i listor protected static class ListNode { protected Object data; protected ListNode next; ListNode(Object d, ListNode n) { data = d; next = n; return data.tostring(); List.java ListException * Undantagsklass för List //... Uppgift 2a protected ListNode head; // Första noden i listan head add(); * Lägger in ett nytt objekt först i listan public void add(object o) { //... Uppgift 2b length() * Beräknar längden av listan public int length() { return length(head); protected static int length(listnode l) { //... Uppgift 2c och 2d List.java Mar 03, 08 17:48 Page 2/3 tostring() * Skapar en textrepresentation av listan genom att * använda de lagrade objektens tostring metoder. String res = ""; for (ListNode l = head; l!=null; l=l.next) { res = res + l.tostring(); if (l.next!=null) res = res + " "; return "[" + res + "]"; get() * Tar bort det första elementet ur listan och returnerar * dess värde. * @throws ListException Om listan är tom public Object get() { //... Uppgift 2e contains() * Testar (med equals) om ett objekt finns i listan public boolean contains(object o) { //... behöver ej implementeras remove() * Tar bort första förekomst av ett objekt (definierat av * equals) ur listan. public void remove(object o) { //... behöver ej skrivas removeall() * Tar bort alla förekomster av ett objekt (definierat av * equals) ur listan. Gör ingenting om objektet inte finns public void removeall(object o) { head = removeall(o, head); protected static ListNode removeall(object o, ListNode l) { //... Uppgift 2f Wednesday March 12, 2008 List.java 1/6
Mar 03, 08 17:48 Page 3/3 main() * Metoden skapar några listor och testar klassens metoder public static void main(string [] args) { List l = new List(); for (int i=1; i<=10; i++) l.add(new Integer(i%3)); System.out.println("Listan : " + l); l.remove(new Integer(1)); System.out.println("Utan första 1 an: " + l); l.removeall(new Integer(1)); System.out.println("Utan alla 1 or : " + l); l.removeall(new Integer(42)); try { l.remove(new Integer(42)); catch (ListException e) { System.out.println("*** Fel: " + e.getmessage()); /* Resultat av testkörning Listan : [1 0 2 1 0 2 1 0 2 1] Utan första 1 an: [0 2 1 0 2 1 0 2 1] Utan alla 1 or : [0 2 0 2 0 2] *** Fel: Remove: 42 not in list List.java Set.java Mar 04, 08 9:41 Page 1/1 class Set * Representerar en mängd av godtyckliga objekt. * I en mängd skall inga dubletter finnas (antingen är * ett element med eller så är det inte med) public class Set extends List { * Lägger in ett nytt objekt i mängden. public void add(object o) { //... Uppgift 3a intersection() * Skapar en ny mängd som bestående av alla element som * finns både i den egna mängden och i mängden s public Set intersection(set s) { Set ns = new Set(); ns.head = intersection(head, s.head); return ns; protected ListNode intersection(listnode x, ListNode y) { if (x==null y==null) { return null; if (contains(x.data, y)) { //... Uppgift 3b { //... Uppgift 3b main() * Testmetod public static void main(string [] args) { Set s = new Set(); Set t = new Set(); s.add(new Integer(1)); s.add(new Integer(2)); s.add(new Integer(3)); s.add(new Integer(4)); s.add(new Integer(1)); // Skall ej ändra mängden // eftersom 1 redan finns t.add(new Integer(2)); t.add(new Integer(4)); t.add(new Integer(6)); t.add(new Integer(7)); System.out.println("s : " + s); System.out.println("t : " + t); System.out.println("snittet: " + s.intersection(t)); /* Output: s : [4 3 2 1] t : [7 6 4 2] snittet: [4 2] Wednesday March 12, 2008 List.java, Set.java 2/6
Mar 04, 08 9:33 Page 1/8 class Parser * Parser för artitmetiska uttryck med addition (dvs a+b), * subtraktion (dvs a b), multiplikation (dvs a*b), * division (dvs a/b), negering (dvs a), * exponentiering eller upphöjt till dvs (a^b) * samt absolutbelopp (dvs a ). * Operatorerna har sina vanliga prioriteter och * parenteser kan användas på vanligt sätt för * att ändra evalueringsordning. * Parsern skapar en intern trädrepresentation * av uttrycken. public class Parser { private static final InputStreamReader isr= new InputStreamReader(System.in); private static final BufferedReader br= new BufferedReader(isr); private static final StreamTokenizer st= new StreamTokenizer(br); statement() * Hanterar en enskild sats public static Sexpr statement() Sexpr res = assignment(); if ( st.nexttoken()!=st.tt_eol ) throw new SyntaxError("Expected EOL "); return res; assignment() * Hanterar en eller flera tilldelningar på formen * <uttryck> = <variabel> = <variabel>... public static Sexpr assignment() throws IOException{ Sexpr res = expression(); while (st.nexttoken()== = ) { if (st.nexttoken()!=st.tt_word) throw new SyntaxError("Identifier expected"); res = new Assignment(res, new Variable(st.sval)); return res; expression() * Hanterar ett uttryck som en följd av termer * med + eller emellan. public static boolean isexproper(int c){ return c== + c== ; public static Sexpr expression() Sexpr sum = term(); Mar 04, 08 9:33 Page 2/8 while (isexproper(st.nexttoken())) if (st.ttype== + ) sum = new Addition(sum, term()); sum = new Subtraction(sum, term()); return sum; term() * Hanterar en term som en följd av faktorer * åtskilda av * eller / public static boolean istermoper(int c){ return c== * c== / ; public static Sexpr term() throws IOException{ Sexpr prod=factor(); while (istermoper(st.nexttoken())) if (st.ttype== * ) prod = new Multiplication(prod, factor()); prod = new Division(prod,factor()); return prod; factor() * Hanterar en factor bestående av en följd av * primärer åtskilda med upphöjningsoperatorn ^ public static Sexpr factor() throws IOException{ //... prim() * Hanterar en primär som antingen är tal, * en variabel, en unär operator ( eller ~) * följt av en primär, en tilldelning omgiven av * parenteser. public static Sexpr prim() st.nexttoken(); if (st.ttype== ( ) { Sexpr val = assignment(); if ( st.nexttoken()!= ) ) throw new SyntaxError("Expected ) "); return val; if (st.ttype== ) { return new Uminus(prim()); if (st.ttype==st.tt_number) { return new Constant(st.nval); if (st.ttype==st.tt_word) { return new Variable(st.sval); throw new SyntaxError("I m lost..."); Printed by Tom Smedsaas Wednesday March 12, 2008 3/6
Mar 04, 08 9:33 Page 3/8 main() * main metod för kalkylatorn public static void main(string [] args) st.ordinarychar( ); st.ordinarychar( / ); st.eolissignificant(true); Map<String,Double> h = new HashMap<String,Double>(); System.out.println("Welcome! End with \"q\""); while (true) try { System.out.print("? "); st.nexttoken(); if (st.ttype==st.tt_word && st.sval.equals("q")) break; Sexpr e = statement(); System.out.print(e + " \t : "); System.out.println(e.eval(h)); catch (SyntaxError e) { System.out.println( "*** " + e.getmessage() ); System.out.println( "at " + st); while (st.ttype!=st.tt_eol) st.nexttoken(); catch (EvalError e) { System.out.println( "*** " + e.getmessage()); System.out.println("Bye!"); SyntaxError * Undantagsklass för syntaxfel public class SyntaxError extends RuntimeException { public SyntaxError(String msg) { super(msg); AbsoluteValue * Representerar absolutbeloppsoperationen a //... Addition * Representerar additionsoperationen x+y public class Addition extends Binary { public Addition(Sexpr x, Sexpr y) { Mar 04, 08 9:33 Page 4/8 return 10; return "+"; return left.eval(h) + right.eval(h); Assignement * Representerar en tilldelningsoperation public class Assignment extends Binary { public Assignment(Sexpr x, Sexpr y) { return 5; return "="; double val = left.eval(h); h.put(right.tostring(), val); return val; Atom * Basklass för konstanter och variabler public abstract class Atom extends Sexpr { return tostring(); Binary * Basklass för alla binära operatorer public abstract class Binary extends Sexpr { protected Sexpr left, right; public Binary(Sexpr l, Sexpr r) { left = l; right = r; Wednesday March 12, 2008 4/6
Mar 04, 08 9:33 Page 5/8 String result; if ( left.priority()<priority() ) result = "(" + left + ")"; result = left.tostring(); if ( right.priority()<=priority() ) result = result + getname() + "(" + right + ")"; result = result + getname() + right; return result; Constant * Representerar en konstant public class Constant extends Atom { protected double value; public Constant(double v) { value = v; return "" + value; return value; Division * Representerar en divisionsoperation public class Division extends Binary { public Division(Sexpr x, Sexpr y) { return 20; return "/"; double r = right.eval(h); if (r==0) throw new EvalError("Division med noll"); return left.eval(h)/r; EvalErrror * Undantagsklass för evalueringsfel public class EvalError extends RuntimeException { public EvalError(String msg) { super(msg); Exponentiation * Representerar upphöjt operationen x^y //... Multiplication * Representerar multiplikationsoperationen x*y public class Multiplication extends Binary { Mar 04, 08 9:33 Page 6/8 public Multiplication(Sexpr x, Sexpr y) { return 20; return "*"; return left.eval(h)*right.eval(h); Sexpr * Basklass för alla trädnoder public abstract class Sexpr { * Prioriteten 100 är den högsta av alla. * Ett träd med denna prioritet behöver aldrig * omges av parenteser. return 100; * Beräknar värdet av trädet med denna nod som rot public abstract double eval(map<string, Double> h); * Returnerar nodens namn public abstract String getname(); Printed by Tom Smedsaas Wednesday March 12, 2008 5/6
Mar 04, 08 9:33 Page 7/8 Subtraction * Representerar subtraktionsoperationen x y public class Subtraction extends Binary { public Subtraction(Sexpr x, Sexpr y) { return 10; return " "; Mar 04, 08 9:33 Page 8/8... Variabel * Representerar en variabel public class Variable extends Atom { protected String ident; public Variable(String id) { ident = id; return ident; return left.eval(h) right.eval(h); Uminus * Representerar unärt minus ( a) public class Uminus extends Unary { public Uminus(Sexpr a) { super(a); return " ";... return argument.eval(h); Unary * Basklass för alla operatorer och * funktioner med ett argument public abstract class Unary extends Sexpr { protected Sexpr argument; public Unary(Sexpr a) { argument = a; return 90; Wednesday March 12, 2008 6/6