Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Artiklar / Titel på artikeln

Logiska operatorer, selektion

Postad 2002-02-14 av Staffan Berg i sektionen ASP.NET, C#, Okategoriserat med 0 Kommentarer | Läst av: 3900, Betyg: 0%

Förord

Denna artikel handlar om något som är väldigt användbart i alla programmeringsspråk, nämligen logiska operatorer och selektion. Efter att du har läst denna artikel skall du förhoppningsvis ha fått en uppfattning om hur de används i Delphi.
Innehåll
  » Logiska operatorer
  » Selektion
  » Konstantmängder
  » Operatorerna is och as


Logiska operatorer

På booleska variabler och i logiska uttryck kan man använda de logiska operatorerna and, or och not. Operatorn not negerar uttryck eller logiska värden och kräver en operand.

Operatorerna and, or och xor kräver två uttyck eller logiska värden som operander. I sanningstabellen nedan är a och b två booleska variabler eller uttryck.

Sanningstabell













aba and ba or ba xor b
falsefalsefalsefalsefalse
falsetruefalsetruetrue
truefalsefalsetruetrue
truetruetruetruefalse


Ovanstående tabell kan sammanfattas på följande sätt.

  • (a and b) har värdet true endast då både a och b är sanna.

  • (a or b) har värdet true om någon av a eller b är sann.

  • (a xor b) har värdet om a och b har olika värden.


Anta att variabeln x har värdet 25 och variabeln y har värdet 10. Nedan ges några sammansatta uttyck som har värdet true eller false.








Logisk uttyckLogisk värde
(x=0)sant
(x-10 > y) and (y <> 0)sant
not (xsant


På grund av prioritetsordningen är parenteserna i exemplen ovan helt nödvändiga. Det går alltså inte att skriva det andra exemplet som

x-10 > y and y <> 0 {OBS! Felaktigt}

Eftersom and har högst prioritet innebär detta uttrycket

y and y

beräknas först vilket alltså inte är avsikten.

Ytterligare exempel på sammansatta uttyck.









PåståendeMotsvarande Pascalkod
x har värdet 6, 7 eller 8 (x=6) or (x=7) or x=8)
5.95<=x>6.05 (5.95<=x) and x<6.05)
ch1 är en liten engelsk bokstav ('a'<=ch1) and (ch1<='z')
ch1 är inte en liten engelsk bokstav not (('a'<=ch1) and (ch1<='z'))




Selektion

Tvåvägsval, if-then-else
I programmeringssammanhang är det vanligt att man måste välja mellan en av två saker beroende på om ett visst villkor är uppfyllt eller inte. Detta villkor formuleras då som ett logiskt uttryck som har värdet true eller false.

Ett tvåvägsval kan se ut enligt följande princip.

if then
truesats
else
falsesats;

Orden if, then och else är reserverade ord.

Ett mer konkret exempel om man använder en etikett för ett skriva ut resultatet.


if tid <=10.3 then
Label1.Caption := 'Till final'
else
Label1.Caption := 'Utslagen';

Det går naturligtvis också bra att köra flera satser i de olika grenarna. De måste i så fall omgärdas med sats-parenteserna begin-end.

if then begin
Sats1;
Sats2;
end
else begin

sats3;
sats4;
sats5;
end;

Här utförs Sats1 och Sats2 om uttrycket är sant, annars utförs Sats3, Sats4 och Sats5.

Flervägsval
Satserna i de båda grenarna i en if-sats kan vara godtyckliga satser. Speciellt kan de bestå av andra if-satser. Man säger då att if-satserna är nästlade. Att satsen i else-grenen utgörs av en ny if-sats är vanligt då man har att välja mellan fler än två saker.

Vi reder ut detta med hjälp av ännu ett exempel.


x := StrToInt(Edit1.Text); //Läs in ett värde till variabeln x.
if x=1 then
Label1.Caption := 'Ett'
else
if x=2 then
Label1.Caption := 'Två'
else
if x=3 then
Label1.Caption := 'Tre'
else
Label1.Caption := 'Stort tal';

De nästlade if-satserna är här utformade som ett upprepat tvåvägsval. Observera indragningarna! Ett if och motsvarande else står precis rakt under varandra för att understryka att de hör ihop. Tumregeln är att ett else alltid hör till närmast föregående if.

Case-satsen
Ibland är tillvägagångssättet ovan den enda möjligheten att formulera ett flervägsval med ömsesidigt uteslutande val. Detta kan bli besvärligt om valen är många. En bättre lösning erbjuder då den s k Case-satsen nedan.


:= StrToInt(Edit1.Text); //Läs in ett värde till variabeln x.
case x of
1: Label1.Caption := 'Ett';
2: Label1.Caption := 'Två';
3: Label1.Caption := 'Tre';
else
Label1.Caption := 'Stort tal';
end;

Det är alltså värdet på x, selektionsvärdet, och värdet i konstantlistan (värdena före kolonet i satserna) som bestämmer vilken tilldelning av etiketten som skall utföras.

Regler för case-satser är följande:

  • Selektionsuttrycket måste vara av enkel datatyp men inte flyttalstyp.

  • Satsen efter kolon (:) kan vara en godtycklig sats. Om flera satser skall ingå måste de omgärdas av begin-end.

  • Om har ett värde bland de uppräknade värdena till vänster om ett kolon (:) utförs satsen för det angivna värdet.

  • Om har ett värde som saknas bland de uppräknade värdena till vänster om ett kolon (:) utförs satsen efter else.

  • Case-satsen behöver inte ha en else-sats.

  • Ett värde kan anges som ett antal uppräknade värden i konstantlistan. Man kan t o m ange ett slutet intervall.

  • Lägg märke till att inga variabler får finnas i konstantlistan. Då är det ju ingen konstantlista.



Konstantmängder

Operatorn in
Ett bekvämt hjälpmedel då man skall testa om ett uttryck eller en variabel kan tänkas ha flera olika värden är s k konstantmängder. Konstantmängder anges inom klammerparenteser:

['a'..'z','å','ä','ö']

Som du ser räknas elementen upp ungefär som i en Case-sats.

Följande regler gäller för konstantmängder:

  • Elementen måste vara konstanter, ej variabler.

  • Ett element i en mängd måste ha ett ordningsnummer 0 .. 255.


Man kan testa med operatorn in (reserverat ord) om ett element finns i en mängd eller inte.

if ch in ['0'..'9'] then
Label1.Caption := 'Siffertecken';
else
Label1.Caption := 'Inget siffertecken';


I proceduren nedan demonstreras hur konstantmängder och in-operatorn kan användas.


procedure TForm1.Button1Click(Sender:TObject);
var
nr : integer;
ch : char;
begin
nr := StrToInt(Edit1.Text);
ch := Chr(nr);
Label2.Caption := 'Ordningsnumret motsvarar tecknet '+ch;
if ch in ['a'..'z','å','ä','ö'] then
Label3.Caption := 'Liten bokstav';
else
if ch in ['A'..'Z','Å','Ä','Ö'] then
Label3.Caption := 'Stor bokstav';
else
if ch in ['0'..'9'] then
Label3.Caption := 'En siffra';
end
else
Label3.Caption := 'Annat tecken!';
end.

En negation av en test med in-operatorn skrivs alltid så här :

if not (ch in ['0'..'9'] then
Label1.Caption := 'Inget siffertecken';

Sätt alltså först en parentes om testen och sedan not strax före parentesen.


Operatorerna is och as

Du har säkert lagt märke till den parameter som Delphi skriver ut till alla händelseprocedurer, Sender av typen TObject. Detta är helt oberoende av om det är en knapp eller en editeringsruta händelseproceduren är knuten till. Det finns två operatorer med vars hjälp man kan hantera denna parameter, nämligen operatorerna is och as. Det kan fungera på följande vis:


procedure TForm1.Button1Click(Sender:TObject);
var
s : string;
begin
if Sender is TButton then
s := 'kommandoknapp'
else
if Sender is TEdit then
s := 'editeringsruta'
else
if Sender is TCheckBox then
s := 'kryssruta'
else
s := 'annan komponent';
Showmessage('Du tryckte på en '+x+'.');
end.

I satsen

if Sender is TButton then

kontrolleras om parametern Sender är av typen TButton.
Upp

0 Kommentarer

Skriv en kommentar på artikeln

Ditt betyg på artikeln



Kommentar:





Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 159
27 952
271 704
847
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies