Presentation laddar. Vänta.

Presentation laddar. Vänta.

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.

Liknande presentationer


En presentation över ämnet: "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."— Presentationens avskrift:

1 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

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

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

4 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?

5 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 !

6 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

7 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.

8 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

9 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”

10 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”

11 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

12 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

13 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

14 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

15 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

16 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

17 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

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

19 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

20 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

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

22 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 ; }

23 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

24 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

25 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 ; }

26 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!

27 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 ; }

28 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

29 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!

30 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)

31 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

32 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”!

33 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

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

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

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

37 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 *));

38 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 *));

39 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 *));

40 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

41 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

42 Anders Sjögren Slut


Ladda ner ppt "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."

Liknande presentationer


Google-annonser