Kurz: let status = if n > 10: “groß” else: “klein” echo status
Teil des Kurses Nim
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 LinuxSchleifen
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 2Prozeduren
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
16Merke
- Einrückung bildet Blöcke;
if/elif/else,caseundwhenverzweigen - Schleifen:
for i in 1..5,countdown,while,blockmit Label procdefiniert Prozeduren (letzter Ausdruck = Rückgabe),funcist rein,template/macroerweitern 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
Was ist der Rückgabewert einer proc ohne return?
- Der letzte Ausdruck (richtig)
- nil
- 0
- void
Wofür steht var bei einem Parameter?
- Der Parameter ist veränderbar (Referenz) (richtig)
- Neue Variable
- Optionaler Parameter
- Konstante
Wofür dient
$?
- Wandelt einen Wert in einen String um (richtig)
- Startet die Shell
- Ist ein Kommentar
- Vergleicht Werte
Weiter im Kurs
Zurück: Einführung und erstes Programm
Weiter: Sequenzen, Tabellen, Mengen und Tupel
Alle Kapitel: Nim im Überblick