homeUnix & Internet Unix & Shell-Programmierung: Kontrollstrukturen und Blöcke Prof. Dr. Uwe Schmidt FH Wedel

Kontrollstrukturen und Blöcke

weiter

weiter

Anweisungen, bedingte Ausdrücke und Kontrollstrukturen

Zuweisungen
a = "abc"
b = a
 
ab = ba
ab = [ba]
ab = plusMinus(2,1)
 
x,y,z = 1,2,3
x,y,z = [1,2,3]
x,y,z = [1,2,3,4,5]
x,y,z = [1,2]
Verzweigungen
if
a = "abc"
b = "xyz"
 
if a < b then
  a + " ist kleiner als " + b
else
  a + " ist nicht kleiner als " + b
end
                # => "abc ist kleiner als xyz"
 
def max(x,y)
  if x >= y then
    x
  else
    y
  end
end
 
max(2,3)                # => 3
Mehrwegverzweigungen
 
def token(s)
 case s
   when "if"       : :if
   when "while"    : :while
   when /^[a-z]+$/ : :identifier
   else              nil
 end
end
 
token "if"            # => :if
token "abc"           # => :identifier
token "123"           # => nil
weiter
bedingte Ausdrücke
a = (defined? x) ? x : 1
 
x = 2
a = (defined? x) ? x : 1
 
a = y || 1
 
y = 2
a = y || 1
Schleifen
while
r = 0
n = 42
 
while n != 0 do
  r = r + n
  n = n - 1
end
 
r                       #  => 903
besser
nr = 42, 0
 
while n != 0 do
  nr = n - 1, r + n
end
 
r                       #  => 903
weiter
Zählschleifen
r = 0
for i in 1..42 do
  r = r + i
end
 
r                       # => 903
weiter
Blöcke
sind Ausdrücke (oder Anweisungen) die parametrisiert sind.
Beispiel
do | i |
  r = r + i
end
merke
Dieser Block kann aufgefasst werden als eine Funktion ohne Namen, aber mit einem formalen Parameter i.
merke
r ist in diesem Beispiel eine zu dem Block globale Variable.
alternative Syntax
{| i |  r = r + i}
weiter
upto
Alternative zu Zählschleifen
 
r = 0
1.upto(42) {|ir = r + i }
r                       # => 903
merke
Ein Block kann als letzter Parameter an eine Methode übergeben werden.
merke
upto ist eine Methode mit 2 Parametern.
Der 2.Parameter muss ein Block sein.
merke
for Schleifen werden intern durch Methoden mit Blöcken als Parameter realisiert.
gut
Es können eigene Kontrollstrukturen mit Hilfe von Blöcken als Parameter realisiert werden.
Die Menge der Kontrollstrukturen ist also nicht fest von der Sprache vorgegeben.
weiter
times
Methode mit einem Block als Parameter
 
r = 0
42.times {|ir = r + i }
                        # => 42
r                       # => 861
 
r = 0
0.upto(41) {|ir = r + i }
                        # ?> 42
r                       # => 861
gut
Mit Hilfe von Blöcken können Schleifen über alle Elemente eines Containers implementiert werden.
merke
Methoden für Strings: each, each_line, each_byte, sub, gsub, scan,
merke
Methoden für Listen: each, each_index, map!
merke
Methoden für assoziative Felder: each, each_key, each_value
each
für Listen
 
l = [1,2,3,4,5]
r = []
l.each {|ir << i * i}
r               # => [1, 4, 9, 16, 25]
weiter
each
für Strings
 
r = ""
s = "hello"
 
s.each_byte do |c|
  r << c.to_s << ' '
end
 
r              # => "104 101 108 108 111 "
 
s = <<END
ein
paar
beliebige
Woerter
END
 
lc,cc=0,0
s.each_line do |l|
  lc = lc + 1
  cc = cc + l.length
end
 
cc.to_s + " Zeichen in " + lc.to_s + " Zeilen"
                # => "27 Zeichen in 4 Zeilen"
weiter
scan
für Strings
 
def words(s)
  ws = []
  s.scan(/\w+/) {|wws << w}
  ws
end
 
words s
                # => ["ein", "paar",
                #     "beliebige", "Woerter"]
map und select
für Listen
 
l = [1,2,3,4,5]
 
l.map {|xx*x}           # => [1, 4, 9, 16, 25]
l                         # => [1, 2, 3, 4, 5]
 
l.select {|xx % 2 == 1} # => [1, 3, 5]
l.select {|xx % 2 != 1} # => [2, 4]
l                         # => [1, 2, 3, 4, 5]
weiter

Letzte Änderung: 14.02.2012
© Prof. Dr. Uwe Schmidt
Prof. Dr. Uwe Schmidt FH Wedel