Minnen variabler att lagra i prim rminnet forts
This presentation is the property of its rightful owner.
Sponsored Links
1 / 47

Minnen, variabler, att lagra i primärminnet forts. PowerPoint PPT Presentation


  • 71 Views
  • Uploaded on
  • Presentation posted in: General

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. Fördefinierade minnes- variabeltyper. int main() { chartecken; intheltal; floatflyttal; doubledubbeltFlyttal; ” ”.

Download Presentation

Minnen, variabler, att lagra i primärminnet forts.

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Minnen variabler att lagra i prim rminnet forts

Minnen, variabler,att lagra i primärminnetforts.

Den här bilden känner ni igen sedan tidigare. Vi skall fortsätta att prata variabeltyper men först lite repetition


F rdefinierade minnes variabeltyper

Fördefinierade minnes-variabeltyper

  • int main() {

    • chartecken;

    • intheltal;

    • floatflyttal;

    • doubledubbeltFlyttal;


Egendefinierade minnen

Egendefinierade minnen

  • enum

  • array

  • strukturer - poster

en liten återblick ...

..... sedan skall vi gå in pådet här


Array vektor matris ett exempel som illustrerar behovet

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?


Varf r array

Varför array ?

  • #include<stdio.h>

  • 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;

  • }

  • Klumpigt !


    Varf r array1

    Varför array ?

    #include<stdio.h>

    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;

    }

    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

    Bra, hyfsat!


    Vad r en array

    int

    int

    temp[0]

    temp[1]

    temp

    temp[6]

    temp[9]

    Vad är en array ?

    • for (i=0 ; i<10 ; i++)

      • printf("\ntemp %d = %d",i, temp[i]);

    • stega på index

    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.


    Strukturer struct post

    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


    Strukturer struct post1

    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

    char

    titel

    ”en sträng”


    Strukturer struct post2

    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

    char

    titel

    ”en sträng”

    char

    forfattare

    ”en sträng”


    Strukturer struct post3

    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

    char

    titel

    ”en sträng”

    char

    forfattare

    ”en sträng”

    • antal_sidor

    int

    • pris

    int


    Strukturer struct post4

    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

    char

    titel

    ”en sträng”

    char

    forfattare

    ”en sträng”

    • antal_sidor

    int

    • pris

    int

    • vikt

    float


    Strukturer struct post5

    Strukturer - "struct", post

    • antag att man vill samla flera olika minnen under ett "tak", ett variabelnamn

    struct,så här gör man

    char

    titel

    ”en sträng”

    char

    forfattare

    ”en sträng”

    • antal_sidor

    int

    • pris

    int

    • vikt

    float


    Strukturer struct post6

    Strukturer - "struct", post

    • int main( void ) {

      • struct bok {

        • chartitel[50], forfattare[50];

        • intantal_sidor, pris;

        • floatvikt;

      • }b1, b2;

      • b1.antal_sidor = 276;

    • antag att man vill samla flera olika minnen under ett "tak", ett variabel-namn

    char

    titel

    ”en sträng”

    char

    forfattare

    ”en sträng”

    • antal_sidor

    int

    • pris

    int

    • vikt

    float


    Strukturer struct post7

    Strukturer - "struct", post

    • int main( void ) {

      • struct bok {

        • chartitel[50], forfattare[50];

        • intantal_sidor, pris;

        • floatvikt;

      • }b1, b2;

      • b1.antal_sidor = 276;

    • varje ”del-minne” i en struktur nås m h a punktoperatorn, ej med index

    char

    titel

    ”en sträng”

    char

    forfattare

    ”en sträng”

    • antal_sidor

    int

    • pris

    int

    • vikt

    float


    Minnen variabler att lagra i prim rminnet forts

    Operatorprioritet

    • 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 ),


    Strukturer struct post8

    Strukturer - "struct", post

    #include <stdio.h>

    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;

    }

    Ett helt program

    • vid tilldelning kopieras hela strukturen, ingen adresskopiering som vid arrayer!


    Strukturer struct post9

    Strukturer - "struct", post

    Nu byter vi till en enklare struktur att jobba med, komplexa tal!

    a + bi


    Komplexa tal

    Komplexa tal

    #include <stdio.h>

    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 ;

    }

    • Ett sätt att definiera en struktur (samma som tidigare)


    Komplexa tal1

    Komplexa tal

    • Ett annat sätt att definiera en struktur

    • typedefstruct {

      • floatre; /* realdel */

      • float im; /* Imaginärdel */

  • } Komplex ;

  • int main ( void ){

    Komplexz ;


    Arbeta med strukturer

    Arbeta med strukturer

    • tilldelning ( = ) på strukturer ?

    • värdeöverföring av strukturer vid funktionsanrop ?


    Arbeta med strukturer1

    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 ;

    }


    Arbeta med strukturer2

    Arbeta med strukturer

    int main ( void )

    {

    Komplexz ;

    z = LaesKomplexTal();

    SkrivKomplexTal( z );

    return 0 ;

    }

    • tilldelning (=) på strukturer ?

    • .

    • 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


    Arbeta med strukturer3

    Arbeta med strukturer

    int main ( void )

    {

    Komplexz ;

    z = LaesKomplexTal();

    SkrivKomplexTal( z );

    return 0 ;

    }

    • värdeöverföring av strukturer vid funktionsanrop ?

    • .

    Vid funktionsanrop på detta sätt så värdeöverförs (kopieras) hela strukturen,jämför med arrayer.

    voidSkrivKomplexTal( Komplex z )

    {

    printf("%0.2f + %0.2fi", z.re, z.im);

    return;

    }


    Komplettera till ett f rdigt program

    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 ;

    • }


    Komplettera till ett f rdigt program1

    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 ;

    • }


    Komplettera till ett f rdigt program2

    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 ;

    • }


    Minnen variabler att lagra i prim rminnet forts

    /* komplex3.c */

    typedefstruct

    {

    float re; /* realdel */

    float im; /* Imaginärdel */

    } Komplex ;

    z1 = LaesKomplexTal();

    z2 = LaesKomplexTal();

    z3 = AdderaKomplex(z1, z2);SkrivKomplexTal( z3 );

    Komplex AdderaKomplex(Komplex z1, Komplex z2){/* ?? skriv själv ?? */}


    Dynamisk allokering

    Dynamisk allokering

    • hur fungerar detta program och speciellt funktionen LaesKomplexTal() ?

    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.

    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 ;

    }


    Dynamisk allokering1

    Dynamisk allokering

    Hur fungerar funktionenLaesKomplexTal()?

    Lägg märke till piloperatorn!

    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 ;

    • }


    Dynamisk allokering heapen

    Heap

    Heap

    Dynamisk allokering - "heapen"

    Bytes

    Maskinkod

    programmet

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

    Komplexstruktur

    Komplexstruktur

    LaesKomplexTal()

    ?

    ?

    Stack

    z

    Stack

    z1

    z1

    z1

    main()

    main()

    Säkrast är att initiera pekare till NULL (z1)

    tidsaxel


    Arbeta med strukturer4

    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


    Minnen variabler att lagra i prim rminnet forts

    Operatorprioritet

    • 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 ),

    Då var alla operatorerna ”gröna”!


    Arrayer av strukturer g r bra

    Arrayer av strukturer går bra!

    typedefstruct {floatre; /* realdel */

    float im; /* Imaginärdel */

    } Komplex ;

    int main ( void )

    {

    KomplexzVektor[10] ;

    int i ;

    zVektor

    Komplex

    Komplex

    Komplex

    Komplex

    Komplex

    Komplex

    Komplex

    Komplex

    Komplex

    Komplex

    zVektor[2]

    zVektor[2].re

    zVektor[2].im


    Sortera element i en array

    Sortera element i en array

    • funktion för detta finns redan

    Lite repetition!


    Sortera element i en array1

    Sortera element i en array

    • funktion för detta finns redan


    Sortera element i en array2

    Sortera element i en array

    • funktion för detta finns redan

    qsort()

    i stdlib.h


    Sortera element i en array3

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


    Sortera element i en array4

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


    Sortera element i en array5

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


    Sortering implementerat

    Sortering implementerat

    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 ;

    }


    Funktionen fcompare hur det skall sorteras

    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 ;

    • }


    Minnen variabler att lagra i prim rminnet forts

    Vad tror Du att programmeraren glömt här?

    #include <math.h>


    Minnen variabler att lagra i prim rminnet forts

    Vad tror Du att programmeraren glömt här?

    Använd kompilatorflaggorna:

    -std=c99 –Wall

    Läs alla varningar, försök förstå och åtgärda.

    #include <math.h>


    Minnen variabler att lagra i prim rminnet forts

    Slut


  • Login