INF2100 ?velsesoppgaver uke 46 14.-18.11.2005 Oppgave 1 Her er et lite Minila-program: prog var a, b; begprog a := inint; b := inint; while a =/= b do if a < b then b := b-a; else a := a-b; endif; endwhile; outint(10) a; outline; endprog Nedenfor er tre oversettelser til Flink-kode. En er riktig og to er gale. Finn den riktige og finn feilene i de to andre. Versjon 1: gcd1.list 1: prog ---I(resVar) 0: 1 cpFrom ---I(resVar) 1: 1 cpTo ---I(resVar) 2: 1 cpC ---I(resVar) 3: 1 xIN ---I(resVar) 4: 1 xINC ---I(resVar) 5: 1 xBet 2: var a, b; 3: begprog 4: a := inint; b := inint; 5: while a =/= b do 6: if a < b then b := b-a; 7: else a := a-b; endif; 8: endwhile; 9: outint(10) a; outline; 10: endprog ---I(Instr) 0: JMP(12) -1 0 ---I(resVar) 6: 1 a ---I(resVar) 7: 1 b ---I(fillOld) 0: 1 ---I(Instr) 1: INI(9) 0 0 ---I(Instr) 2: STI(2) 6 0 ---I(Instr) 3: INI(9) 0 0 ---I(Instr) 4: STI(2) 7 0 ---I(Instr) 5: LDI(1) 6 0 ---I(Instr) 6: STI(2) 5 0 ---I(Instr) 7: LDI(1) 7 0 ---I(Instr) 8: SUBI(6) 5 0 ---I(Instr) 9: JNEI(16) -1 0 ---I(Instr) 10: LDI(1) 6 0 ---I(Instr) 11: STI(2) 5 0 ---I(Instr) 12: LDI(1) 7 0 ---I(Instr) 13: SUBI(6) 5 0 ---I(Instr) 14: JGTI(15) -1 0 ---I(Instr) 15: LDI(1) 7 0 ---I(Instr) 16: SUBI(6) 6 0 ---I(Instr) 17: STI(2) 7 0 ---I(Instr) 18: JMP(12) -1 0 ---I(fillOld) 14: 19 ---I(Instr) 19: LDI(1) 6 0 ---I(Instr) 20: SUBI(6) 7 0 ---I(Instr) 21: STI(2) 6 0 ---I(fillOld) 18: 22 ---I(Instr) 22: JMP(12) 5 0 ---I(fillOld) 9: 23 ---I(Instr) 23: LDI(1) 6 0 ---I(Instr) 24: OUTI(10) 10 0 ---I(Instr) 25: OLIN(11) 0 0 ---I(Instr) 26: STOP(0) 0 0 Versjon 2: gcd2.list 1: prog ---I(resVar) 0: 1 cpFrom ---I(resVar) 1: 1 cpTo ---I(resVar) 2: 1 cpC ---I(resVar) 3: 1 xIN ---I(resVar) 4: 1 xINC ---I(resVar) 5: 1 xBet 2: var a, b; 3: begprog 4: a := inint; b := inint; 5: while a =/= b do 6: if a < b then b := b-a; 7: else a := a-b; endif; 8: endwhile; 9: outint(10) a; outline; 10: endprog ---I(Instr) 0: JMP(12) -1 0 ---I(resVar) 6: 1 a ---I(resVar) 7: 1 b ---I(fillOld) 0: 1 ---I(Instr) 1: INI(9) 0 0 ---I(Instr) 2: STI(2) 6 0 ---I(Instr) 3: INI(9) 0 0 ---I(Instr) 4: STI(2) 7 0 ---I(Instr) 5: LDI(1) 6 0 ---I(Instr) 6: STI(2) 5 0 ---I(Instr) 7: LDI(1) 7 0 ---I(Instr) 8: SUBI(6) 5 0 ---I(Instr) 9: JEQI(16) -1 0 ---I(Instr) 10: LDI(1) 6 0 ---I(Instr) 11: STI(2) 5 0 ---I(Instr) 12: LDI(1) 7 0 ---I(Instr) 13: SUBI(6) 5 0 ---I(Instr) 14: JLEI(15) -1 0 ---I(Instr) 15: LDI(1) 7 0 ---I(Instr) 16: SUBI(6) 6 0 ---I(Instr) 17: STI(2) 7 0 ---I(Instr) 18: JMP(12) -1 0 ---I(fillOld) 14: 19 ---I(Instr) 19: LDI(1) 6 0 ---I(Instr) 20: SUBI(6) 7 0 ---I(Instr) 21: STI(2) 6 0 ---I(fillOld) 18: 22 ---I(Instr) 22: JMP(12) 5 0 ---I(fillOld) 9: 23 ---I(Instr) 23: LDI(1) 6 0 ---I(Instr) 24: OUTI(10) 10 0 ---I(Instr) 25: OLIN(11) 0 0 ---I(Instr) 26: STOP(0) 0 0 Versjon 3: gcd3.list 1: prog ---I(resVar) 0: 1 cpFrom ---I(resVar) 1: 1 cpTo ---I(resVar) 2: 1 cpC ---I(resVar) 3: 1 xIN ---I(resVar) 4: 1 xINC ---I(resVar) 5: 1 xBet 2: var a, b; 3: begprog 4: a := inint; b := inint; 5: while a =/= b do 6: if a < b then b := b-a; 7: else a := a-b; endif; 8: endwhile; 9: outint(10) a; outline; 10: endprog ---I(Instr) 0: JMP(12) -1 0 ---I(resVar) 6: 1 a ---I(resVar) 7: 1 b ---I(fillOld) 0: 1 ---I(Instr) 1: INI(9) 0 0 ---I(Instr) 2: STI(2) 6 0 ---I(Instr) 3: INI(9) 0 0 ---I(Instr) 4: STI(2) 7 0 ---I(Instr) 5: LDI(1) 6 0 ---I(Instr) 6: STI(2) 5 0 ---I(Instr) 7: LDI(1) 7 0 ---I(Instr) 8: SUBI(6) 5 0 ---I(Instr) 9: JNEI(16) -1 0 ---I(Instr) 10: LDI(1) 6 0 ---I(Instr) 11: STI(2) 5 0 ---I(Instr) 12: LDI(1) 7 0 ---I(Instr) 13: SUBI(6) 5 0 ---I(Instr) 14: JGTI(15) -1 0 ---I(Instr) 15: LDI(1) 7 0 ---I(Instr) 16: SUBI(6) 6 0 ---I(Instr) 17: STI(2) 7 0 ---I(Instr) 18: JMP(12) -1 0 ---I(fillOld) 14: 22 ---I(Instr) 19: LDI(1) 6 0 ---I(Instr) 20: SUBI(6) 7 0 ---I(Instr) 21: STI(2) 6 0 ---I(fillOld) 18: 23 ---I(Instr) 22: JMP(12) 5 0 ---I(fillOld) 9: 19 ---I(Instr) 23: LDI(1) 6 0 ---I(Instr) 24: OUTI(10) 10 0 ---I(Instr) 25: OLIN(11) 0 0 ---I(Instr) 26: STOP(0) 0 0 For lettere ? se hvilke linjer som er forskjellige, har jeg sammenlignet dem med diff-programmet. $ diff gcd1.list gcd2.list 29c29 < ---I(Instr) 9: JNEI(16) -1 0 --- > ---I(Instr) 9: JEQI(16) -1 0 34c34 < ---I(Instr) 14: JGTI(15) -1 0 --- > ---I(Instr) 14: JLEI(15) -1 0 $ diff gcd1.list gcd3.list 39c39 < ---I(fillOld) 14: 19 --- > ---I(fillOld) 14: 22 43c43 < ---I(fillOld) 18: 22 --- > ---I(fillOld) 18: 23 45c45 < ---I(fillOld) 9: 23 --- > ---I(fillOld) 9: 19 $ diff gcd2.list gcd3.list 29c29 < ---I(Instr) 9: JEQI(16) -1 0 --- > ---I(Instr) 9: JNEI(16) -1 0 34c34 < ---I(Instr) 14: JLEI(15) -1 0 --- > ---I(Instr) 14: JGTI(15) -1 0 39c39 < ---I(fillOld) 14: 19 --- > ---I(fillOld) 14: 22 43c43 < ---I(fillOld) 18: 22 --- > ---I(fillOld) 18: 23 45c45 < ---I(fillOld) 9: 23 --- > ---I(fillOld) 9: 19 Oppgave 2 Skriv makeCode for If-setningen.