Anders Sjögren Deklarationsområde och funktioner
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.
Anders Sjögren Deklarationsområde block #include int main( void ){ { int a = 2 ; printf("a = %d\n", a); } return 0; }
Anders Sjögren Deklarationsområde block #include int main( void ){ { int a = 2 ; printf("a = %d\n", a); } return 0; }
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?
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?
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?
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?
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?
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; }
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!
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?
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; }
Anders Sjögren Nästlade och parallella block {}{} {}{} {}{} {}{} Nästlade block Parallella block
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
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
Anders Sjögren Deklarationsområde block
Anders Sjögren Definition och deklaration av funktioner
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 ?(--> )--> "); 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
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 ?(--> )--> "); 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()
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 ?(--> )--> "); 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; }
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 ; }
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 ?(--> )--> "); 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
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 ?(--> )--> "); 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()
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.
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 ?(--> )--> "); 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.
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();
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
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 ?(--> )--> "); 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 ?
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 ?(--> )--> "); 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.
Anders Sjögren Slut