Filbehandling Tekstfiler

Like dokumenter
Pensum: Starting out with Python

TDT4110 Informasjonsteknologi grunnkurs: Python: Repetisjon. Professor Alf Inge Wang

Dictionary er et objekt som lagrer en samling av data. Minner litt om lister men har klare forskjeller:

Læringsmål og pensum. Algoritmeeffektivitet

TDT4110 Informasjonsteknologi grunnkurs: Tema: Algoritmer i praksis. Professor Alf Inge Wang

Dictionary er et objekt som lagrer en samling av data. Minner litt om lister men har klare forskjeller:

Mål. Pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Filer og unntak (exceptions) Utgave 3: Kap. 6. Terje Rydland - IDI/NTNU

TDT4110 Informasjonsteknologi grunnkurs: Tema: Filer og unntak ( exceptions ) - 3rd edition: Kapittel 6. Professor Alf Inge Wang

Læringsmål og pensum. Inn- og utoperasjoner 21/10/16

Python: Rekursjon (og programmering av algoritmer) Python-bok: Kapittel 12 + teoribok om Algoritmer

Python: Filer og unntak Gaddis: Kapittel 6

Python: Filer og unntak Gaddis: Kapittel 6

Tirsdag 21/11. Onsdag 24/11. Tirsdag 12/12. TDT4110 Informasjonsteknologi grunnkurs: Tema: Et større case

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

TDT4110 Informasjonsteknologi grunnkurs: Kapittel 7 Filer og unntak ( exceptions ) Professor Alf Inge Wang Stipendiat Lars Bungum

Søkeproblemet. Gitt en datastruktur med n elementer: Finnes et bestemt element (eller en bestemt verdi) x lagret i datastrukturen eller ikke?

Mål. Pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Et større case. Terje Rydland - IDI/NTNU. Lære å lage større og sammensatte programmer

Mål. Pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Dictionaries og sets (mengder) Utgave 3: Kap. 9. Terje Rydland - IDI/NTNU

Med løkke: Læringsmål og pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Løkker/Sløyfer Utgave 3: Kap. 4 Utgave 2: Kap. 5. Mål.

TDT4110 Informasjonsteknologi grunnkurs: Eksempler. Mangekanter

Oppsummering fra sist

Datastrukturer for rask søking

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

TDT4110 Informasjonsteknologi grunnkurs: Tema: Dictionaries og mengder (sets) - Kapittel 9. Professor Alf Inge Wang

TDT4105 Informasjonsteknologi, grunnkurs. Mer om funksjoner: - rekursive funksjoner

Primtall. Et heltall p > 0 kalles et primtall hvis kun 1 og p går opp i p.

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

Øvingsforelesning 9 i Python (TDT4110)

Binærfiler versus tekstfiler

Løsningsforslag Kontinuasjonseksamen i TDT4110 Informasjonsteknologi - grunnkurs

TDT4105 Informasjonsteknologi, grunnkurs

TDT4110 Informasjonsteknologi grunnkurs: Tema: Lister og tupler. - 3rd edition: Kapittel 7. Professor Alf Inge Wang

MENGDER (SETS) Læringsmål og pensum. Kapittel 9.2

Palindrom - iterativt

Repetisjon, del 1. TDT 4110 IT Grunnkurs Professor Guttorm Sindre

Binære trær: Noen algoritmer og anvendelser

TDT4105 Informasjonsteknologi, grunnkurs

Python: Intro til funksjoner. TDT4110 IT Grunnkurs Professor Guttorm Sindre

TDT4110 IT Grunnkurs Høst 2014

O-notasjon og kompleksitet

TDT4110 Informasjonsteknologi grunnkurs: Programmering: En større case. Professor Alf Inge Wang

Læringsmål og pensum. En større case. Mål Lære å lage større og sammensatte programmer Pensum Kapitlene 1-9 og 12.

TDT4110 Informasjonsteknologi grunnkurs: Tema: Mer om strenger. - 3rd edition: Kapittel 8. Professor Alf Inge Wang

Definisjon av binært søketre

TDT4102 Prosedyreog objektorientert programmering Vår 2016

Euklids algoritmen. p t 2. 2 p t n og b = p s 1. p min(t 2,s 2 )

Repetisjon, del 2. TDT 4110 IT Grunnkurs Professor Guttorm Sindre

TDT4110 IT Grunnkurs Høst 2016

Største felles divisor. (eng: greatest common divisors)

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

Mattespill Nybegynner Python PDF

Mål. Pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Dictionaries og sets (mengder) Utgave 3: Kap. 9. Terje Rydland - IDI/NTNU

TDT4110 Informasjonsteknologi grunnkurs: Tema: Funksjoner med retur og moduler Utgave 3: Kap

INF2220: Forelesning 2

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

TDT4105 Informasjonsteknologi, grunnkurs. Introduksjon til programmering i Matlab

Alg. Dat. Øvingsforelesning 3. Grafer, BFS, DFS og hashing. Børge Rødsjø

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

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

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

Rekursjon. Binærsøk. Hanois tårn.

Læringsmål og pensum. Intro til returverdifunksjoner: Generering av tilfeldige tall 27/09/16

IN1000 Repetisjonskurs: IO og listeoperasjoner (+ string)

I dag skal vi ved hjelp av ganske enkel Python-kode finne ut om det er mulig å tjene penger på å selge og kjøpe en aksje.

IN1000 Obligatorisk innlevering 7

Prøveeksamen IN1000. IN Prøveeksamen. Dato november 2017 Tid 12:30-12:00 Alle trykte og skrevne hjelpemidler er tillatt.

TDT4110 Informasjonsteknologi grunnkurs: Tema: Mer om strenger Utgave 3: Kap. 8

IN Seminaroppgaver til uke 11

Øvingsforelesning 3: Splitt og hersk. Daniel Solberg

EKSAMEN med løsningsforslag

TDT4110 Informasjonsteknologi grunnkurs: Tema: Funksjoner med retur og moduler. - 3rd edition: Kapittel Professor Alf Inge Wang

INF2220: Time 12 - Sortering

Alg. Dat. Øvingsforelesning 3. Grafer, BFS, DFS og hashing

Søking i strenger. Prefiks-søking Naiv algoritme Knuth-Morris-Pratt-algoritmen Suffiks-søking Boyer-Moore-algoritmen Hash-basert Karp-Rabin-algoritmen

ITGK - H2010, Matlab. Repetisjon

Noen innebygde funksjoner - Vektorisering

Steg 1: Rest etter divisjon

Løsningsforslag Kontinuasjonseksamen i TDT4110 Informasjonsteknologi - grunnkurs

Læringsmål og pensum. Intro løkker. Mål Lære om begrepet løkker Lære om bruk av while-løkke Lære om bruk av for-løkke Pensum. Kapittel 4.

Kapittel 1 En oversikt over C-språket

Løse reelle problemer

Noen innebygde funksjoner - Vektorisering

INF1010 notat: Binærsøking og quicksort

Kjøretidsanalyse. Hogne Jørgensen

SIF8010 ALGORITMER OG DATASTRUKTURER

TDT4110 Informasjonsteknologi grunnkurs: Tema: Løkker. - 3rd edition: Kapittel 4. Professor Alf Inge Wang

Turingmaskiner.

Finne ut om en løsning er helt riktig og korrigere ved behov

Øvingsforelesning 5 Python (TDT4110)

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

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

Løsningsforslag Kontinuasjonseksamen i TDT4110 Informasjonsteknologi - grunnkurs

YouTube-kanal ITGK. Læringsmål og pensum

EKSAMEN. Algoritmer og datastrukturer

Innhold uke 8. Objekter: Bruk og intern organisering. Beskjeder: Oblig 1 6. Beskjeder: Oblig 7 (og 8)

Effektiv eksekvering av spørsmål

Programmering i C++ Løsningsforslag Eksamen høsten 2005

Del 1 En oversikt over C-programmering

Læringsmål og pensum. v=nkiu9yen5nc

Øvingsforelesning 1 Python (TDT4110)

Transkript:

1 Kunnskap for en bedre verden TDT4110 Informasjonsteknologi grunnkurs: Python: Repetisjon tekstfiler rekursjon Terje Rydland - IDI/NTNU 2 Filbehandling Tekstfiler

3 Prosessen for filoperasjoner i Python Filoperasjoner i Python gjøres i tre steg (uavhengig av om det er tekstfiler eller binærfiler): 1. Fila åpnes: Etablerer en link mellom filvariabelen og informasjonen lagret på disken. Filreferansen som peker til den fysiske fila på disk blir lagret i en variabel. Alle operasjoner mot fila må bruke denne variabelen som filreferanse. 2. Verdier leses fra og skrives til fila ved hjelp av filreferansen: Lesing: Data lagret i fil leses inn og lagres i variabler. Skriving: Data lagret i variabler skrives som data lagret i en fil. 3. Fila stenges. Etter at fila er stengt, kan man ikke lese eller skrive til fila. 4 Filhåndtering i Python Filkommandoer f = open( filnavn ) f = open( filnavn, tilgang ) f.read() f.read(n) f.readline() f.readlines() f.write(s) f.writelines(liste) f.seek(offset,fra_hvor) f.tell() f.close() Forklaring Åpner ei fil, returnerer filreferanse Åpner ei fil, med spesifisert tilgang. F.eks. w åpner ei fil for skriving (se neste side) Returnerer hele innholdet av fila Returnerer n karakterer av innholdet Returnerer neste linje (før \n) Returnerer hele innholdet av fila som ei liste Skriver strengen s til fil Skriver innholdet av liste av strenger til fil Forflytter filpekeren (index) i fila Returnerer posisjon til filpekeren i fila Stenger fila f representerer variabelen som tar vare på filpekeren

5 Søk igjennom stor fil Skriv funksjonen find_rate som har tre input-parametere, filname, check_rate, og acc. Funksjonen skal søke igjennom en fil som inneholder vekslingsrate mellom USD og NOK sammen med dato, og skrive ut til skjerm alle datoer der vekslingsraten i fila matcher med check_rate. Fila (USD_NOK.txt) har følgende format: 26.11.2013 6.1036 25.11.2013 6.1236... Parameteren acc brukes til å angi hvor mange siffer det avrundes til under sammenligning av vekslingsrater. Hver linje ser altså slik ut: '26.11.2013 6.1036\n' '25.11.2013 6.1236\n' etc... kode: find_rate.py 6 Exception... Utvid funksjonen find_rate slik funksjonen tåler klønete brukere: Hvis man kaller find_rate med et filnavn til ei fil som ikke finnes eller som ikke kan leses, så skal følgende skrives ut til skjermen: Feil: Finner ikke fila eller har ikke lesetilgang! Hvis man oppgir feil check_rate eller acc, f.eks. tekststrenger i stedet for tall, så skal følgende skrives ut til skjermen: Feil: Det er noe feil med argumentene! ) kode: find_rate_try.py

7 Rekursjon 8 Rekursjon Rekursiv funksjon kalles det når en funksjon kaller seg selv. Rekursive funksjoner brukes ofte i algoritmer for å lage elegante løsninger på problemer. For at en rekursiv funksjon ikke skal fortsette i det uendelige, er det viktig at argumentet til funksjonen endres slik at den en gang får en stopp verdi. rekursjon.py

9 NB Noe som kan løses rekursivt kan også alltid løses iterativt 10 Rekursjon til å kalkulere fakultet Fakultet til et tall beregnes på følgende måte: Hvis n=0 så er n!=1 Hvis n>0 så er n!=1 * 2 * 3 * * n For å lage en algoritme for fakultet må: Først finne delen som ikke er rekursiv (som ikke skal kalles på nytt): Hvis n = 0 så er n!=1 (denne er ikke avhengig av tidligere ledd) Resten er den rekursive delen som stegvis kan beskrives: Hvis n>0 så er fakultet(n) = n x fakultet(n-1) Dette er alt vi trenger for å lage en rekursiv funksjon for å beregne fakultet fakultet.py

11 fakultet.py 12 fakultet(4) 4*3*2*1*1 def fakultet(n): #antar positivt tall if(n==0): return 1 return n*fakultet(n-1) Illustrasjon fakultet(3) 3*2*1*1 def fakultet(n): #antar positivt tall if(n==0): return 1 return n*fakultet(n-1) fakultet(2) 2*1*1 def fakultet(n): #antar positivt tall if(n==0): return 1 return n*fakultet(n-1) fakultet(1) 1*1 def fakultet(n): #antar positivt tall if(n==0): return 1 return n*fakultet(n-1) fakultet(0) 1 def fakultet(n): #antar positivt tall if(n==0): return 1 return n*fakultet(n-1)

13 Rekursivt fakultet.py Iterativt 14 Binærsøkealgoritmen Binærsøkealgoritmen fungere på samme måte som vi kan spille gjettespillet fra uke 39. Gjetter på den midterste verdien, og fjerner dermed halvparten av mulighetene for hver gjetting. gjettespill.py

15 Illustrasjon av binærsøk Finnes 17 i listen? indeks 0 1 2 3 4 5 6 7 8 9 verdi 1 2 3 9 11 13 17 25 57 90 15 Illustrasjon av binærsøk Finnes 17 i listen? indeks 0 1 2 3 4 5 6 7 8 9 verdi 1 2 3 9 11 13 17 25 57 90 Sjekk det midterste elementet. (0 + 9)//2 -> 4, altså a(4)

15 Illustrasjon av binærsøk Finnes 17 i listen? indeks 0 1 2 3 4 5 6 7 8 9 verdi 1 2 3 9 11 13 17 25 57 90 Sjekk det midterste elementet. (0 + 9)//2 -> 4, altså a(4) 17 > a(4) Sjekk da det midterste elementet mellom a(5) og a(9) (5 + 9)//2 -> 7 15 Illustrasjon av binærsøk Finnes 17 i listen? indeks 0 1 2 3 4 5 6 7 8 9 verdi 1 2 3 9 11 13 17 25 57 90 Sjekk det midterste elementet. (0 + 9)//2 -> 4, altså a(4) 17 > a(4) Sjekk da det midterste elementet mellom a(5) og a(9) (5 + 9)//2 -> 7 17 < a(7) Sjekk da det midterste elementet mellom a(5) og a(7) (5 + 7)//2 -> 6

15 Illustrasjon av binærsøk Finnes 17 i listen? indeks 0 1 2 3 4 5 6 7 8 9 verdi 1 2 3 9 11 13 17 25 57 90 Sjekk det midterste elementet. (0 + 9)//2 -> 4, altså a(4) 17 > a(4) Sjekk da det midterste elementet mellom a(5) og a(9) (5 + 9)//2 -> 7 17 < a(7) Sjekk da det midterste elementet mellom a(5) og a(7) (5 + 7)//2 -> 6 17 == a(6) 17 finnes i listen 16 Rekursiv algoritme for binærsøk bin_search(liste, verdi, min, max) hvis max < min Returner ikke funnet verdi hvis ikke midtpunkt = midtpunkt(min,max) hvis verdi < liste[midtpunkt] returner bin_search(liste,verdi,min,midtpunkt-1) hvis verdi > liste[midtpunkt] returner bin_search(liste,verdi,midtpunkt+1,max) hvis ikke returner midtpunkt binary_search.py

17 binary_search.py 18 Karakteristikker av binærsøk

18 Karakteristikker av binærsøk Hva er best-case? Treffer på midten første gang Tidsbruk: Ω(1) 18 Karakteristikker av binærsøk Hva er best-case? Treffer på midten første gang Tidsbruk: Ω(1) Hva er worst-case? Halverer lista helt til det er ett element igjen Tidsbruk: O(log n)

18 Karakteristikker av binærsøk Hva er best-case? Treffer på midten første gang Tidsbruk: Ω(1) Hva er worst-case? Halverer lista helt til det er ett element igjen Tidsbruk: O(log n) Kan sekvensielt søk være raskere enn binærsøk? Ja hvis sekvensielt søk treffer tidlig i lista 18 Karakteristikker av binærsøk Hva er best-case? Treffer på midten første gang Tidsbruk: Ω(1) Hva er worst-case? Halverer lista helt til det er ett element igjen Tidsbruk: O(log n) Kan sekvensielt søk være raskere enn binærsøk? Ja hvis sekvensielt søk treffer tidlig i lista Begrensninger på binærsøk: Lista må være sortert (pre-prosessert)

19 Graf over worst-case analyse av binært søk 20 GCD - Greatest Common Divisor Euclids algoritme bruker divisjon og observasjonen at GCD mellom 2 tall er også en faktor i forskjellen mellom tallene gcd(48,18) divider 48 med 18. Dette gir 2 med en rest på 12 divider 18 med 12. Dette gir 1 med rest 6. divider 12 med 6. Dette gir en rest på 0, hvilket betyr at 6 er gcd. Euclids algoritme for å finne største fellesnevner for 2 tall skrevet litt mer formelt: gcd(a,0) = a gcd(a,b) = gcd(b, a mod b)

21 Som Python-program Rekursivt Iterativt 22 Eks - tallene 18 og 48 gcd(48,18) return gcd(18,12) 6 return gcd(12, 6) def gcd(x,y) x = 48, y = 18 if x % y == 0: return y return gcd(y, x % y) def gcd(x,y) x = 18, y = 12 if x % y == 0: return y return gcd(y, x % y) def gcd(x,y) x = 12, y = 6 if x % y == 0: return y return gcd(y, x % y)

22 Eks - tallene 18 og 48 gcd(48,18) return gcd(18,12) return gcd(12, 6) 6 def gcd(x,y) x = 48, y = 18 if x % y == 0: return y return gcd(y, x % y) 48 % 18!= 0, så gcd blir kalt med verdiene 18 og 12 Som så returneres til kallende funksjon def gcd(x,y) x = 18, y = 12 if x % y == 0: return y return gcd(y, x % y) 18 % 12!= 0, så gcd blir kalt med verdiene 12 og 6 12 % 6 == 0, så verdien 6 blir returnert def gcd(x,y) x = 12, y = 6 if x % y == 0: return y return gcd(y, x % y)