Ladda ner presentationen
Presentation laddar. Vänta.
1
Anders Sjögren Deklarationsområde och funktioner
2
Anders Sjögren Deklarationsområde med hjälp av { } skapar man sammansatta satser ( ) som även kallas block { int a = 2 ; printf("a = %d\n", a); } i början på ett block ( sammansatt sats) är det tillåtet att ha deklarationer och definitioner av variabler samt deklarationer av funktioner men ej definitioner av funktioner som måste ligga utanför alla block.
3
Anders Sjögren Deklarationsområde block #include int main( void ){ { int a = 2 ; printf("a = %d\n", a); } return 0; }
4
Anders Sjögren Deklarationsområde block #include int main( void ){ { int a = 2 ; printf("a = %d\n", a); } return 0; }
5
Anders Sjögren Deklarationsområde block #include int main( void ){ int a = 1 ; printf("a = %d\n", a); { int a = 2 ; printf("a = %d\n", a); } return 0; } kan man ha en variabel a utanför blocket?
6
Anders Sjögren Deklarationsområde block #include int main( void ){ int a = 1 ; printf("a = %d\n", a); { int a = 2 ; printf("a = %d\n", a); } return 0; } kan man ha en variabel a utanför blocket?
7
Anders Sjögren Deklarationsområde block #include int main( void ){ int a = 1 ; printf("a = %d\n", a); { int a = 2 ; printf("a = %d\n", a); } return 0; } vad händer nu då? Testa! Slutsats?
8
Anders Sjögren Deklarationsområde block #include int main( void ){ int a = 1 ; printf("a = %d\n", a); { int a = 2 ; printf("a = %d\n", a); } return 0; } vad händer nu då? Testa! Slutsats?
9
Anders Sjögren Deklarationsområde block #include int main( void ){ int a = 1 ; printf("a = %d\n", a); { int a = 2 ; printf("a = %d\n", a); } return 0; } vad händer nu då? Testa! Slutsats?
10
Anders Sjögren Deklarationsområde block #include int main( void ){ int a = 1 ; printf("a = %d\n", a); { int a = 2 ; printf("a = %d\n", a); } return 0; }
11
Anders Sjögren Deklarationsområde block #include int main( void ){ int a = 1 ; printf("a = %d\n", a); { int a = 2 ; printf("a = %d\n", a); } return 0; } aja baja! variabeln a måste vara definierad innan den kan användas. Detta ger kompileringsfel!
12
Anders Sjögren Deklarationsområde block #include int main( void ){ int a = 1 ; printf("a = %d\n", a); { int a = 2 ; printf("a = %d\n", a); { int a = 3 ; printf("a = %d\n", a); } { printf("a = %d\n", a); } return 0; } vad händer nu då? Testa! Slutsats?
13
Anders Sjögren Deklarationsområde block #include int main( void ){ int a = 1 ; printf("a = %d\n", a); { int a = 2 ; printf("a = %d\n", a); { int a = 3 ; printf("a = %d\n", a); } { printf("a = %d\n", a); } return 0; }
14
Anders Sjögren Nästlade och parallella block {}{} {}{} {}{} {}{} Nästlade block Parallella block
15
Anders Sjögren Deklarationsområde block slutsatser –man kan definiera variabler med samma namn inom olika block –kompilatorn kontrollerar en använd variabel mot ”närmsta” definition uppåt i den nästlade blockstrukturen –definieras en variabel i ett block döljer den variabler med samma namn från ”yttre” block {}{} {}{} {}{} {}{} Nästlade block Parallella block
16
Anders Sjögren Deklarationsområde block #include int a = 0 ; int main( void ){ int a = 1 ; printf("a = %d\n", a); { int a = 2 ; printf("a = %d\n", a); { int a = 3 ; printf("a = %d\n", a); } { printf("a = %d\n", a); } return 0; } om man definierar en variabel på den ”yttersta nivån så får man en ”global” (eg extern, tas upp senare) variabel som blir känd i hela programmet om den inte döljs genom lokala definitioner
17
Anders Sjögren Deklarationsområde block
18
Anders Sjögren Definition och deklaration av funktioner
19
Anders Sjögren Definition av funktioner /* Beräknar kapitaltillväxt på 10 å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; } void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } funktionen main() definierad funktionen definierad funktionen TabellPaSkarm() deklarerad
20
Anders Sjögren Definition av funktioner /* Beräknar kapitaltillväxt på 10 å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; } void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } funktionen main() definierad funktionen definierad funktionen TabellPaSkarm() deklarerad en funktion måste definieras på den yttersta nivån den kan däremot deklareras i block praxis är att man definierar funktionerna efter main() och deklarerar dem före pga deklarationen kan kompilatorn kontrollera att funktionen används rätt pga deklarionerna först så spelar det ingen roll i vilken ordning funktions-definitionerna kommer efter main()
21
Anders Sjögren Funktioner exempel ytterligare funktionsuppdelning /* Beräknar kapitaltillväxt på 10 å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; } void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; }
22
Anders Sjögren Den nya funktionen den nya funktionen som tar en float och returnerar en float float NastaAr( float x ) { if ( x > 0 ) x = x * ( 1 + RANTESATS/100 ); else x = x * 1/( 1 + RANTESATS/100 ); return x ; }
23
Anders Sjögren Det modifierade programmet #include #define RANTESATS 8.5 float NastaAr( float ); 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; } void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { kapital = NastaAr( kapital ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } float NastaAr( float x ) { if ( x > 0 ) x = x * ( 1 + RANTESATS/100 ); else x = x * 1/( 1 + RANTESATS/100 ); return x ; } funktionen main() definierad funktionen TabellPaSkarmen() definierad funktionerna TabellPaSkarm(), NastaAr() deklarerad funktionen NastaAr() definierad
24
Anders Sjögren Det modifierade programmet #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; } void TabellPaSkarmen( int antalAr, float kapital ) { float NastaAr( float ); int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { kapital = NastaAr( kapital ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } float NastaAr( float x ) { if ( x > 0 ) x = x * ( 1 + RANTESATS/100 ); else x = x * 1/( 1 + RANTESATS/100 ); return x ; } funktionen main() definierad funktionen TabellPaSkarmen() definierad funktionerna TabellPaSkarm(), NastaAr() deklarerad funktionen NastaAr() definierad funktionen definierad en funktion måste definieras på den yttersta nivån den kan däremot deklareras i block praxis är att man definierar funktionerna efter main() och deklarerar dem före pga deklarationen kan kompilatorn kontrollera att funktionen används rätt pga deklarionerna först så spelar det ingen roll i vilken ordning funktions-definitionerna kommer efter main()
25
Anders Sjögren Funktioner indata - utdata indata överförs till funktionerna m h a de formella parametrarna och utdata m h a return eller ( som vi skall see längre fram ) m h a de formella parametrarna. Detta strävar man efter pga tydligheten men det finns ett annat sätt också, nämligen genom s k sidoeffekt. float NastaAr( float x ) { if ( x > 0 ) x = x * ( 1 + RANTESATS/100 ); else x = x * 1/( 1 + RANTESATS/100 ); return x ; } Denna möjlighet att ”lämna utdata” tas upp längre fram när ”pekare” har lanserats.
26
Anders Sjögren Sidoeffekt hos funktion exempel #include #define RANTESATS 8.5 float NastaAr( float ); void TabellPaSkarmen( int, float ); float kapital; int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } void gör kapital till en global ( extern ) variabel genom att definiera den på den yttersta nivån. Den blir då känd i alla block.
27
Anders Sjögren Sidoeffekt hos funktion exempel void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { kapital = NastaAr( kapital ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } ändringar i TabellPaSkarmen() NastaAr();
28
Anders Sjögren Sidoeffekt hos funktion exempel float NastaAr( float x ) { if ( x kapital > 0 ) x kapital = x kapital* ( 1 + RANTESATS/100 ); else x kapital = x kapital * 1/( 1 + RANTESATS/100 ); return x ; } ändringar i NastaAr(), x byts mot kapital in och utdata överförs nu sidovägen, ett sådant här program är svårt att underhålla, felavlusa samt bygga ut. void
29
Anders Sjögren Sidoeffekter #include #define RANTESATS 8.5 void NastaAr( void ); void TabellPaSkarmen( int ); float kapital; int main ( void ) { intantalAr; printf("Insatt kapital och antal år ?(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr ); return 0; } void TabellPaSkarmen( int antalAr ){ int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { NastaAr(); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } void NastaAr( void ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); return ; } vilken funktion ändrar resp använder variabeln kapital ?
30
Anders Sjögren Sidoeffekter #include #define RANTESATS 8.5 void NastaAr( void ); void TabellPaSkarmen( int ); float kapital; int main ( void ) { intantalAr; printf("Insatt kapital och antal år ?(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr ); return 0; } void TabellPaSkarmen( int antalAr ){ int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { NastaAr(); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } void NastaAr( void ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); return ; } ? Användaren upplever inga problem – det är vi som programmerare som får svårt att förstå programmets funktion, och därmed får svårt att underhålla programvaran.
31
Anders Sjögren Slut
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.