Läsning, skrivning, tangentbord, skärm. F6: Filhantering (kap. 8) Tabell på skärmen

Relevanta dokument
Läsning, skrivning, tangentbord, skärm. F6: Filhantering (kap. 8) Tabell på skärmen. save

Läsning, skrivning, tangentbord, skärm. F6: Filhantering (kap. 8) Tabell på skärmen. Tabell på skärmen, test

F5: Grafiska användargränssnitt (kap. 9 10) Vad är ett (grafiskt) användargränssnitt? Ett exempel: Enkel räknare

Grafiska objekt och egenskapslistor Grafikfunktioner returnerar en objektreferens. >> obj_r = quiver([0 1],[0 0],[1 0],[1 1],'o') obj_r = 111.

F5: Grafiska användargränssnitt (kap. 9 10) Vad är ett (grafiskt) användargränssnitt? Ett exempel: Enkel räknare

Enklast att skriva variabelnamn utan ; innehåll och variabelnamn skrivs ut

Numeriska Metoder och Grundläggande Programmering för P1, VT2014

F8: Resterna. Substitutionschiffer. Permutationer. ASCII och char. Substitutionschiffer (Lab 3) Permutationer Rekursion

Matlab-repetition. p 1 (25) Staffan Romberger, CSC, KTH,

F4: Datastrukturer (kap. 6 7) Komplexa tal Ö3: 5.2, 5.7, 5.14, 5.20

Föreläsning 12: Datastrukturer & filer

HI1024 Programmering, grundkurs TEN

Komplexa tal. F4 (5): Datastrukturer (kap. 6 7)

Föreläsning 13. In- och utmatning

Enkla datatyper minne

Objektorienterad programmering Föreläsning 11. Copyright Mahmud Al Hakim

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Filer och structer Del 2

5 Grundläggande in- och utmatning

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Deklarera en struct som kan användas för att representera en rät linje

TANA81: Simuleringar med Matlab

Programmeringsteknik med C och Matlab

Uppgifter till praktiska tentan, del A. (7 / 27)

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

TANA17 Matematiska beräkningar med MATLAB för M, DPU. Fredrik Berntsson, Linköpings Universitet. 4 december 2015 Sida 1 / 26

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Omtentamen i Programmering C, 5p, fristående, kväll,

TANA17 Matematiska beräkningar med MATLAB för M, DPU. Fredrik Berntsson, Linköpings Universitet. 8 december 2015 Sida 1 / 22

HI1024 Programmering, grundkurs TEN

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

[] Arrayer = Indexerad variabel

Objektorienterad Programmering (TDDC77)

Tentamen ges för: Tentamensdatum: Tid:

Språket Python - Del 2 Grundkurs i programmering med Python

MATLAB the Matrix Laboratory. Introduktion till MATLAB. Martin Nilsson. Enkel användning: Variabler i MATLAB. utvecklat av MathWorks, Inc.

Övning från förra gången: readword

Strängar. Strängar (forts.)

Strängar. Elektronikcentrum i Svängsta AB

Objektorienterad Programmering (TDDC77)

HI1024 Programmering, grundkurs TEN

Komponentvisa operationer,.-notation Multiplikation (*), division (/) och upphöj till (ˆ) av vektorer följer vanliga vektoralgebraiska

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Introduktion till Matlab

Villkor if, switch. F2: Styrstrukturer, programmeringsteknik (kap. 3 4) If-kommando forts. If-kommando forts.

Programmeringsteknik med C och Matlab

Övningsuppgift 2 Datalogi I 2I1027/2I1035/2I1046

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Datorlära 6. Arbeta med strängar Inmatning med tangentbordet Bygga ett program med inmatning, funktioner, osv

Funktioner forts. F3: Funktioner (kap. 5) Parametrar. findgear.m forts

Tentamen i Introduktion till programmering

F4 (5): Datastrukturer (kap. 6 7)

Tentamen i. Programmering i språket C

Filhantering. Grunderna i filhantering. Uppbyggnad av filer. Data hierarkin. Filpekaren. Positionering i filer

F2: Styrstrukturer, programmeringsteknik (kap. 3 4)

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Flyttal kan också hantera vanliga tal som både 16- och 32-bitars dataregister hanterar.

Användarhandledning Version 1.2

Innehåll. Vad är MATLAB? Grunderna i MATLAB. Informationsteknologi. Informationsteknologi.

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,

4.3. Programmering i MATLAB

Diagnostiskt Prov. Antaganden Om förutsättningar saknas I en uppgift skall rimliga antaganden göras och nedtecknas.

MMA132: Laboration 2 Matriser i MATLAB

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

TANA17 Matematiska beräkningar med Matlab

TAIU07 Matematiska beräkningar med MATLAB för MI. Fredrik Berntsson, Linköpings Universitet. 15 januari 2016 Sida 1 / 26

PROGRAMMERING-JAVA TENTAMINA

STRÄNGAR DATATYPEN. Om du vill baka in variabler eller escape-tecken måste du använda dubbla citattecken. strängar

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Tentamen OOP

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

Programmering i C++ EDA623 Strömmar och filer. EDA623 (Föreläsning 9) HT / 19

Programmering för språkteknologer II, HT2011. Rum

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Anteckningar 1: Grundläggande saker

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Objektorienterad programmering Föreläsning 4

KPP053, HT2015 MATLAB, Föreläsning 1. Introduktion till MATLAB Skript Inläsning och utskrift av variabler Ekvationssystem Anonyma funktioner

Villkor, if, switch. F2: Styrstrukturer, programmeringsteknik (kap. 3 4) If-kommando forts. If-kommando forts.

FÖRSLAG TILL LÖSNING AV Tentamen i Objektorienterad programmering C++ I

Uppgift 1 ( Betyg 3 uppgift )

Beräkningsvetenskap föreläsning 2

LABORATION 4 OBJEKTORIENTERAD PROGRAMMERING I C++ I

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

TDDC77 Objektorienterad Programmering

Tentamen i. för D1 m fl, även distanskursen. fredag 13 januari 2012

Programmering för språkteknologer I, VT2012. Rum

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Övningar i JavaScript del 4

Outline. I Vi kan lätt göra samma sak för fyra variabler... I Hur gör vi för 400 inlästa värden? I Ofta behöver man flera likadana variabler

Tentamen i Programmering grundkurs och Programmering C

KPP053, HT2016 MATLAB, Föreläsning 1. Introduktion till MATLAB Skript Inläsning och utskrift av variabler Ekvationssystem Anonyma funktioner

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Tentamen i. för D1 m fl, även distanskursen. lördag 19 januari 2013

Labora&on 2 Funk&oner, if och loop övningar/uppgi:er

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

Kurslitteraturen. C-nivå Villkorssatser [kap 8] if & elif & else and & or Loopar [kap 9] for

Transkript:

F6: Filhantering (kap. 8) Läsning från tangentbordet, skrivning på skärmen Binär skrivning och läsning med save och load Skrivning på och läsning från textfil med save och load Användning av filreferenser, öppna, stänga, filslut Binär skrivning och läsning med filreferens Skrivning och läsning med formatstyrning Direktfiler Läsning, skrivning, tangentbord, skärm Det finns många sätt att hämta och spara data. In från tangentbordet: med tilldelningskommando input(ledtext), input(ledtext,'s') Ut på skärmen: kommando utan ; variabelns namn skrivs också ut disp(uttryck) inget variabelnamn fprintf(formatsträng,uttryck, ) hur uttryckens värden skrivs styrs av formatkoder m.m. i formatsträngen Tabell på skärmen Skriv en tabell med rätvinkliga trianglar med heltalssidor <= 100. fprintf('\n a b c\n'); for c=1:100 c2 = c^2; for a=1:floor(sqrt(c2/2)) a2 = a^2; b = round(sqrt(c2-a2)); if a2+b^2==c2 fprintf('%5d%5d%5d\n',a,b,c);

save Ut på fil: save [variabellista] alla variabler i arbetsplatsen (eller angivna) binärt till filen matlab.mat save filnamn [variabellista] binärt till filen filnamn.mat save filnamn.suffix [variabellista] binärt till filen filnamn.suffix save -ascii [-double] [-tabs] som text till filen matlab.mat save filnamn [variabellista] -ascii [-double] [-tabs] som text till filen filnamn.mat save filnamn.suffix [variabellista] -ascii [-double] [-tabs] som text till filen filnamn.suffix med 8 siffror, -double ger 16 siffror, -tabs ger tabulatorseparerad utskrift load In från fil: load [variabellista] alla variabler (eller angivna) från matlab.mat binärt load -ascii alla data från matlab.mat som text till variabeln matlab load filnamn [variabellista] alla variabler (eller angivna) från filnamn.mat binärt load filnamn -ascii alla data från filnamn.mat som text till variabeln filnamn load filnamn.suffix [variabellista] [-ascii -mat] alla variabler (eller angivna) från filnamn.suffix värdena läses normalt binärt, med -ascii eller med suffix annat än mat läses alla data till variabeln filnamn (då används ej variabellistan) från filen som text Load forts. Med >> type in.dat 2 3 4 5 6 6 7 får man >> load in.dat??? Error using ==> load Number of columns on line 2 of ASCII file in.dat must be the same as previous lines. Filreferenser Användning av filreferens. Med en filreferens håller Matlab reda på filen, vad man får göra med den och var man jobbar i den. filreferens = fopen(filnamn,tillstånd) Tillstånd kan vara 'r', 'r+', 'w', 'w+', 'a', 'a+'. Om öppningen misslyckas blir filreferens 1 och ett felmeddelande lagras i variabeln msg. fclose(filreferens) Ev. utskrift avslutas. Filen stängs. Om det går bra återsänds 0 annars 1. feof(filreferens) sant om inga data återstår

Binär skrivning och läsning med filreferens Skrivning binärt med filreferens: fwrite(filreferens, uttryck, precision) där precision kan vara 'char', 'int16', 'float32' m.m. Läsning binärt med filreferens: [variabel,antal] = fread(filreferens, storlek, precision) antal är antalet lästa värden, storlek är ett tal, Inf eller [m n] och precision som ovan Skrivning och läsning med formatstyrning Skrivning som text med filreferens: fprintf(filreferens,formatsträng,uttryck, ) sprintf(formatsträng, uttryck, ) returnerar en sträng Läsning från textfil: [variabel1, variabel2,,variabeln] = textread(filnamn,formatsträng,radantal) läser kolumnuppdelade data Läsning från textfil med filreferens: variabel = fscanf(filreferens,formatsträng,storlek) [variabel,antal] = fscanf(filreferens,formatsträng,storlek) texten i filen tolkas som värden enligt formatsträng [variabel,antal] = sscanf(sträng,formatsträng,storlek) läser från sträng rad = fgetl(filreferens) texten fram till radslut, om filen står vid radslut återsänds -1 rad = fgets(filreferens) texten fram till och med radslut, om filen står vid radslut återsänds -1 Med >> type in.dat 2 3 4 5 6 6 7 8 9 10 får man >> [a, b, c]=textread('in.dat'); [a';b';c'] ans = 2 4 6 8 3 5 7 9 0 6 0 10 Med >>type s.dat ab c def ger s = fscanf(fopen('s.dat'),'%c') s = ab c def och abs(s) ans = 97 98 32 99 10 10 100 101 102

Formatsträng En formatsträng består av formatkoder, specialtecken och annan text. En formatkod har formen %[ + 0][#.#]k. % och k måste sättas ut. - vänsterställ + sätt alltid ut tecken 0 fyll ut med inledande nollor #. totalt antal tecken.# antal siffror/antal decimaler c ett tecken d decimalt heltal e exponentform med e E exponentform med E f decimalbråk g kortaste av e och f G kortaste av E och f o oktalt heltal s teckensträng u decimalt heltal utan tecken x sedecimalt (basen 16) med gemena siffror X sedecimalt (basen 16) med versala siffror Specialtecken är %% (representerar ett procenttecken), \' (apostrof), '' (apostrof), \\ (inverterat snedstreck), \f (sidmatning), \r (vagnretur), \b (blanktecken), \t (tabulatortecken), \n (ny rad). Uttrycken paras ihop med formatkoderna. När formatsträngen tar slut används den från början igen. När data tar slut används formatsträngen fram till nästa formatkod eller till sitt slut. Text och specialtecken skrivs ut resp. matchas mot tecknen i filen. Läs, lagra och skriv en textfil. fr = fopen('findgear.m','r') fr = 3 t = fscanf(fr,'%c',inf); disp(t); function [m,n,finalgear] = findgear(gear,min,max)... whos t Name Size Bytes Class t 1x865 1730 char array Läs en nx3 numerisk matris från textfil. Fyll ut sista raden. type t.dat 1 2 3 4 5 6 7 8 9 10 fr = fopen('t.dat','r') fr = 3 t = fscanf(fr,'%d',inf); size(t) ans = [10 1] % Fyll sista raden t = reshape([t; zeros(mod(-numel(t),3))],3,[])' % mod([-12-11 -10],3) är [0 1 2] t = 1 2 3 4 5 6 7 8 9 10 0 0 Med uigetfile och uisetfile kan man öppna dialogrutor för att välja in- och utfil. Man bör kontrollera om läsning och skrivning gick bra: [felmed,felnr] = ferror(filreferens); if felnr~=0 disp(felmed); Läs i boken och hjälpinformationen om filhantering.

Direktfiler Programmet kan styra var i filen läsning/skrivning ska ske: frewind(filreferens) sätter aktuell position till filbörjan ftell(filreferens) ger aktuell position i byte från filbörjan fseek(filreferens,pos,origo) sätter aktuell position till pos byte efter origo, origo 1 betyder filbörjan, 0 betyder aktuell position, 1 betyder filslut Funktion som parameter (function functions) I många tillämpningar har man en metod (function method) som man ska kunna använda metoden med många olika funktioner. 1 Funktion med bestämt namn Fil: use1.m function use1 method1; Fil: f1.m function f1(x) disp(['f1 x=' num2str(x)]); Fil: method1.m function method f1(x); >use1 f1 x=3 f1 x=6 f1 x=9 2a Uttryck som text Fil: use2a.m function use2a f = 'disp([''f2 x='' num2str(x)]);'; method2a(f); Fil: method2a.m function method2a(f) eval(f); >use2a f2 x=3 f2 x=6 f2 x=9 2b Funktionsanrop som text Fil: use2b.m function use2b f = 'f2b'; method(f); Fil: f2b.m function f2b(x) disp(['f2b x=' num2str(x)]); Fil: method2b.m function method(f) feval(f,x); >use2b f2b x=3 f2b x=6 f2b x=9

3a Enkel funktionsreferens (function handle) Fil: use3a.m >use3a function use3a f3a x=3 f=@f3a; f3a x=6 method3a(f); f3a x=9 Fil: f3a.m function f3a(x) disp(['f3a x='... num2str(x)];); Fil: method.m function method3a(f) feval(f,x); 3b Funktionsreferens med parameter Fil: use3b.m >use3b function use3b f3b x=3 y=5 for y = [5 10] f3b x=6 y=5 f = @(x)f3b(x,y); f3b x=9 y=5 method(f); f3b x=3 y=10 Fil: f3b.m f3b x=6 y=10 function f3b(x,y) f3b x=9 y=10 disp(['f3b x='... num2str(x) ' y='... num2str(y)]); Fil: method3b.m function method3b(f) feval(f,x); Bankkontoregister Vi har en posttabell, REG, med fälten: kontonummer, namn, ranta och saldo och en funktion saldo = trans(accountno, amount). Låt oss bygga ut hanteringen av detta register. Man kan bl.a. tänka sig följande kompletteringar: Skapa ett konto Ta bort konto Redigera konto, t.ex. namnbyte eller rättelse av fel Hantera ränta, ev. med särskild hantering av konton med underskott Låt oss börja med att ta bort ett konto. Funktionen kan ta kontonummer som inparameter, behöver inte returnera något, kan kommunicera med användaren och kan ha huvudet: function killaccount(accountno) Vi behöver göra det vi gjorde i trans, nämligen söka i registret efter en post med ett givet kontonummer. Då är det rimligt att göra funktionen regfind anropbar från både trans och killaccount. Vi flyttar alltså funktionen till en fil med namnet regfind.m: function index = regfind(accountno) % Sök en post i REG med kontonummer accountno % Returnera postens nummer % eller -1 om sådan post inte finns global REG for no = 1:numel(REG) if REG(no).kontonummer==accountno index = no; return; index = -1; I killaccount bör vi kontrollera indata, att det är en inparameter och att det är ett tal i tillåtet intervall. T.v. förutsätter vi att kontonummer ska ligga i intervallet 1..99 999. function killaccount(accountno)

% Om accountno är ett tillåtet kontonummer och % det finns ett konto med detta nummer tas posten % med detta nummer bort ur REG global REG accountno = accountno(1); if ~isnumeric(accountno) error('kontonumret är ej ett tal.'); elseif mod(accountno,1) error('kontonumret är ej ett heltal.'); elseif accountno<1 accountno>99999 error(['kontonumret ligger ej mellan 1 '... 'och 99999.']); recno = regfind(accountno); if recno==-1 error(['det finns inget konto med nummer '... num2str(accountno)]); else disp('ska följande konto dödas?'); fn = fieldnames(reg); for index = 1:numel(REG) disp([fn{index} ': '... getfield(reg(recno),fn{index})]); answer = input('svara ''J'' för ja: ','s'); if upper(answer)~='j' disp('kontot tas ej bort.'); else REG = REG([1:recno-1 recno+1:]); disp('kontot är dödat.'); Det skulle vara bra att kunna lagra även andra data än själva kontona i registret. Vi kan låta REG ha ett fält maxaccount som innehåller högsta tillåtna kontonummer och ett andra fält account som är kontoförteckningen. Vi kan göra en kommandofil som initierar ett testregister: % Initiera bankkontoregistret global REG REG.maxaccount = 99999; REG.account.kontonummer = 12357; REG.account.namn = 'Kloker'; REG.account.ranta = 2.2; REG.account.saldo = 200; REG.account(2).kontonummer = 314159; REG.account(2).namn = 'Trötter'; REG.account(2).ranta = 1.9; REG.account(2).saldo = 10500; Vi måste ändra på några ställen i trans och regfind: ändra alla REG till REG.account och ändra i killaccount till: accountno>reg.maxaccount, ' num2str(reg.maxaccount) ' och fn = fieldnames(reg.account); for index = 1:numel(fn) disp([fn{index} ': '... getfield(reg.account(recno),fn{index})]); answer = input('svara ''J'' för ja: ','s'); if upper(answer)~='j' disp('kontot tas ej bort.'); else REG.account = REG.account([1:recno-1... recno+1:]);

Registret är ju globalt så att det nås från alla funktioner där det är deklarerat globalt. Det försvinner dock när man avslutar Matlab. Vi kan spara registret på fil med save REG REG som sparar variabeln REG på filen REG.mat så att den kan hämtas med load REG. Härefter kan den intresserade läsaren göra andra tillägg till bankkontohanteringen. Avslutning av programmerigskursdelen Det finns mer i Matlab Ni kan fördjupa det ni redan har sett. Ni kan lära känna Matlabs verktygslådor. Ni kan lära er objektorienterad programmering med Matlab. Kursen fortsätter med Programmeringslaboration 2 och 3 Numeriska metoder inkl. laborationer Projektet Tentan Hur går du vidare? Använd Matlab i nummedelen och i andra kurser. Läs kursen Tillämpad datalogi (tilda).