EMZETT.
Login

Kurz: array hat feste Länge, seq wächst dynamisch:

Teil des Kurses Nim

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

Arrays und Sequenzen

array hat feste Länge, seq wächst dynamisch:

import std/[sequtils, algorithm, sugar]
 
var a: array[5, int] = [5, 3, 9, 1, 7]
echo a, " ", a.len, " ", a[0], " ", a[^1]
a[0] = 50
echo a.sorted()
 
var s = @[5, 3, 9, 1, 7]
s.add(11)
s.insert(100, 0)
echo s
echo s.len, " ", s[1], " ", s[^1], " ", s[1..3], " ", s[1 ..< 3]
echo s.pop()
s.delete(0)
echo s
echo s.sorted()
echo s.sorted(Descending)
echo s.reversed()
echo s.map(x => x * 2)
echo s.filter(x => x > 4)
echo s.foldl(a + b)
echo s.mapIt(it * it)
echo s.filterIt(it mod 2 == 1)
echo s.anyIt(it > 8), " ", s.allIt(it > 0)
echo s.count(3), " ", s.find(9), " ", 9 in s, " ", 99 notin s
echo s.minIndex, " ", s.maxIndex
echo s.zip(@["a", "b", "c", "d", "e"])
echo toSeq(1..5)
echo newSeq[int](3)
echo repeat(7, 3)
echo concat(@[1, 2], @[3])
echo deduplicate(@[1, 2, 2, 3, 3, 3])
echo @[1, 2, 3, 4, 5, 6].distribute(3)
echo (@[1, 2, 3] & @[4])
echo s.mapIt($it).foldl(a & "-" & b)

Ausgabe:

[5, 3, 9, 1, 7] 5 5 7
@[1, 3, 7, 9, 50]
@[100, 5, 3, 9, 1, 7, 11]
7 5 11 @[5, 3, 9] @[5, 3]
11
@[5, 3, 9, 1, 7]
@[1, 3, 5, 7, 9]
@[9, 7, 5, 3, 1]
@[7, 1, 9, 3, 5]
@[10, 6, 18, 2, 14]
@[5, 9, 7]
25
@[25, 9, 81, 1, 49]
@[5, 3, 9, 1, 7]
true true
1 2 true true
3 2
@[(5, "a"), (3, "b"), (9, "c"), (1, "d"), (7, "e")]
@[1, 2, 3, 4, 5]
@[0, 0, 0]
@[7, 7, 7]
@[1, 2, 3]
@[1, 2, 3]
@[@[1, 2], @[3, 4], @[5, 6]]
@[1, 2, 3, 4]
5-3-9-1-7

Tupel

let person = (name: "Mia", alter: 17)
echo person
echo person.name, " ", person.alter
let (n, a) = person
echo n, " ", a
let punkt = (3, 4)
echo punkt[0] + punkt[1]
var t = (1, "eins", 3.5)
t[0] = 10
echo t
 
proc teile(a, b: int): (int, int) = (a div b, a mod b)
let (q, r) = teile(17, 5)
echo q, " ", r

Ausgabe:

(name: "Mia", alter: 17)
Mia 17
Mia 17
7
(10, "eins", 3.5)
3 2

Tabellen (Hash-Maps)

import std/[tables, sequtils, algorithm]
 
var alter = {"Mia": 17, "Tom": 25, "Zoe": 31}.toTable
alter["Ben"] = 12
echo alter["Mia"], " ", alter.len, " ", "Tom" in alter
echo alter.getOrDefault("Max", 0)
alter.del("Ben")
for name in alter.keys.toSeq.sorted:
  echo name, " = ", alter[name]
 
var zaehler = initCountTable[char]()
for c in "mississippi":
  zaehler.inc(c)
echo zaehler.largest
for k in zaehler.keys.toSeq.sorted:
  stdout.write k, ":", zaehler[k], " "
echo ""
 
var gruppen = initTable[int, seq[string]]()
for w in ["ein", "kleiner", "langer", "satz", "mit", "drei"]:
  gruppen.mgetOrPut(w.len, @[]).add(w)
for k in gruppen.keys.toSeq.sorted:
  echo k, ": ", gruppen[k]
 
let ordered = {"b": 2, "a": 1}.toOrderedTable
echo ordered

Ausgabe:

17 4 true
0
Mia = 17
Tom = 25
Zoe = 31
(key: 'i', val: 4)
i:4 m:1 p:2 s:4
3: @["ein", "mit"]
4: @["satz", "drei"]
6: @["langer"]
7: @["kleiner"]
{"b": 2, "a": 1}

Mit toSeq und sortedByIt holt man Schlüssel, Werte und Paare in sortierter Form:

import std/[tables, sequtils, algorithm]
 
let t = {"b": 2, "a": 1, "c": 3}.toTable
echo t.keys.toSeq.sorted
echo t.values.toSeq.sorted
echo t.pairs.toSeq.sortedByIt(it[1])

Ausgabe:

@["a", "b", "c"]
@[1, 2, 3]
@[("a", 1), ("b", 2), ("c", 3)]

Mengen und Aufzählungen

import std/sets
 
var s = toHashSet([3, 1, 2, 3, 1])
s.incl(9)
s.excl(1)
echo s.len, " ", 3 in s, " ", 1 in s
echo (s + toHashSet([7])).len
echo (s * toHashSet([2, 9, 100])).len
echo toHashSet([1, 2]) < toHashSet([1, 2, 3])
 
type Wochentag = enum Mo, Di, Mi, Do, Fr, Sa, So
let werktage: set[Wochentag] = {Mo..Fr}
echo Mi in werktage, " ", Sa in werktage
echo Fr.ord, " ", succ(Mo), " ", pred(Fr), " ", $So
for tag in Mo..Mi:
  stdout.write tag, " "
echo ""
echo {'a'..'e'}

Ausgabe:

3 true false
4
2
true
true false
4 Di Do So
Mo Di Mi
{'a', 'b', 'c', 'd', 'e'}

Merke

  • array (fest), seq (dynamisch, @[...]), Table, HashSet, set[...] und Tupel
  • sequtils und sugar liefern map, filter, foldl, mapIt, filterIt
  • Indizes: a[^1] zählt vom Ende, a[1..3] ist ein Ausschnitt
  • Table/CountTable für Zuordnungen, toTable, getOrDefault, mgetOrPut

Übungsaufgabe

Zähle mit einer CountTable die Wörter eines Satzes.

Quiz zur Selbstkontrolle

?

  • Das letzte Element (richtig)
  • Das erste Element
  • Potenz
  • Fehler

Weiter im Kurs

Zurück: Kontrollfluss und Prozeduren

Weiter: Objekte, Vererbung und Generics

Alle Kapitel: Nim im Überblick