EMZETT.
Login

Kurz: let status = if n > 10: “groß” else: “klein” echo status

Teil des Kurses Nim

Kapitel 2 von 8 im Kurs Nim. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Bedingungen

let n = 15
if n mod 15 == 0:
  echo "FizzBuzz"
elif n mod 3 == 0:
  echo "Fizz"
else:
  echo n
 
let status = if n > 10: "groß" else: "klein"
echo status
 
let note = 2
case note
of 1: echo "sehr gut"
of 2, 3: echo "gut bis befriedigend"
of 4..5: echo "ausreichend bis mangelhaft"
else: echo "ungültig"
 
let text = case n
  of 0: "null"
  of 1..9: "einstellig"
  else: "größer"
echo text
 
when defined(linux):
  echo "läuft unter Linux"
else:
  echo "anderes System"

Ausgabe:

FizzBuzz
groß
gut bis befriedigend
größer
läuft unter Linux

Schleifen

for i in 1..5:
  stdout.write i, " "
echo ""
 
for i in countdown(5, 1):
  stdout.write i, " "
echo ""
 
for i in countup(0, 10, 3):
  stdout.write i, " "
echo ""
 
for i in 0 ..< 3:
  stdout.write i, " "
echo ""
 
for x in [10, 20, 30]:
  stdout.write x, " "
echo ""
 
for i, x in ["a", "b", "c"]:
  stdout.write i, ":", x, " "
echo ""
 
var k = 0
while k < 3:
  stdout.write "w", k, " "
  inc k
echo ""
 
for i in 1..10:
  if i mod 2 == 0: continue
  if i > 7: break
  stdout.write i, " "
echo ""
 
block aussen:
  for a in 1..3:
    for b in 1..3:
      if a * b == 4: break aussen
      stdout.write a * b, " "
echo ""

Ausgabe:

1 2 3 4 5
5 4 3 2 1
0 3 6 9
0 1 2
10 20 30
0:a 1:b 2:c
w0 w1 w2
1 3 5 7
1 2 3 2

Prozeduren

proc quadrat(x: int): int =
  x * x                              # letzter Ausdruck ist der Rückgabewert
 
proc addiere(a, b: int): int = a + b
 
proc begruesse(name: string, gruss = "Hallo"): string =
  gruss & ", " & name & "!"
 
proc fak(n: int): int =
  if n <= 1: return 1
  n * fak(n - 1)
 
proc tausche(a, b: var int) =        # var = Referenz (veränderbar)
  let tmp = a
  a = b
  b = tmp
 
proc minmax(l: seq[int]): (int, int) =
  (min(l), max(l))
 
proc teile(a, b: int): tuple[q, r: int] =
  (a div b, a mod b)
 
func rein(x: int): int = x * 2       # func = pure function ohne Nebenwirkung
 
echo quadrat(7), " ", addiere(3, 4), " ", fak(15)
echo begruesse("Mia")
echo begruesse("Tom", gruss = "Servus")
var p = 1
var q = 2
tausche(p, q)
echo p, " ", q
let (kleinster, groesster) = minmax(@[5, 3, 9, 1])
echo kleinster, " ", groesster
echo teile(17, 5)
echo rein(21)
echo 5.quadrat, " ", 3.addiere(4)          # Methodenaufruf-Syntax (UFCS)

Ausgabe:

49 7 1307674368000
Hallo, Mia!
Servus, Tom!
2 1
1 9
(q: 3, r: 2)
42
25 7

Überladen und Operatoren

proc verdopple(x: int): int = x * 2
proc verdopple(s: string): string = s & s
proc verdopple(x: float): float = x * 2.0
 
type Vektor = object
  x, y: float
 
proc `+`(a, b: Vektor): Vektor = Vektor(x: a.x + b.x, y: a.y + b.y)
proc `$`(v: Vektor): string = "(" & $v.x & ", " & $v.y & ")"
proc `*`(v: Vektor, s: float): Vektor = Vektor(x: v.x * s, y: v.y * s)
 
echo verdopple(21), " ", verdopple("ab"), " ", verdopple(1.5)
let a = Vektor(x: 1, y: 2)
let b = Vektor(x: 3, y: 4)
echo a + b
echo (a + b) * 2.0
 
template doppelt(x: untyped): untyped = x * 2
echo doppelt(21)
 
proc applyTwice(f: proc(x: int): int, x: int): int = f(f(x))
echo applyTwice(proc(x: int): int = x + 3, 10)

Ausgabe:

42 abab 3.0
(4.0, 6.0)
(8.0, 12.0)
42
16

Merke

  • Einrückung bildet Blöcke; if/elif/else, case und when verzweigen
  • Schleifen: for i in 1..5, countdown, while, block mit Label
  • proc definiert Prozeduren (letzter Ausdruck = Rückgabe), func ist rein, template/macro erweitern die Sprache
  • Überladen und eigene Operatoren (+, $) sind möglich

Übungsaufgabe

Schreibe eine Prozedur istPrim(n: int): bool und gib alle Primzahlen bis 50 aus.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Einführung und erstes Programm

Weiter: Sequenzen, Tabellen, Mengen und Tupel

Alle Kapitel: Nim im Überblick