Dagens föreläsning Repetition Funktioner Programmeringsteknik för Ingenjörer VT05 Räckvidd (scope) Föreläsning 5 Programmeringsteknik VT05 Repetition - Datatyper 2 Repetition - Uttryck • En datatyp har en grupp värden samt en grupp operationer som är giltiga för dess värden. Ett uttryck är en syntaktiskt korrekt kombination av konstanter, variabler, funktionsanrop, tilldelningar och operatorer. • C har ett antal primitiva datatyper som är fördeklarerade. Exempel: (a + b) / (c + d) • Dessa är heltal, flyttal och tecken. a = 5.7 + 9.7 * 0.4 b = sqrt(3.5 – 0.5) Programmeringsteknik VT05 3 Repetition - Operatorer 4 Repetition - Kontrollflöde Relationsoperatorer < mindre än > större än <= mindre än eller lika med >= större än eller lika med == lika med != inte lika med Logikoperatorer ! negation && logiskt ”och” || logiskt ”eller” Programmeringsteknik VT05 Programmeringsteknik VT05 Sekvens: Satserna exekveras en efter en. Standard Urval: Man väljer om satser ska exekveras eller ej. If-sats, if-else-sats, switch-sats Repetition: Satsen exekveras ett visst antal gånger while-loop, do-loop, for-loop 5 Programmeringsteknik VT05 6 1 Top-down design Funktionsanrop Programmet börjar alltid med ett anrop till main(). När en funktion anropas ges kontroll till den funktionen. Efter att funktionen är klar med sitt jobb, ges kontrollen tillbaka till den anropande funktionen. ”top-down” metod för att lösa problem. – Försök dela upp programmet i mindre och mindre delproblem. När delproblemen är enkla nog, använd funktioner för att lösa delproblemen (och därmed hela problemet). Syntax: funktionsnamn(); Program är ofta uppdelade på flera källkodsfiler där varje fil kan innehålla noll eller flera funktioner. Om funktionen har något returvärde kan detta värde lagras i en variabel eller användas direkt i en beräkning. int slumptal = rand(); // tilldelning if (x && rand()) {... // uttryck Programmeringsteknik VT05 7 Programmeringsteknik VT05 Funktionsprototyp 8 Exempel #include <stdio.h> En funktion bör deklareras innan den används. ANSI C tillhandahåller en deklarationssyntax som kallas funktionsprototyp. /* funktionsprototyp */ double pow2(double tal); double pow2(double tal); int main (void) { double mitt_tal = 5.0; double retval; Detta berättar för kompilatorn att pow2 är en funktion som tar en double som argument och att den returnerar en double. retval = pow2(mitt_tal); printf("Kvadraten: %.2f\n",retval); return 0; OBS! Identifierare som anges i parameterlistan i en funktionsprototyp påverkar inte deklarationen utan är enbart av dokumentationssyfte. Programmeringsteknik VT05 } OBS! Kommer ej att kompilera! 9 Programmeringsteknik VT05 Funktionsdefinition 10 Exempel #include <stdio.h> C-källkoden, som beskriver vad en funktion gör, kallas funktionsdefinition. /* Funktionsprototyp */ double pow2(double tal); Syntax: returtyp funktionsnamn ( parameterlista ) { deklarationer satser } int main (void) { printf("Kvadraten är: %.2f\n",pow2(5.0)); return 0; } • Allt innan första krullparentesen kallas funktionshuvud. • Allt mellan krullparenteserna kallas funktionskropp. • Parameterlistan är en komma-separerad lista med deklarationer. Programmeringsteknik VT05 /* Funktionsdeklaration */ double pow2(double tal) { return (tal * tal); } 11 Programmeringsteknik VT05 12 2 Funktionsanrop Funktionsanrop och variabler Aktuellt argument – Ett uttryck mellan paranteserna i funktionsanropet. Argumenten skickas ”call-by-value”. Detta betyder att varje argument utvärderas och värdet av argumentet skickas till funktionen. Värdena lagras i motsvarande lokala variabel. pow2(5.0); Formell parameter – En identifierare som representerar värdet av det aktuella argumentet i funktionsdeklarationen. Alltså, om en variabel skickas till en funktion så ändras inte värdet på variabeln i den anropande miljön. Variabler i en funktion är lokala för den funktionen. Ändringar av de variablerna kommer inte att påverka andra variabler med samma namn utanför funktionen. double pow2(double tal) { return (tal * tal); } Programmeringsteknik VT05 13 Programmeringsteknik VT05 Return Programflöde return används för att returnera värden från funktioner till den anropande miljön. return; return ++a; return (a * b); Programflödet är sekventiellt. Sats efter sats i den beskrivna ordningen. Återhoppet sker till anropsstället. ... funktion1() { ... sats; funktion2(); sats; ... } Om return-satsen innehåller ett utryck evalueras först uttrycket och värdet av uttrycket returneras. När return påträffas avbryts exekveringen av funktionen och kontrollen ges åter till den anropande miljön. Programmeringsteknik VT05 14 15 Funktioner utan indata funktion2() { ... ... return ...; } Programmeringsteknik VT05 16 Funktioner med flera argument void hello_world(void) { printf("Hello World!\n"); } En funktion kan ta flera argument, typ får vara olika. Exempel: Denna funktion returnerar ingenting (void). Den tar heller inga argument. int many(double x, int y, char z) { int temp; temp = (int)(x / y); temp += z; return temp; } Funktionen anropas med: hello_world(); Observera att den inte anropas med hello_world(void); Programmeringsteknik VT05 17 Programmeringsteknik VT05 18 3 Räckvidd (Scope) Exempel { Grundregeln är att identifierare bara är tillgängliga inne i det block där de deklarerades. int a = 2; printf("a = %d\n", a); { int a = 5; printf("a = %d\n", a); } printf("a = %d\n", a); De finns inte utanför blocket. Detta låter som en enkel regel, men programmerare väljer ofta att använda samma identifierare på olika variabler. Frågan uppstår då vilket objekt identifieraren refererar till... } Vad skrivs ut? Programmeringsteknik VT05 19 Programmeringsteknik VT05 20 Exempel #include <stdio.h> int main (void) { int a = 1, b = 2, c = 3; printf("a = %d b = %d c = %d\n", a, b, c); { int b = 4; float c = 5.0F; printf("a = %d b = %d c = %f\n", a, b, c); a = b; { int c = b; printf("a = %d b = %d c = %d\n", a, b, c); } printf("a = %d b = %d c = %f\n", a, b, c); } printf("a = %d b = %d c = %d\n", a, b, c); return 0; } Programmeringsteknik VT05 21 4