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"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 ""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)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)42 abab 3.0 (4.0, 6.0) (8.0, 12.0) 42 16
Merke
- 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
Aufgabe
Schreibe eine Prozedur istPrim(n: int): bool und gib alle Primzahlen bis 50 aus.