0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); /* enheter i tabellen */ if ( -10 < kapital && kapital < 10 ) printf("%3d%11.2f kr\n", ar, kapital>0 ? kapital : -kapital); else if ( -100 < kapital && kapital < 100 ) printf("%3d%11.2f da(deka)kr\n", ar, (kapital>0 ? kapital :... else if ( < kapital && kapital < 1000 ) printf("%3d%11.2f h(hekto)kr\n", ar, (kapital>0 ? kapital :... else printf("%3d%11.2f kkr\n", ar, (kapital>0 ? kapital :.... } return 0; } ”gör antingen A eller B eller C.....”, endast ett alternativ utförs! minns ni det här exemplet? Provkör!"> 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); /* enheter i tabellen */ if ( -10 < kapital && kapital < 10 ) printf("%3d%11.2f kr\n", ar, kapital>0 ? kapital : -kapital); else if ( -100 < kapital && kapital < 100 ) printf("%3d%11.2f da(deka)kr\n", ar, (kapital>0 ? kapital :... else if ( < kapital && kapital < 1000 ) printf("%3d%11.2f h(hekto)kr\n", ar, (kapital>0 ? kapital :... else printf("%3d%11.2f kkr\n", ar, (kapital>0 ? kapital :.... } return 0; } ”gör antingen A eller B eller C.....”, endast ett alternativ utförs! minns ni det här exemplet? Provkör!">
Ladda ner presentationen
Presentation laddar. Vänta.
Publicerades avRune Vikström
1
Mer om operatorer logiska operatorer bit-operatorer adress-operatorn ”komma”-operatorn punkt - operatorn
2
Logiska operatorer det finns tre logiska operatorer i C && OCH ||ELLER !ICKE
3
Selektion nästlade if - satser printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= ANTAL_AR ; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); /* enheter i tabellen */ if ( -10 < kapital && kapital < 10 ) printf("%3d%11.2f kr\n", ar, kapital>0 ? kapital : -kapital); else if ( -100 < kapital && kapital < 100 ) printf("%3d%11.2f da(deka)kr\n", ar, (kapital>0 ? kapital :... else if ( -1000 < kapital && kapital < 1000 ) printf("%3d%11.2f h(hekto)kr\n", ar, (kapital>0 ? kapital :... else printf("%3d%11.2f kkr\n", ar, (kapital>0 ? kapital :.... } return 0; } ”gör antingen A eller B eller C.....”, endast ett alternativ utförs! minns ni det här exemplet? Provkör!
4
Selektion nästlade if - satser resultat av en programkörning, exekveringsresultat!
5
Logiska operatorer /* enheter i tabellen */ if ( -10 < kapital && kapital < 10 ) printf("%3d%11.2f kr\n", ar, kapital>0 ? kapital : -kapital); else if ( -100 < kapital && kapital < 100 ) printf("%3d%11.2f da(deka)kr\n", ar, (kapital>0 ? kapital : -kapital)/10); else if ( -1000 < kapital && kapital < 1000 ) printf("%3d%11.2f h(hekto)kr\n", ar, (kapital>0 ? kapital : -kapital)/100); else printf("%3d%11.2f kkr\n", ar, (kapital>0 ? kapital : -kapital)/1000); om villkoret -10<kapital OCH villkoret kapital<10 bägge är sanna så blir hela villkoret sant och printf() utförs.
6
Logiska operatorer (villkor_1 && villkor_2 && villkor_3 &&...) –alla villlkoren skall vara sanna för att hela uttrycket skall bli sant –villkor_1 OCH villkor_2 OCH villkor_3 OCH.... (villkor_1 || villkor_2 || villkor_3 ||...) –något, eller flera, av villkoren skall vara sant för att hela uttrycket skall bli sant –villkor_1 ELLER villkor_2 ELLER villkor_3 ELLER.. (!villkor) –hela uttrycket sant om villkor är falskt eller falskt om villkor är sant –ICKE villkor
7
Bit-operatorer påverkar enskilda bitar i minnet ~ negation, bit för bit << vänsterskift >> högerskift & OCH, bit för bit ^ exklusiv ELLER, bit för bit | ELLER, bit för bit 2 bytes16 bits bit short int
8
Bit-operatorer ~ negation, bit för bit ~67 = ~= == ?? Vad tror du det blir?
9
Bit-operatorer ~ negation, bit för bit ~67 = ~= == -68 #include void bin_prnt_byte(unsigned int); void bin_prnt_short(unsigned int); int main( void ) { printf(" ~67 = ~("); bin_prnt_short( 67 ); printf(") = ("); bin_prnt_short( ~67 ); printf(") = %d", ~67 ); system( " PAUSE " ); return 0; } Se kurswebben för: bin_prnt_short()
10
Windows kalkylator 65468 - 65536 = - 68
11
Bit-operatorer << vänsterskift 67<<2 = <<2 = == ?? Vad tror du det blir?
12
Bit-operatorer << vänsterskift ( logisk skift vänster = 0:r in ) 67<<2 = <<2 = == 268 #include void bin_prnt_byte(unsigned int); void bin_prnt_short(unsigned int); int main( void ) { printf(" 67<<2 = ("); bin_prnt_short( 67 ); printf(")<<2 = ("); bin_prnt_short( 67<<2 ); printf(") = %d", 67<<2 ); system( " PAUSE " ); return 0; }
13
Bit-operatorer >> högerskift 67u>>2 = >>2 = == ?? Vad tror du det blir?
14
Bit-operatorer >> högerskift ( logisk skift höger = 0:r in ) 67u>>2 = >>2 = == 16 #include void bin_prnt_byte(unsigned int); void bin_prnt_short(unsigned int); int main( void ) { printf(" 67u>>2 = ("); bin_prnt_short( 67u ); printf(")<<2 = ("); bin_prnt_short( 67u<<2 ); printf(") = %d", 67u<<2 ); system( " PAUSE " ); return 0; }
15
Bit-operatorer >> högerskift ( signed int, positivt tal ? ) 67>>2 = >>2 = == ? Det är ospecifiserat vad som händer med en signed int.
16
Bit-operatorer >> högerskift ( signed int, positivt tal ? ) 67>>2 = >>2 = == ? #include void bin_prnt_byte(unsigned int); void bin_prnt_short(unsigned int); int main( void ) { printf(" 67>>2 = ("); bin_prnt_short( 67 ); printf(")<<2 = ("); bin_prnt_short( 67<<2 ); printf(") = %d", 67<<2 ); system( " PAUSE " ); return 0; } Tydligen skiftades 0:or in, men detta är inget som ANSI-C lovar!
17
Bit-operatorer >> högerskift ( signed int, negativa tal ( aritmetisk shift? ) -67>>2= >>2 = == ? Det är ospecifiserat vad som händer med en signed int.
18
Bit-operatorer >> högerskift ( signed int, negativa tal ( aritmetisk shift? ) -67>>2= >>2 = == ? #include void bin_prnt_byte(unsigned int); void bin_prnt_short(unsigned int); int main( void ) { printf(" -67>>2 = ("); bin_prnt_short( -67 ); printf(")<<2 = ("); bin_prnt_short( -67<<2 ); printf(") = %d", -67<<2 ); system( " PAUSE " ); return 0; } Det blev aritmetiskt skift med den här kompilatorn (inget som ANSI-C lovar)…
19
Bit-operatorer & OCH-operatorn, bit för bit -67&0xff= & = = = ? Vad tror du det blir?
20
Bit-operatorer & OCH-operatorn, bit för bit -67&0xff= & = = = 189 #include void bin_prnt_byte(unsigned int); void bin_prnt_short(unsigned int); int main( void ) { printf(" -67&0xff = ("); bin_prnt_short( -67 ); printf(") &0xff = ("); bin_prnt_short( -67&0xff ); printf(") = %d", -67&0xff ); system( " PAUSE " ); return 0; }
21
Windows kalkylator
22
And-mask -67 & 0xff tal mask OCH, AND: De bitpositioner som är 0 i masken nollställer motsvarande bitpositioner i talet. På det sättet kan man påverka enskilda bitar i en variabel.
23
Bit-operatorer ^ exklusiv ELLER-operatorn, bit för bit -67^0x0f= ^ = = = ? Vad tror du det blir?
24
Bit-operatorer ^ exklusiv ELLER-operatorn, bit för bit - 67^0x0f= ^ = = = -78 #include void bin_prnt_byte(unsigned int); void bin_prnt_short(unsigned int); int main( void ) { printf(" -67^0x0f = ("); bin_prnt_short( -67 ); printf(") ^0x0f = ("); bin_prnt_short( -67^0x0f ); printf(") = %d", -67^0x0f ); system( " PAUSE " ); return 0; }
25
Exor-mask -67 ^ 0x0f tal mask Exor: De bitpositioner som är 1 i masken togglar (=byter värde på) motsvarande bitpositioner i talet. De bitpositioner som är 0 i masken lämnas oförändrade. På det sättet kan man byta värde på enskilda bitar i en variabel.
26
Bit-operatorer | ELLER-operatorn, bit för bit -67|0x0f= | = = = ? Vad tror du det blir?
27
Bit-operatorer | ELLER-operatorn, bit för bit -67|0x0f= | = = = -65 #include void bin_prnt_byte(unsigned int); void bin_prnt_short(unsigned int); int main( void ) { printf(" -67|0x0f = ("); bin_prnt_short( -67 ); printf(") |0x0f = ("); bin_prnt_short( -67|0x0f ); printf(") = %d", -67|0x0f ); system( " PAUSE " ); return 0; }
28
Eller, OR - mask -67 | 0x0f tal mask Or: De bitpositioner som är 1 i masken ettställer motsvarande bitpositioner i talet. På det sättet kan man ettställa enskilda bitar i en variabel.
29
Bit-operatorer exempel
30
databitar byglat, not busy, not out of paper parallellporten printerport Parallellportar försvinner mer och mer från datorerna, vi byter från PC till en inbyggnadsprocessor PIC
31
Adventljus med PIC16F690
32
PIC-processorn? Ej enligt ANSI-standarden, men lämpliga storlekar för en pytteliten 8-bitsprocessor som har bitinstruktioner är: bit 1/8 Byte, char 1 Byte (unsigned), int 1Byte (signed) long 2 Bytes (signed)
33
C-kod (ej ANSI) för PIC-processorn printf("Advent: 1, 2, 3, 4 Light flicker: +,-\r\n",0); while(1) { if( receiver_flag ) /* Character received? */ { choice = getchar(); switch (choice) { case '1': mask = 0x01; /* 00000001 */ printf("%c First\r\n", choice); break; case '2': mask = 0x03; /* 00000011 */ printf("%c Second\r\n", choice); break; case '3': mask = 0x07; /* 00000111 */ printf("%c Third\r\n", choice); break; case '4': mask = 0x0F; /* 00001111 */ printf("%c Fourth\r\n", choice); break;
34
fortsättning … case '+': if(speed > 0) speed --; else speed = 0; printf("%c Increasing flicker, ", choice); printf("delay %u\r\n", speed); break; case '-': if(speed < 254) speed ++; else speed = 255; printf("%c Decreasing flicker, ", choice); printf("delay %u\r\n", speed); break; default : mask = 0x00; /* 00000000 */ printf("%c Choose advent: 1, 2, 3, 4 Light flicker: +,-r\n",choice); } } flicker = rand(); flicker &= mask; PORTC = flicker; delay(5); /* minimum delay */ delay(speed); } }
35
Adventstider … flicker = rand(); flicker &= mask; PORTC = flicker; mask 0001 0011 0111 1111 & Slumptal rand() Fladdrande ljuslågor …
36
”Annons” för IL131V Digitalteknik med PIC Digitalteknik med PIC-processor 7.5 hp IL131V. 12 veckor ht/vt 1 kväll i veckan. Sök kursen på studera.nu !
37
Adress - operatorn &
38
/* Beräknar kapitaltillväxt på x å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; } Adress - operatorn Maskinkod programmet Heap Stack Bytes antalAr=1 kapital =100 funktionen scanf() är en funktion som vill ha reda på var i primärminnet ( adressen ) det inlästa skall lagras. Detta erhålls m h a adressoperatorn & xxxxxxxx
39
Komma - operatorn,
40
Komma - operatorn exempel /* Beräknar kapitaltillväxt på x år framåt eller bakåt */ #include #define RANTESATS 8.5 void TabellPaSkarmen( int, float ); void Kalkylator( void ); int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); Kalkylator(); return 0; } minns ni exemplet med kalkylatorn i? forts
41
void Kalkylator( void ) /* Enkel kalkylator */ { float x, y; char c; printf( "\nKalkylator som klarar de fyra räknesätten t ex 3+2\n"); printf( "A, avslutar\n"); while (printf("-->"), scanf("%f%c%f", &x, &c, &y ) == 3) { switch(c) { case '+': printf("%f\n", x + y); break; case '-': printf("%f\n", x - y); break; case '*': printf("%f\n", x * y); break; case '/': if (y != 0) printf("%f\n", x / y); else printf("Division med noll\n"); break; default: printf("Felaktig operator\n"); break; } return; } Komma - operatorn exempel Se ”kommat” i while-satsen. Den gör att man kan exekvera flera uttryck i parentesen, från vänster till höger. Resultatet av det sista uttrycket är upprepningsvillkoret
42
Punkt - operatorn. Denna operator har vi ännu inte stött på, den kommer senare. Den används för att nå ett delminne i ett större minne. Inte undra på att programmen vi skriver på övningar och laborationer kraschar när varenda skiljetecken vi skriver eller glömmer är en operator !
43
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
44
Slut
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.