INF109 - Uke 1b 20.01.2016 1 Variabler Et program er ikke til stor hjelp hvis det er statisk. Statisk betyr at programmet bare bearbeider faste data som er lagt inn i programkoden. For å gjøre programmer mer dynamiske, bruker vi variabler. Variabler kan ses på som plassholdere, som i matematikk, men de kan også betraktes mer fysisk som referanser til lagringsplasser i datamaskinens internminne, som kan tildeles og lagre verdier. Verdiene som en variabel tar kan f.eks. være heltall, flyt-tall og strenger. (Flyttall er en tilnærming til desimaltall.) I noen programmeringsspråk må variabler deklareres (dvs defineres) med en bestemt type før de kan brukes, men in Python er det slik at med det samme variabelen gis en verdi er dens navn og type (heltall, flyt-tall, etc.) fastlagt. Dette kan endres senere i programmet. >>> var = 1+2+3 >>> p r i n t ( var ) 6 >> var = 0. 1 >> p r i n t ( var ) 0. 1 >> et_navn = " Alan Turing " >> p r i n t ( et_navn ) Alan Turing >> p r i n t (" et_navn ") et_navn >>> p r i n t (6 var, 2 et_navn ) # g j e t t hva som b l i r s k r e v e t ut : ) Generelt sett kan variabler i et program ta et hvilket som helst navn, så lenge navnet består av bokstaver og tall. Det eneste som er forbudt er variabelnavn som begynner med et tall og som er identisk med reserverte nøkkelord, som f.eks. print. (I tabell 2.1 i boken står en liste over slike nøkkelord.) I tillegg kan man bruke _ i variabelnavnet. Uansett, når man skriver programkode bør man bruke fornuftige navn. I praksis betyr dette at det bør gå fram av navnet hva variabelen brukes til, og hva den lagrer. Selv ved et medium stort program blir det forvirrende hvis variablene heter x1,x2,...,x1000. Finn 3 eksempler for gyldige og 3 eksempler for ugyldige variabelnavn. Hvis det valgte navnet var ugyldig får du en feilmelding, hvis ikke burde du være i stand til å skrive ut den tildelte verdien med: >>> p r i n t ( ditt_valgte_variabelnavn ) 1
Prøv å finne ut hvilken type en gitt variabel har. Bruk type()-funksjonen, f.eks.: >>> type ( 3 ) <c l a s s int > >>> type ( 3. 0 ) <c l a s s f l o a t > >>> type ("3") <c l a s s s t r > >>> en_variabel = 5 >>> type ( en_variabel ) <type int > Sett to variabler x1=5 og x2=2.7. Test hva slags verdi du får når du kombinerer variablene med, +,, /, // (x1*x2, etc.). Sett to variabler x og y til et tilfeldig heltall. Forsøk å dele dem (x med y og omvendt, både med / og med //) og observer resultatet. Eksperimenter med dette og prøv å forstå hva som skjer. Hva endrer seg hvis du setter x og y med.0 på slutten? Hva hvis x = 10.1 og y = 3.4? Skriv et program som bytter om verdien til to variabler x og y. Dvs. hvis for eksempel x=10 og y=15 så skal vi ha x=15 og y=10 etter at programmet er kjørt (hint: det kan være nyttig med en tredje variabel). Lag et program stoneconverter.py som først konverterer kg til pounds og siden til stones og skriv ut resultatet (6.35 kg = 1 stone = 14 pounds). F.eks.: 5 kg er 0.787401574803 s t o n e s er 11.0231131 pounds. I dette programmet skal bare verdien av kg-variabelen endres for å få korrekt ny output. Prøv å finne ut hva det følgende programmet skriver ut før du prøver selv. >>> x = 5 >>> y = 6 >>> x = x+y >>> p r i n t ( x ) 2 Innlesning av Variabler For å unngå å måtte forandre programkoden hele tiden når du vil forandre verdien til en variabel, leser vi inn data fra tastaturet. Forsøk: >>> kg_value = e v a l ( input (" Enter a value in kg : " ) ) >>> p r i n t ( kg_value ) Metoden input skriver ut strengen som står mellom anførselstegn og venter til brukeren har skrevet noe og tastet enter. Det brukeren taster inn evalueres av metoden eval og tildeles variabelen som tallverdi. Vi vil lære mer om eval senere (s. 137 i læreboken). Modifiser stoneconverter.py slik at programmet leser verdien som skal konverteres fra tastaturet. 2
Gitt ligningen a = mx + b, skriv et program linear.py med metoden lineq() som leser inn a, x, b og skriver ut m. En prøvekjøring av programmet bør se omtrent slik ut: >>> l i n e q ( ) C a l c u l a t e m in Enter a : 5. 0 Enter x : 2. 5 Enter b : 3. 0 m = 0. 8 >>> a=mx+b Ikke glem å skrive kommentarer. Hva skjer når x = 0? 3 Enkle Løkker Av og til trenger vi å utføre en bestemt del av program-koden flere ganger etter hverandre. Hvis du for eksempel vil kjøre konverterings-programmet ditt 10 ganger, så er det tungvint å skrive 10 kall til programmet etter hverandre. I slike situasjoner kan vi bruke en for-løkke. En slik løkke har følgende syntaks: f o r <var> i n <sequence >: <body> Her er <var> løkke-variablen og <sequence> en sekvens med verdier. En sekvens skrives på formen [verdi 1, verdi 2,..., verdi n], som f.eks. [1, 2, 3, 4] eller [ jeg, du, vi, de, han, hun ]. Når løkken blir utført vil løkke-variablen bli tildelt en og en verdi fra sekvensen og for hver verdi utføres koden som står i <body>. F.eks. vil koden p r i n t ( i i ) skrive ut alle kvadrat-tallene opp til 100. Merk at hva som inngår i <body> bestemmes av hvordan ting er innrykket. Skriv inn og kjør følgende to metoder: def sum1 ( ) : sum = 0 sum = sum + i p r i n t ( i, sum) og def sum2 ( ) : sum = 0 sum = sum + i p r i n t ( i, sum) (Selvfølgelig kan du definere begge metoder i èn fil. Etter Run Module kan du bruke dem med henholdsvis sum1() og sum2().) Hva gjør programmene og hvorfor oppfører de seg ulikt? 3
Lag en metode med en løkke som skriver ut alle verdiene i en sekvens. Til slutt skal programmet skrive ut hvor mange elementer det var i sekvensen. Prøv metoden på sekvensen [ jeg, du, vi, de, han, hun ]. Det kan være tungvint å skrive inn lange sekvenser med heltall. Det finnes derfor en egen funksjon range() som returnerer en sekvens med tall. Skriver man range(a,b) der a og b er heltall med a<b så får man en sekvens med verdiene [a, a + 1, a + 2,..., b 1]. Skriver man range(a) der a er et positivt heltall får man sekvensen [0, 1, 2,..., a 1]. Skriver man range(a,b,c) får man en sekvens [a, a + c, a + 2c,..., a + kc] der k er maksimal slik at b ikke blir passert (!). I Python 3 trenger man funksjonen list() til å skrive ut sekvensen, f.eks., print(list(range(10))). Hvilke sekvenser får du når du skriver range(-4), range(4,4), range(10,4) og range(10,4,-1)? Lag et program som først spør brukeren hvor mange verdier hun vil ha konvertert fra kg til stones til pounds og deretter leser inn en og en verdi og konverterer. 4 Programmeringsoppgaver 4.1 Halvliteren Som ny og fersk student tar du opp maksimalt med lån fra Statens Lånekasse og finner straks veien til Det Akademiske Kvarter hvor du bestiller en kald skummende halvliter til 49 kr. Mens du sitter der begynner du å gruble på hva glasset egentlig koster deg. Alternativet hadde vært å spare de 49 kroner og betalt de tilbake til Lånekassen straks du var ferdig med siste eksamen og før rentene begynner å løpe. Det er imidlertid for seint nå. Lånet ditt skal betales tilbake over 20 år og med en rentesats på 5.8 %. De 49 kronene du har brukt på øl vil være de siste pengene du betaler inn på lånet ditt, du må derfor betale rente på dem i 20 år. Lag et dataprogram som regner ut hvor mye du må ut med i renter for å betale tilbake pengene du brukte på halvliteren. Modifiser programmet ditt slik at det kan lese inn verdiene som brukes fra tastaturet (beløp, løpetid, rentesats). 4.2 π For å få π kan man beregne Gregory-Leibniz serien: π = 4 k=0 ( 1) k 2k + 1 = 4 1 4 3 + 4 5 4 7.... Men siden vi verken har uendelig med tid eller uendelig med plass, må vi tilnærme verdien til noen desimaler. Lag et program som tilnærmer π og skriver ut verdien. Hint: bruk en variabel fortegn = 1 og i løkken fortegn = fortegn. Eksperimenter med programmet og prøv å finne ut av hvor mange ganger løkkekroppen må utføres for at π skal bli beregnet med en presisjon på to desimaler. Modifiser koden slik at programmet leser inn hvor mange ganger det skal gå gjennom løkken. For å avbryte python fortolkeren når det tar for lang tid trykker du <Ctrl-c> samtidig. 4
Les kapittel 1 og 2 i boken til neste forelesning. Det anbefales at du gjør øvelsene i kapitlene, men dette er ikke obligatorisk. 5