INF2100 ?velsesoppgaver uke 40 3.-7.10.2005 Oppgave 1 (Denne oppgaven er laget for ? gi trening i listeh?ndtering.) Vi ?nsker ? bruke Del 0 fra oblig 0 til ? gi oss en oversikt over hvilke variable som forekommer i et Minila-program og hvor mange ganger de forekommer. Til dette trenger vi klassen class Name { String name; Name next = null; int nOcc; Name (String n) { name = n; nOcc = 1; } void print () { System.out.println(name + " (" + nOcc + ")"); } } Metoden readProgram i TreeGenerator endres til public void readProgram () { symbGen.readSymbol(); while (! symbGen.curIsEnd()) { if (...) rememberName(symbGen.curSymbol()); symbGen.readSymbol(); } printNames(); } Fyll ut testen som mangler i readProgram og skriv metodene rememberName og printNames. Trenger vi da flere deklarasjoner? Oppgave 2 Vi skal se p? hvorledes vi kan representere et program som et tre og skal som eksempel bruke enkle aritmetiske uttrykk som 4 + (4 - 7) Verdiene skal bare v?re heltallskonstanter (alts? ingen variable), og lovlige operatorer er - n Negasjon (un?r) a + b Addisjon a - b Subtraksjon a * b Multiplikasjon a / b Divisjon samt parenteser. Oppgave 2a Lag jernbanediagrammer for slike aritmeriske uttrykk. (Symbolet ?Konstant? beh?ver ikke defineres.) Her er programkode som kan lagre slike uttrykk. Med det kan man bygge opp uttrykk som kan skrives ut og verdien beregnes. abstract class Element { abstract void print (); abstract int eval (); } class UnOp extends Element { char op; Element opExp; UnOp (char op, Element e) { ... } void print () { ... } int eval () { ... } } class BinOp extends Element { char op; Element opExp1, opExp2; BinOp (char op, Element e1, Element e2) { ... } void print () { ... } int eval () { ... } } class Num extends Element { int val; Num (int v) { ... } void print () { ... } int eval () { ... } } class Calculator { public static void main (String arg[]) { Element e = new BinOp('+', new BinOp('*', new Num(4), new Num(4)), new BinOp('-', new Num(2), new BinOp('+',new Num(-2), new UnOp('-', new Num(7))))); e.print(); System.out.println(" = " + e.eval()); } } Oppgave 2b Hvilket uttrykk peker e p? i main-metoden? Skriv uttrykket som formel 4 * 4 + ... (skriv resten av uttrykket) og tegn det som et tre. Oppgave 2c Hva er form?let med den abstrakte klassen Element? Hvorfor er den abstrakt? Oppgave 2d Skriv innmaten av alle metodene. Oppgave 3 Vi ?nsker ? finne ut hvor mange oddetall det er i en gitt array. Dette kan vi enkelt gj?re ved hjelp av et par funksjoner i Minila: mod2 beregner ?n mod 2?, alts? resten vi f?r n?r vi dividerer n med 2. odd sjekker om n er et oddetall or returnerer 1 om det er det og 0 ellers (siden vi ikke har noen ?boolean? i Minila. nOdd teller antall oddetall i array den f?r overf?rt. prog proc mod2 in n out res; begproc ... endproc; proc odd in n out isOdd; begproc ... endproc; proc nOdd in a[] out n; begproc ... endproc; var data[10], n; begprog data[1] := 17; data[2] := 18; data[3] := 19; data[4] := 20; data[ 5] := 21; data[6] := 7; data[7] := 8; data[8] := 9; data[9] := 1; data[10] := 3; call nOdd with data into n; outint(1) n; outtext " oddetall"; outline; endprog Fyll inn det som mangler. Oversett funksjonene mod2 og isOdd til Flass-kode.