Deklarera en struct som kan användas för att representera en rät linje Använd den I main för att deklarera en variabel som du initierar så att den representerar.

Slides:



Advertisements
Liknande presentationer
Föreläsning 9 Programmeringsteknik och Matlab 2D1312/2D1305
Advertisements

INTRODUKTION TILL PROGRAMMERING
Array Skriv ett program som frågar följande: ”Hur många tal vill du mata in?” användaren matat in ett tal t.ex n. då frågar programmet n ggr följande.
void hittaMax(int tal[], int antal, int *pmax) { int i; ??=tal[0]; for(i=1;i??) ??=tal[i]; } int main() { int v[]={1,2,3,4,2}; int.
Jonny Karlsson PROCESSPROGRAMMERING Föreläsning 1 ( ) Innehåll: -Introduktion av kursen -Program och processer -Fildeskriptorer -Filhantering.
Anders Sjögren Lagringsklasser •en variabel i C har två attribut –type( int, float, char..... ) –lagringsklass( auto, extern, register, static ) •lagringsklassens.
Programstruktur: C för enchipsdatorer
Funktioner och programorganisation
2D1311 Programmeringsteknik med PBL
De fundamentala datatyperna
#include void fun(char s[]) { int i=-1; while(s[++i]!=0) { if('a'
Filhantering Grundprincipen för filhantering Öppna filen
Tentamensdags och lab 3…. Större program delas normalt upp i flera filer/moduler vilket har flera fördelar:  Programmets logiska struktur när man klumpar.
C-programmering ID120V William Sandqvist Länkad lista
Välkommen Vahid Mosavat
Programmeringsteknik för K och Media
Programmeringsteknik K och Media
Föreläsning 2 Datalogi för E1 2D1343
Föreläsning 5 Python: argument från kommando-tolken
Föreläsning 2 Primitiva datatyper Variabler och konstanter Tilldelning Inläsning Operatorer Villkorssatsen if Slingor: while och for.
Strömmar Vid läsning och skrivning används något som kallas strömmar.
Föreläsning 5.  Idag  Kap 7 i Dawson  Filer  Felhantering med try…except.
Tentamensdags och lab 3…. Större program delas normalt upp i flera filer/moduler vilket har flera fördelar:  Programmets logiska struktur när man klumpar.
Anders Sjögren Selektion i C ”vägval” if och switch - satserna.
Föreläsning 11 Arrayer.
Ali Ghodsi Variabler En variabel är en sorts behållare som man kan placera data i Man måste ange typ och namn för alla variabler.
Pointers. int a=5; int f(int b) { a--; b++; return b; } int main() { int a=3; printf("%d,",f(a)); printf("%d",a); return 0; }
Föreläsning 4 Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö.
Föreläsning 2 Kort Översikt Över Javaspråket. Källkodsformat Unicode används åäöμψζ tillåtna Inte alla miljöer klarar av det Källkod Bytekod Java VM för.
Jonny Karlsson PROCESSPROGRAMMERING Föreläsning 4 ( ) Innehåll: -Programmerade rörledningar -Namngivna rörledningar.
William Sandqvist C:s minnesmodell.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 4 ( ) INNEHÅLL: -Logiska opertorer -Poster.
Programspråk Två olika typer av program omvandlar högnivå till lågnivå program: Interpreterande program och kompilerande program. Python är ett interpreterande.
Funktioner, styrstrukturer, manipulering av matriser
Problemlösning Veckodagsproblemet Gissa talet Siffersumman.
Mitt första Java program Mahmud Al Hakim Copyright, Mahmud Al Hakim, 1.
Modulär programutveckling
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 8 ( ) INNEHÅLL:Klasser: -Konstruktorer -Klassvariabler -Instansmetoder -Privata.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Metoder -Lokala variabler -Mera om klasser: -Nyckelorden.
Föreläsning 14 ”Enkel” Filhantering.
1 Föreläsning 6 Programmeringsteknik och Matlab 2D1312/2D1305 Metoder & parametrar Array API och klassen ArrayList.
1 Föreläsning 5 Programmeringsteknik och Matlab 2D1312/2D1305 Repetition Metoder Array API och klassen ArrayList.
Namnrum, räckvidd och rekursion Linda Mannila
William Sandqvist Databuffer Omvandlar mellan olika storlekar på dataobjekt Anpassar mellan olika dataöverföringshastigheter Databuffer.
Föreläsning 1 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
Jonny Karlsson PROCESSPROGRAMMERING Föreläsning 2 ( ) Innehåll: -Processtruktur -Processklyvning och kodbyte -Avslutning av processer.
INTRODUKTION TILL PROGRAMMERING
Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 11 C# I/O Streams C# använder “strömmar” för in- och utmatningsoperationer.
Anders Sjögren Bitfält exempel Nu kommer ett förbättrat program. Det är funktions- uppdelat och kan lägga till poster som lagras på fil.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 2 ( ) INNEHÅLL: -Variabler och datatyper -Tilldelning av variabler -Aritmetiska.
Problemlösningsmetodik
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 3 ( ) INNEHÅLL: -Tabeller -Villkorssatser -Repetitionssatser.
F4 - Funktioner & parametrar 1 Programmeringsteknik, 4p vt-00 Modularisering ”svarta lådor” Väl definierade arbetsuppgifter Enklare validering Enklare.
William Sandqvist C-programmering ID120V Stack och Kö William Sandqvist
Föreläsning 4 Klasser Och Objekt.
Anders Sjögren Selektion i C ”vägval” if och switch - satserna.
Anders Sjögren Filer - långtidslagring. Anders Sjögren Filtyper i DOS talet ett ( intx=1; ) lagrat i en –textfil, (en sekvens av tecken ( bytes )) enligt.
ITK:P2 F8 Strömmar och filhantering DSV Peter Mozelius.
OOP F2:1 Stefan Möller OOP Objekt-orienterad programmering Föreläsning 2 Deklaration och tilldelning Programsatser Tilldelning Input/Output Selektion.
Anders Sjögren Deklarationsområde och funktioner.
1 Ingenjörsmetodik IT & ME 2007 Föreläsare Dr. Gunnar Malm.
F2 1 Programmeringsteknik, 4p vt-00 Kommentarer Allt mellan /* och */ Varje kommentar byts ut mot en blank av kompilatorn /* Exempel på uttryck, tilldelningsoperatorn.
Jonny Karlsson PROCESSPROGRAMMERING Föreläsning 2 ( ) Innehåll: -Fildeskriptorer -Filhantering -Felhantering.
William Sandqvist Funktionsbibliotek När man utvecklat en funktion så långt att den är "färdigutvecklad" kan man lika gärna spara den på.
Kronljusströmställaren 0, 1, 2, 3
Mer om operatorer logiska operatorer bit-operatorer adress-operatorn ”komma”-operatorn punkt - operatorn.
1 Föreläsning 2 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
Föreläsning4 Repetition slingor Metoder. while-sats består av följande delar: 1. while 2. Villkor-sats (condition) 3. uttryck (statement) while-sats int.
Anders Sjögren Programmering i ANSI-C Ett första program för att se vart vi ska...
Anders Sjögren Funktioner något in och något annat ut.
Presentationens avskrift:

Deklarera en struct som kan användas för att representera en rät linje Använd den I main för att deklarera en variabel som du initierar så att den representerar en linje som går genom punken (0,2) och (4,-2) Hemma (eller om du hinner) skriv en funktion som tar en linje och returnerar för vilket x den skär x-axeln

struct linje//här kan man göra andra val, tex repr med två punkter som linjen {//skär double k,m; }; typedef struct linje Linje; double xSkarning(Linje rl) { return -rl.m/rl.k; } int main(){ Linje minLinje; minLinje.k=-1; minLinje.m=2; printf("Skarningen med x-axeln sker vid x = %f",xSkarning(minLinje)); return 0; }

Strömmar (streams) Binärfiler och textfiler Skriva till textfil med fprintf Läsa från textfil med fscanf Läsa in till bilregistret med fscanf Läsa med fgets Skriva och läsa binärt i bilregistret

En ström betyder en källa för indata (tangentbordet, hårddisk, DVD, nätverksportar,…) eller ett mål för utdata (hårddisk, printer, portar,…) I C kommer vi åt strömmar via en filpekare och en ström kallas ofta helt enkelt för en fil (vilket det ofta är) När vi från vårt program vill kommunicera med hårddisken öppnar vi en ström och associerar den till en fil på hårddisken, det gör vi med fopen som returnerar en filpekare När man har läst eller skrivit klart bör man alltid stänga strömmen. Det gör man med fclose. (Ofta skrivs data inte direkt till filen utan till en buffert, stänger vi då inte filen kanske datat aldrig skriv till den fysiska filen) Printf som vi tidigare har använt för utmatning använder en ström som alltid är öppen och kallas standard output, stdout. Den skriver normalt till kommandotolken men går att omdirigera Scanf använder på samma sätt strömmen standard input, stdin Alla funktioner vi behöver bor i stdio.h så glöm inte #include

Består inte alla filer av 1or och 0or? Jo frågan här är hur dessa 1or och 0or ska tolkas I en textfil ska alla ettor och nollor tolkas som ascii-tecken. Dessutom har textfiler radslut (i unix tecken 10 och i windows tecken 13 följt av tecken 10). De kan också ha ett filslutstecken. I en binärfil skrivs alla 1or och 0or ner precis som programmet har dem lagrade i minnet. Hur de ska tolkas beror på vad man skrivit. Har man skrivit ett heltal ska de tolkas så som C skriver heltal. Endast om man vet exakt vilken sorts data som skrivits är det möjligt att tolka filen. Binärfiler saknar också radslut och filslut. Ett exempel. Ska vi spara heltalet i en textfil sparar vi 5 tecken vilket tar 5 byte: | | | | ’3’’2’ ’7’’6’ ’7’ Sparar vi samma heltal binärt representeras det i datorn av 2 byte: | Binära filer blir mindre, går fortare att läsa och skriva. Textfiler kan man öppna i en texteditor och se vad de innehåller.

int main(){ FILE *fp; fp = fopen("minFil.txt","w"); fprintf(fp,"%s\n",”Tjena"); fprintf(fp,"%s\n",”leget"); fprintf(fp,"%d\n",234); fclose(fp); return 0; }

int main(){ FILE *fp; fp = fopen("minFil.txt","w"); if(fp!=NULL){//viktigare vid inläsning fprintf(fp,"%s\n",”Tjena"); fprintf(fp,"%s\n",”leget"); fprintf(fp,"%d\n",234); fclose(fp); }else{ printf("Kunde inte öppna filen?"); }

int main(){ FILE *fp; char s1[ORDLANGD],s2[ORDLANGD]; int i; fp = fopen ("minFil.txt","r"); if(fp!=NULL){ fscanf(fp,"%s",s1); fscanf(fp,"%s",s2); fscanf(fp,"%d",&i); printf("Last:%s,%s,%d",s1,s2,i); fclose(fp); } return 0; } Precis som med scanf finns risken att vi läser in längre ord än vad som får plats. Fördelen är att vi kan använda formatsträngar och därmed tex heltal. Om vi med säkerhet vet att vi inte har längre ord än ORDLANGD tex för att vi använt det när vi skrivit filen kan man överväga att använda det ändå

Vi förutsätter här att registret är sparat till en fil kallad minfil.txt enligt följande format: volvo saab fiat

void lasIn(Bil reg[],int *antal) { FILE *fp; fp=fopen("minFil.txt","r"); if(fp!=NULL){ char marke[ORDLANGD]; int arsmodell,mil; while(fscanf(fp,"%s",marke)==1){//Alternativt kan man först i filen skriva antalet bilar och då läsa fscanf(fp,"%d",&arsmodell); // in det och använda en for-loop fscanf(fp,"%d",&mil); reg[*antal]=skapaBil(marke,arsmodell,mil); (*antal)++; } fclose(fp); } int main(){ Bil bilRegister[MAX]; int antal=0; lasIn(bilRegister,&antal); skrivaUtRegister(bilRegister,antal); return 0; }

Har man lite koll på formaterad inläsning kan man göra en snyggare fil och dessutom läsa in en hel bil med en inläsning. Vi arrangerar nu textfilen enligt nedan: volvo saab fiat

void lasIn(Bil reg[],int *antal) { FILE *fp; fp=fopen("minFil.txt","r"); if(fp!=NULL){ char marke[ORDLANGD]; int arsmodell,mil; while(fscanf(fp,"%s %d %d",marke,&arsmodell,&mil)==3){ reg[*antal]=skapaBil(marke,arsmodell,mil); (*antal)++; } fclose(fp); }

fscanf har precis som scanf problemet att den riskerar att läsa in större saker än var som får plats. Mycket säkrare då att använda fgets där man kan ange maximalt antal lästa tecken. Den läser endast strängar så behöver man läsa tex ett heltal får man läsa in heltalet som en sträng och sedan använda funktionen atoi (ascii to int) för att omvandla till ett heltal eller atof för decimaltal. fgets läser en hel rad och lägger in i en sträng. En egenhet är att den till skillnad från gets också lägger in ’\n’ sist i strängen. Detta vill man oftast inte och man får då manuellt byta ut det mot ’\0’. Man kan använda fgets istället för gets för att läsa från standard in genom att helt enkelt ange stdin som ström och på så sätt få säkrare inmatning

Här kommer ett program där vi läser textrader från en fil till dess att filen är slut. Eftersom vi inte vill ha med radslutstecknet byter vi också ut det mot ’\0’

#include #define ORDLANGD 30 #define MAX 100 int main(){ char s[MAX][ORDLANGD]; fp = fopen ("minFil2.txt","r"); if(fp!=NULL){ int antal=0; while(fgets(s[antal],sizeof(s[antal]),fp)){//kunde använt ORDLANGD s[antal][strlen(s[antal])-1]='\0';//byter ut '\n' antal++; } fclose(fp); int i; for(i=0;i<antal;i++) printf("%s\n",s[i]); } return 0; }

Man kan enkelt använda fgets istället för gets om man vill ha möjligheten att inte råka läsa för måna tecken. Kom bara ihåg att fgets sparar ’\n’ Vi skriver då helt enkelt: fgets(str, sizeof(str), stdin); för att läsa till str från standard in Om användaren nu matar in för många tecken så krachar inte programmet!

I denna kurs räcker det om ni vet vad binära filer är. Vi har valt att fokusera på textfiler för att de är lite mer tillgängliga och för att de är användbara i fler sammanhang Dock är det ofta kanske lite förvånande lättare att använda binära filer. Man behöver inte bry sig om rader eller format. Man ser bara till att läsa in precis som man skrev ut. Jag visar därför hur man skulle läsa och skriva binärt i vårt bilregister för den intresserade

void skrivaBinart(Bil reg[],int antal) { FILE *fp; fp = fopen("bildata","wb"); if(fp==NULL) { printf("Misslyckades med sparning pga misslyckad filoppning"); exit(EXIT_FAILURE); // } fwrite(&antal,sizeof(antal),1,fp);//det finns ett snitsigt sätt att ta reda på antal från filstorleken men vi skippar det fwrite(reg,sizeof(Bil),antal,fp);//här skriver vi hela arrayen med structar fclose(fp); } void lasaBinart(Bil reg[],int *antal) { FILE *fp; fp = fopen("bildata","rb"); if(fp==NULL) { printf("Misslyckad filoppning vid lasning"); exit(EXIT_FAILURE); } fread(antal,sizeof(*antal),1,fp); fread(reg,sizeof(Bil),*antal,fp);//här läser vi hela arrayen med structar fclose(fp); }

Läs igenom föreläsningen och programmera exemplen och experimentera Lägg till funktionalitet som skriver ut alla bilar i registret i vårt bilregisterprogram till en textfil när man väljer avsluta. Lägg till så att man när bilregistret startar kan välja att ange en textfil som programmet läser in bilar från till arrayen. Se till att du matchar inläsningen med hur du skrev ut. Observera att alla bilar läses in först i körningen och alla bilar skrivs ut sist i körningen. Under resten av programmet förekommer ingen filhantering. Om du vill kan du göra en version av bilregistret som läser och skriver binärt Om du vill kan du skumma igenom kapitel 22. Det finns mycket användbart men också mycket som inte ingår och texten är något svårtillgänglig så det är ok att hoppa läsningen och fokusera på föreläsningsanteckningarna denna gång om man tycker att man har fullt upp med annat. E-excercises, P-programming projects