Anders Sjögren Minnen, variabler, att lagra i primärminnet forts. Den här bilden känner ni igen sedan tidigare. Vi skall fortsätta att prata variabeltyper.

Slides:



Advertisements
Liknande presentationer
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.
Advertisements

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.
Anders Sjögren Lagringsklasser •en variabel i C har två attribut –type( int, float, char..... ) –lagringsklass( auto, extern, register, static ) •lagringsklassens.
Funktioner och programorganisation
Algoritmer och data strukturer -Länkade listor
Föreläsning 3 Lista Array/länkad lista Lista implementerad som länkad lista Inlämningsuppgifter.
De fundamentala datatyperna
Operatorer.
#include void fun(char s[]) { int i=-1; while(s[++i]!=0) { if('a'
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.
Arrays Indicerade variabler.
C-programmering ID120V William Sandqvist Länkad lista
Föreläsning 13 Allt om tentan. Sistaminutenhjälp: På fredag 17 december kl 12 sitter Linda i kemi-fiket och svarar på frågor.
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Konstruktor Ser till att objektets data är korrekt initierade MinKlass::MinKlass(); MinKlass::MinKlass(int.
Programmering B PHP Lektion 2
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.
Sid 1 CD5250 OOP med C++ Daniel Flemström MDH/IDT CD5250 OOP med C++
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 6 ( ) INNEHÅLL: -Mera om tabeller.
Pekare och speciell programstruktur i inbyggda system
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; }
Programmering B PHP Lektion 2
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.
Vektorer (klassen Vector) Sortering
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.
William Sandqvist C:s minnesmodell.
Anders Sjögren Minnen, variabler, att lagra i primärminnet forts.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 4 ( ) INNEHÅLL: -Logiska opertorer -Poster.
Anders Sjögren Mer om datatyper. Anders Sjögren const det finns ett elegantare sätt att skapa konstanter i C än sättet med makro som vi använt tidigare.
Modulär programutveckling
Anders Sjögren Pekare. Anders Sjögren Skapa ett program som byter plats på två heltal Pekare.
Anders Sjögren Bitfält Kompakt datalagring i delar av bytes, ett fält av bits StackBytes Heap.
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.
Föreläsning 1 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
Programmering i C# 9. Pekare och osäker kod.
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
Anders Sjögren Selektion i C ”vägval” if och switch - satserna.
F. Drewes, Inst. f. datavetenskap1 Föreläsning 2: Variabler och datatyper Variabler Bindning Typkontroll Några viktiga datatyper.
Språket för inbyggda system 2
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.
F6 - Pekare 1 Programmeringsteknik, 4p vt-00 Pekare & adresser Alla variabler är knutna till en viss adress i minnet int i; adressen till denna fås med.
F5 - Fält & strängar 1 Programmeringsteknik, 4p vt-00 Fält Många element av samma typ Typexempel : lista av heltal Gemensamt namn Individuella värden nås.
Anders Sjögren Deklarationsområde och funktioner.
Lennart Edblom & Frank Drewes, Inst. f. datavetenskap 1 Föreläsning 2: Variabler och datatyper Variabler Bindning Typkontroll Några viktiga datatyper.
ITM1 Kapitel 8 Datastrukturer Grundläggande datavetenskap, 4p Utgående från boken Computer Science av: J. Glenn Brookshear.
F2 1 Programmeringsteknik, 4p vt-00 Kommentarer Allt mellan /* och */ Varje kommentar byts ut mot en blank av kompilatorn /* Exempel på uttryck, tilldelningsoperatorn.
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å.
Mer om operatorer logiska operatorer bit-operatorer adress-operatorn ”komma”-operatorn punkt - operatorn.
Föreläsning 7 Repetition Sammansatta datatyper –vektor (hakvektor, array) –matris.
Anders Sjögren Data (i primärminnet) som en länkad lista datatypen för varje element i listan är en struktur, post ( struct )
1 Föreläsning 2 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
Anders Sjögren Mer om datatyper. Anders Sjögren const det finns ett elegantare sätt att skapa konstanter i C än sättet med makro som vi använt tidigare.
Anders Sjögren Enkelt program med funktion /* two_func.c - a program that uses two functions in one file */ /* from Stephen Prata C Primer Plus ISBN
Överlagring av operatorer, friends, user-defined conversions, klassmallar sid. 1 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Överlagring av operatorer.
Anders Sjögren Operatorer. Anders Sjögren Operand(er)
William Sandqvist Datorteknik övning 4 Maskinnära programmering med C inför hemlab 1.
Anders Sjögren Minnen, variabler, att lagra i primärminnet forts.
Anders Sjögren Programmering i ANSI-C Ett första program för att se vart vi ska...
Mer om operatorer logiska operatorer bit-operatorer adress-operatorn ”komma”-operatorn punkt - operatorn.
Anders Sjögren Funktioner något in och något annat ut.
TDP004 Objektorienterad Programmering Fö 5 Minneshantering.
Presentationens avskrift:

Anders Sjögren Minnen, variabler, att lagra i primärminnet forts. Den här bilden känner ni igen sedan tidigare. Vi skall fortsätta att prata variabeltyper men först lite repetition

Anders Sjögren Fördefinierade minnes- variabeltyper int main() { chartecken; inthektal; floatflyttal; doubledubbeltFlyttal; ”

Anders Sjögren Egendefinierade minnen enum array strukturer - poster en liten återblick sedan skall vi gå in på det här

Anders Sjögren Array ( vektor, matris ) ett exempel som illustrerar behovet Antag att man vill mäta temperaturen flera gånger och spara värdena för statistisk behandling. Hur gör man ett program som läser in mätvärdena? Ni minns väl det här?

Anders Sjögren #include int main(void) { inttemp1, temp2, temp3, temp4, temp5; inttemp6, temp7, temp8, temp9, temp10; printf("Ge temperatur --> "); scanf("%d",&temp1); printf("Ge temperatur --> "); scanf("%d",&temp2); printf("Ge temperatur --> "); scanf("%d",&temp3); printf("Ge temperatur --> "); scanf("%d",&temp4); printf("Ge temperatur --> "); scanf("%d",&temp5); printf("Ge temperatur --> "); scanf("%d",&temp6); printf("Ge temperatur --> "); scanf("%d",&temp7); printf("Ge temperatur --> "); scanf("%d",&temp8); printf("Ge temperatur --> "); scanf("%d",&temp9); printf("Ge temperatur --> "); scanf("%d",&temp10); printf("\ntemp = %d", temp1); return 0; } Varför array ? Klumpigt !

Anders Sjögren #include int main(void) { inttemp[10]; inti; for (i=0 ; i<10 ; i++){ printf("Ge temperatur %d --> ",i); scanf("%d",&temp[i]); } for (i=0 ; i<10 ; i++) printf("\ntemp %d = %d",i, temp[i]); return 0; } Varför array ? Bra, hyfsat! detta skapar 10 st minnen i primärminnet ( på stacken i detta fall) som vardera kan lagra en int. En array ( vektor ) om 10 element har sett dagens ljus

Anders Sjögren Vad är en array ? stega på index int temp[1] temp[9] temp temp[0] temp[6] int for (i=0 ; i<10 ; i++) printf("\ntemp %d = %d",i, temp[i]); Vitsen är att man kan samla minnen av samma typ i en array där man når dem enkelt via ett index. Nackdelen är att alla elementen måste vara av samma typ.

Anders Sjögren Strukturer - "struct", post I en array så är alla "delminnen" av samma typ antag att man vill samla flera olika minnen under ett "tak", ett variabelnamn som t ex att man önskar lagra fakta om böcker –titel –författare –antal sidor –pris –vikt

Anders Sjögren Strukturer - "struct", post I en array så är alla "delminnen" av samma typ antag att man vill samla flera olika minnen under ett "tak", ett variabelnamn som t ex att man önskar lagra fakta om böcker –titel –författare –antal sidor –pris –vikt titel char ”en sträng”

Anders Sjögren Strukturer - "struct", post I en array så är alla "delminnen" av samma typ antag att man vill samla flera olika minnen under ett "tak", ett variabelnamn som t ex att man önskar lagra fakta om böcker –titel –författare –antal sidor –pris –vikt titel char ”en sträng” forfattare char ”en sträng”

Anders Sjögren Strukturer - "struct", post I en array så är alla "delminnen" av samma typ antag att man vill samla flera olika minnen under ett "tak", ett variabelnamn som t ex att man önskar lagra fakta om böcker –titel –författare –antal sidor –pris –vikt titel char ”en sträng” char ”en sträng” antal_sidor int pris int forfattare

Anders Sjögren Strukturer - "struct", post I en array så är alla "delminnen" av samma typ antag att man vill samla flera olika minnen under ett "tak", ett variabelnamn som t ex att man önskar lagra fakta om böcker –titel –författare –antal sidor –pris –vikt titel char ”en sträng” char ”en sträng” antal_sidor int pris int vikt float forfattare

Anders Sjögren Strukturer - "struct", post antag att man vill samla flera olika minnen under ett "tak", ett variabelnamn titel char ”en sträng” char ”en sträng” antal_sidor int pris int vikt float struct, så här gör man forfattare

Anders Sjögren Strukturer - "struct", post antag att man vill samla flera olika minnen under ett "tak", ett variabel- namn titel char ”en sträng” char ”en sträng” antal_sidor int pris int vikt float int main( void ) { struct bok { chartitel[50], forfattare[50]; intantal_sidor, pris; floatvikt; }b1, b2; b1.antal_sidor = 276; forfattare

Anders Sjögren Strukturer - "struct", post varje ”del- minne” i en struktur nås m h a punktoperatorn, ej med index titel char ”en sträng” char ”en sträng” antal_sidor int pris int vikt float int main( void ) { struct bok { chartitel[50], forfattare[50]; intantal_sidor, pris; floatvikt; }b1, b2; b1.antal_sidor = 276; forfattare

Anders Sjögren högst prioritet har de unära postfixoperatorerna [] (). -> sedan kommer de unära prefixoperatorerna & * + - ~ ! (typnamn) därefter de aritmetiska ( rikning V till H ) * / % + - skiftoperatorer ( rikning V till H ) > jämförelseoperatorerna ( rikning V till H ) = == != bit-operatorerna ( rikning V till H ) & ^ | logiska operatorer ( rikning V till H ) && || villkorsoperatorn ( rikning H till V ) ? uttryck : tilldelningsoperatorer ( rikning H till V ) = *= /= %= += -= >= &= ~= |= kommaoperatorn ( riktning V till höger ), Operatorprioritet

Anders Sjögren #include int main( void ) { struct bok { chartitel[50], forfattare[50]; intantal_sidor, pris; floatvikt; }b1, b2; printf("Titel? -> "); scanf("%s", b1.titel); printf("Författare? (efternamn)-> "); scanf("%s", b1.forfattare); printf("Sidor, pris och vikt? -> "); scanf("%d%d%f", &b1.antal_sidor,&b1.pris, &b1.vikt); b2 = b1 ; printf("\nTitel:\t\t%s\n", b2.titel); printf("Författare:\t%s\n", b2.forfattare); printf("Sidor:\t\t%d\n", b2.antal_sidor ); printf("Pris:\t\t%d\n", b2.pris ); printf("Vikt:\t\t%0.2f\n", b2.vikt ); return 0; } Strukturer - "struct", post Ett helt program vid tilldelning kopieras hela strukturen, ingen adresskopiering som vid arrayer! bok.exe

Anders Sjögren Strukturer - "struct", post Nu byter vi till en enklare struktur att jobba med, komplexa tal! a + bi

Anders Sjögren #include int main ( void ) { struct Komplex{ floata; /* realdel */ float b; /* Imaginärdel */ } z; printf("Ge real och imaginärdel --> "); scanf("%f%f",&z.a, &z.b); printf("%0.2f + %0.2fi", z.a, z.b); return 0 ; } Komplexa tal Ett sätt att definiera en struktur (samma som tidigare) komplex1.exe

Anders Sjögren Komplexa tal typedefstruct { floatre; /* realdel */ float im; /* Imaginärdel */ } Komplex ; int main ( void ){ Komplexz ; Ett annat sätt att definiera en struktur

Anders Sjögren Arbeta med strukturer tilldelning ( = ) på strukturer ? värdeöverföring av strukturer vid funktionsanrop ?

Anders Sjögren Arbeta med strukturer tilldelning ( = ) på strukturer ? värdeöverföring av strukturer vid funktionsanrop ?. operatorn int main ( void ) { Komplexz ; z = LaesKomplexTal(); SkrivKomplexTal( z ); return 0 ; }

Anders Sjögren Arbeta med strukturer tilldelning (=) på strukturer ?. int main ( void ) { Komplexz ; z = LaesKomplexTal(); SkrivKomplexTal( z ); return 0 ; } int main ( void ) { Komplexz ; z = LaesKomplexTal(); SkrivKomplexTal( z ); return 0 ; } KomplexLaesKomplexTal( void ) { Komplexz; printf( "Ge real och imaginärdel --> "); scanf("%f%f",&z.re, &z.im); return z; } Som sagts tidigare så kopieras hela strukturen vid tilldelning komplex2.exe

Anders Sjögren Arbeta med strukturer värdeöverföring av strukturer vid funktionsanrop ?. int main ( void ) { Komplexz ; z = LaesKomplexTal(); SkrivKomplexTal( z ); return 0 ; } int main ( void ) { Komplexz ; z = LaesKomplexTal(); SkrivKomplexTal( z ); return 0 ; } voidSkrivKomplexTal( Komplex z ) { printf("%0.2f + %0.2fi", z.re, z.im); return; } voidSkrivKomplexTal( Komplex z ) { printf("%0.2f + %0.2fi", z.re, z.im); return; } Vid funktionsanrop på detta sätt så värdeöverförs (kopieras) hela strukturen, jämför med arrayer. komplex2.exe

Anders Sjögren Komplettera till ett färdigt program! vad gör funktionerna? hur arbetar funktionerna? inte bra att värdeöverföra strukturer om de är stora. Ändra till referensöver-föring! int main ( void ) { Komplexz1, z2, z3 ; z1 = LaesKomplexTal(); z2 = LaesKomplexTal(); z3 = AdderaKomplex(z1, z2); SkrivKomplexTal( z3 ); return 0 ; }

Anders Sjögren Komplettera till ett färdigt program! int main ( void ) { Komplexz1, z2, z3 ; z1 = LaesKomplexTal(); z2 = LaesKomplexTal(); z3 = AdderaKomplex(z1, z2); SkrivKomplexTal( z3 ); return 0 ; } vad gör funktionerna? hur arbetar funktionerna? inte bra att värdeöverföra strukturer om de är stora. Ändra till referensöver-föring!

Anders Sjögren vad gör funktionerna? hur arbetar funktionerna? inte bra att värdeöverföra strukturer om de är stora. Ändra till referensöver-föring! Komplettera till ett färdigt program! int main ( void ) { Komplexz1, z2, z3 ; z1 = LaesKomplexTal(); z2 = LaesKomplexTal(); z3 = AdderaKomplex(z1, z2); SkrivKomplexTal( z3 ); return 0 ; }

Anders Sjögren Dynamisk allokering hur fungerar detta program och speciellt funktionen LaesKomplexTal() ? int main ( void ) { Komplex*z1, *z2, *z3 ; z1 = LaesKomplexTal(); z2 = LaesKomplexTal(); z3 = AdderaKomplex(z1, z2); SkrivKomplexTal( z3 ); free(z1);free(z2);free(z3); return 0 ; } I detta fall jobbar man bara med pekare ( z1, z2, z3 ) till strukturer och då är det onödigt att skriva z1Pek osv. OBS! Att skapa en pekare till en struktur skapar ingen struktur i sig. zpekare.exe

Anders Sjögren Dynamisk allokering int main ( void ) { Komplex*z1, *z2, *z3 ; z1 = LaesKomplexTal(); int main ( void ) { Komplex*z1, *z2, *z3 ; z1 = LaesKomplexTal(); Komplex* LaesKomplexTal( void ) { Komplex*z; z = malloc(sizeof( Komplex )); printf( "Ge real och imaginärdel --> "); scanf("%f%f", &z->re, &(*z).im); return z ; } zpekare.exe Hur fungerar funktionen LaesKomplexTal()? Lägg märke till piloperatorn!

Anders Sjögren Dynamisk allokering - "heapen" allokerat minne på heapen försvinner inte när funktionen som skapat det "dör", jämför z resp den komplexa strukturen som skapats på heapen! Maskinkod programmet Heap Stack Bytes main() Komplex struktur z1 Heap Stack tidsaxel Komplex struktur ? z z1 main() ? LaesKomplexTal() Säkrats är att initiera pekare till NULL (z1)

Anders Sjögren Arbeta med strukturer i detta fall har vi inget variabelnamn på det allokerade minnet utan endast en pekare (adress) dit. För att nå de olika delminnena används då ”piloperatorn” -> operator: z->re, då z är en pekare Komplex* LaesKomplexTal( void ) { Komplex*z; z = malloc(sizeof( Komplex )); printf( "Ge real och imaginärdel --> "); scanf("%f%f", &z->re, &(*z).im); return z ; } För att scanf() kräver en adress

Anders Sjögren högst prioritet har de unära postfixoperatorerna [] (). -> sedan kommer de unära prefixoperatorerna & * + - ~ ! (typnamn) därefter de aritmetiska ( rikning V till H ) * / % + - skiftoperatorer ( rikning V till H ) > jämförelseoperatorerna ( rikning V till H ) = == != bit-operatorerna ( rikning V till H ) & ^ | logiska operatorer ( rikning V till H ) && || villkorsoperatorn ( rikning H till V ) ? uttryck : tilldelningsoperatorer ( rikning H till V ) = *= /= %= += -= >= &= ~= |= kommaoperatorn ( riktning V till höger ), Operatorprioritet Då var alla operatorerna ”gröna”!

Anders Sjögren Arrayer av strukturer går bra! typedefstruct {floatre; /* realdel */ float im; /* Imaginärdel */ } Komplex ; int main ( void ) { KomplexzVektor[10] ; int i ; Komplex zVektor zVektor[2] zVektor[2].re zVektor[2].im

Anders Sjögren Sortera element i en array funktion för detta finns redan Lite repetition!

Anders Sjögren Sortera element i en array funktion för detta finns redan

Anders Sjögren Sortera element i en array funktion för detta finns redan qsort() i stdlib.h

Anders Sjögren Sortera element i en array funktion för detta finns redan och prototypen ser ut på följande sätt void *base är en pekare till inget men som kan konverteras att peka på någon specifik typ void qsort(void *base, size_t nelem, size_t width, int (*fcmp)(const void *, const void *));

Anders Sjögren Sortera element i en array funktion för detta finns redan och prototypen ser ut på följande sätt size_t är ett makro som i ANSI-standard anger typen på returvärdet för funktionen sizeof() void qsort(void *base, size_t nelem, size_t width, int (*fcmp)(const void *, const void *));

Anders Sjögren Sortera element i en array funktion för detta finns redan och prototypen ser ut på följande sätt pekare till en funktion (funktionspekare) vars argument är två void-pekare och som returnerar en int void qsort(void *base, size_t nelem, size_t width, int (*fcmp)(const void *, const void *));

Anders Sjögren int main ( void ) { Komplexz[5] ; int i ; for ( i=0; i<=4 ; i++) z[i] = LaesKomplexTal(); qsort( (void*) z, 5, sizeof( Komplex ), fcompare ); for ( i=0; i<=4 ; i++) SkrivKomplexTal( z[i] ); return 0 ; } Sortering implementerat

Anders Sjögren Funktionen fcompare() ”hur det skall sorteras” sorterar på de komplexa talens belopp intfcompare( const void* z, const void* w){ if ( sqrt(pow(((Komplex*)z)->re,2)+pow(((Komplex*)z)->im,2)) < sqrt(pow(((Komplex*)w)->re,2)+pow(((Komplex*)w)->im,2)) ) return -1 ; else if ( sqrt(pow(((Komplex*)z)->re,2)+pow(((Komplex*)z)->im,2)) > sqrt(pow(((Komplex*)w)->re,2)+pow(((Komplex*)w)->im,2)) ) return 1 ; else return 0 ; } sortera.exe

Anders Sjögren Slut