Villkorssatser: Skillnad mellan sidversioner

Från Webbling
Hoppa till: navigering, sök
Skapade sidan med 'När man programmerar använder man sig ofta av villkorssatser för att styra programflödet. Med hjälp av en villkorssats kan man styra hur programflödet ska uppföra sig ...'
 
Ingen redigeringssammanfattning
 
(25 mellanliggande sidversioner av samma användare visas inte)
Rad 1: Rad 1:
När man programmerar använder man sig ofta av villkorssatser för att styra programflödet.  
När man programmerar använder man sig ofta av villkorssatser för att styra programflödet.  
Med hjälp av en villkorssats kan man styra hur programflödet ska uppföra sig då ett visst villkor är uppfyllt.
Med hjälp av en villkorssats kan man styra hur programmet ska uppföra sig då ett visst villkor är uppfyllt.
== <code>if</code>-satser ==
== <code>if</code>-satser ==
Den vanligaste villkorssatsen är <code>if</code>-satsen. Man har då en sektion med kod som enbart utförs villkoret är sant, till exempel;
 
Den vanligaste villkorssatsen är <code>if</code>-satsen. Man har då en sektion med kod som enbart utförs när villkoret är sant, till exempel;
   
   
<syntaxhighlight lang="JavaScript">
<syntaxhighlight lang="JavaScript">
if (villkor)  
if (villkor)  
{
{
<kodblocket utförs endast om villkor är sant>
  <kodblocket utförs endast om villkor är sant>
}
}
<Här fortsätter koden sen>
<Här fortsätter koden oavsett om if-kodblocket kördes eller ej>
</syntaxhighlight>
</syntaxhighlight>


Eller för att skriva det på vanlig svenska; Om villkor är sant gör det här…
Eller för att skriva det på vanlig svenska; om <code>villkor</code> är sant gör det här…
 
Om <code>villkor</code> inte är sant, fortsätter programmet att köra koden som finns efter ”<code>}</code>”-tecknet.
 
=== Vad är <code>villkor</code> ===
<code>villkor</code> är någonting som i slutändan kommer att bli <code>true</code> eller <code>false</code>. Man brukar kalla denna typ av <code>villkor</code> för ett booleskt värde eller för ett sanningsvärde.


Om villkor inte är sant, fortsätter programmet att köra koden som finns efter ”}”-tecknet.
Boolesk algebra är en typ av matematik som behandlar hanteringen av utsagor som enbart kan vara sanna eller falska. Vi återkommer till detta.


Man kan även begära att något annat ska utföras i de fall som villkoret inte är sant. Då gör man så här;
Vad är det då som kan bli <code>true</code> eller <code>false</code>? Ett vanligt exempel på detta är jämförelse, t.ex. om vi vill kontrollera om en variabel innehåller ett visst värde.  Det kan se ut så här:


<syntaxhighlight lang="JavaScript">
<syntaxhighlight lang="JavaScript">
if ( villkor)  
  if( värde == 1)
{
  {
<utförs endast om villkor är sant>
    // Utförs om värde är lika med 1, om inte så hoppas detta block över
} else {
  }
<utförs endast om villkor är falskt>
  // Här fortsätter koden
}
</syntaxhighlight>
</syntaxhighlight>


Med den programkoden säger man; om villkor är sant gör det som står i första blocket, i annat fall gör det som står i <code>else</code>-blocket.
=== <code>==</code> jämförelse, likhet ===
I exemplet användes jämförelse-operatorn; <code>==</code> för att kontrollera om <code>värde</code> är lika med <code>1</code>. Lägg märke till att det är två "<code>=</code>"-tecken.
 
För jämförelser använder vi <code>==</code> och för tilldelning använder vi <code>=</code>. Det är ett rätt så vanligt fel att råka skriva enbart ett <code>=</code>, när vi egentligen ville ha två. Så var uppmärksam på det!


Om man vill kan man lägga <code>if</code>-satser inuti andra <code>if</code>-satser. Det kallas nästlade eller inkapslade <code>if</code>:ar. Sådana kan man använda om man vill att programmet ska kolla om flera saker är sanna. Men som ni kommer att se i nästa sektion, går det ibland att lösa dylika situationer på ett mer effektivt sätt. Ett exempel på nästlade <code>if</code>-satser:
=== <code>!=</code> jämförelse, olikhet ===
För att kontrollera om två saker skiljer sig från varandra använder vi oss av <code>!=</code>.


<syntaxhighlight lang="JavaScript">
<syntaxhighlight lang="JavaScript">
if ( villkor)  
  if( värde != 1)
{
  {
if ( villkor2)
    // Utförs om värde INTE är lika med 1, om inte så hoppas detta block över
{
  }
<utförs endast om både villkor och villkor2 är sanna>
  // Här fortsätter koden
}
}
</syntaxhighlight>
</syntaxhighlight>


== Att jobba med sanningsvärden ==
I JavsScript betyder "!"-tecknet "not" eller "inte". Dvs, <code>!=</code> betyder alltså "not equal".
Man brukar tala om sanningsvärden när man jobbar med villkor. Ett sanningsvärde är antingen <code>true</code> eller <code>false</code>, dvs sant eller falskt. När ett villkor är sant säger man att villkoret är uppfyllt. Ibland kan man även säga uttryck istället för villkor.


Några exempel på sanningsvärden:
Vi återkommer till <code>villkor</code> och sanningsvärden i nästa sektion.
<pre>
=== <code>else</code> ===
C#-villkor       Resultat
Man kan även begära att något annat ska utföras i de fall som villkoret ''inte'' är sant. Då gör man så här;
1 == 1            True
1 == 2            False
“alfa” == “alfa”  True
“alfa” == “beta”  False
</pre>
Lägg märke till att för jämförelse använder man sig i JavaScript av ”<code>==</code>”, dvs två likamed-tecken. Ett likamed-tecken ger tilldelning, medan två ger jämförelse. Tilldelning ändrar innehållet i variabeln, medan jämförelse returnerar <code>true</code> eller <code>false</code> utan att ändra något innehåll.


(I den här sektionen kommer vi bara att använda <code>if</code>-satser i exemplen. Men alla sanningsvärden skulle fungera lika bra (eller dåligt) i t.ex. <code>while</code>-loopar.)
<syntaxhighlight lang="JavaScript">
 
if ( villkor )  
Om man vill kan man göra <code>if</code>-satser som alltid utförs:
 
if ( true )
{
{
<utförs alltid>
  // <utförs endast om villkor är sant>
} else {
  // <utförs endast om villkor är falskt>
}
}
// Här fortsätter körningen oavsett vilket av ovan kodblock som kördes
</syntaxhighlight>


Det är iofs rätt meningslöst att göra så (vi kommer dock att se att det finns tillfällen då liknande konstruktioner är användbara, men det blir först när vi kommer till while). Ännu meningslösare, men likväl möjligt, är att göra en if-sats som aldrig körs (genom att använda sig av sanningsvärdet false).
Med den programkoden säger man; om <code>villkor</code> är sant gör det som står i första blocket, i annat fall gör det som står i <code>else</code>-blocket.


I villkor använder man sig ofta av matematiska jämförelseoperatorer. Några vanliga villkor/jämförelseoperatorer:
Man kör alltså antingen det ena eller det andra blocket. Det finns inget fall då bägge blocken kan bli att köras!


C#-villkor Typ av jämförelse
=== Nästlade <code>if</code>-satser ===
a == b Är a och b lika?
Om man vill kan man lägga <code>if</code>-satser inuti andra <code>if</code>-satser. Det kallas nästlade eller inkapslade <code>if</code>:ar.
a != b Är a skiljd ifrån b?
a < b Är a mindre än b?
a > b Är a större än b?
a <= b Är a mindre än eller lika b?


I C# betyder ”!” icke, eller ”not”, så man utläser alltså ”!=” som icke lika med.
Sådana kan man använda om man vill att programmet ska kolla om flera saker är sanna. Men som ni kommer att se i nästa sektion, går det ofta att lösa dylika situationer på ett mer effektivt sätt.  
Kombinera sanningsvärden
Man kan sätta samman mer komplexa villkor med hjälp av; ”&&” som betyder ”och” samt ”||” som betyder ”eller”. Genom att använda dessa instruktioner kan man foga samman flera sanningsuttryck till ett. Man kan jämföra med hur man använder sig av + och – när man räknar med vanliga tal, skillnaden är att vi nu ”räknar” med sanningsvärden.


Det finns till och med en speciell gren av matematik som specialiserar sig räkning med sanningsvärden-/uttryck, det kallas Boolesk algebra.
Ett exempel nästlade <code>if</code>-satser:


 
<syntaxhighlight lang="JavaScript">
Och-villkor; &&
if ( villkor1)  
När man använder sig av && måste bägge villkoren vara uppfyllda för att hela och-villkoret ska bli sant.
 
if ( villkor1 && villkor2 )
{
{
<utförs endast om både villkor1 och villkor2 är sanna>
  if ( villkor2)
  {
    // <utförs endast om både villkor1 och villkor2 är sanna>
  }
}
}
</syntaxhighlight>


Det innebär att följande gäller för och-villkoret:
För att koden längst in ska utföras måste alltså såväl den första <code>if</code>:en och den andra ha <code>villkor</code> som är sanna.


Villkor Resultat
I princip kan man nästla hur många <code>if</code>:ar som helst. Men, som sagt, man kan lösa detta på ett effektivare sätt. För att kunna göra det behöver vi kunna utföra operationer som fungerar med sanningsvärden. Vilket vi återkommer till nästa sektion.
false && false false
true && false false
false && true false
true && true true


Eller-villkor; ||
== Överkurs ==
När man använder eller-varianten, ||, räcker det med att ett av villkoren är uppfyllt (bägge villkoren kan vara sanna, men det räcker med att ett är det).
<div class="well well-meadow">
Följande är lite överkurs, men det kan vara bra att känna till.
</div><!-- end well -->


if ( villkor1 || villkor2 )
== <code>switch</code> ==
{
När man vill testa något som kan ha många olika värden kan det lätt bli många <code>if</code>:ar. För att lösa såna situation på ett snyggare sätt så kan man använda sig av <code>switch</code>.
<utförs endast om något, eller båda, av villkor1 och villkor2  är sant>
}


Det innebär att följande gäller för eller-villkoret:
<syntaxhighlight lang="JavaScript">
 
switch( testuttryck )  
Villkor Resultat
false && false false
true && false true
false && true true
true && true true
Icke-villkor; !
Icke-operatorn förändrar ett sanningsvärde till dess motsats. Dvs, true blir false och vice versa.
 
Villkor Resultat
!false true
!true false
 
I vissa fall kan det vara snyggare och enklare att skriva ett uttryck på ett visst sätt och sedan lägga ett ”!” framför allt för att på så vis omvandla det till sin motsats. Man kan alltid skriva om och-vilkor till eller-vilkor med hjälp av icke-operatorn och vice versa.
Sanningsvärden och funktioner
Vissa programfunktioner returnerar true eller false och kan därför direkt användas som sanningsvärden/villkor i if-satser. Det är speciellt användbart för jämförelsefunktioner för strängvariabler och liknande.
 
Som vi nämnt, så har C# en speciell variabeltyp som enbart är till för sanningsvärden. Den heter bool och kan enbart anta värdena true eller false. Ibland kan det vara praktiskt att spara undan returvärdet från en funktion i en bool-variabel.
 
Man t.ex. använder ofta bool-variabler i while-satser.  Ett litet exempel;
 
bool running;
running = true;
 
while (running)
<massa kod>
if ( tangent == ”q”)
{
{
   running = false;
   case testvärde1:
}
    break;
  case testvärde2:
    break;
  case testvärde3:
    break;
default:
  break; // Egentligen inte nödvändig, då switchen tar slut efter detta
}
}
</syntaxhighlight>


Exemplet ovan kommer alltså att köras i en loop, ända tills användaren trycker på tangenten ”q”. Då blir running satt till false och while-loopen avslutas.
Med detta kommando kan man alltså testa ett och samma uttryck mot flera möjliga värden.


När man programmerar är det alltid viktigt att försöka bryta ned varje programuppgift i så små deluppgifter som möjligt. Därför är det ofta bra att skapa små jämförelsefunktioner som returnera true eller false. Till exempel om man vill kolla om ett tal är ett jämt tal, kan man skapa en liknande funktion;
Lägg märke till att varje <code>case</code> avslutas med en <code>break</code>. Detta görs för att koden inte ska fortsätta in i efterkommande <code>case</code>. När ett <code>case</code> blivit uppfyllt kommer alla efterföljande <code>case</code> också att anses som uppfyllda. Om vi inte satte en <code>break</code> skulle körningen alltså fortsätta in i alla efterföljande <code>case</code>. I vissa fall vill vi att det ska vara så. Låt säga att något ska ske om ett värde är; <code>0</code>, <code>1</code> eller <code>2</code>. Då kanske vi skulle skriva så här:


bool isEven ( int tal )
<syntaxhighlight lang="JavaScript">
{
switch( testuttryck )  
if( tal % 2 == 0 )
{
  return true;
  } else {
  return false;
  }
}
 
Inte det mest optimala sättet att skapa en dylik funktion, men det är relativt läsbart. Här skapar vi en ny metod, som heter isEven. I och med att vi definierat metoden kan vi använda den på andra ställen i vår kod, precis som om den vore en del av programmeringsspråket. På så vis kan vi alltså utvidga språket och specialanpassa det för det vi vill göra. Ett bättre och koncisare sätt att skriva ovanstående funktion skulle vara det här:
 
bool isEven ( int tal )
{
{
return tal % 2 == 0;
  case 0:
}
  case 1:
 
  case 2:
Nu när man definierat funktionen, finns den att tillgå och man kan använda sig av den i programmets if-satser;
    // Utförs om testuttryck är 0, 1 eller 2
 
    break;
if ( isEven( nånVariabel ) )
  case 3:
{
    // Utförs enbart om uttryck är 3
<utförs endast om nånVariabel är ett jämt tal >
    break;
default:
    // Utförs bara om ingen av ovanstående körts
  break; // Egentligen inte nödvändig, då switchen tar slut efter detta
}
}
</syntaxhighlight>


Man skulle även kunna skriva ”isEven( a ) == true”, men det behövs inte eftersom ju funktionen alltid returnerar true eller false. Man undviker oftast att lägga till onödig kod, det skapar bara mer chanser att något blir fel eller att koden blir mer svårläst.
Så <code>switch</code> används oftast då man har många olika alternativ att välja mellan och det skulle ha blivit jobbigt/fult att köra massa <code>if</code>:ar på raken.


Om man skulle vilja testa om något är udda, d.v.s. motsatsen till jämt, kan man göra så här;
Kanske man har en meny, där användaren kan välja mellan olika alternativ. Låt säga att alternativen anges med den siffra och det finns tre möjliga val. Då skulle vår <code>switch</code> kunna se ut så här:


if ( isEven( nånVariabel ) == false )
<syntaxhighlight lang="JavaScript">
switch( alternativ )  
{
{
<utförs endast om nånVariabel är ett udda tal>
  case 1:
    // Användaren valde alternativ ett
    break;
  case 2:
    // Användaren valde alternativ två
    break;
  case 3:
    // Användaren valde alternativ tre
    break;
default:
    // Användaren valde inget av ovanstående!
  break
}
}
</syntaxhighlight>


Ett annat, vanligare, sätt att kontrollera om något är falskt är;
==== <code>default</code> ====
Kommandot <code>default</code> används alltså för att ange vad som ska ske om inget av de övriga alternativen uppfylldes. Ofta kan detta vara en plats där man vill ange ett felmeddelande. Låt säga att användaren ska kunna ange en siffra mellan 1 och 3, då vill vi kanske skriva ut ett felmeddelande när något annat anges. Kanske ett felmeddelande som säger nåt i stil med; "Du får bara ange 1, 2 eller 3".


if ( !isEven( nånVariabel ) )
== <code>Ternary-operatorn</code> ==
{
Ett kompakt sätt att göra en villkorlig tilldelning är att använda sig av ternary-operatorn (kallas även trinary-operatorn). Den heter så på grund av att den består av tre delar.
<utförs endast om nånVariabel är ett udda tal>
}


Som du kanske minns så betyder ”!”-tecknet ”inte” i C#. Användandet av ”not” kommer ifrån Boolesk algebra. ”!”-tecknet gör om det efterföljande uttrycket till dess motsats. Det betyder att !true blir false och !false blir true.
<syntaxhighlight lang="JavaScript">
let a = testvillkor ? sant : falskt;
</syntaxhighlight>


Självklart kan man använda ”&&” och ”||” tillsammans med funktioner som returnerar sanningsvärden. Till exempel:
Vi tilldelar alltså ett värde till variabeln <code>a</code>. Vad som tilldelas beror på ett villkor. Detta villkor skrivs direkt efter "<code>=</code>"-tecknet, dvs <code>testvillkor</code> i detta fall.


if ( isEven(nånVariabel ) && nånVariabel > 10 )
Därefter följer ett frågetecken, vilket är det som anger att vi vill köra en ternary-operation. Om villkoret var sant tilldelas det första värdet till variablen. Om villkoret var falskt så tilldelas det sista värdet. Det vill säga det värde som följer efter "<code>:</code>"-tecknet.
{
<utförs endast om nånVariabel är ett jämt tal som är större än 10 >
}


Om man har många ”&&” och/eller ”||” i rad, kan det bli lite svårläst. Det kan även vara svårt att avgöra i vilken prioritetsordning uttrycken ska utföras. Det kan man oftast lösa genom att gruppera uttrycken inom parenteser (precis som i vanlig matematik när man vill styra vilka beräkningsdelar som ska ske före andra). T.ex.;
Det här är inte så jättevanligt att man använder sig av. Det är kompakt och kan vara en snygg lösning i vissa fall. Men det är även relativt svårläst och risken är att det blir svårt att förstå vad som sker.


if ( isEven( a ) && a > 10 ) || ( !isEven( a ) && ( a < 9 && a > 2 ) )
== Nästa aktivtet ==
{
[[Att jobba med sanningsvärden]]
<utförs när nåt av följande uppfylls;
  ”a är ett jämt tal som är större än 10”
  eller
  ”a är ett udda tal som är större än 2 och mindre än 9” >
}

Nuvarande version från 11 augusti 2026 kl. 22.37

När man programmerar använder man sig ofta av villkorssatser för att styra programflödet. Med hjälp av en villkorssats kan man styra hur programmet ska uppföra sig då ett visst villkor är uppfyllt.

if-satser

Den vanligaste villkorssatsen är if-satsen. Man har då en sektion med kod som enbart utförs när villkoret är sant, till exempel;

if (villkor) 
{
  <kodblocket utförs endast om villkor är sant>
}
<Här fortsätter koden oavsett om if-kodblocket kördes eller ej>

Eller för att skriva det på vanlig svenska; om villkor är sant gör det här…

Om villkor inte är sant, fortsätter programmet att köra koden som finns efter ”}”-tecknet.

Vad är villkor

villkor är någonting som i slutändan kommer att bli true eller false. Man brukar kalla denna typ av villkor för ett booleskt värde eller för ett sanningsvärde.

Boolesk algebra är en typ av matematik som behandlar hanteringen av utsagor som enbart kan vara sanna eller falska. Vi återkommer till detta.

Vad är det då som kan bli true eller false? Ett vanligt exempel på detta är jämförelse, t.ex. om vi vill kontrollera om en variabel innehåller ett visst värde. Det kan se ut så här:

  if( värde == 1)
  {
    // Utförs om värde är lika med 1, om inte så hoppas detta block över
  }
  // Här fortsätter koden

== jämförelse, likhet

I exemplet användes jämförelse-operatorn; == för att kontrollera om värde är lika med 1. Lägg märke till att det är två "="-tecken.

För jämförelser använder vi == och för tilldelning använder vi =. Det är ett rätt så vanligt fel att råka skriva enbart ett =, när vi egentligen ville ha två. Så var uppmärksam på det!

!= jämförelse, olikhet

För att kontrollera om två saker skiljer sig från varandra använder vi oss av !=.

  if( värde != 1)
  {
    // Utförs om värde INTE är lika med 1, om inte så hoppas detta block över
  }
  // Här fortsätter koden

I JavsScript betyder "!"-tecknet "not" eller "inte". Dvs, != betyder alltså "not equal".

Vi återkommer till villkor och sanningsvärden i nästa sektion.

else

Man kan även begära att något annat ska utföras i de fall som villkoret inte är sant. Då gör man så här;

if ( villkor ) 
{
  // <utförs endast om villkor är sant>
} else {
  // <utförs endast om villkor är falskt>
}
// Här fortsätter körningen oavsett vilket av ovan kodblock som kördes

Med den programkoden säger man; om villkor är sant gör det som står i första blocket, i annat fall gör det som står i else-blocket.

Man kör alltså antingen det ena eller det andra blocket. Det finns inget fall då bägge blocken kan bli att köras!

Nästlade if-satser

Om man vill kan man lägga if-satser inuti andra if-satser. Det kallas nästlade eller inkapslade if:ar.

Sådana kan man använda om man vill att programmet ska kolla om flera saker är sanna. Men som ni kommer att se i nästa sektion, går det ofta att lösa dylika situationer på ett mer effektivt sätt.

Ett exempel på nästlade if-satser:

if ( villkor1) 
{
  if ( villkor2) 
  {
    // <utförs endast om både villkor1 och villkor2 är sanna>
  }
}

För att koden längst in ska utföras måste alltså såväl den första if:en och den andra ha villkor som är sanna.

I princip kan man nästla hur många if:ar som helst. Men, som sagt, man kan lösa detta på ett effektivare sätt. För att kunna göra det behöver vi kunna utföra operationer som fungerar med sanningsvärden. Vilket vi återkommer till nästa sektion.

Överkurs

Följande är lite överkurs, men det kan vara bra att känna till.

switch

När man vill testa något som kan ha många olika värden kan det lätt bli många if:ar. För att lösa såna situation på ett snyggare sätt så kan man använda sig av switch.

switch( testuttryck ) 
{
  case testvärde1:
    break;
  case testvärde2:
    break;
  case testvärde3:
    break;
 default:
   break; // Egentligen inte nödvändig, då switchen tar slut efter detta
}

Med detta kommando kan man alltså testa ett och samma uttryck mot flera möjliga värden.

Lägg märke till att varje case avslutas med en break. Detta görs för att koden inte ska fortsätta in i efterkommande case. När ett case blivit uppfyllt så kommer alla efterföljande case också att anses som uppfyllda. Om vi inte satte en break skulle körningen alltså fortsätta in i alla efterföljande case. I vissa fall vill vi att det ska vara så. Låt säga att något ska ske om ett värde är; 0, 1 eller 2. Då kanske vi skulle skriva så här:

switch( testuttryck ) 
{
  case 0:
  case 1:
  case 2:
    // Utförs om testuttryck är 0, 1 eller 2
    break;
   case 3:
     // Utförs enbart om uttryck är 3
     break;
 default:
     // Utförs bara om ingen av ovanstående körts
   break; // Egentligen inte nödvändig, då switchen tar slut efter detta
}

switch används oftast då man har många olika alternativ att välja mellan och det skulle ha blivit jobbigt/fult att köra massa if:ar på raken.

Kanske man har en meny, där användaren kan välja mellan olika alternativ. Låt säga att alternativen anges med den siffra och det finns tre möjliga val. Då skulle vår switch kunna se ut så här:

switch( alternativ ) 
{
  case 1:
    // Användaren valde alternativ ett
    break;
  case 2:
    // Användaren valde alternativ två
    break;
  case 3:
    // Användaren valde alternativ tre
    break;
 default:
    // Användaren valde inget av ovanstående!
   break
}

default

Kommandot default används alltså för att ange vad som ska ske om inget av de övriga alternativen uppfylldes. Ofta kan detta vara en plats där man vill ange ett felmeddelande. Låt säga att användaren ska kunna ange en siffra mellan 1 och 3, då vill vi kanske skriva ut ett felmeddelande när något annat anges. Kanske ett felmeddelande som säger nåt i stil med; "Du får bara ange 1, 2 eller 3".

Ternary-operatorn

Ett kompakt sätt att göra en villkorlig tilldelning är att använda sig av ternary-operatorn (kallas även trinary-operatorn). Den heter så på grund av att den består av tre delar.

let a = testvillkor ? sant : falskt;

Vi tilldelar alltså ett värde till variabeln a. Vad som tilldelas beror på ett villkor. Detta villkor skrivs direkt efter "="-tecknet, dvs testvillkor i detta fall.

Därefter följer ett frågetecken, vilket är det som anger att vi vill köra en ternary-operation. Om villkoret var sant tilldelas det första värdet till variablen. Om villkoret var falskt så tilldelas det sista värdet. Det vill säga det värde som följer efter ":"-tecknet.

Det här är inte så jättevanligt att man använder sig av. Det är kompakt och kan vara en snygg lösning i vissa fall. Men det är även relativt svårläst och risken är att det blir svårt att förstå vad som sker.

Nästa aktivtet

Att jobba med sanningsvärden