Selektion jämförande och logiska operatorer Programmering i C# Selektion jämförande och logiska operatorer Farid Naisan, Universitetsadjunkt Datavetenskap, Teknik och samhälle, Malmö högskola farid.naisan@ts.mah.se
Selektion true logiskt uttryck false sats-1 sats-n Flödesdiagram Selektion är en form av algoritm som alternativ till sekvensiell programmering som innebär att satserna utförs steg för steg. Selektion betyder att sätta villkor, dvs utföra operation endast under vissa villkor. Exempel: I någon beräkning får en negativ faktor x värdet noll: if (x < 0) x = 0;
Selektion – två alternativ välj bland två olika alternativ if (x <0) { //meddela användaren //avbryt körningen } else //räkna kvadratroten av x
Flödesdiagram Två alternativ: Logiskt uttryck sats-1 falskt sant delen false sats-1 sats-n true falskt delen sant
Selektion - flera alternativ Välj bland flera alternativ if ( (x >= 0 ) && ( x <= 9) ) { //Talet är positvt och ensiffrigt //Gör det du vill } else if ( (x > 9 ) && ( x < 999 ) ) if ( summan > 5000.0) //…. //fortsätt med något annat else //någon annan operation
Jämförelse operatorer Med selektion behöver man använda logiska uttryck. I logiska uttryck använder man logiska operatorer. Op Beskrivning < mindre än > större än <= mindre eller lika med >= större eller lika med == lika med != inte lika med Exempel double dTalA = 3.6, dTalB = -5.0; dTalA < dTalB false dTalA > dTalB true dTalB <= dTalA dTalA >= dTalB dTalA == 3.6D dTalB != -5.0D
text jämförelse Symbolen ‘==‘ och “!=“ kan också användas med typen string för att jämföra likehet och olikhet av två texter. Jämförelsen sker då efter tecknens placering i teckentabellen. "abc" != "abc" // false "abc" != "123" // true "abc" == "aBc" // false "abc" != "aBc" // true ("abc" + "123“) == "abc123" // true ("abc" + 4) == "abc4" // true
Logiska operatorer De mest använda logiska operatorer är logiskt och, logiskt eller och logisk negation. logiskt ’och’ && logiskt ’eller’ || logisk negation ! De används för att testa två eller flera logiska uttryck samtidigt.
Exempel – logiska operatorer En nybörjarstudent tänker programmera sin tanke om framtiden. Hennes vision är: ”Om jag blir stor och rik och inte är sjuk or slut, reser jag så mycket jag kan.” Villkor 1: ålder >= 60 Villkor 2: ekonomi = toppen Villkor 3: inte (sjuk) eller (orklös)), två undervillkor Samtliga villkor skall vara sanna för att hon skall lyckas med sin plan. if ((minÅlder >= 60) && (ekonomi == toppen) && (hälsa != sjuk) && (ork != slut) ) MessageBox.Show(”Jag reser mer och jobbar mindre när jag blir stor.”); Denna algoritm kan programmeras i en liten void funktion. Obs. datastrukturerna är slumpmässigt valda.
Exempel v1 public enum Status {toppen, gift, slut, sjuk} public void DayDreaming1() { //Variabler och testvärden int minÅlder = 65; string ekonomi = "toppen"; Status hälsa = Status.toppen; Status ork = Status.toppen; bool villkor1 = (minÅlder >= 60); bool villkor2 = (ekonomi.CompareTo("toppen") == 0); bool villkor3 = !((hälsa == Status.sjuk) || (ork == Status.slut)); if (villkor1 && villkor2 && villkor3) Console.WriteLine("Jag reser mer och jobbar mindre när jag närmar mig pensionen."); }
Några förtydligganden Följande är ekvivalenta: if (villkor1 && villkor2 && villkor3) ’1 if ( (villkor1) && (villkor2) && (villkor3) ) ’2 if (villkor1==true && villkor2== true && villkor3== true) ’3 if ( (villkor1==true) && (villkor2== true) && (villkor3== true) ) ’4 Den andra varianten (2) är en rekommenderad stil. Notera också: if(någonVillkor) är samma sak som if (någonVillkor == true) if(! någonVillkor) är samma sak som if (någonVillkor == false) Villkoret: !((hälsa == Status.sjuk) || (ork == Status.slut) ) kan skrivas som ( hälsa != Status.sjuk) && (ork != Status.slut) ) Detta tillämpas i version 2 av samma exempel nedan:
Exempel v2 public void DayDreaming2() { //Variabler och testvärden int minÅlder = 65; string ekonomi = "toppen"; Status hälsa = Status.toppen; Status ork = Status.toppen; if ( (minÅlder >= 60) && (ekonomi.CompareTo("toppen") == 0) && (hälsa != Status.sjuk) && (ork != Status.slut) ) Console.WriteLine("Jag reser mer och jobbar mindre när jag närmar mig pensionen."); }
Sammanfattningstabell || (logisk eller) A || B Resultat true || true true true || false false || true false || false false && (logisk och) A && B Resultat true && true true true && false false false && true false && false ! (logisk inte) !A Resultat !true false !false true
boolska variabler Varje logiskt uttryck resulterar i true eller false. x = -1; if ( x < 0 ) //samma som if (true) ... x = 10; if ( x < 0 ) //samma som if (false) … Man kan spara resultatet av logiska operationer i boolska variabler bool res; //om x är utanför 0 – 9 och beräkningen inte är färdig res = ( ( x < 0 ) || ( x > 9 ) ) && ( !klar ); if ( res ) //obs. !klar är samma som (klar == false)
Exempel Anta vi har variabel frisk av typen bool. bool frisk = false; bool res; res = frisk != true; //är samma som res = !frisk ; //vilket är samma som res = res = !(frisk == true);//är samma som res = frisk == false; // vilket är samma som res = !(frisk == false); Samtliga resulterar i true!
Nästlade satser Det kan blir svårtläst och jobbigt att skriva många if/else satser. Risken att göra fel blir också stor. Men det går inte alltid att ersätta if-else satser till en motsvarande switch konstruktion. Indentering av kod är viktig för att göra koden lättläst (se exemplen som följer). I vissa fall, är switch satsen ett bra alternativ. Det sägs också att switch är snabbard än if/else satsen.
Nästlade if -else public char SetBetyg (double poäng) { char betyg = '\0'; //nollställning if (poäng >= 0.0) if (poäng >= 85.0) betyg = '5'; else if (poäng >= 70.0) betyg = '4'; else if (poäng >= 50.0) betyg = '3'; else betyg = 'u'; } betyg = 'x'; //fel betyg return betyg;
Switch - syntax switch (uttryck) //uttryck kan endast vara int,char,string { case konstant uttryck 1: //sat(er) break; //hopp-sats, break eller goto, undvik helst goto case konstant uttryck 2: //satser break; //andra case-satser default: // valfritt }
Switch - exempel public void SwitchExempel() { Console.Write("Välj 1, 2 för att fortsätta, 0 för att avsluta! "); int val = int.Parse(Console.ReadLine()); switch (val) case 1: Console.WriteLine("Du valt 1."); break; case 2: Console.WriteLine("Du valt 2."); case 0: Console.WriteLine("Du valt att avsluta."); default: Console.WriteLine("Inget bra val!"); }
Sist men inte minst, ’?’-operatorn Syntax: boolskt uttryck ? utryck 1 : uttryck 2; Betrakta följande: //Räkna någon avgift public double RäknaAvgift(double number) { double avgift = 0.05*number; //5% gäller alla //+2% för belopp > 10000 if ( number > 10000.0) avgift += 0.02 * (number - 10000.0); //samma som avgift = avgift + //0.02.... return avgift; }
Forts. Satserna kan skrivas om med ?-operatorn: Ett avslutande råd: //Räkna någon avgift public double RäknaAvgiftEx(double number) { double avgift = 0.05*number; //5% gäller alla return ( number > 10000.0) ? avgift +0.02 * (number - 10000.0) : avgift; } Ett avslutande råd: Öka läsbarheten och minimera felkällor – använd parenteser flyttigt i alla lägen!
Parenteser Obs. när man har två eller satser efter if/else, måste man använda parenteser { } som i exemplet nedan. if ( x < 0 ) { x = 0; //… } Det är dock på säkra sidan att alltid använda parenteser. double rot = 0.0; if ( x > 0 ) rot = Math.Sqrt(x); The End