#scene.no size-optimized c-compo - Evaluator -------------------------------------------- - Lag et program som evaluerer et eller flere matematisk uttrykk fra stdin. - Det vil vaere et uttrykk per linje, og svaret skal skrives ut til stdout etter hvert uttrykk. - Hvis den foerste parameteren (argv[1]) er gitt, inneholder den antall desimaler svaret skal skrives ut med. Hvis ikke, skal svar skrives ut med 6 desimaler. Dersom argv[1] ikke er et heltall, er resultatet udefinert - Uttrykkene er paa formen: - 4.2 - .13243 - 7.1 + 3.1 - 5.31 - 4 / .435E-6 * .45E3 - (4.1 + 4.1)*5.612 - (1337 / 32) - (((((((((42))))))))) - 42 * -69 - Programmet skal stoette operasjonene * (multiplikasjon), / (divisjon), + (addisjon) og - (subtraksjon). - Operatorpresedensen er * / foer + -. Parenteser har hoeyest presendes: - 1+2*3 = 7 - (1+2)*3 = 9 - Alle operatorene er venstreassosiative, slik at a/b/c tilsvarer (a/b)/c. - Alle uttrykkene kan inneholde en eller flere whitespaces (dvs ' ' og '\t') mellom tall, parenteser og operatorer. (a - b * c ) er det samme som (a-b*c). - Alle operasjoner skal utfoeres med dobbel presisjon (bruk double, ikke float :). - Hvert uttrykk kan maks vaere paa 80 tegn + newline og nullterminering. - Hvert uttrykk avsluttes med newline. - Hvis det oppstaar en feil i uttrykket (ugyldige tegn, ubalanserte parenteser etc) skal programmet skrive ut "error\n" og terminere med returverdi 1. - Programmet skal terminere naar det ikke er mer data fra stdin, og returverdien skal vaere 0 (med mindre en feil har oppstaatt, se forrige punkt). Generelle regler ---------------- - Koden skal kompilere og kjoere korrekt under gcc3 (cygwin, linux, irix) og Microsoft Visual C 6.0 SP5 - Programmet skal fungere baade paa big- og little-endian-maskiner. - All output skal sendes til stdout med mindre det spesifisert noe annet - Programmet skal returnere *eksakt* det samme som eksempelprogrammet, ogsaa ved feil. Returverdien fra main() skal ogsaa vaere den samme som i eksemplet. - Inline assembler er ikke tillatt. - Programmet skal kompileres slik: - cl program.c (visual c) - gcc program.c -lm -o program (gcc) - Warnings er selvsagt tillatt, og oppfordres. Optimalisering -------------- - Hvis en funksjon (ogsaa main()) skal returnere en verdi kan man *ikke* anta at en manglende return foerer til at den returnerer 0. - Programmet kan anta at globale, uinitaliserte variabler blir initalisert til 0 (pga at de havner i bss). - Programmet kan ikke anta hva uinitialiserte variable paa stacken er, og skal heller ikke anta hvilke rekkefoelge variabler ligger i (dvs ingen smarte buffer under/overflow-triks). - sizeof(int) = sizeof(void*) = 32 bits Stoerrelse ---------- - Stoerrelsen paa programmet maales i antall bytes c-sourcen er paa. Newlines teller som en byte. Deadline -------- - Deadline er søndag 1. juni kl 1500. - Alle bidrag skal sendes i mail til geir@bjerke.org. Bidraget skal leveres i et .zip, .rar, tar.gz, tar.bz2, .gz eller bz2. - Navnet paa bidraget skal vaere .c. - Subjektet i mailen skal vaere "#scene.no evaluator compo" - Bidrag som ikke foelger reglene blir diskvalifisert.