C# Villkor
Inledning
Du gör ofta val i livet, och valet du gör får olika konsekvenser och följder. När klockan är tolv är det egentligen lunchtid, och du kan känna efter om du är hungrig. Beroende på resultatet handlar du på olika sätt. Är du hungrig går du självklart och äter, men om du inte är hungrig väntar du någon timme tills aptiten kommer. Vårt hungrighetsproblem skulle i pseudokod kunna se ut som följer:
Om hungrig
gå och ät
Annars
vänta någon timme
I C# beskrivs sådana här villkor t.ex. av s.k. if…else-satser. Man ställer upp ett villkorsuttryck, och anger sen vad som ska hända om villkoret är uppfyllt, och vad som ska hända om det inte är uppfyllt:
{
en eller flera satser
}
else
{
en eller flera satser
}
Ett litet exempel
Villkoret ska göra en test och ge svaret sant eller falskt, t.ex. kolla om en variabel är större än 25. Om villkoret är sant utförs de programrader som står mellan de båda första klamrarna, om villkoret är falskt körs programraderna som står mellan de båda sista (efter else). Else-delen behöver inte finnas med utan kan utelämnas. För att lättare kunna läsa koden flyttas, raderna mellan ihophörande startklammer och slutklammer in en bit. Detta kallas indentering. När man skriver längre och större program så underlättar det avsevärt läsbarheten.
Exempel på en programsnutt:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a; //deklaration av en variabel för heltal
Console.WriteLine( " Ange ett tal: ");
a = Convert.ToInt32(Console.ReadLine());
if (a>25)
{
Console.WriteLine( "Större än 25");
}
else
{
Console.WriteLine( "Mindre än eller lika med 25");
}
Console.ReadKey();
}
}
}
Om variabeln a är större än 25 kommer den första texten skrivas ut, annars den andra. Om resultatsatserna bara är en rad långa (som efter else), kan man utelämna klamrarna, men i det första fallet är satserna två rader, och klamrarna måste stå runt koden.
Man kan också skriva if-satser i if-satser, s.k. nästlade if-satser:
{
en eller flera satser
}
else if (villkor2)
{
en eller flera satser
}
else
{
en eller flera satser
}
Jämförelseoperatorer
Villkoren kan jämföra uttryck på olika sätt med hjälp av de olika jämförelseoperatorerna, som följer nedan:
| Operator | Betyder | Exempel |
|---|---|---|
| < | Mindre än | if (a<20) |
| > | Större än | if (b>100) |
| == | Lika med | if (produkt==500) |
| != | Skiljt från (inte lika med) | if (x!=28) |
| <= | Mindre än eller lika med | if (a<=2000) |
| >= | Större än eller lika med | if (b>=12) |
Observera här att när man jämför om variabeln är lika med något använder man dubbla likhetstecken,
eftersom ett enkelt likhetstecken används när man tilldelar en variabel ett värde,
t.ex. a=20;
Ett exempel till
/*Programmet ska dra av rabatter, 5 % rabatt om summan överstiger 1000 kr och 10 % om summan överstiger 2000 kr. */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a;
double p, k, rabatt=0;
Console.WriteLine( "Mata in antal böcker : ");
a = Convert.ToInt32(Console.ReadLine());
Console.WriteLine( "Mata in bokpriset : ");
p = Convert.ToDouble(Console.ReadLine());
k=50 + a*p;
if (k>=2000)
{
rabatt=k*0.1;
}
else if (k>=1000)
{
rabatt=k*0.05;
}
Console.WriteLine( "Kostnaden blir "+(k-rabatt)+" kronor");
if (k>=1000) Console.WriteLine( "Du har fått "+rabatt+" kr i rabatt.");
Console.ReadKey();
}
}
}
Logiska operatorer
Man kan också kräva att flera villkor ska vara uppfyllda samtidigt, genom att i if-satsen förbinda flera villkor med s.k. logiska operatorer.
| Operator | Betyder | Exempel |
|---|---|---|
| && | och | if ((a>20) && (a<30)) |
| || | eller | if ((a==0) || (b<0)) |
| ! | inte | if (!(a>0)) |
En annan lösning på tidigare exempel
/*Programmet ska dra av rabatter, 5 % rabatt om summan överstiger 1000 kr och 10 % om summan överstiger 2000 kr. */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a;
double p, k, rabatt=0;
Console.WriteLine( "Mata in antal böcker : ");
a = Convert.ToInt32(Console.ReadLine());
Console.WriteLine( "Mata in bokpriset : ");
p =Convert.ToDouble(Console.ReadLine());
k = 50 + a*p;
if (k<1000)
{
rabatt=0;
}
else if (k>=1000 && k<2000)
{
rabatt=k*0.05;
}
else
{
rabatt=k*0.1;
}
Console.WriteLine( "Kostnaden blir "+(k-rabatt)+" kronor");
if (k>=1000) Console.WriteLine( "Du har fått "+rabatt+" kr i rabatt.");
Console.ReadKey();
}
}
}
Skillnad mellan if-if och if-else if
En, if - else if, gör att bara en del körs. Om något villkor blivit sant så kommer resten av if - else if satsen att hoppas över. Vid upprepade if-satser så kommer varje if-sats att testas och om de är sanna så kan fler komma att köras.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int x=1;
if (x==1) {
x=x+1;
}
if (x==2) {
x=x+10;
}
Console.WriteLine( x); //12
int y=1;
if (y==1) {
y=y+1;
}
else if (y==2) {
y=y+10;
}
Console.WriteLine( y); //2
}
}
}
if - med och utan måsklamrar
Om det saknas måsklamrar { } eftyer en if, else if, else uttryck så innebär det att endast första satsen (instruktionen) efter hör till själva if, else if, else uttrycket.
Visst kan det ibland vara bra att spara plats men ta för vana nu i början att ALLTID skriva ut måsklamrar, även om det bara gäller en instruktion efter.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int x=0;
if (x==1) {
x=x+10;
x=x+20;
}
x=x+30;
Console.WriteLine( x); //30
int y=0;
if (y==1)
y=y+10;
y=y+20;
y=y+30;
Console.WriteLine( y); //50
}
}
}
Källor
Filmer
C# Svenska - 11 - Kommentarer (Mr1Buying - 5 min)
C# Svenska - 10 - Snabbtilldelningsoperatorer (Mr1Buying - 9 min)
C# Svenska - 6 - Jämförelseoperatorer (Mr1Buying - 9 min)
C# Svenska - 7 - Villkorssatser (Mr1Buying - 14 min)
C# Svenska - 8 - Else if (Mr1Buying - 8 min)
C# Svenska - 9 - Logiska operatorer (Mr1Buying - 15 min)