Problemlösningsmetodik

Problemlösningsmetodik
Per Lindström
Datavetenskap, UmU
1
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
 testa
i aktuellt programspråk
2
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
3
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
4
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)...
5
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*/
6
Val
IF villkor THEN /* envägs IF */
satser
IF villkor THEN /* tvåvägs IF */
satser
ELSE
satser
IF villkor1 THEN /* flervägs IF */
satser
ELSE IF villkor2 THEN
satser
ELSE
satser
7
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
satser
UNTIL villkor
*WHILE-loop
WHILE villkor DO
satser
END
8
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)
9
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
10
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)
11
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;
}
12
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)
13
Validering av indata
#include
#define
PI
<stdio.h>
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");
scanf("%f", &hoejd);
}
14
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");
scanf("%f", &radie);
}
/*Beräkna volymen*/
Botten_area=PI*radie*radie;
Volym=hoejd*Botten_area;
printf("\n\nCylinderns volym= %f\n", Volym);
return 0;
}
15
Validering av indata, ver. 2
#include
#define
PI
<stdio.h>
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);
}
16
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;
}
17