Innleveringsoppgave 1 INF109 Dataprogrammering for naturvitskap Dette er den første av syv obligatoriske oppgaver. Du kan få totalt 10 poeng på denne oppgaven. Innleveringsfristen er fredag, 12. feb, 23:59.9999999. Oppgaven skal leveres inn som én enkelt.py-fil. Oppgaven skal leveres inn på kursets hjemmeside på Mi Side. Oppgavene skal løses individuelt selv om samarbeid er tillatt. Lykke til! 1 Oppgaven Oppgave 1 Befolkningsvekst I denne oppgaven skal du skrive et Python-program som beregner veksten for en befolkning. Programmet skal først lese inn størrelse av en populasjon som heltall, årlig vekst i prosent som flyttall og antall år som skal beregnes som heltall. For hvert år skal programmet skrive ut estimatet av den nye befolkningsstørrelsen med to desimalers nøyaktighet (det er ikke nødvendig å skrive ut avsluttende nullere (trailing zeros), man kan med andre ord bruke round()-funksjonen, mer om dette under). Til slutt skal programmet skrive ut totalveksten av startbefolkningen. Kort oppsummert skal programmet gjøre følgende: Be brukeren om nåværende befolkning, en spesifikk vekstrate og antall år, n, som skal beregnes, skrive ut n linjer, én linje per år som beregnes, med antatt befolkning gitt oppgitt vekstrate og skrive ut en linje på slutten som oppgir den totale veksten etter n år oppgitt i prosent. Når programmet er lastet inn i Python, skal det være mulig uten å måtte gjøre annet enn å kompilere, å kjøre metoden befolkningsvekst(). Den skal be om de nødvendige tallene fra brukeren og skrive ut informasjonen som er beskrevet over. Når brukeren kjører funksjonen, skal det se ut som følger (dersom brukeren oppgir tallene 1000, 2.48 og 5). >>> befolkningsvekst () Befolkning : 1000 Å rlig vekstrate ( i prosent ): 2.48 Antall år: 5 Befolkningen etter 1 år er 1024.8 Befolkningen etter 2 år er 1050.22 Befolkningen etter 3 år er 1076.26 Befolkningen etter 4 år er 1102.95 1
Befolkningen etter 5 år er 1130.3 Total vekst etter 5 år er ( i prosent ) 13.03 >>> Med unntak av funksjonen round() som er beskrevet nedenfor skal du bare bruke Pythonfunksjoner du har lært i kapittel 1 og 2 i læreboken. Det vil si print-setninger, enkle aritmetiske uttrykk, innlesning av variabelverdier ved hjelp av input() og for-løkker med range(). round()-funksjonen Når du har et flyttall du vil skrive ut og du bare trenger et bestemt antall desimaler (e.g. du ønsker å skrive ut 1.618 fremfor 1.61803398874989) så kan du bruke round()-funksjonen. Første parameter av funksjonen er variabelen, eller tall som skal avrundes, andre parameter er antall desimaler du vil ha. F.eks.: >>> from math import e >>> e 2.718281828459045 >>> e_avrundet = round (e, 9) >>> e_avrundet 2.718281828 >>> round (e,14) 2.71828182845905 >>> round (e,13) 2.718281828459 >>> round (e,12) 2.718281828459 >>> from math import pi >>> pi 3.141592653589793 >>> round (pi,2) 3.14 >>> round (pi,4) 3.1416 >>> round (pi,5) 3.14159 >>> round ( pi) # pi blir rundet ned 3 >>> round (pi,0) 3.0 >>> round ( e) # e blir rundet opp 3 >>> round (e,0) 3.0 Hvis du bruker round() uten den andre parameteren (f.eks. round(var)), så få du nærmeste heltall tilbake. Du kan lese mer om round()-funksjonen på side 68 i boken. Prøv eksemplene over i IDLE og prøv å forstå hva som foregår. Merk at alt som står etter en # blir ignorert av Python (de er kommentarer), og at det derfor ikke er nødvendig å skrive det for disse eksemplene. Oppgave 2 Vi så i første ukeoppgave at formelen for å finne røttene til en annengradsligning var gitt med x = b ± b 2 4ac. 2a 2
Dette vil si at dersom man har en funksjon f(x) = 3x 2 4x + 3, så setter man a = 3, b = 4 og c = 3 og regner ut. Vi vet videre at et annengradspolynom har potensielt to røtter, én rot eller ingen røtter (gitt at vi bare aksepterer løsninger i R). Mer bestemt, dersom diskriminanten = b 2 4ac er positiv, det vil si om > 0, har ligningen to reelle røtter r 1 R og r 2 R, om vi har at = 0, har ligningen nøyaktig én reell rot r R og dersom < 0, vil vi ikke ha noen reelle røtter. Dette blir første funksjonen dere skriver som tar inn argumenter (også kalt parametre). En funksjon (som befolkningsvekst over), kan bli laget til å ta inn én eller flere argumenter. Dette betyr at den kommer med variabler allerede satt til verdier. Se på følgende eksempel: def hello_world ( name ): print (" Hello,", name ) Denne funksjonen må kalles med ett argument som følger (følg med på hvordan argumentet vi kaller funksjonen med blir det name har som verdi inni funksjonen): >>> hello_world (" Hallo ") Hello, Hallo >>> hello_world (3) Hello, 3 >>> Vi kan utvide funksjonen med å ta inn flere argumenter: def hello_again ( first_name, surname, times ): for i in range ( times ): print (" Hello,", first_name, surname ) Prøv deg frem med forskjellige verdier av first name, surname og times. Se spesielt hva som skjer dersom du setter times til å være noe annet enn et heltall. >>> hello_again (" INF109 ", " Python ", 6) >>> 2a Annengradspolynomer Lag en funksjon solve(a, b, c) som tar inn de tre variablene og regner ut (bruk gjerne variabelnavn d, siden python kan være i overkant hårsår på greske tegn). Deretter skal programmet ditt teste hvor mange røtter funksjonen har ved å bruke if-setninger. Skriv følgende (fyll ut for...): 3
def solve (a, b, c): """ Prints solutions to the quadratic equation given by parameters. """ d =... # Fyll ut for... # There are two solutions if (d > 0): numerator1 = -b + math. sqrt ( d) numerator2 = -b - math. sqrt ( d) denominator = 2 * a root1 = numerator1 / denominator #... print ut to linjer, en for hver x # There is only one solution if (d == 0): numerator = #... #... print ut kun en x # There is no solution if (d < 0): print ("No solutions ") 2b Innlesing fra bruker Nå skal vi lage en funksjon som tar inn input fra bruker og som kaller funksjonen vi laget over. Lag en funksjon quadratic equation solver() som leser inn a, b og c fra brukeren og som kaller funksjonen over med de argumentene: def quadratic_equation_solver (): """ Asks user for input, calls solve on input. """ print (" Velkommen.\ nvennligst tast inn verdi for a: ") a = eval ( input ()) #... 2c Førstegradspolynom? Nå skal vi løse en litt enklere oppgave enn Oppgave 2a, nemlig finne røttene til en førstegradsligning. Den har formen f(x) = bx + c. Lag funksjonen solve linear equation(b,c). Nå står du helt på egne ben, men husk å kommentere og å dokumentere koden. Utvid dernest koden i Oppgave 2b til å sjekke om verdien for a er 0, og hvis så er tilfelle, kall funksjonen solve linear equation istedet. Informer gjerne brukeren om dette ved å skrive ut at input ikke definerer et ekte annengradspolynom. 2d Valgfri: Røtter i C? (Denne oppgaven er valgfri og gir ikke poeng, bare litt street cred.) Dersom du har testet i oppgave at ligningen ikke har noen reelle røtter ( < 0), tar vi like greit og gir brukeren de to komplekse røttene. De er definert enkelt og greit ved r c = b 2a + i 2a 4
r c = b 2a i 2a, og de er, som noen kaller dem, komplekse konjugater av hverandre. For å få dem skrevet ut i python, bruker vi funksjonen complex(a,b) som gir oss det komplekse tallet a + bi. Dersom du ikke gidder å skrive inn begge formlene oppe, kan den andre fåes ved å kalle c.conjugate(), dersom c er ditt komplekse tall. 5
2 Innlevering Lagre programmet ditt i en.py-fil som heter oblig1-abc123.py, hvor abc123 skal erstattes med ditt brukernavn, og lever besvarelsen på studentportalen Mi Side, i mappen Innleveringsmappe Vurderingsmappe Innlevering1. 3 Vurdering For denne oppgaven kan du få maksimalt 10 poeng. Fordeling av poeng er: Programmet fungerer som forventet 6 Programmet er veldokumentert med kommentarer og oversiktlig 2 Navngiving 2 10 Programmet fungerer som forventet. Her får man trekk om programmet enten skriver ut feil data, har feil format på utskrift (avviker fra eksempelet), kræsjer på noen som helst måte eller om funksjonsnavn ikke er som oppgitt. Det er viktig å merke seg at dersom funksjonen dere skal implementere, befolkningsvekst(), har blitt kalt noe annet enn nettopp befolkningsvekst vil dere bli trukket i poeng her. Utskriften skal heller ikke vesentlig avvike fra eksempelet over. Programmet er veldokumentert med kommentarer og oversiktlig. Her får man trekk om programmet ikke er kommentert godt nok, men også om programmet er for mye kommentert (spør gruppeleder hva dette betyr). Man kan også få trekk om programmet er uoversiktlig, det vil si at det er vanskelig for en ny person å sette seg inn i programmets funksjonalitet. Navngiving. Posten Navngiving dekker at navn på variabler og funksjoner er fornuftig valgt og at navngivingen som er brukt er konsistent; enten mixedcase eller med underscore. 1 Oppgavene vil være ferdigrettet innen én uke har gått, og poengsum og kommentarer fra retter vil bli postet i vurderingsmappen under kommentarer. Spørsmål til rettingen kan bli rettet til en av gruppelederne, eventuelle klager skal rettes til koordinator på e-post (email to be decided) som vil se gjennom rettingen og eventuelt be en annen gruppeleder rette på ny. Obs: Den nye karakteren vil bli stående og det er ikke garantert at den ikke vil gå ned. 1 mixedcase er når variablene ser ut som innlestdata, mens underscore er når variablene skrives som innlest data. Velg én av disse to, og hold dere til den måten. I boken bruker de førstnevnte, mens det er kanskje vanligere ellers i Python-verdenen å bruke sistnevnte. Aldri begynn med stor forbokstav, e.g. InnlestData eller lignende, da disse er reservert til klassenavn, noe som er delvis utenfor pensum for dette kurset. 6