Problemlösningsmetodik Per Lindström Datavetenskap, UmU
Introduktion Transformera en problembeskrivning till ett program skrivet i programspråk formulera problemet så du förstår vad som ska göras beskriv indata och utdata vilka indata behövs vad ska ”produceras” gör en algoritmbeskrivning stegvis förfining producurell abstraktion koda i aktuellt programspråk testa
Think first, code later Om något kan gå fel så kommer det att ske Ju tidigare du börjar koda ditt program desto längre tid kommer det att dröja innan det fungerar Tänk en gång, tänk en gång till, tänk lite mer och först då är det dags att börja koda programmet
Algoritm En detaljerad lista av instruktioner i pseudokod högnivåbeskrivningar funktionellt via funktioner lågnivåbeskrivningar inläsning av data variabler val iteration utskrift av data då dessa instruktioner utförs leder det till en lösning av ett speciellt problem i ändlig tid
Variabler Enkla värde: tal eller tecken (a,b,c…,+,*,\,/…) olika ”typer”: tex heltal, reella tal….. Sammansatta lista av tal eller tecken (ett index) Ex. x(i), b(4)... tabell (matris) av tal eller tecken (två index) Ex. A(i,j), tab(4,8)...
Inläsning av data Användaren matar in via tangentbordet -interaktiv inmatning Inläsning sker från datafil Ex. READ(skonr) /*variabeln skonr får värde via tangentbordet*/ READ(”telefil”, namn, telnr) /* inläsning från tänkt telefonkatalog*/
Val IF villkor THEN /* envägs IF */ satser IF villkor THEN /* tvåvägs IF */ ELSE IF villkor1 THEN /* flervägs IF */ ELSE IF villkor2 THEN
Iteration Upprepning av vissa instruktioner tills något stoppvillkor är uppfyllt *FOR-loop FOR styr:=start TO slut {increment/decrement tal} satser END *REPEAT-loop REPEAT UNTIL villkor *WHILE-loop WHILE villkor DO
Utskrift av data Skriv ut variblers värden och strängar med tecken -på skärmen -på en extern datafil Ex. WRITE(”Summan= ”, summa) /*skärmen*/ WRITE(”fil1”, summa)
Problem Beräkna och skriv ut volymen för en cylinder Hur beräknas volymen för en cylinder? Volym=höjd*bottenytans area Vi måste alltså förse programmet med cylinders höjd och tex radien på den cirkel som utgör dess botten. Algoritm på hög nivå 1. Läs in höjden (hoejd) och radien (radie) 2. Beräkna volymen 3. Skriv ut volymen
Algoritm på lägre nivå 1. WRITE(”Mata in cylinderns höjd”)/*ledtext*/ READ(hoejd) WRITE(”Mata in radien för cylinderns botten”) READ(radie) 2. Bottenarea=pi*radie*radie Volym=hoejd*bottenarea 3. WRITE(”Cylinderns volym= ”, Volym)
C-kod #include <stdio.h> #define PI 3.141592 int main(void) { float hoejd, radie, Botten_area, Volym; printf(”Mata in cylinderns höjd\n”); scanf(”%f”, &hoejd); printf(”\nMata in radien för cylinderns botten: ”); scanf(”%f”, &radie); /*Beräkna volymen*/ Botten_area=PI*radie*radie; Volym=hoejd*Botten_area; printf(”\n\nCylinderns volym= %f\n”, Volym); return 0; }
Validering av indata 1. REPEAT WRITE(”Mata in cylinderns höjd”)/*ledtext*/ READ(hoejd) UNTIL hoejd>0 and hoejd<100 REPEAT WRITE(”Mata in radien för cylinderns botten”) READ(radie) UNTIL radie>0 2. Bottenarea=pi*radie*radie Volym=hoejd*bottenarea 3. WRITE(”Cylinderns volym= ”, Volym)
Validering av indata #include <stdio.h> #define PI 3.141592 int main(void) { float hoejd, radie, Botten_area, Volym; printf("Mata in cylinderns höjd\n"); scanf("%f", &hoejd); /* Validera inläst värde */ while ((hoejd <= 0) | (hoejd > 100)) printf("Försök igen: Mata in cylinderns höjd\n"); }
Validering, forts. printf("\nMata in radien för cylinderns botten: "); scanf("%f", &radie); /* Validera inläst värde */ while (radie <= 0) { printf("Försök igen: Mata in radien för cylinderns botten:\n"); } /*Beräkna volymen*/ Botten_area=PI*radie*radie; Volym=hoejd*Botten_area; printf("\n\nCylinderns volym= %f\n", Volym); return 0;
Validering av indata, ver. 2 #include <stdio.h> #define PI 3.141592 int main(void) { float hoejd, radie, Botten_area, Volym; hoejd = -10; /* fejkat värde */ /* Validera inläst värde */ while ((hoejd <= 0) | (hoejd > 100)) printf(“ Mata in cylinderns höjd\n"); scanf("%f", &hoejd); }
Validering, ver. 2, forts. radie = -10; /* fejkat värde */ /* Validera inläst värde */ while (radie <= 0) { printf("Mata in radien för cylinderns botten:\n"); scanf("%f", &radie); } /*Beräkna volymen*/ Botten_area=PI*radie*radie; Volym=hoejd*Botten_area; printf("\n\nCylinderns volym= %f\n", Volym); return 0;