)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } fördelen med detta är att kompilatorn kan typkontrollera användningen av konstanten. ranteSats används i denna funktion"> )--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } fördelen med detta är att kompilatorn kan typkontrollera användningen av konstanten. ranteSats används i denna funktion">
Ladda ner presentationen
Presentation laddar. Vänta.
Publicerades avJohanna Pettersson
1
Anders Sjögren Mer om datatyper
2
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. /* Beräknar kapitaltillväxt på # år framåt eller bakåt */ #include #define RANTESATS 8.5 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; }
3
Anders Sjögren const nyckel ordet const vid variabeldefinitionen gör att värdet ej går att ändra i programmet. /* Beräknar kapitaltillväxt på # år framåt eller bakåt */ #include #define RANTESATS 8.5 const float ranteSats = 8.5 ; void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } fördelen med detta är att kompilatorn kan typkontrollera användningen av konstanten. ranteSats används i denna funktion
4
Anders Sjögren Typomvandlingar
5
Anders Sjögren Typomvandlingar implicit ( automatisk ) typomvandling –typomvandling som görs automatiskt i C explicit typomvandling –typomvandling som programmeraren explicit påkallar
6
Anders Sjögren Typomvandling implicit ( automatisk ) #include int main ( void ){ doubled; float f = 8.5; inti ; printf("\n sizeof( i ) = %d",sizeof( i ) ) ; printf("\n sizeof( f ) = %d",sizeof( f ) ) ; printf("\n sizeof( 100 ) = %d",sizeof( 100 ) ) ; printf("\n sizeof( f/100 ) = %d",sizeof( f/100 ) ) ; printf("\n sizeof( i + f/100 ) = %d",sizeof( i+f/100 ) ) ; printf("\n sizeof( d = i + f/100 ) = %d",sizeof(d=i+ f/100)); return 0; } genom att studera byte-storleken på uttrycken i programmet kan man lista sig till vilka typomvand- lingar som sker i uttrycket d = i + f/100 provkör!
7
Anders Sjögren Uttryck: d = i + f/100
8
Anders Sjögren Typomvandling implicit ( automatisk ) d = i + f/100 int float division mellan en float och en int. Då konverteras int till float och resultatet av divisionen blir en float float
9
Anders Sjögren Typomvandling implicit ( automatisk ) d = i + f/100 int float addition mellan en int och en float. Då konverteras int till float och resultatet av additionen blir en float float
10
Anders Sjögren Typomvandling implicit ( automatisk ) d = i + f/100 int float float double uttrycket i högerledet antar typen float men eftersom resultatet av det skall tilldelas en double konverteras det till en double. float
11
Anders Sjögren Typomvandling implicit ( automatisk ) d = i + f/100 int float float double uttrycket i högerledet antar typen float men eftersom resultatet av det skall tilldelas en double konverteras det till en double. typomvandlingar där programmet får ”välja typ självt”, sker typomvandling från ”lägre” typ till ”högre” typ, se följande sida float
12
Anders Sjögren Typomvandling implicit ( automatisk ) long double double float unsigned long int long int unsigned int int unsigned short int short int unsigned char signed char typomvandlingar där programmet får ”välja typ självt”, sker typomvandling från ”lägre” typ till ”högre” typ. högsta typ lägsta typ
13
Anders Sjögren På webtentan
14
Anders Sjögren Typomvandling implicit ( automatisk ) i C kan typomvandlingar ske vid följande tillfällen
15
Anders Sjögren Typomvandling implicit ( automatisk ) operanderna till en operator kan omvandlas, operanderna skall vara av samma typ i + f/100
16
Anders Sjögren Typomvandling implicit ( automatisk ) operanderna till en operator kan omvandlas operanderna skall vara av samma typ i + f/100 vid tilldelning omvandlas högerledet till den typ som operanden till vänster har d = i + f/100
17
Anders Sjögren Typomvandling implicit ( automatisk ) operanderna till en operator kan omvandlas, operanderna skall vara av samma typ i + f/100 vid tilldelning omvandlas högerledet till den typ som operanden till vänster har d = i + f/100 en aktuell parameter till en funktion omvandlas för att matcha den formella parametern void TabellPaSkarmen( int, float ); int main ( void ){ intkapital ; floatantalAr; printf("Insatt kapital och antal år ?(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); int float (trunkering!) En 32 bitar float använder 8 bitar till exponenten, så en int som använder mer än 32-8=24 bitar kommer att förlora precision om den lagras i en float. Om Du har mer än 16 miljoner i kapital!
18
Anders Sjögren Typomvandling implicit ( automatisk ) operanderna till en operator kan omvandlas, operanderna skall vara av samma typ i + f/100 vid tilldelning omvandlas högerledet till den typ som operanden till vänster har d = i + f/100 en aktuell parameter till en funktion omvandlas för att matcha den formella parametern void TabellPaSkarmen( int, float ); int main ( void ){ intkapital ; floatantalAr; printf("Insatt kapital och antal år ?(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); värdet som returneras från en funktion omvandlas till den typ som funktionen skall ge som resultat double Berakna( int i, float f ) { ” return i + f/100 ; int float (trunkering!) float double float int Omvandlingen från float till double är problemfri
19
Anders Sjögren Typomvandling explicit ( av programmeraren påkalllad )( cast på engelska) exempel #include int main ( void ){ floatkvot; inttaljare, namnare ; printf("\n Ge taljare --> "); scanf("%d",&taljare); printf("\n Ge namnare --> "); scanf("%d",&namnare); kvot = taljare / namnare; /* int/int -> int */ printf("\n %d/%d blev %f",taljare, namnare, kvot); return 0; } provkör!
20
Anders Sjögren
21
Typomvandling explicit ( av programmeraren påkalllad )( cast på engelska) exempel #include int main ( void ){ floatkvot; inttaljare, namnare ; printf("\n Ge taljare --> "); scanf("%d",&taljare); printf("\n Ge namnare --> "); scanf("%d",&namnare); kvot = taljare / namnare; /* int/int -> int */ printf("\n %d/%d blev %f",taljare, namnare, kvot); return 0; } hmm, hur löser man detta? Tidigare kunde man ju sätta till en decimalpunkt, men då var ju en av operanderna en konstant 5./namnare. lösning
22
Anders Sjögren Typomvandling explicit ( av programmeraren påkalllad )( cast på engelska) exempel #include int main ( void ){ floatkvot; inttaljare, namnare ; printf("\n Ge taljare --> "); scanf("%d",&taljare); printf("\n Ge namnare --> "); scanf("%d",&namnare); kvot = (float) taljare / namnare; /* cast */ printf("\n %d/%d blev %f",taljare, namnare, kvot); return 0; } jahaja, man gör en explicit typomvandling av värdet fpån taljare till en float och då konverteras värdet från namnare implicit till float.
23
Anders Sjögren
24
Typomvandling explicit ( av programmeraren påkalllad )( cast på engelska) exempel #include int main ( void ){ floatkvot; inttaljare, namnare ; printf("\n Ge taljare --> "); scanf("%d",&taljare); printf("\n Ge namnare --> "); scanf("%d",&namnare); kvot = (float) taljare / namnare; /* cast */ printf("\n %d/%d blev %f",taljare, namnare, kvot); return 0; } jahaja, man gör en explicit typomvandling av värdet fpån taljare till en float och då konverteras värdet från namnare implicit till float.
25
Anders Sjögren Typomvandling syntax ( typnamn) uttryck
26
Anders Sjögren Typomvandling alla typer som är av tal-typ ( skalär typ )kan konverteras mellan varandra man bör fundera och kontrollera vad som händer vid typomvandling, följand gäller dock –från flyttal till heltal om talet ryms (till storlek) så trunkeras det dvs avhuggning av decimaldel sker, ingen avrundning –från heltal till fyttal precisionsförlust, det är inte säkert att flyttalsformen kan lagra alla värdesiffror
27
Anders Sjögren Typen på en konstant 10 333 blir int 012 0515oktalt blir int 0xA 0x14D hex bli int 10Lblir long int 0Xalblir long int 012ublir unsigned int 333Ublir unsigned int ”default” för en heltalskonstant är att den antar typen int HeltalskonstanterFlyttalskonstanter
28
Anders Sjögren Typen på en konstant HeltalskonstanterFlyttalskonstanter 5.057.blir double 0.57e11exponentform blir double 5.7E13exponentform blir double 3.11E-7fexponentform blir float.56Fblir float 0.93432e+50Lblir long double 7.45lblir long double ”default” för en flyttalskonstant är att den antar typen double 10 333 blir int 012 0515oktalt blir int 0xA 0x14D hex bli int 10Lblir long int 0Xalblir long int 012ublir unsigned int 333Ublir unsigned int ”default” för en heltalskonstant är att den antar typen int
29
Anders Sjögren #include #define DELAY 1000000L int main( void ){ long i; while ( !kbhit() ) {/* kbhit() ej ANSI */ printf("A"); for ( i=1; i < DELAY ; i++ ) ; printf("\tn"); for ( i=1; i < DELAY ; i++ ) ; printf("\td"); for ( i=1; i < DELAY ; i++ ) ; printf("\te"); for ( i=1; i < DELAY ; i++ ) ; printf("\tr"); for ( i=1; i < DELAY ; i++ ) ; printf("\ts"); for ( i=1; i < DELAY ; i++ ) ; printf("\r \t \t \t \t \t \r"); for ( i=1; i < DELAY ; i++ ) ; } return 0; } Typen på en konstant exempel en heltalskonstan har ”default” typen int. Vill man definiera en konstant av typen long int lägger man till l eller L på slutet. U och u är ett andra suffix. Det ger en konstant av typen unsigned int. Kombinationer går också bra t ex uL.
30
Anders Sjögren En första egendefinierad datatyp med hjälp av enum
31
Anders Sjögren Variabeltyper vad man tänker lagra heltalstyper –teckenlösa heltal ( 2 bytes lagrar talen [0,65535] ) –heltal med tecken ( 2bytes lagrar talen [-32768,32767] –tecken i texter ( ASCII-koden i 1 byte: 1000001 B = 65 D =’A’ ) –logiska värden, boolean ( =0 falskt, 0 sant ) –bitmönster ( 10011101varje bit betyder något t ex tänd eller släckt lampa flyttalstyper –de reella talen ( 3.56E-10 = 3.56 · 10 -10 ) det lagrade värdet är exakt det lagrade värdet är oftast en approximation kommer ni ihåg den här bilden? Med hjälp av enum kan vi nu skapa en data- typ som bara kan lagra de sk boolska värdena sant och falskt
32
Anders Sjögren #include int main ( void ){ enum boolean { false, true }; /* typdef */ enum boolean omIgen=true, ok=false; char svar ; while ( omIgen ) { printf("Hej allihopa! En g\206ng till? ( j/n ) --> "); while ( !ok ){ /******* Inmatningskontroll ************/ ok = true ; scanf(" %c", &svar); /* ignorerar blanka */ switch ( svar ) { case'j': omIgen = true; break; case 'J': omIgen = true; break; case'n': omIgen = false; break; case'N': omIgen = false; break; default : printf("Du ska svara j eller n ! --> "); ok = false; } ok = false ; /******* Slut inmatningskontrtoll *******/ } return 0; } enum exempel
33
Anders Sjögren
34
enum - månaderna /* Beräkning av antalet semesterdagar */ #include int main(void) { enum manad {jan, feb, mar, apr, maj, jun, jul, aug, sep, okt, nov, dec}; enum manad akt_manad; int n, ant_dagar = 0; printf("Ange uttagen semester varje m\206nad\n"); for (akt_manad = jun; akt_manad <= sep; akt_manad++) { printf("m\206nad %d semesterdagar: ",akt_manad+1); scanf("%d", &n); ant_dagar += n; } printf("Totala antalet semesterdagar: %3d\n”,ant_dagar); system("PAUSE"); return 0; }
35
Anders Sjögren
36
enum - toner enum ton { c, ciss, d, diss, e, f, fiss, g, giss, a, b, h};
37
Anders Sjögren Slut
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.