Høst 2014. Øving 5. 1 Teori. 2 Månedskalender. Norges teknisknaturvitenskapelige universitet Institutt for datateknikk og informasjonsvitenskap



Like dokumenter
TDT4105 IT Grunnkurs Høst 2014

TDT4105 IT Grunnkurs Høst 2014

TDT4105 IT Grunnkurs Høst 2012

TDT4102 Prosedyre og Objektorientert programmering Vår 2014

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

TDT4102 Prosedyreog objektorientert programmering Vår 2016

TDT4102 Prosedyre og Objektorientert programmering Vår 2014

Øvingsforelesning TDT4105 Matlab

Enarmet banditt Nybegynner Scratch Lærerveiledning

Utførelse av programmer, metoder og synlighet av variabler i JSP

TDT4110 IT Grunnkurs Høst 2012

TDT4105 IT Grunnkurs Høst 2014

TDT4105 IT Grunnkurs Høst 2016

TDT4102 Prosedyreog objektorientert programmering Vår 2016

Utførelse av programmer, funksjoner og synlighet av variabler (Matl.)

BOKMÅL Side 1 av 5. KONTERINGSEKSAMEN I FAG TDT4102 Prosedyre og objektorientert programmering. Onsdag 6. august 2008 Kl

TDT4105 IT Grunnkurs Høst 2014

Ta kontakt i pausen. Viktig at vi kommer i gang med dette arbeidet!

Kanter, kanter, mange mangekanter

MAT1030 Diskret matematikk

TDT4102 Prosedyreog objektorientert programmering Vår 2016

Løse reelle problemer

TDT4105 Informasjonsteknologi grunnkurs Øvingsforelesning 2. Iver Dihle Skjervum Vit.ass. ITGK

Matematikk Øvingsoppgaver i numerikk leksjon 3. Løsningsforslag

Øvingsforelesning TDT4105

Leksjon 3. Kontrollstrukturer

TDT4110 IT Grunnkurs Høst 2016

Dagens tema: 12 gode råd for en kompilatorskriver. Sjekking av navn. Lagring av navn. Hvordan finne et navn?

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

[Kurssidene] [ ABI - fagsider bibin ] Michael Preminger (michaelp@hio.no) 07/ Vi holder orden på verdier med hjelp av variabler

Python: Oppslagslister (dictionaries) og mengder 3. utgave: Kapittel 9

ITGK - H2010, Matlab. Repetisjon

TDT4105 Informasjonsteknologi, grunnkurs. Introduksjon til programmering i Matlab. Rune Sætre / Anders Christensen {satre, anders}@idi.ntnu.

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Matematikk Øvingsoppgaver i numerikk leksjon 5 Skript

Verden - Del 2. Steg 0: Oppsummering fra introduksjonsoppgaven. Intro

Øvingsforelesning 5 Python (TDT4110)

Obligatorisk oppgave nr. 3 (av 4) i INF1000, våren 2006

TDT4102 Prosedyre og Objektorientert programmering Vår 2014

TDT4110 IT Grunnkurs Høst 2015

TDT4102 Prosedyre og Objektorientert programmering Vår 2015

Kapittel og 5. september Institutt for geofag Universitetet i Oslo. GEO En Introduksjon til MatLab. Kapittel 4.

Introduksjon til beslutningsstrukturer

Oblig4 - obligatorisk oppgave nr. 4 (av 4) i INF1000

Husk at du skal ha to vinduer åpne. Det ene er 'Python Shell' og det andre er for å skrive kode i.

Øvingsforelesning 5 Python (TDT4110)

EKSAMEN I FAG TDT4100 Objekt-orientert programmering. Fredag 3. juni 2005 KL

Løsningsforslag Kontinuasjonseksamen i TDT4110 Informasjonsteknologi - grunnkurs

INF1000 Metoder. Marit Nybakken 16. februar 2004

Øvingsforelesning TDT4105 Matlab

Øvingsforelesning i Python (TDT4110)

Skilpaddefraktaler Erfaren Python PDF

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I

Ordliste. Obligatorisk oppgave 1 - Inf 1020

<?php. count tar en array som argument, og returnerer et tall som uttrykker antallet innførsler i arrayen.

Løsningsforslag Kontinuasjonseksamen i TDT4110 Informasjonsteknologi - grunnkurs

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

TDT4110 IT Grunnkurs Høst 2016

Øvingsforelesning 1 Python (TDT4110)

TOD063 Datastrukturer og algoritmer

TDT4110 Informasjonsteknologi, grunnkurs Uke 35 Introduksjon til programmering i Python

TDT4110 Informasjonsteknologi grunnkurs: Tema: Betingelser og logiske uttrykk Utgave 3: Kap. 3

Læringsmål og pensum. if (be): else (not_to_be):

Shellscripting I. Innhold

Universitetet i Bergen Det matematisk-naturvitenskapelige fakultet Institutt for informatikk

if (be): else (not_to_be): TDT4110 Informasjonsteknologi grunnkurs: Tema: Betingelser og logiske uttrykk Utgave 3: Kap.

TDT4105 Informasjonsteknologi, grunnkurs MatLab: Filbehandling - load, save, type - fopen, fgetl, feof, fprintf, fclose

Prosjektoppgave, FYS-MEK1110 V06 ROBERT JACOBSEN

TDT Prosedyre- og objektorientert programmering

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

TDT4110 Informasjonsteknologi grunnkurs: Tema: Betingelser og logiske uttrykk. - 3rd edition: Kapittel 3. Professor Alf Inge Wang

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

MAT1030 Diskret Matematikk

Systemutvikling (Software Engineering) TDT 4110 IT Grunnkurs Professor Guttorm Sindre

TDT4110 IT Grunnkurs Høst 2014

Hemmelige koder. Kodeklubb-koden. Steg 1: Alfabetet. Sjekkliste. Introduksjon

Læringsmål og pensum. Oversikt

Eksamensoppgaver 2014

Spøkelsesjakten. Introduksjon

TDT4105 Informasjonsteknologi grunnkurs: Uke 42 Strenger og strenghåndtering

Straffespark Introduksjon Scratch Lærerveiledning

Øvingsforelesning i Matlab TDT4105

Verden - Del 2. Intro. Skrevet av: Kine Gjerstad Eide

Mål. Pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Unntak (exceptions) (Kap 6) Dictionaries (Kap. 9) Terje Rydland - IDI/NTNU

HØGSKOLEN I SØR-TRØNDELAG

Bruk av oppgaver og grupper i

INF1000 Eksamen 2014 (modifisert)

MAT1030 Plenumsregning 1

Tabellen viser en serie med verdier for den uavhengige variabelen, og viser den tilhørende verdien til den avhengige variabelen.

Tre på rad mot datamaskinen. Steg 1: Vi fortsetter fra forrige gang. Sjekkliste. Introduksjon

Brukermanual for statistikk på Asset on web: Statistikk salg pr dag, uke eller måned fordelt på alle avdelinger:

Noen innebygde funksjoner - Vektorisering

Redd verden. Steg 1: Legg til Ronny og søppelet. Sjekkliste. Introduksjon

Noen innebygde funksjoner - Vektorisering

TDT4110 IT Grunnkurs Høst 2017

Soloball. Steg 1: En roterende katt. Sjekkliste. Test prosjektet. Introduksjon. Vi begynner med å se på hvordan vi kan få kattefiguren til å rotere.

Informasjon Prøveeksamen i IN1000 høsten 2018

TDT4110 IT Grunnkurs Høst 2014

I denne oppgaven blir du introdusert for programmeringsspråket JavaScript. Du skal gjøre den klassiske oppgaven Hei verden, med en katt.

TDT4110 Informasjonsteknologi grunnkurs: Uke 41: «Matlab programs» (kapittel 6)

Transkript:

TDT4105 IT Grunnkurs Høst 2014 Norges teknisknaturvitenskapelige universitet Institutt for datateknikk og informasjonsvitenskap Øving 5 1 Teori a) Hva er den binære ASCII-verdien av bokstaven E (stor e)? Hva er den i titallssystemet? b) Bruk ASCII tabellen til å oversette følge til bokstaver: 01001101 01000001 01010100 01001100 01000001 01000010 c) Hva er metadata? 2 Månedskaler I denne øvingen skal du implementere funksjonen printcalar. Funksjonen skal vise en gyldig månedskaler, gitt et månednummer og et år som parameter. Her er et forslag til utskrift for oktober 2014: Oktober 2014 ma ti on to fr lø sø 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 For å kunne skrive denne funksjonen trenger vi å denere ere hjelpefunksjoner som løser delproblemer, på veien til den elige løsningen. Hvis du vil ha en ekstra utfordring, kan du prøve å dele opp problemet selv, og løse øvingen uten å se på resten av oppgavene. Men du må uansett gjøre oppgave 3a. Når du gjør denne øvingen, kan det være smart å se på kaler.no for å kunne sjekke verdiene du får ut av funksjonene du lager. For å løse oppgaven er det som nevnt viktig å dele opp problemet. Hvis man ser på utskriften kan man se at denne har tre deler: 1. Månedsnavn og årstall (første rad) 2. Dagsnavn (andre rad) 3. Datoer for alle dager på riktig plass (tredje til syve rad) Punkt 1) her er ganske greit. Tatt parameterene månedsnummer og år i betraktning, trenger man her kun å gjøre et månedsnummer om til et månedsnavn, og så kan printcalar skrive ut resultatet. a) I len getmonthname.m nner du hjelpefunksjonen getmonthname, som tar inn et månedsnummer som parameter og returnerer navnet på måneden. Skriv et skript som tester denne funksjonen, kalt getmonthnametest.m. (Vedlegget viser en litt mer avansert måte å teste funksjoner på) For punkt 2) trenger vi ikke å lage noen hjelpefunksjoner, siden dagsnavnene alltid er de samme. Side 1 av 6

3 Kodeforståelse På punkt 3) er det desto mer jobb som må gjøres. Ved å se på utskriften kan man legge merke til at den ser ut som en matrise med tall. Dette er en n måte å representere datoene på, og vi velger en 7x6 matrise hvor kolonnene representerer ukedager og radene uker. For eksempel slik for oktober 2014: month = 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 0 0 Tallet 0 representerer dager som ikke nnes i måneden. Neste steg er å denere en funksjon som lager denne matrisen. Det gjør følge funksjon. function calar = getcalar ( year, month ) startday = getmonthstartday ( year, month ); numdays = daysinmonth ( year, month ); calar = zeros ( 6, 7 ); date = 0; for week = 1:6 for day = 1:7 if ( date == 0 ) if ( week == 1 && day == startday ) date = 1; else if ( date < numdays ) date = date + 1; else date = 0; calar ( week, day ) = date ; Her returnerer funksjonen daysinmonth antall dager i måned, getmonthstartday returnerer nummeret på den første ukedagen i måneden (1 = Mandag, 2 = Tirsdag,..., 7 = Søndag). I eksempelet med oktober 2014, returnerer daysinmonth 31 og getmonthstartday 3. Side 2 av 6

a) Gitt at startday = 3 og numdays = 31. Gå gjennom funksjonen over og skriv ned verdien til variablene week, day og date for hver iterasjon i den indre for-løkken. Iterasjon week day date 1 1 1 0 2..................... 42......... 4 Hjelpefunksjoner Legg inn funksjonen getcalar (ligger vedlagt i len getcalar.m). For at denne funksjonen skal kunne kjøre, trenger vi altså å denere funksjonene daysinmonth og getmonthstartday. I øving 3 lagde du førstnevnte funksjon, så det skal du slippe å gjøre igjen. For å løse denne oppgaven må den ta hensyn til skuddår. Du kan bruke lene daysinmonth.m og isleapyear.m For å kunne denere funksjonen getmonthstartday trenger vi først å vite hvilken dag året starter på. a) Lag funksjonen getyearstartday. Funksjonen skal ta inn et årstall som parameter og returnere hvilken ukedag året starter på (1 = Mandag, 2 = Tirsdag,..., 7 = Søndag). Tips: Året 1900 startet på en mandag. For hvert år ytter startdagen seg med en dag. Det vil si at 1901 startet på en tirsdag. Hvis året er et skuddår, ytter startdagen i neste år seg med to dager. For å teste denne funksjonen kan du kjøre følge skript: getyearstartday ( 1900) % skal skrive ut 1 getyearstartday ( 1901) % skal skrive ut 2 getyearstartday ( 1902) % skal skrive ut 3 getyearstartday ( 1903) % skal skrive ut 4 getyearstartday ( 1904) % skal skrive ut 5 getyearstartday ( 1905) % skal skrive ut 7 getyearstartday ( 1906) % skal skrive ut 1 getyearstartday ( 2012) % skal skrive ut 7 b) Lag funksjonen getmonthstartday. Den skal ta inn et årstall og et månedsnummer som parameter (1 = Januar, 2 = Februar,..., 12 = Desember). Funksjonen skal returnere hvilken ukedag måneden starter på (1 = Mandag, 2 = Tirsdag,..., 7 = Søndag). getmonthstartday (2012, 0) % skal skrive ut 0 getmonthstartday (2012, 1) % skal skrive ut 7 getmonthstartday (2012, 2) % skal skrive ut 3 getmonthstartday (2012, 3) % skal skrive ut 4 getmonthstartday (2012, 4) % skal skrive ut 7 getmonthstartday (2012, 5) % skal skrive ut 2 getmonthstartday (2012, 6) % skal skrive ut 5 getmonthstartday (2012, 7) % skal skrive ut 7 getmonthstartday (2012, 8) % skal skrive ut 3 getmonthstartday (2012, 9) % skal skrive ut 6 getmonthstartday (2012, 10) % skal skrive ut 1 getmonthstartday (2012, 11) % skal skrive ut 4 getmonthstartday (2012, 12) % skal skrive ut 6 getmonthstartday (2012, 13) % skal skrive ut 0 Side 3 av 6

5 Utskriftfunksjoner Nå har vi laget alle funksjonene vi trenger for å regne ut riktige verdier. Da er det bare utskrift som er igjen. For å ha god kontroll på hvordan utskriften ser ut, bruker vi fprintf, som gir oss mulighet til å formatere den akkurat som vi vil. Man kaller på funksjonen slik: a = 1; % en variabel med et heltall b = 2; % en variabel med et heltall fprintf ( ' dette er et tall : %d, det er dette ogsaa : %d\n ', a, b); Denne koden skriver ut 'dette er et tall: 1, det er dette ogsaa: 2' og et linjeskift til skjermen. %d betyr: her skal det settes inn et tall. \n betyr: her skal det settes inn et linjeskift. Det må være like mange %d tegn i kontrollstrengen (parameter 1) som det er parametre etterpå. I eksempelet er det to %d og to ekstra parameter. Siden det å skrive ut punkt 3 er litt mer komplisert enn å skrive ut punkt 1 og 2, lønner det seg å skille dette ut i en egen funksjon. a) Lag funksjonen printdays. Den skal ta inn matrisen som funksjonen i oppgave 3 lager som parameter, og skrive ut datoene som vist i toppen av øvingen. Denne funksjonen skal ikke returnere noen verdi. Funksjonshodet kan dermed se slik ut: function printdays ( days ) b) Lag funksjonen printcalar. Denne skal ta inn år og månedsnummer som parameter, og kalle på getmonthname og getcalar. Deretter skal den skrive ut de to første linjene av kaleren og kalle printdays slik at den skriver ut resten. Denne funksjonen skal ikke returnere noe. 6 Du er som alle rasjonelle (?) mennesker meget bekymret hver gang det er fredag 13. Du ønsker derfor å lage en funksjon som sjekker hvilke måneder i løpet av et gitt år som inneholder en fredag 13. Funksjonen skal ta inn et årstall og returnere en liste med 12 verdier, én for hver måned, som angir hvorvidt den måneden inneholder en fredag 13. For eksempel skal hasfriday13(2014) returnere følge liste: [0 0 0 0 0 1 0 0 0 0 0 0], siden 13. juni 2014 er en fredag (6. elementet i listen). Her angir altså 0 og 1 den boolske verdien false og true, henholdsvis. 1 Vedlegg: Testing (ikke pensum) En mer grundig og enklere måte å teste en funksjon på er ved å bruke funksjonen assert. Den har blandt annet følge funksjonshoder: Side 4 av 6

assert ( utrykk ); assert ( utrykk, feilmelding ); Hvor utrykk er et boolsk utrykk (altså noe som er true eller false) og feilmelding er en tekststreng som forteller hva som er feil. Assert er ikke som vanlige funksjoner. Dens oppgave er å sjekke om utrykket er true, hvis ikke stopper den programmet med en gang og skriver ut feilmeldingen. Den kan for eksempel brukes slik: assert ( 1 + 1 == 2, ' 1 + 1 er ikke lik 2 '); Tankegangen her er at hvis 1 + 1 ikke er lik 2 så kommer sannsynligvis ikke resten av programmet til å oppføre seg som det skal, så det er best avslutte med en gang og gi beksjed om hva som er feil. Dette kan vi bruke på følge måte: Gitt funksjonen i oppgave 2a, hvis den ikke returnerer riktig navn for alle månedene så kommer ikke printcalar til å vise riktig månedsnavn heller. Da kan vi lage et skript med følge setninger. assert ( strcmp ( getmonthname (0), ' Ikke en gyldig maaned '), ' getmonthname (0) skriver ikke ut riktig verdi '); assert ( strcmp ( getmonthname (1), ' Januar ' ), ' getmonthname (1) skriver ikke ut Januar ' ); assert ( strcmp ( getmonthname (2), ' Februar ' ), ' getmonthname (2) skriver ikke ut Februar ' ); assert ( strcmp ( getmonthname (3), ' Mars ' ), ' getmonthname (3) skriver ikke ut Mars ' ); assert ( strcmp ( getmonthname (4), ' April ' ), ' getmonthname (4) skriver ikke ut April ' ); assert ( strcmp ( getmonthname (5), ' Mai ' ), ' getmonthname (5) skriver ikke ut Mai ' ); assert ( strcmp ( getmonthname (6), ' Juni ' ), ' getmonthname (6) skriver ikke ut Juni ' ); assert ( strcmp ( getmonthname (7), ' Juli ' ), ' getmonthname (7) skriver ikke ut Juli ' ); assert ( strcmp ( getmonthname (8), ' August ' ), ' getmonthname (8) skriver ikke ut August ' ); assert ( strcmp ( getmonthname (9), ' September ' ), ' getmonthname (9) skriver ikke ut September ' ); assert ( strcmp ( getmonthname ( 10), ' Oktober ' ), ' getmonthname ( 10) skriver ikke ut Oktober ' ); assert ( strcmp ( getmonthname ( 11), ' November ' ), ' getmonthname ( 11) skriver ikke ut November ' ); assert ( strcmp ( getmonthname ( 12), ' Desember ' ), ' getmonthname ( 12) skriver ikke ut Desember ' ); assert ( strcmp ( getmonthname ( 13), ' Ikke en gyldig maaned '), ' getmonthname ( 13) skriver ikke ut riktig verdi '); Her brukes strcmp for å sammenligne to tekststrenger, den returnerer 1 (altså true) hvis tekststrengene er identiske og 0 hvis ikke. Det ne med denne måten å teste på, er at når man er ferdig med å skrive testen, så slipper man den manuelle delen ved å teste. Skriptet kan kjøres for eksempel hver gang du gjør en liten ring i funksjonen. På den måten får du direkte tilbakemelding på hva som fungerer og ikke i funksjonen. Den gir i tillegg tilbakemelding kun på hva som er feil og ikke hva som er riktig. Side 5 av 6

En enkel måte å utvide funksjonaliteten til assert på er å skrive assertequal. (Denne versjonen fungerer kun for tall) function assertequal ( actual, expected ) assert ( actual == expected, ' Expected % d to be equal to % d ', actual, expected ); Da kan isleapyear testes slik: assertequal ( isleapyear ( 2000), 1) ; assertequal ( isleapyear ( 1900), 0) ; assertequal ( isleapyear ( 2004), 1) ; assertequal ( isleapyear ( 2001), 0) ; Intill videre kan det være greit å lage et skript som tester en funksjon, og hvis funksjonen ligger i len foo.m så kan testene ligge i len footest.m. Du kan nå skrive om all testkoden i denne øvingen ved hjelp av denne metoden. Side 6 av 6