diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9d81605..18678ae 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,13 +31,7 @@ jobs: # 3. Build the documents - name: "Build the documents" run: | - make -j -C lecture compile - make -j -C exercises compile - make -j -C misc/linux_commands compile - mkdir -p pdfout - cp lecture/pdfout/*.pdf pdfout/ - cp exercises/pdfout/*.pdf pdfout/ - cp misc/linux_commands/pdfout/*.pdf pdfout/ + make -j # 4. Upload artifacts to GitHub - name: Upload artifacts to GitHub @@ -91,5 +85,9 @@ jobs: path: . name: Vorkurs-Materialien + - name: Set current year + id: year + run: echo "::set-output name=year::$(date +'%Y')" + - name: Deploy with rsync - run: rsync -avz * ${{ secrets.SSH_USER }}@login.d120.de:public_html + run: rsync -avz * ${{ secrets.SSH_USER }}@login.d120.de:public_html/vorkurs-${{ steps.year.outputs.year }} diff --git a/.gitignore b/.gitignore index 1a81f23..02a1522 100644 --- a/.gitignore +++ b/.gitignore @@ -378,4 +378,7 @@ TSWLatexianTemp* #*Notes.bib .secrets options.cfg + +# SVG package svg-inkscape/ +svg-inkscape-*/ diff --git a/.pep8 b/.pep8 index 68859ad..20698f3 100644 --- a/.pep8 +++ b/.pep8 @@ -1,2 +1,3 @@ [pep8] max-line-length = 120 +ignore = E302, E305 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2c17662..ad330b3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -17,6 +17,7 @@ repos: rev: 'v2.3.1' # Use the sha / tag you want to point at hooks: - id: autopep8 + exclude: ^.*/listings/unformatted/.*\.py$ - repo: https://github.com/editorconfig-checker/editorconfig-checker.python rev: '3.0.3' # pick a git hash / tag to point to hooks: diff --git a/Makefile b/Makefile index eb18de3..c7628d6 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,8 @@ +.DEFAULT_GOAL := all OUT_DIR := pdfout/ # find all makefiles in subdirectories -MAKEFILES := $(shell find . -mindepth 2 -name 'Makefile' -not -path './.git/*' -not -path './.devcontainer') +MAKEFILES := $(shell find . -mindepth 2 -name 'Makefile' -not -path './.git/**/*' -not -path './.devcontainer/**/*') $(MAKEFILES:Makefile=Makefile.all): $(eval MAKEFILE := $(patsubst %.all,%,$@)) diff --git a/README.md b/README.md index f4b97b1..3b8ac6c 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ Neben einer aktuellen TeX Live Distribution wird folgende Software benötigt: Zur einfachen Erstellung der Inhalte stehen UNIX Makefiles bereit, Details dazu sind den jeweiligen Verzeichnis zu entnehmen. ## Lizenz -Eine Verwendung des Logos der Fachschaft Informatik, TU Darmstadt (`bildmarke_ohne_rand.png`), ist nur für Fachschaftstätigkeiten gestattet. +Eine Verwendung der Logos der Fachschaft Informatik, TU Darmstadt in (`lecture/globalMedia/*.(pdf|svg)`), ist nur für Fachschaftstätigkeiten gestattet. Alle anderen Inhalte dieses Projekts stehen, sofern nicht anders angegeben, unter der GNU General Public License v3.0 (GNU GPLv3): diff --git a/codingchallenges/2019/TicTacToe.py b/codingchallenges/2019/TicTacToe.py index b76909c..91080c6 100644 --- a/codingchallenges/2019/TicTacToe.py +++ b/codingchallenges/2019/TicTacToe.py @@ -75,7 +75,7 @@ def computer_move(): def game_over(): - if board.count(player)+board.count(computer) == 9: + if board.count(player) + board.count(computer) == 9: return True return False diff --git a/codingchallenges/2019/vorstellung.tex b/codingchallenges/2019/vorstellung.tex index 23bfc6e..cebc3fc 100755 --- a/codingchallenges/2019/vorstellung.tex +++ b/codingchallenges/2019/vorstellung.tex @@ -1,5 +1,6 @@ +% !TeX root = vorstellung.tex \input{../../lecture/global} -\logo*{\includegraphics{../../lecture/globalMedia/bildmarke_ohne_rand}} +\logo*{\includegraphics{../../lecture/globalMedia/logo\IfDarkModeT{-dark}.pdf}} \usepackage{float} \usepackage{listings} \usepackage{graphicx} @@ -8,7 +9,7 @@ \title[Programmiervorkurs]{Programmiervorkurs Wintersemester 2019/20} \subtitle{{\small der Fachschaft Informatik}} -%\logo[2]{\includegraphics[scale=5]{../../lecture/globalMedia/bildmarke_ohne_rand}} +%\logo[2]{\includegraphics[scale=5]{../../lecture/globalMedia/logo\IfDarkModeT{-dark}.pdf}} \author{Vorkursteam der Fachschaft Informatik} \institute{TU Darmstadt} \date{Wintersemester 2019} diff --git a/codingchallenges/2021/2048-advanced.py b/codingchallenges/2021/2048-advanced.py index 963ac7d..bea4536 100644 --- a/codingchallenges/2021/2048-advanced.py +++ b/codingchallenges/2021/2048-advanced.py @@ -31,10 +31,10 @@ # Translate direction to a vector with length 1 [x, y] directionVectors = { - "left": [-1, 0], - "down": [0, 1], - "up": [0, -1], - "right": [1, 0], + "left": [-1, 0], + "down": [0, 1], + "up": [0, -1], + "right": [1, 0], } x = 69 @@ -65,7 +65,7 @@ def randint(minimum: int, maximum: int): t = x ^ ((x << 11) & 0xFFFFFFFF) # 32bit x, y, z = y, z, w w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)) - return (w % (maximum-minimum+1)) + minimum + return (w % (maximum - minimum + 1)) + minimum def deepCopy(liste: list): @@ -107,19 +107,19 @@ def printField(state: list, style: int = 1, color_new: bool = False, new_fields: new_fields (list, optional): a list of coordinates(x,y) like:[[1,2],[2,3]]. Defaults to []. """ # Add two spaces for stylistic reasons - maxLength = getMaxStringLength(state)+2 + maxLength = getMaxStringLength(state) + 2 hlineupper = "" hlinelower = "" borderspacer = "" betweenspacer = "" if (style == 1): - hlinelower = f"+{('-' * maxLength+'+')*len(state)}\n" + hlinelower = f"+{('-' * maxLength + '+') * len(state)}\n" print(hlinelower, end='') borderspacer = "|" betweenspacer = "|" else: - hlineupper = f"{('╭' + '-' * maxLength+'╮')*len(state)}\n" - hlinelower = f"{('╰' + '-' * maxLength+'╯')*len(state)}\n" + hlineupper = f"{('╭' + '-' * maxLength + '╮') * len(state)}\n" + hlinelower = f"{('╰' + '-' * maxLength + '╯') * len(state)}\n" borderspacer = "|" betweenspacer = "||" for y, row in enumerate(state): @@ -271,7 +271,7 @@ def spawnNewTile(state): newState = state emptySlots = getEmptySlots(state) if (len(emptySlots) > 0): - [newX, newY] = emptySlots[randint(0, len(emptySlots)-1)] + [newX, newY] = emptySlots[randint(0, len(emptySlots) - 1)] newState[newY][newX] = 4 if randint(1, 10) == 10 else 2 return newState @@ -314,7 +314,7 @@ def slideTiles(currentState: list, direction: str): newState = currentState [xMov, yMov] = directionVectors.get(direction) forwardRange = range(len(currentState)) - backwardRange = range(len(currentState)-1, -1, -1) + backwardRange = range(len(currentState) - 1, -1, -1) # Durch Feld Iterieren # Anmerkung: Hier muss man darauf achten, in welcher Reihenfolge man durch die Felder geht, # da sonst mehrere Felder auf einmal addiert werden können @@ -329,7 +329,7 @@ def slideTiles(currentState: list, direction: str): # Ansatz: wir gehen solange in die Schieberichtung, # bis der nächste Schritt außerhalb des Feldes Läge oder wir auf ein nichtleeres Feld stoßen. for i in range(len(currentState)): - nextPos = [newPos[0]+xMov, newPos[1]+yMov] + nextPos = [newPos[0] + xMov, newPos[1] + yMov] [nextX, nextY] = nextPos if not pointIsInGameField(len(currentState), nextX, nextY) or newState[nextY][nextX] != '': break @@ -340,7 +340,7 @@ def slideTiles(currentState: list, direction: str): # bis der nächste Schritt außerhalb des Feldes Läge oder wir auf ein nichtleeres Feld stoßen. # Sollten wir auf ein nichtleeres Feld mit dem Gleichen Wert stoßen, haben wir eine Verschmelzposition gefunden. for i in range(len(currentState)): - prevPos = [newMergePos[0]-xMov, newMergePos[1]-yMov] + prevPos = [newMergePos[0] - xMov, newMergePos[1] - yMov] [prevX, prevY] = prevPos if not pointIsInGameField(len(currentState), prevX, prevY): break @@ -357,7 +357,7 @@ def slideTiles(currentState: list, direction: str): # Wenn das Feld an der Verschmelzposition nicht leer ist, # müssen wir den Wert des Feldes verdoppeln if (newState[newMergeY][newMergeX] != ''): - newState[newY][newX] = field+newState[newMergeY][newMergeX] + newState[newY][newX] = field + newState[newMergeY][newMergeX] newState[newMergeY][newMergeX] = '' else: newState[newY][newX] = field diff --git a/codingchallenges/2021/2048-ugly.py b/codingchallenges/2021/2048-ugly.py index 76d31ba..8485d12 100644 --- a/codingchallenges/2021/2048-ugly.py +++ b/codingchallenges/2021/2048-ugly.py @@ -18,16 +18,16 @@ randomindex = -1 # 100 zufallszahlen randomints = [ - 28, 9, 40, 74, 28, 56, 82, 61, 80, 95, - 14, 97, 47, 83, 63, 88, 91, 39, 2, 85, + 28, 9, 40, 74, 28, 56, 82, 61, 80, 95, + 14, 97, 47, 83, 63, 88, 91, 39, 2, 85, 82, 61, 69, 35, 19, 17, 64, 21, 29, 20, - 94, 59, 73, 50, 1, 69, 30, 39, 26, 11, - 21, 94, 1, 24, 12, 8, 3, 90, 13, 8, - 52, 48, 41, 86, 60, 33, 74, 83, 9, 48, - 90, 12, 60, 44, 9, 58, 64, 61, 50, 74, + 94, 59, 73, 50, 1, 69, 30, 39, 26, 11, + 21, 94, 1, 24, 12, 8, 3, 90, 13, 8, + 52, 48, 41, 86, 60, 33, 74, 83, 9, 48, + 90, 12, 60, 44, 9, 58, 64, 61, 50, 74, 97, 77, 69, 81, 62, 18, 22, 64, 25, 61, - 56, 63, 95, 39, 21, 6, 87, 98, 28, 52, - 35, 69, 43, 92, 94, 88, 4, 39, 6, 20 + 56, 63, 95, 39, 21, 6, 87, 98, 28, 52, + 35, 69, 43, 92, 94, 88, 4, 39, 6, 20 ] @@ -93,7 +93,7 @@ for j in i: feldzeile += str(j) # Right Padding with space - for k in range(longestString-len(str(j))): + for k in range(longestString - len(str(j))): feldzeile += " " feldzeile += "|" print(feldzeile) @@ -155,8 +155,8 @@ # Ansatz: wir gehen solange in die Schieberichtung, # bis der nächste Schritt außerhalb des Feldes Läge oder wir auf ein nichtleeres Feld stoßen. for i in range(4): - nextX = newX+xMov - nextY = newY+yMov + nextX = newX + xMov + nextY = newY + yMov pointIsInGameField = nextX >= 0 and nextX < 4 and nextY >= 0 and nextY < 4 if not pointIsInGameField or newState[nextY][nextX] != 0: break @@ -171,8 +171,8 @@ # bis der nächste Schritt außerhalb des Feldes Läge oder wir auf ein nichtleeres Feld stoßen. # Sollten wir auf ein nichtleeres Feld mit dem Gleichen Wert stoßen, haben wir eine Verschmelzposition gefunden. for i in range(4): - prevX = newMergeX-xMov - prevY = newMergeY-yMov + prevX = newMergeX - xMov + prevY = newMergeY - yMov pointIsInGameField = prevX >= 0 and prevX < 4 and prevY >= 0 and prevY < 4 if not pointIsInGameField: break @@ -186,7 +186,7 @@ # Verschieben an neue Position, und ggf multiplizieren newState[y][x] = 0 if (newState[newMergeY][newMergeX] != 0): - newState[newY][newX] = 2*field + newState[newY][newX] = 2 * field newState[newMergeY][newMergeX] = 0 else: newState[newY][newX] = field @@ -259,7 +259,7 @@ for j in i: feldzeile += str(j) # Right Padding with space - for k in range(longestString-len(str(j))): + for k in range(longestString - len(str(j))): feldzeile += " " feldzeile += "|" print(feldzeile) diff --git a/codingchallenges/2021/2048.py b/codingchallenges/2021/2048.py index 82fdfd4..531629a 100644 --- a/codingchallenges/2021/2048.py +++ b/codingchallenges/2021/2048.py @@ -17,16 +17,16 @@ randomindex = -1 randomints = [ - 28, 9, 40, 74, 28, 56, 82, 61, 80, 95, - 14, 97, 47, 83, 63, 88, 91, 39, 2, 85, + 28, 9, 40, 74, 28, 56, 82, 61, 80, 95, + 14, 97, 47, 83, 63, 88, 91, 39, 2, 85, 82, 61, 69, 35, 19, 17, 64, 21, 29, 20, - 94, 59, 73, 50, 1, 69, 30, 39, 26, 11, - 21, 94, 1, 24, 12, 8, 3, 90, 13, 8, - 52, 48, 41, 86, 60, 33, 74, 83, 9, 48, - 90, 12, 60, 44, 9, 58, 64, 61, 50, 74, + 94, 59, 73, 50, 1, 69, 30, 39, 26, 11, + 21, 94, 1, 24, 12, 8, 3, 90, 13, 8, + 52, 48, 41, 86, 60, 33, 74, 83, 9, 48, + 90, 12, 60, 44, 9, 58, 64, 61, 50, 74, 97, 77, 69, 81, 62, 18, 22, 64, 25, 61, - 56, 63, 95, 39, 21, 6, 87, 98, 28, 52, - 35, 69, 43, 92, 94, 88, 4, 39, 6, 20 + 56, 63, 95, 39, 21, 6, 87, 98, 28, 52, + 35, 69, 43, 92, 94, 88, 4, 39, 6, 20 ] @@ -46,7 +46,7 @@ def randint(minimum, maximum): global randomindex randomindex = randomindex + 1 randomindex = randomindex % len(randomints) - rand_range = maximum-minimum + rand_range = maximum - minimum # Trim to given Range random = randomints[randomindex] random = random % (rand_range + 1) @@ -91,7 +91,7 @@ def printField(state): for j in i: feldzeile += str(j) # Right Padding with space - for k in range(longestString-len(str(j))): + for k in range(longestString - len(str(j))): feldzeile += " " feldzeile += "|" print(feldzeile) @@ -150,7 +150,7 @@ def getNextMove(): print("bye") exit() else: - print("Expected one of: [w, a, s, d] but got "+move+".") + print("Expected one of: [w, a, s, d] but got " + move + ".") return getNextMove() @@ -259,7 +259,7 @@ def slideTiles(currentState, xMov, yMov): """ newState = currentState forwardRange = range(len(currentState)) - backwardRange = range(len(currentState)-1, -1, -1) + backwardRange = range(len(currentState) - 1, -1, -1) # Durch Feld Iterieren # Anmerkung: Hier muss man darauf achten, in welcher Reihenfolge man durch die Felder geht, # da sonst mehrere Felder auf einmal addiert werden können @@ -281,8 +281,8 @@ def slideTiles(currentState, xMov, yMov): # Ansatz: wir gehen solange in die Schieberichtung, # bis der nächste Schritt außerhalb des Feldes Läge oder wir auf ein nichtleeres Feld stoßen. for i in range(4): - nextX = newX+xMov - nextY = newY+yMov + nextX = newX + xMov + nextY = newY + yMov if not pointIsInGameField(len(currentState), nextX, nextY) or newState[nextY][nextX] != 0: break newX = nextX @@ -296,8 +296,8 @@ def slideTiles(currentState, xMov, yMov): # bis der nächste Schritt außerhalb des Feldes Läge oder wir auf ein nichtleeres Feld stoßen. # Sollten wir auf ein nichtleeres Feld mit dem Gleichen Wert stoßen, haben wir eine Verschmelzposition gefunden. for i in range(4): - prevX = newMergeX-xMov - prevY = newMergeY-yMov + prevX = newMergeX - xMov + prevY = newMergeY - yMov if not pointIsInGameField(len(currentState), prevX, prevY): break if newState[prevY][prevX] != 0: @@ -310,7 +310,7 @@ def slideTiles(currentState, xMov, yMov): # Verschieben an neue Position, und ggf multiplizieren newState[y][x] = 0 if (newState[newMergeY][newMergeX] != 0): - newState[newY][newX] = 2*field + newState[newY][newX] = 2 * field newState[newMergeY][newMergeX] = 0 else: newState[newY][newX] = field diff --git a/codingchallenges/2021/bewertungsleitfaden.tex b/codingchallenges/2021/bewertungsleitfaden.tex index e73ba5e..9052bd4 100755 --- a/codingchallenges/2021/bewertungsleitfaden.tex +++ b/codingchallenges/2021/bewertungsleitfaden.tex @@ -2,6 +2,7 @@ % Packages \usepackage{hyperref} +\usepackage{darkmode} %\usepackage{ClearSans} \usepackage{csquotes} @@ -90,7 +91,7 @@ boxrule=0pt, left=5pt, % Links Platz lassen enhanced, % Erlaubt uns, den ramen zu zeichnen - fonttitle=\sffamily, % Titelschriftart auf + fonttitle=\sffamily, % Titelschriftart auf overlay={ % Für Grauen Bereich links \begin{tcbclipinterior}% \fill[TUDa-3c] (frame.south west) rectangle ([xshift=4pt]frame.north west); % Zeilennummernbereich färben diff --git a/codingchallenges/2021/vorstellung.tex b/codingchallenges/2021/vorstellung.tex index 7a6e66f..6ebec9d 100755 --- a/codingchallenges/2021/vorstellung.tex +++ b/codingchallenges/2021/vorstellung.tex @@ -1,6 +1,7 @@ +% !TeX root = vorstellung.tex %\PassOptionsToClass{handout}{beamer} \input{../../lecture/global} -\logo*{\includegraphics{../../lecture/globalMedia/bildmarke_ohne_rand}} +\logo*{\includegraphics{../../lecture/globalMedia/logo\IfDarkModeT{-dark}.pdf}} % Packages \usepackage{hyperref} @@ -60,8 +61,7 @@ } -%\logo[2]{\includegraphics[scale=5]{../../lecture/globalMedia/bildmarke_ohne_rand}} - +%\logo[2]{\includegraphics[scale=5]{../../lecture/globalMedia/logo\IfDarkModeT{-dark}.pdf}} \begin{document} diff --git a/codingchallenges/2022/hangman.py b/codingchallenges/2022/hangman.py index b1adbfe..79df016 100644 --- a/codingchallenges/2022/hangman.py +++ b/codingchallenges/2022/hangman.py @@ -17,7 +17,7 @@ def contains_ignore_case(search_list, search_element): guess_nr = 1 already_guessed_letters = [] -print('\n'*1000) +print('\n' * 1000) while guess_nr <= guesses: print(f"Guess {guess_nr}/{guesses}\nThe word is: ") @@ -34,7 +34,7 @@ def contains_ignore_case(search_list, search_element): print(guessed_word_string) guess = input("Guess a letter: ").lower() - print('\n'*1000) + print('\n' * 1000) if len(guess) != 1: print("Guess exactly one letter") diff --git a/codingchallenges/2022/vorstellung.tex b/codingchallenges/2022/vorstellung.tex index 12c0c9c..ab74aa8 100755 --- a/codingchallenges/2022/vorstellung.tex +++ b/codingchallenges/2022/vorstellung.tex @@ -1,6 +1,7 @@ +% !TeX root = vorstellung.tex %\PassOptionsToClass{handout}{beamer} \input{../../lecture/global} -\logo*{\includegraphics{../../lecture/globalMedia/bildmarke_ohne_rand}} +\logo*{\includegraphics{../../lecture/globalMedia/logo\IfDarkModeT{-dark}.pdf}} % Packages \usepackage{hyperref} \usepackage{csquotes} diff --git a/codingchallenges/2023/Programmierchallenge_2023_vorstellung.tex b/codingchallenges/2023/Programmierchallenge_2023_vorstellung.tex index 2d4fe03..a62c6e7 100755 --- a/codingchallenges/2023/Programmierchallenge_2023_vorstellung.tex +++ b/codingchallenges/2023/Programmierchallenge_2023_vorstellung.tex @@ -1,6 +1,7 @@ +% !TeX root = Programmierchallenge_2023_vorstellung.tex %\PassOptionsToClass{handout}{beamer} \input{../../lecture/global} -\logo*{\includegraphics{../../lecture/globalMedia/bildmarke_ohne_rand}} +\logo*{\includegraphics{../../lecture/globalMedia/logo\IfDarkModeT{-dark}.pdf}} % Packages \usepackage{hyperref} \usepackage{csquotes} diff --git a/codingchallenges/2024/TicTacToe.py b/codingchallenges/2024/TicTacToe.py new file mode 100644 index 0000000..0d70c6a --- /dev/null +++ b/codingchallenges/2024/TicTacToe.py @@ -0,0 +1,73 @@ +def main(): + board = [[0, 0, 0], [0, 0, 0], [0, 0, 0]] + player = 1 + + finished = False + while not finished: + placed = False + while not placed: + printBoard(board) + print("Spieler " + getChar(player) + " ist am Zug...") + x = input("x: ") + y = input("y: ") + + if int(x) < 1 or int(x) > 3 or int(y) < 1 or int(y) > 3: + print("Feld ist außerhalb des Spielfeldes") + elif board[int(y) - 1][int(x) - 1] != 0: + print("Feld ist schon besetzt.") + else: + placed = True + + board[int(y) - 1][int(x) - 1] = player + printBoard(board) + if checkWin(board, player): + print("Spieler " + getChar(player) + " hat gewonnen!") + finished = True + elif checkDraw(board): + print("Die Runde ist unentschieden.") + finished = True + + if player == 1: + player = 2 + else: + player = 1 + + +def checkWin(board, player): + for i in range(3): + row = board[i] + col = [board[0][i], board[1][i], board[2][i]] + if row[0] == row[1] == row[2] == player: + return True + if col[0] == col[1] == col[2] == player: + return True + + if board[0][0] == board[1][1] == board[2][2] == player: + return True + if board[0][2] == board[1][1] == board[2][0] == player: + return True + + return False + +def checkDraw(board): + for row in board: + for cell in row: + if cell == 0: + return False + return True + +def printBoard(board): + print() + print("+-+-+-+") + for row in board: + print("|" + getChar(row[0]) + "|" + getChar(row[1]) + "|" + getChar(row[2]) + "|") + print("+-+-+-+") + +def getChar(state): + if state == 0: + return " " + if state == 1: + return "X" + return "O" + +main() diff --git a/codingchallenges/2024/aufgabenstellung.tex b/codingchallenges/2024/aufgabenstellung.tex new file mode 100755 index 0000000..244c79b --- /dev/null +++ b/codingchallenges/2024/aufgabenstellung.tex @@ -0,0 +1,38 @@ +\RequirePackage{import} +\subimport{../../exercises}{preamble.tex} +\usepackage[T1]{fontenc} +\usepackage[utf8]{inputenc} +\usepackage[ngerman]{babel} +\usepackage{hyperref} +\usepackage{ifthen} +\usepackage{listings} +\usepackage{graphicx} +\usepackage{multicol} +\usepackage{multirow} + +\setlength{\parindent}{0pt} + +\begin{document} +\title{Programmierchallenge Wintersemester 2024/25 \\ {\small der Fachschaft Informatik}} +\subtitle{Wintersemester 2024/25} +\maketitle + +\section*{TicTacToe \footnote[1]{\url{https://de.wikipedia.org/wiki/Tic-Tac-Toe}}} +\subsection*{Ablauf des Spiels} +Es wird ein Spielfeld generiert, welches aus 9 Feldern besteht. \\ + +Die Spieler*innen markieren immer abwechselnd ein leeres Feld mit individuellen Zeichen (z.B. \texttt{X}, \texttt{O}). Das Spiel ist beendet, sobald keine Felder mehr frei sind oder ein*e Spieler*in eine Reihe oder Diagonale aus drei Feldern markiert hat, was den Sieg bedeutet. \\ + + +\section*{Das Spiel} +\subsection*{Die Aufgabe} +Programmiert in Python eine Spieladaption des oben beschriebenen TicTacToe. Dieses soll auf und in der Konsole funktionieren. Hierbei soll das Spielfeld nach jedem Zug neu angezeigt werden. Anschließend muss der*die Spieler*in mittels der Konsole ein Feld auswählen, welches dann mit seinem Zeichen markiert wird. \\ +Das Programm soll selbst erkennen, wann das Spiel für eine*n der Spieler*innen gewonnen oder verloren ist bzw. wann es ein Unentschieden gibt. Im Anschluss zeigt das Programm den Ausgang des Spiels an und beendet sich. \\ +Weiter soll das Programm selbst gegen den Menschen spielen. Dabei ist es egal, ob das Programm Zufallszüge macht oder intelligent erkennt welchen Zug es spielen muss, um ein Unentschieden oder Sieg zu erreichen. + +\subsection*{Rahmen} +Es existiert kein Rahmen oder Framework. Das Projekt besitzt außer diesem Dokument keine weiteren Unterlagen. Bei Fragen könnt ihr euch am besten an die Tutor*innen oder an die Orga wenden. Bitte haltet euch an das KISS-Prinzip\footnote[2]{\url{https://de.wikipedia.org/wiki/KISS-Prinzip}} (Keep it simple, stupid), versucht also eine möglichst einfache Lösung zu erstellen. Es muss auch kein Wunderwerk der Technik sein. Dennoch sind kreative Ideen gerne gesehen. + +\subsection*{Die Abgabe} +Es gibt zwei Möglichkeiten der Abgabe: Bis spätestens 18:00 Uhr am Donnerstag (03.10.2024) könnt ihr eure \texttt{.py}-Datei in Moodle hochladen oder ihr schickt uns eine Mail an \href{mailto:vorkurs@d120.de}{\nolinkurl{vorkurs@d120.de}}. Dort hängt ihr die Datei bitte als Anhang an. Dabei gilt die Ankunftszeit bei uns. +\end{document} diff --git a/lecture/globalMedia/bildmarke_ohne_rand.png b/codingchallenges/2024/bildmarke_ohne_rand.png old mode 100644 new mode 100755 similarity index 100% rename from lecture/globalMedia/bildmarke_ohne_rand.png rename to codingchallenges/2024/bildmarke_ohne_rand.png diff --git a/codingchallenges/2024/vorstellung.tex b/codingchallenges/2024/vorstellung.tex new file mode 100755 index 0000000..90e63ed --- /dev/null +++ b/codingchallenges/2024/vorstellung.tex @@ -0,0 +1,89 @@ +% !TeX root = vorstellung.tex +\input{../../lecture/global} +\logo*{\includegraphics{../../lecture/globalMedia/logo\IfDarkModeT{-dark}.pdf}} +\usepackage{float} +\usepackage{listings} +\usepackage{graphicx} +\usepackage{epstopdf} +\usepackage{wrapfig} + +\title[Programmiervorkurs]{Programmiervorkurs Wintersemester 2024/25} +\subtitle{{\small der Fachschaft Informatik}} +%\logo[2]{\includegraphics[scale=5]{../../lecture/globalMedia/logo\IfDarkModeT{-dark}.pdf}} +\author{Vorkursteam der Fachschaft Informatik} +\institute{TU Darmstadt} +\date{Wintersemester 2024/25} + +\begin{document} +\begin{frame} + \begin{center} + \vspace{2cm} + {\huge Programmierchallenge \\ "`TicTacToe"'} + \end{center} +\end{frame} + + +\begin{frame} + \frametitle{Was wollen wir machen} + \begin{itemize} + \item Keine Vorerfahrung + \item Nur drei Tage Programmiervorkurs + \item Und dann ein komplettes Spiel programmieren? + \end{itemize} +\end{frame} + + +\begin{frame} + \frametitle{Was wollen wir machen} + \begin{itemize} + \item Euch eine mögliche Anwendung eures gelerntes Wissens zeigen + \item Ein Spiel programmieren + \item Euch herausfordern + \end{itemize} + \vspace{6mm} + \begin{center} + \textbf{\huge Und deswegen gibt es heute eine Programmierchallenge!} + \end{center} + +\end{frame} + + + +\begin{frame} + \frametitle{Was ist das?} + \begin{itemize} + \item Ein größeres Projekt, dass man nach oder alternativ zu den Aufgaben machen kann (empfohlen ist nach der Übung!) + \item Ihr bekommt die Möglichkeit eure Spiele abzugeben + \item Die besten Ideen werden am Freitag gezeigt + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Wie wird es ablaufen?} + \begin{itemize} + \item Arbeitsblatt mit der genauen Aufgabenstellung (Moodle) + \item Gruppen von drei oder vier Leuten + \item Abgabe mittels E-Mail oder in Moodle bis morgen 18:00 Uhr + \item Die besten Abgaben werden Freitag während der Vorlesung gezeigt + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Was sind die Regeln?} + \begin{itemize} + \item KISS + \item Eine Datei, keine Projekte + \item Kommentiert euren Code + \item Muss ohne Fehler ausführen bis das Spiel zu Ende ist + \item Nutzereingaben können falsch sein + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Ansonsten...} + \vspace{15mm} + \begin{center} + \huge ...noch viel Spaß ! + \end{center} +\end{frame} +\end{document} diff --git a/exercises/Aufgabe1.tex b/exercises/Aufgabe1.tex index 2fd6794..c33c7b9 100644 --- a/exercises/Aufgabe1.tex +++ b/exercises/Aufgabe1.tex @@ -1,3 +1,4 @@ +%!TeX root = Aufgabe1.tex \input{preamble.tex} \sheetnumber{1} \title{Aufgaben Programmiervorkurs} @@ -5,56 +6,67 @@ \usepackage{hyperref} \usepackage{wrapfig} +\usepackage{footnote} \begin{document} \maketitle{} \begin{task}[points=auto]{Einleitung} - \begin{subtask*}[points=0]{Kotlin Installieren} + \begin{subtask*}[points=0]{Python Installieren} Hey, willkommen bei den Übungen zum Programmiervorkurs im \ptitle. Wie in der - Vorlesung verwenden wir für die Übungen die Programmiersprache Kotlin. \\\\ + Vorlesung verwenden wir für die Übungen die Programmiersprache Python. \\\\ % - Für das Installieren und Starten von Kotlin haben wir eigene Guides in Moodle verlinkt. - Folgt denen, sodass ihr Kotlin ausführen könnt. + Für das Installieren und Starten von Python haben wir eigene Guides in Moodle verlinkt. + Folgt denen, sodass ihr Python ausführen könnt. \begin{solution} - Kotlin ist installiert und dem Pfad hinzugefügt. Der Befehl - \mintinline{text}{kotlin -version} gibt eine Versionsnummer von mindestens \mintinline{text}{1.8.22} aus. - % Der Kotlin Interpreter mit \mintinline{text}{kotlin} wurde gestartet. + Python ist installiert und dem Pfad hinzugefügt. Der Befehl + \mintinline{text}{python --version} gibt eine Versionsnummer von mindestens \mintinline{text}{3.X.X} aus. + Der Python Interpreter mit \mintinline{text}{python} wurde gestartet. - Das Repl wurde korrekt installiert und mit \mintinline{text}{ki} gestartet. Der Befehl - \mintinline{text}{ki} gibt eine Versionsnummer von mindestens \mintinline{text}{0.5.2} aus. + Die REPL wurde korrekt installiert und mit \mintinline{text}{ipython} gestartet. Der Befehl + \mintinline{text}{ipython} gibt eine Versionsnummer von mindestens \mintinline{text}{8.X.X} aus. \end{solution} \end{subtask*} \begin{subtask*}[points=0]{Theoriefragen} - \begin{itemize} + \mccmd + \begin{enumerate} \mchead \mcitemt{Programmcode steht üblicherweise in Textdateien} - \mcitemf{Ein Prozessor kann Kotlin direkt ausführen} - \mcitemt{Um Kotlin-Code auszuführen kann ein Compiler verwendet werden} - \mcitemf{Es ist niemals sinnvoll seinen Code mit Kommentaren zu überladen} - \end{itemize} + \mcitemf{Um Python auszuführen, muss ich einen neuen Computer kaufen} + \mcitemt{Um Python-Code auszuführen kann eine Konsole verwendet werden} + \mcitemf{Es gibt genau drei Programmiersprachen} + \mcitemf{Es ist niemals sinnvoll seinen Code mit Kommentaren füllen} + \mcitemt{Eine if-Anweisung beeinflusst den Programmablauf} + \mcitemf{Eine if-Anweisung benötigt immer eine else-Klausel} + \mcitemt{Ein \lstinline{if (0 < 3)} führt immer den eingeschlossenen Codeblock aus} + \mcitemt{Man kann if-Anweisungen verschachteln} + \end{enumerate} \begin{solution} - Die zutreffenden Antworten sind die Aussagen 1 und 3. + Die zutreffenden Antworten sind die Aussagen 1, 3, 6, 8 und 9. \end{solution} \end{subtask*} \end{task} \begin{task}[points=auto]{Ausdrücke \stage1} \begin{subtask*}[points=0]{Frage \& Antwort} - Gebt nacheinander die folgenden Ausdrücke in \kotlininline{ki} ein. Drückt nach - jedem Eintrag \textit{ENTER}, um den Ausdruck auszuwerten. Was passiert? - Versucht, zu erklären, warum. Probiert auch noch weitere Ausdrücke, die euch - einfallen. + Überlege, für jeden der Folgenden Ausdrücke, + ob sie korrektes Python sind + und welchen Typ sie in diesem Fall haben. + + Gib anschließend nacheinander die folgenden + Ausdrücke in \pythoninline{Python} ein. + Drücke nach jedem Eintrag \textit{ENTER}, + um den Ausdruck auszuwerten. + Was passiert? + Probiere auch noch weitere Ausdrücke, + dir euch einfallen. \begin{multicols}{3} \begin{itemize} \item \mintinline{text}{2} \item \mintinline{text}{10.0} \item \mintinline{text}{"1"} - \item \mintinline{text}{'1'} \item \mintinline{text}{Test} \item \mintinline{text}{"Test"} - \item \mintinline{text}{0x11} - \item \mintinline{text}{0b11} \item \mintinline{text}{true} \item \mintinline{text}{True} \item \mintinline{text}{false} @@ -62,49 +74,39 @@ \end{itemize} \end{multicols} - \bonus{Kotlin gibt nicht nur den Wert eines Ausdrucks, - sondern auch seinen Typ an.} + Zusatz: Lasse dir jeweils für korrekte Ausdrücke auch mit Hilfe von \pythoninline{type(...)} den Typ angeben. \begin{solution} Zahlen ohne Anführungszeichen ergeben die Zahl. Rationale Zahlen brauchen einen - Dezimal\fatsf{punkt}. Doppelte Anführungszeichen (\mintinline{text}{"}) ergeben Strings, - der Prefix \mintinline{text}{0x} erwartet hexadezimales Format, der Prefix \mintinline{text}{0b} - binäres Format. Wahrheitswerte müssen klein geschrieben werden (\kotlininline{true}, - \kotlininline{false}). - Einfache Anführungszeichen ergeben Chars, hier wird ein einzelnes Zeichen als numerischer Wert abgespeichert. - Strings sind dann die Verkettung von Chars. + Dezimal\fatsf{punkt}. + Doppelte Anführungszeichen (\mintinline{text}{"}) ergeben Strings, + Wahrheitswerte müssen groß geschrieben werden (\pythoninline{True}, + \pythoninline{False}). \end{solution} \end{subtask*} \begin{subtask*}[points=0]{Mathe 0 für Informatiker*innen} Wenn euch das Programm aber nur das zurückgeben könnte, was ihr hinschreibt, - dann wäre das ja noch lange kein \textit{Computer}. Darum rechnen wir nun etwas. - Überlegt euch was die folgenden Ausdrücke ergeben, und was die verwendeten - Symbole für Operationen bezeichnen. Beachtet dabei, die Operatorenpräzedenz. + dann hätten wir ja noch lange kein \textit{Computer}. + Deswegen möchten wir jetzt etwas rechnen. + Überlege dir, was die folgenden Ausdrücke ergeben, + und für welche Rechnenoperation die verwendeten Symbole stehen. + Symbole für Operationen bezeichnen. + Beachte dabei die Operatorenpräzedenz. + Lasse dir auch immer den Typ ausgeben. \begin{multicols}{3} \begin{itemize} - \item \kotlininline{16 + 26} - \item \kotlininline{13.75 + 28.67} - \item \kotlininline{2 * 3 + 6 * 6} - \item \kotlininline{"4" + 2} - \item \kotlininline{12 * 133 / 28 - 15} - \item \kotlininline{'a' + 5} - \item \kotlininline{1.3 * 5.6} + \item \pythoninline{16 + 26} + \item \pythoninline{13.75 + 28.67} + \item \pythoninline{12 * 133 // 28 - 15} + \item \pythoninline{2**5 + 2**3 + 2**1} + \item \pythoninline{2 * 3 + 6 * 6} + \item \pythoninline{5.4 * 7.7} \end{itemize} \end{multicols} - \bonus{Weitere mathematische Operationen können mit \kotlininline{import kotlin.math.*} importiert werden. - - \begin{multicols}{3} - \begin{itemize} - \item \kotlininline{PI} - \item \kotlininline{12.0.pow(3)} - \item \kotlininline{sqrt(2.0)} - \end{itemize} - \end{multicols}} - \begin{solution} - Das Ergebnis ist meistens eine Variante von \kotlininline{42}. + Das Ergebnis ist meistens eine Variante von \pythoninline{42}. Wichtig ist, dass hier Punkt- vor Strichrechnung gilt. Beachtet die unterschiedlichen Datentypen. Die letzte Aufgabe betont, dass manche Operationen auf Kommazahlen keine genauen Ergebnisse liefern. @@ -113,58 +115,65 @@ \end{task} \begin{task}[points=auto]{Konvertierung \stage2} \begin{subtask*}[points=0]{Konvertierung} - Nehmen wir mal an, ihr habt den Text \kotlininline{"1000"} zur Verfügung. Vielleicht - errechnet; vielleicht aus einer API (\textit{application programming interface}, allgemeine Bezeichnung für Schnittstellen zwischen Programmen)? Es kommt immer wieder vor, dass die Daten noch den falschen Typ haben, wenn ihr sie bekommt. - - Gebt die folgenden Ausdrücke ein, und findet das Ergebnis heraus. + Nehmen wir mal an, + wir wollen sich vom Nutzer eine Zahl geben lassen. + Erstmal bekommen wir nur Text vom Nutzer + in die Konsole eingegeben. + Wir haben also den z.B. Text \pythoninline{"1000"} zur Verfügung + und müssen daraus eine Zahl machen. - \textit{Hinweis: es kann sein, dass einige Konvertierungen fehlschlagen. In diesem Fall überlegt euch, warum. Die Fehlermeldung kann dabei hilfreich sein.} + Allgemein kommt es immer wieder vor, + dass die Daten noch den falschen Typ haben, + wenn wir sie bekommt. + Überlege dir, ob folgende Konvertierungen möglich sind + und was als Ergebnis raus kommt. + Gib die folgenden Ausdrücke ein und findet das Ergebnis heraus. \begin{multicols}{3} \begin{enumerate} - \item \kotlininline{"100".toInt()} - \item \kotlininline{"1.3".toDouble()} - \item \kotlininline{"NaN".toDouble()} - \item \kotlininline{123.toString()} - \item \kotlininline{"0x11".toInt()} - \item \kotlininline{2.toString() + "5"} - \item \kotlininline{(2 + 5).toString()} - \item \kotlininline{5.toDouble()} - \item \kotlininline{5.5.toInt()} - \item \kotlininline{"4.2".toInt()} + \item \pythoninline{int("100")} + \item \pythoninline{float("1.3")} + \item \pythoninline{str(123)} + \item \pythoninline{str(2) + "5"} + \item \pythoninline{str(2 + 5)} + \item \pythoninline{float(5)} + \item \pythoninline{int(5.5)} + \item \pythoninline{int("4.2")} + \item \pythoninline{float("5")} \end{enumerate} \end{multicols} \begin{solution} \begin{multicols}{3} \begin{enumerate} - \item \kotlininline{kotlin.Int = 100} - \item \kotlininline{kotlin.Double = 1.3} - \item \kotlininline{kotlin.Double = NaN} - \item \kotlininline{kotlin.String = 123} - \item \kotlininline{NumberFormatException} - \item \kotlininline{kotlin.String = 25} - \item \kotlininline{kotlin.String = 7} - \item \kotlininline{kotlin.Double = 5.0} - \item \kotlininline{kotlin.Int = 5} - \item \kotlininline{NumberFormatException} + \item \pythoninline{100 # int} + \item \pythoninline{1.3 # float} + \item \pythoninline{"123" # str} + \item \pythoninline{"25" # str} + \item \pythoninline{"7" # str} + \item \pythoninline{5.0 # float} + \item \pythoninline{5 # int} + \item Format Error + \item \pythoninline{5.0 # float} \end{enumerate} \end{multicols} \end{solution} \end{subtask*} \begin{subtask*}[points=0]{Verrückte Eingabe \stage3} - Versucht einen Ausdruck zu finden, der nur \kotlininline{'1'}, \kotlininline{0}, - \kotlininline{toInt}, \kotlininline{toString} und Operationen verwendet, der - insgesamt zu \kotlininline{3000} auswertet. Beachtet, dass solche Ausdrücke - wie ihr hier schreiben sollt, so \textbf{niemals} in echtem Code auftauchen + Versucht einen Ausdruck zu finden, + der nur \pythoninline{"1"}, \pythoninline{0}, \pythoninline{int}, \pythoninline{str} + und Operationen verwendet, + sowie insgesamt zu \pythoninline{3000} auswertet. + Beachtet, dass solche Ausdrücke + wie in dieser Aufgab so \textbf{niemals} in echtem Code auftauchen sollten. - \textit{Hinweis: Zwar soll am Ende eine Zahl rauskommen, ihr werdet aber in dieser Aufgabe oft zwischen Zahl und Text hin- und herkonvertieren müssen.} + \textit{Hinweis: Zwar soll am Ende eine Zahl rauskommen, ihr werdet aber in dieser Aufgabe mehrmals zwischen Zahl und Text hin- und herkonvertieren müssen.} \begin{solution} - \begin{codeBlock}[]{minted language=kotlin} - >>> (("1".toInt() + "1".toInt() + "1".toInt()).toString() + 0.toString() + 0.toString() + 0.toString()).toInt() - res4: kotlin.Int = 3000 + \begin{codeBlock}[]{minted language=python} + In [1]: int(str(int("1") + int("1") + int("1")) + str(0) + str(0) + str(0)) + Out[1]: 3000 \end{codeBlock} Es gibt natürlich auch noch andere Möglichkeiten. \end{solution} @@ -176,14 +185,14 @@ Ordnet die folgenden drei Fehlertypen den folgenden Ausdrücken zu. \begin{multicols}{3} \begin{itemize} - \item[] \textbf{expecting an expression} - \item[] \textbf{ArithmeticException} - \item[] \textbf{unresolved reference} + \item[] \textbf{SyntaxError} + \item[] \textbf{ZeroDivisionError} + \item[] \textbf{NameError} \end{itemize} \begin{itemize} - \item[] \kotlininline{True} - \item[] \kotlininline{2.toInt)3(} - \item[] \kotlininline{2 / 0} + \item[] \pythoninline{true} + \item[] \pythoninline{int)3(} + \item[] \pythoninline{2 // 0} \end{itemize} \begin{itemize} \item[] \textit{Syntaktischer Fehler} @@ -194,74 +203,171 @@ \begin{solution} \begin{enumerate} - \item \kotlininline{True} ist ein falsch geschriebenes Schlüsselwort und somit ein \\ - lexikalischer Fehler (unresolved reference) - \item \kotlininline{2.toInt)3(} hat die Klammern vertauscht, somit ein \\ - syntaktischer Fehler (expecting an expression) - \item \kotlininline{2 / 0} ist eine undefinierte Rechnung, also ein - \\ semantischer Fehler (\textbf{ArithmeticException}) + \item \pythoninline{true} ist ein falsch geschriebenes Schlüsselwort und somit ein \\ + lexikalischer Fehler (NameError) + \item \pythoninline{int)3(} hat die Klammern vertauscht, somit ein \\ + syntaktischer Fehler (SyntaxError) + \item \pythoninline{2 // 0} ist eine undefinierte Rechnung, also ein + \\ semantischer Fehler (ZeroDivisionError) \end{enumerate} \end{solution} \end{subtask*} \begin{subtask*}[points=0]{Finde den Fehler \stage2} - Gegeben sind die folgenden Listings. Führt die Programme aus und beschreibt, warum jeweils ein Fehler auftritt. - \begin{codeBlock}[]{minted language=kotlin} - >>> prinntln("Hello World") // a) - >>> println(Hello World!) // b) - >>> println("Alter: " * 18) // c) - >>> println("Hello World!) // d) + Gegeben sind die folgenden Programmausschnitte. + Führt die Programme aus und beschreibt, warum jeweils ein Fehler auftritt. + \begin{codeBlock}[]{minted language=text} + >>> prinnt("Hello World") // 1) + >>> print(Hello World!) // 2) + >>> print("Alter: " + 18) // 3) + >>> print("Hello World!) // 4) \end{codeBlock} \begin{solution} \begin{enumerate} - \item \mintinline{text}{unresolved reference: prinntln}: Ein \textcolor{red}{Lexikalischer Fehler}, da es keine Funktion mit dem angegebenen Namen - \mintinline{text}{prinntln} gibt. Gültig wäre \mintinline{text}{println}. Ein klassische Tippfehler. - \item Ein \textcolor{red}{Syntaktischer Fehler}, da Strings immer in einfachen oder doppelten Anführungszeichen - stehen müssen. - \item \mintinline{text}{Unresolved reference}: Ein \textcolor{red}{Semantischer Fehler}, da Texte und Zahlen multiplizierbar sind. - \textbf{Bonus Fact}: Hierfür kann man z.B. \kotlininline{"Hallo ".repeat(3)} nutzen. - \item Ein \textcolor{red}{Syntaktischer Fehler}, da der Rest der Zeile nun auch als String gelesen wird, der aber nie endet. + \item \mintinline{text}{NameError}: Ein \textcolor{TUDa-9b}{Lexikalischer Fehler}, da es keine Funktion mit dem angegebenen Namen + \mintinline{text}{prinnt} gibt. + Gültig wäre \mintinline{text}{print}. + Ein klassische Tippfehler. + \item Ein \textcolor{TUDa-9b}{Syntaktischer Fehler}, + da Strings immer in einfachen oder doppelten Anführungszeichen stehen müssen. + \item \mintinline{text}{TypeError}: Ein \textcolor{TUDa-9b}{Semantischer Fehler}, da Texte und Zahlen nicht addierbar sind. + \textbf{Bonus Fact}: Hierfür kann man z.B. \pythoninline{"Alter: " + str(18)} nutzen. + \item Ein \textcolor{TUDa-9b}{Syntaktischer Fehler}, da der Rest der Zeile nun auch als String gelesen wird, der aber nie endet. \end{enumerate} \end{solution} \end{subtask*} \end{task} -\begin{task}[points=auto]{Challenge} - \begin{subtask*}[points=0]{Caesar Cipher \stage3} - \begin{wrapfigure}[7]{r}{0.2\textwidth} - \begin{center} - \includegraphics{caesar-cipher.jpg} - \end{center} - Quelle: Wikipedia - \end{wrapfigure} - Wir wollen einen sehr einfaches Verschlüsselungsverfahren implementieren, den Caesar Cipher\footnote{\url{https://de.wikipedia.org/wiki/Caesar-Verschlüsselung}}. - Grundidee ist, das Alphabet auf zwei Scheiben zu schrieben und diese gegeneinander zu drehen. - Eine Verschiebung von $5$ wäre zum Beispiel: - \begin{align*} - \text{\kotlininline{'A'}} \to \text{\kotlininline{'F'}} \\ - \text{\kotlininline{'B'}} \to \text{\kotlininline{'G'}} \\ - \text{\kotlininline{'M'}} \to \text{\kotlininline{'R'}} - \end{align*} - - Geben sollen eine Verschiebung von \kotlininline{5} und ein beliebiger Char sein. - Es soll einmal die Ver- und die Entschlüsselung berechnet werden. - Man muss natürlich aufpassen, dass man bei z.B. - \kotlininline{'A'} nicht \enquote{zu weit nach links} geht. + +\begin{task}{Das erste Programm} + Für die folgenden Aufgaben solltet ihr jeweils eine Python-Programmdatei + anlegen. + Öffnet dazu einen beliebigen Ordner in eurem Dateiexplorer. + Öffnet dann ein Terminal im selben Verzeichnis: + + \begin{itemize} + \item Unter Linux \& Mac (u.a. den Poolrechnern): Rechtsklick $\to$ In Terminal öffnen + \item Unter Windows: Shift+Rechtsklick $\to$ Powershell hier öffnen (bei Windows 11: Terminal hier öffnen) + \end{itemize} + + Öffnet dann einen Texteditor eurer Wahl. Unter Linux z.B. + {\ttfamily gedit, kate, usw.}, unter Windows kann Notepad verwendet werden. + Erstellt eine Datei mit eurem Programm und speichert sie mit der Endung + {\ttfamily.py}, beispielsweise {\ttfamily programm.py} + in dem vorher ausgewählten Ordner. + + Als Programm könnt ihr das beliebte Hello World Programm + \footnote{\url{https://en.wikipedia.org/wiki/\%22Hello,_World!\%22_program}} + implementieren. + Sorge dafür, dass \pythoninline{"Hello, World!"} aus der Konsole + gezeigt wird, wenn man das Programm als Datei ausführt. + + Ihr könnt diese Datei dann starten, + indem ihr {\ttfamily python programm.py} in dem geöffneten Terminal ausführt. + + \begin{solution} + Eine Python Datei kann erstellt und ausgeführt werden. + \end{solution} +\end{task} + +\begin{task}{Komplexere Programme} + Nun schreiben wir einige komplexere Programme in Python: + + \begin{subtask*}{Teilbarkeit} + \begin{enumerate} + \item Frage den Nutzer nach zwei ganze Zahlen. + \item Ist eine Zahl ein Vielfaches der anderen, gib aus, + welche ein Vielfaches von welcher ist. + \item Andernfalls gib aus, dass es keine Vielfachen gibt. + \end{enumerate} + + Beispiel: + \begin{itemize} + \item $5, 15 \to$ 15 ist ein Vielfaches von 5 + \item $5, 17 \to$ Keine Vielfaches + \end{itemize} + + \begin{hinweise} + \begin{itemize} + \item Überlege dir vorab alle Fälle, die eintreten können + \item Teilbarkeit kann man mit \pythoninline{%} prüfen + \end{itemize} + \end{hinweise} \begin{solution} - Ein Beispiel für die Verschlüsselung wäre die folgende Rechnung: - \begin{codeBlock}[]{minted language=kotlin} - 'A' + ((@\textit{\color{accentcolor}}@ - 'A') + 5) % 26 + \begin{codeBlock}[]{minted language=python} + print("Gib zwei Zahlen ein") + a = int(input()) + b = int(input()) + + if a > b: + if a % b == 0: + print(f"{a} ist ein Vielfachens von {b}") + else: + print("Kein Vielfaches") + else: + if b % a == 0: + print(f"{b} ist ein Vielfachens von {a}") + else: + print("Kein Vielfaches") \end{codeBlock} - Und für die Entschlüsselung die folgende Rechnung: - \begin{codeBlock}[]{minted language=kotlin} - 'A' + ((@\textit{\color{accentcolor}}@ - 'A') - 5 + 26) % 26 + + Alternativ: + \begin{codeBlock}[]{minted language=python} + print("Gib zwei Zahlen ein:") + l = int(input("Erste Zahl:")) + r = int(input("Zweite Zahl:")) + message = "ist ein Vielfaches von" + + if l % r == 0: + print(f"{l} {message} {r}.") + elif r % l == 0: + print(f"{r} {message} {l}.") + else: + print("Es liegen keine Vielfachen vor.") \end{codeBlock} - Dabei sollen \texttt{\textit{\color{accentcolor}}} und \texttt{\textit{\color{accentcolor}}} jeweils mit entsprechenden Wert ersetzt werden. - Z.B. würde \kotlininline{'B'} verschlüsselt zu \kotlininline{'G'} und das verschlüsselte \kotlininline{'G'} hier wieder zu \kotlininline{'B'}. + Hier wurde die Doppelung in der Nachricht + mittels Variablen umgangen. + \end{solution} + \end{subtask*} - Wobei man hier allerdings aufpassen muss, ist wenn der zu verschlüsselnde Buchstabe soweit hinten im Alphabet ist, dass man wieder zum Anfang springen muss. Wenn man z.B. \kotlininline{'X'} verschlüsseln will, dann soll das Ergebnis \kotlininline{'C'} sein. Wenn man das \kotlininline{'C'} dann wieder entschlüsseln will soll man wieder bei \kotlininline{'X'} raus kommen. Daher braucht man das Modulo. + \begin{subtask*}{Vergleiche} + \begin{enumerate} + \item Frage den Nutzer nach drei Ganzzahlen. + \item Gib aus, wie viele Werte gleich sind. + \end{enumerate} + + Beispiel: + \begin{itemize} + \item $1, 1, 1 \to$ Drei gleiche Werte + \item $1, 2, 1 \to$ Zwei gleiche Werte + \item $1, 2, 3 \to$ Alle verschieden + \end{itemize} + + \begin{hinweise} + \begin{itemize} + \item Prüfe mehrere Bedingung mit logischen Operatoren + \item Benutze \pythoninline{elif} um überflüssiges + Verschachtelungen zu vermeiden + \end{itemize} + \end{hinweise} + + \begin{solution} + \begin{codeBlock}[]{minted language=python} + print("Gib drei Zahlen ein") + a = int(input()) + b = int(input()) + c = int(input()) + + if a == b and b == c: + print("Alle drei Zahlen sind gleich") + elif a == b or a == c or b == c: + print("Zwei von drei Zahlen sind gleich") + else: + print("Alle Zahlen sind unterschiedlich") + \end{codeBlock} \end{solution} \end{subtask*} \end{task} + \end{document} diff --git a/exercises/Aufgabe2.tex b/exercises/Aufgabe2.tex index 7a18e6c..c76a0cf 100644 --- a/exercises/Aufgabe2.tex +++ b/exercises/Aufgabe2.tex @@ -8,40 +8,6 @@ \begin{document} \maketitle{} -Für die folgenden Aufgaben solltet ihr jeweils eine Kotlin-Programmdatei -anlegen. Öffnet dazu einen beliebigen Ordner in eurem Dateiexplorer. Öffnet -dann ein Terminal im selben Verzeichnis. - -\begin{itemize} - \item Unter Linux \& Mac (u.a. den Poolrechnern): Rechtsklick $\to$ In Terminal öffnen - \item Unter Windows: Shift+Rechtsklick $\to$ Powershell hier öffnen (bei Windows 11: Terminal hier öffnen) -\end{itemize} - -Öffnet dann einen Texteditor eurer Wahl. Unter Linux z.B. {\ttfamily gedit, kate, usw.}, unter -Windows kann Notepad verwendet werden. Erstellt eine Datei mit eurem Programm -und speichert sie mit der Endung {\ttfamily.kts}, beispielsweise {\ttfamily date.kts} -in dem vorher ausgewählten Ordner. - -Ihr könnt diese Datei dann starten, indem ihr {\ttfamily kotlin date.kts} in dem geöffneten Terminal ausführt. - -\begin{solution} - Eine Kotlin Datei kann erstellt und ausgeführt werden. -\end{solution} -\begin{task}[points=auto]{Zum Aufwärmen \stage1} - \begin{subtask*}[points=0]{Anweisungen} - \begin{itemize} - \mchead - \mcitemt{Eine if-Anweisung beeinflusst den Programmablauf.} - \mcitemf{Eine if-Anweisung benötigt eine else-Klausel.} - \mcitemt{Ein \lstinline{if (0 < 3)} führt immer den eingeschlossenen Codeblock aus.} - \mcitemt{Man kann if-Anweisungen verschachteln} - \end{itemize} - - \begin{solution} - Die erste, die dritte und die vierte Aussage treffen zu. - \end{solution} - \end{subtask*} -\end{task} \begin{task}[points=auto]{Variablen \stage1} \begin{subtask*}[points=0]{Fehlersuche} Gegeben ist folgendes Listing: diff --git a/exercises/preamble.tex b/exercises/preamble.tex index 3c16b83..f63a788 100644 --- a/exercises/preamble.tex +++ b/exercises/preamble.tex @@ -5,7 +5,7 @@ \tl_trim_spaces:N \l_solution_env_var_tl \tl_if_eq:NnT \l_solution_env_var_tl {1} {\PassOptionsToClass{solution=true}{tudaexercise}} \ExplSyntaxOff -\documentclass[accentcolor=3c,colorbacktitle,12pt]{tudaexercise} +\documentclass[accentcolor=3b,colorbacktitle,12pt]{tudaexercise} % \usepackage[T1]{fontenc} %\usepackage[utf8]{inputenc} \ifPDFTeX @@ -54,11 +54,13 @@ \newcommand{\slnformat}[1]{\ifthenelse{\boolean{sln}}{#1}{}} \newcommand{\vorkurstaskformat}[1]{\ifthenelse{\boolean{sln}}{}{#1}} \newcommand{\vorkurstask}[1]{\input{task/#1}\IfFileExists{./sln/#1.tex}{\sln{\input{sln/#1}}}{\IfFileExists{./sln/#1.\ext}{\sln{\pythonfile{sln/#1.\ext}}}{\ClassError{Vorkurs-TeX}{No solution specified for task #1}{Add solution file #1.tex or #1.\ext}}}} -\newcommand{\mccmd}{Kreuze zu jeder Antwort an, ob sie zutrifft (\textbf{w}) oder nicht (\textbf{f}).} -\newcommand{\mchead}{\item[\textbf{w} \textbf{f} ]} -\newcommand{\mcitem}[1]{\item[$\square\ \square$] #1} -\newcommand{\mcitemt}[1]{\item[$\ifthenelse{\boolean{sln}}{\blacksquare}{\square}\ \square$] #1} -\newcommand{\mcitemf}[1]{\item[$\square\ \ifthenelse{\boolean{sln}}{\blacksquare}{\square}$] #1} +\newcommand{\mccmd}{Kreuze zu jeder Aussage an, ob sie \textbf{wahr} oder \textbf{falsch} ist.} + +\newcommand{\mchead}{\item \textbf{wahr} \hspace{.2cm} \textbf{falsch}} +\newcommand{\mcitem}[1]{\item \hspace{.2cm} $\square\ \hspace{.9cm} \square$ \hspace{.6cm} #1} +\newcommand{\mcitemt}[1]{\item \hspace{.2cm} $\ifthenelse{\boolean{sln}}{\blacksquare}{\square} \hspace{.9cm} \square$ \hspace{.6cm} #1} +\newcommand{\mcitemf}[1]{\item \hspace{.2cm} $\square \hspace{.9cm} \ifthenelse{\boolean{sln}}{\blacksquare}{\square}$ \hspace{.6cm} #1} + \newcommand{\ptitle}{\ifthenelse{\boolean{SoSe}}{Sommersemester \the\year}{Wintersemester \the\year/\thenextyear}} \newcommand{\lstinlinenoit}[1]{\upshape{\lstinline|#1|}\itshape} diff --git a/lecture/00_Orga/00_Orga.tex b/lecture/00_Orga/00_Orga.tex index 197f178..b4a9a45 100644 --- a/lecture/00_Orga/00_Orga.tex +++ b/lecture/00_Orga/00_Orga.tex @@ -8,14 +8,28 @@ \usepackage{tabularx,booktabs,multirow,multicol,colortbl} \aboverulesep = 0mm \belowrulesep = 0mm -\def\streamlink{https://youtu.be/dTWa0Tk3C9U} -\def\moodlecourselink{https://moodle.informatik.tu-darmstadt.de/course/view.php?id=1502} +\def\streamlink{https://www.youtube.com/d120de/live} +\def\moodlecourselink{https://moodle.informatik.tu-darmstadt.de/course/view.php?id=1636} \begin{document} %Deckblatt -\subtitle{Organisatorisches} -\titlegraphic{ +\titlegraphic{% + \vbox to \height {% + \vfill + \IfDarkModeTF{% + \includegraphics[height=\height,width=\textwidth,keepaspectratio]{../globalMedia/d120-breit-bunt-pfad.pdf} + }{% + \includegraphics[height=\height,width=\textwidth,keepaspectratio]{../globalMedia/d120-breit-transparent-hell-pfad.pdf} + }% + \vfill + } +} +\maketitle + +\section{Organisatorisches} +\begin{frame} + \slidehead \begin{columns} \begin{column}{6cm} \begin{figure} @@ -31,25 +45,41 @@ \caption{WS 2016/2017} \end{figure} \end{column} - \end{columns}} -\maketitle + \end{columns} +\end{frame} \section{Veranstalter} \subsection*{Fachschaft Informatik} \begin{frame} \slidehead - \begin{itemize} - \item "`Die Schüler*innenvertretung der Studierenden"' - \item Ansprechpartner für Studierende bei Fragen zum Studium - \item Bei Problemen zwischen Dozierenden und Studierenden vermitteln - \item Den Studienablauf am Fachbereich weiter verbessern - \item Soziale Interaktion zwischen Studierenden fördern - \item Erstsemestern den Einstieg ins Studium erleichtern - \item ... - \end{itemize} - \centering - \vspace{3mm} - \huge Mehr auf D120.de + \begin{columns}[T] + \begin{column}{.6\textwidth} + \begin{itemize}[<+->] + \item \enquote{Die Schüler*innenvertretung der Studierenden} + \item Wir machen neben Vorkurs \dots + \begin{itemize} + \item Ophase + \item Cloudflight + \item Hören gute Musik + \item FB20 Parties + \item Sommerfest und Nikolausfeier + \end{itemize} + \item Ansprechpartner bei Fragen zum Studium + \item Gestalten den Studienablauf mit + \vspace{.4cm} + \item {\centering \huge Mehr auf D120.de} + \end{itemize} + \end{column}% + \begin{column}{.4\textwidth} + \vfill + \IfDarkModeTF{ + \includegraphics[width=\textwidth,height=\textheight,keepaspectratio]{../globalMedia/logo-dark.pdf} + }{ + \includegraphics[width=\textwidth,height=\textheight,keepaspectratio]{../globalMedia/logo.pdf} + } + \vfill + \end{column} + \end{columns} \end{frame} \section{Moodle-Kurs} @@ -74,7 +104,7 @@ \section{Moodle-Kurs} \end{columns} \vspace{-1em} \begin{block}{Lernportal Informatik - Vorkurs} - {\Huge Gastschlüssel: PVK-2023} + {\Huge Gastschlüssel: PVK-2024} \vspace{1em}Nähere Informationen zum Zugriff auf die Materialien:\\ \href{https://d120.de/vorkurs}{https://d120.de/vorkurs} @@ -145,14 +175,13 @@ \section{Kontakt} \item \textbf{Mail:} \href{mailto:vorkurs@d120.de}{vorkurs@d120.de} \item \textbf{Moodle:} Foren im \href{\moodlecourselink}{Moodle-Kurs} \end{itemize} - \vspace{\fill} + \vspace{1cm} \begin{defBox}[title=Hinweise]% - \vspace{-1em} \begin{itemize} \item allgemeine Fragen: Schreibt ins Moodle-Forum. \item spezielle Fragen an uns: Schreibt uns eine Mail. + \item Ihr könnt uns natürlich auch ansprechen. \end{itemize} - Ihr könnt uns natürlich auch ansprechen. \end{defBox} \end{frame} @@ -163,8 +192,8 @@ \subsection{Ein üblicher Tag im Vorkurs} \begin{itemize} \item \textbf{Vormittags Vorlesung (Hybrid) 9:00 - 12:00} \begin{itemize} - \item Vorlesung im Hörsaal S2|02 C205 - \item Übertragung in C110/C120, falls zu viele Leute da sind + \item Vorlesung im Hörsaal S3|11 0012 + \item Übertragung in S2|02 C205, falls zu viele Leute da sind \item interaktiv \item heißt: Fragen stellen \item zusätzlicher Stream auf \url{\streamlink} @@ -189,7 +218,6 @@ \subsection{Ein üblicher Tag im Vorkurs} \subsection{Wochenplan} \begin{frame} \slidehead - % \textbf{Allgemeines Programm} \begin{table}[ht!] \small\centering \def\vlcolor{\cellcolor{brown!15!\thepagecolor}} @@ -201,59 +229,89 @@ \subsection{Wochenplan} \fatsf{Zeit} & \fatsf{Montag}& \fatsf{Dienstag}& \fatsf{Mittwoch}& \fatsf{Donnerstag}& \fatsf{Freitag}\\ \midrule \phantom{09:00} & & & & & \\ - \tikzmark{tpos-1} & \vlcolor{} & & \vlcolor{} & \vlcolor{} & \vlcolor{}\\ - \tikzmark{tpos-2} & \vlcolor{} & & \vlcolor{} & \vlcolor{} & \vlcolor{}\\ - \tikzmark{tpos-3} & \multirow{-3}{*}{\vlcolor{}\begin{minipage}[t][2cm][t]{\textwidth} + % Vorlesungsfarbe MO DI MI DO FR + \tikzmark{tpos-1} & \vlcolor{} & \vlcolor{} & \vlcolor{} & & \vlcolor{}\\ + \tikzmark{tpos-2} & \vlcolor{} & \vlcolor{} & \vlcolor{} & & \vlcolor{}\\ + \tikzmark{tpos-3} & + % Vorlesung MO + \multirow{-3}{*}{\vlcolor{}\begin{minipage}[t][2cm][t]{\textwidth} \tiny \fatsf{Vorlesung}\\ Foliensätze:\\ - \quad - 00-Orga\\ - \quad - 01-Erste Schritte\\ - \quad - 02-Datentypen-Zeichenketten - \end{minipage}} & & \multirow{-3}{*}{\vlcolor{}\begin{minipage}[t][2cm][t]{\textwidth} + \quad - Orga\\ + \quad - Erste Schritte\\ + \quad - Operationen\\ + \quad - Variablen + \end{minipage}} & + % Vorlesung DI + \multirow{-3}{*}{\vlcolor{}\begin{minipage}[t][2cm][t]{\textwidth} \tiny \fatsf{Vorlesung}\\ Foliensätze:\\ - \quad - 03-Variablen + If - \end{minipage}} & + \quad - Schleifen\\ + \quad - Listen + \end{minipage}} & + % Vorlesung MI \multirow{-3}{*}{\vlcolor{}\begin{minipage}[t][2cm][t]{\textwidth} \tiny \fatsf{Vorlesung}\\ Foliensätze:\\ - \quad - 04-Schleifen\\ - \quad - 05-Listen + \quad - Funktionen\\ + \quad - Rekursion\\ + \quad - Chellange Vorstellung \end{minipage}} & + % Vorlesung DO + & + % Vorlesung FR \multirow{-3}{*}{\vlcolor{}\begin{minipage}[t][2cm][t]{\textwidth} \tiny \fatsf{Vorlesung}\\ Foliensätze:\\ - \quad - 06-Funktionen + Rekursion + \quad - Chellange Lösung\\ + \quad - Recap\\ + \quad - Fragestunde \end{minipage}}\\ - \tikzmark{tpos-4} & \pausecolor{}{\footnotesize Mittagspause} & & \pausecolor{}{\footnotesize Mittagspause} & \pausecolor{}{\footnotesize Mittagspause} & \pausecolor{}{\footnotesize Mittagspause}\\ - \tikzmark{tpos-5} & \excolor{} & & \excolor{} & \excolor{} & \excolor{}\\ - \tikzmark{tpos-6} & \excolor{} & & \excolor{} & \excolor{} & \excolor{}\\ - \tikzmark{tpos-7} & \excolor{} & & \excolor{} & \excolor{} & \excolor{}\\ - \tikzmark{tpos-8} & \excolor{} & & \excolor{} & \excolor{} & \excolor{}\\ + \tikzmark{tpos-4} & + %Mittag MO + \pausecolor{}{\footnotesize Mittagspause} & + %Mittag DI + \pausecolor{}{\footnotesize Mittagspause} & + %Mittag MI + \pausecolor{}{\footnotesize Mittagspause} & + %Mittag DO + & + %Mittag FR + \pausecolor{}{\footnotesize Mittagspause}\\ + %Übungsfarbe MO DI MI DO FR + \tikzmark{tpos-5} & \excolor{} & \excolor{} & \excolor{} & & \excolor{}\\ + \tikzmark{tpos-6} & \excolor{} & \excolor{} & \excolor{} & & \excolor{}\\ + \tikzmark{tpos-7} & \excolor{} & \excolor{} & \excolor{} & & \excolor{}\\ + \tikzmark{tpos-8} & \excolor{} & \excolor{} & \excolor{} & & \excolor{}\\ \tikzmark{tpos-9} & + % Übung MO \multirow{-4}{*}{\excolor{}\begin{minipage}[t][3cm][t]{\textwidth} \tiny \fatsf{Übungsphase}\\ - \quad - Kotlin installieren\\ + \quad - Python installieren\\ \quad - Übungsblatt 1 - \end{minipage}} & \multirow{-9}{*}{\textcolor{TUDa-9b}{Feiertag}} & \multirow{-4}{*}{\excolor{}\begin{minipage}[t][3cm][t]{\textwidth} + \end{minipage}} & + % Übung DI + \multirow{-4}{*}{\excolor{}\begin{minipage}[t][3cm][t]{\textwidth} \tiny \fatsf{Übungsphase}\\ - % \quad - Kotlin installieren\\ \quad - Übungsblatt 2 - \end{minipage}} & \multirow{-4}{*}{\excolor{}\begin{minipage}[t][3cm][t]{\textwidth} - \tiny \fatsf{Übungsphase}\\ - % \quad - Kotlin installieren\\ - \quad - Übungsblatt 3 - \end{minipage}} & \multirow{-4}{*}{\excolor{}\begin{minipage}[t][3cm][t]{\textwidth} + \end{minipage}} & + % Übung MI + \multirow{-4}{*}{\excolor{}\begin{minipage}[t][3cm][t]{\textwidth} \tiny \fatsf{Übungsphase}\\ - % \quad - Kotlin installieren\\ - \quad - Übungsblatt 4\\ + \quad - Übungsblatt 3\\ \quad - Challenge + \end{minipage}} & + % Übung DO + \multirow{-9}{*}{\textcolor{TUDa-9b}{Feiertag}} & + % Übung FR + \multirow{-4}{*}{\excolor{}\begin{minipage}[t][3cm][t]{\textwidth} + \tiny \fatsf{Übungsphase}\\ + \quad - Challenge\\ + \quad - MRMCD \end{minipage}}\\ \tikzmark{tpos-10} & & & & & \\ \bottomrule \end{tabularx} - \caption{Caption} - \label{tab:newtab} \begin{tikzpicture}[remember picture,overlay] \foreach \x in {1,...,10} { @@ -261,61 +319,22 @@ \subsection{Wochenplan} } \end{tikzpicture} \end{table} - % \begin{itemize} - % \item Montag - % \begin{itemize} - % \item Vorlesung um 9:00 - % \item Nachmittags: Kotlin installieren und Übung - % \end{itemize} - % \pause - % \item Mittwoch, Donnerstag und Freitag - % \begin{itemize} - % \item Vorlesung um 9:00 - % \item Nachmittags: Übung - % \end{itemize} - % \end{itemize} \end{frame} -% \subsection{Stoffplan} -% \begin{frame} -% \slidehead -% \begin{itemize} -% \item Erste Schritte im Programmieren? -% \item Was ist Kotlin? -% \item Mein erstes Programm -% \item Datentypen und Operatoren -% \item Schleifen und bedingte Anweisungen -% \item Funktionen \& Rekursion -% \end{itemize} -% \end{frame} - \subsection{Voraussetzungen} \begin{frame} \slidehead \centering \vspace{1.5cm} - % \tiny Ein internetfähiges Endgerät,\\ansonsten:\\ % <- nur für eine online-Vorkurse \Huge Keine \end{frame} -\subsection{Ziele} -\begin{frame} - \slidehead - \begin{itemize} - \item Vereinfachter Start ins Studium - \item Grundlegende Konzepte verstehen - \item Leute kennenlernen - - \end{itemize} -\end{frame} - \subsection{Übungsaufgaben} \begin{frame} \slidehead \begin{itemize} \item Aufgaben mit unterschiedlichen Schwierigkeitsgraden \item Tutor*innen - %in Discord, die euch unterstützen \item Helft euch auch gegenseitig, denn so lernt ihr am meisten \item Ihr müsst nicht alle Aufgaben lösen @@ -325,7 +344,7 @@ \subsection{Übungsaufgaben} \section{Ophase} \begin{frame} \slidehead - \textbf{Nächste Woche} ist die Ophase (9.10. bis 13.10.2023)! \\ + \textbf{Nächste Woche} ist die Ophase (07.10. bis 11.10.2024)! \\ Nehmt auf jeden Fall daran teil. Es lohnt sich für euch! \end{frame} diff --git a/lecture/01_Einfuehrung/01_Einfuehrung.tex b/lecture/01_Einfuehrung/01_Einfuehrung.tex index 9fa0c69..2343bad 100644 --- a/lecture/01_Einfuehrung/01_Einfuehrung.tex +++ b/lecture/01_Einfuehrung/01_Einfuehrung.tex @@ -3,103 +3,182 @@ % !TeX root = 01_Einfuehrung.tex \input{../global.tex} +% Für den Vortragenden: +% +% Bevor es losgeht die Vortragenden erwähnen! +% +% Um den Vorkurs zu beginnen muss man irgendwie die Zuschauer für das Programmieren inspirieren. +% Es muss sie überzeugen, dass Programmieren geil ist, das die Vortragenden sympathisch sind und dass eigentlich alles super ist. +% +% Warum nutzt man also überhaupt Computer, rechnen lernt man schließlich schon in der Schule. +% Und für alles andere, wie Notizen, Kalender etc., hat man Zettel und Stift. +% +% - Rechner sind exakt. +% - Rechner sind schnell, sehr schnell. +% - Die Ergebnisse der Rechenschritte (Programm später erwähnen) sind reproduzierbar. +% - TODO: mehr +% +% Man möchte den Zuschauern klarmachen, dass ein Rechner keine natürliche Sprache kann (auch nicht via ChatGPT!), +% und man eine Programmiersprache braucht, die sowohl Mensch, als auch Rechner spricht. +% Dafür mache ich eine Einführung, die Programmieren als abstraktes Gedankenexperiment einführt: +% Man stelle sich eine außerirdische Lebensform vor, welche eine komplett andere Art von Intelligenz als wir Menschen hat. +% Wie kann man mit dieser Lebensform kommunizieren? +% Wir haben verschiedene Informationen über die Lebensform: Sie ist exakt, vergisst keine Details, ist sehr fleißig, ist sehr schnell aber ist nicht eigenständig. +% Welche Sprache kann man benutzen, bei der sowohl wir Menschen, als auch diese Lebensform etwas versteht? +% Englisch würde zwar uns Menschen gefallen, aber Englisch hat zu viele Wörter, deren genaue Bedeutung unklar ist. +% "Mehrdeutigkeit" ist etwas mit der die Lebensform überhaupt nicht umgehen kann. +% Die Lebensform könnte eine Sprache vorschlagen, die nur aus Nullen und Einsen besteht, und ein so begrenztes Vokabular hat, dass jeder Begriff eine exakte Bedeutung hat. +% Damit kann der Mensch jedoch schlecht umgehen, weil er sich Zahlen schlecht merken kann und keine Intuition aufbaut was die Begriffe bedeuten. +% Lösung: Ein Mittelweg: Eine künstlich erfundene Sprache, die eine sehr begrenzte Anzahl Begriffe auf Englisch hat, +% die man sich gut merken kann und gleichzeitig eine exakt definierte Bedeutung hat, so dass das Wesen sich es auch merken kann. +% +% Unsere Programmiersprache heißt Python. +% Wir folgen ihrem Formalismus, um unseren Computern Befehle bzw. Programme zu vermitteln und diese ausführen zu lassen. +% Die Wahl ist willkürlich und es gibt nicht die *eine* Programmiersprache. +% Dies soll dem Publikum verdeutlicht werden. + \begin{document} %Deckblatt -\subtitle{Kapitel 1: Erste Schritte} \titlegraphic{ - \begin{columns}[b] - \begin{column}{.6\textwidth} - \centering - {\huge Mit einem\\Computer Reden} + \vbox to \height {% + \vfill + \begin{columns} + \begin{column}{.4\textwidth} + \centering + \begin{figure} + \centering + \includegraphics[height=.55\textheight]{computer1917.jpg} + \caption*{Ein Rechenzentrum, 1917} + \end{figure} + \end{column}% + \begin{column}{.4\textwidth} + \centering + \begin{figure} + \centering + \includegraphics[height=.55\textheight]{Z3_Deutsches_Museum.JPG} + \caption*{Der Z3 von Konrad Zuse} + \end{figure} + \end{column} + \end{columns} + \vfill + } +} +\maketitle + +\section{Noch etwas Historie} +\begin{frame}[c] + \slidehead + \begin{columns}[T] + \begin{column}{.3\textwidth} \begin{figure} \centering - \includeinvertablegraphics[scale=0.3]{code_quality.png} - \caption*{Bild: \href{https://xkcd.com/1513/}{https://xkcd.com/1513/}} + \includegraphics[width=\textwidth]{punchcards.png} + \caption*{Ein Lochkartenleser} \end{figure} \end{column}% \begin{column}{.4\textwidth} + \centering \begin{figure} \centering - \includeinvertablegraphics[scale=0.2]{good_code.png} - \caption*{Bild: \href{https://xkcd.com/844/}{https://xkcd.com/844/}} + \includegraphics[height=.58\textheight]{apollo_code.png} + \caption*{\footnotesize Margaret Hamilton und ihr \\ Programm der Apollo 11 Mission} \end{figure} \end{column} - \end{columns}} -\maketitle - -% Bevor es losgeht die Vortragenden erwähnen! - -% Um den Vorkurs zu beginnen muss ich irgendwie die Zuschauer für das Programmieren inspirieren. Es muss sie überzeugen, dass Programmieren geil ist, das die Vortragenden sympathisch sind und dass eigentlich alles super ist. Dafür mache ich eine Einführung, die Programmieren als abstraktes Gedankenexperiment einführt. -% Man stelle sich eine außerirdische Lebensform vor, welche eine komplett andere Art von Intelligenz als wir Menschen hat. Wie kann man mit dieser Lebensform kommunizieren? Wir haben verschiedene Informationen über die Lebensform: Sie ist exakt, vergisst keine Details, ist sehr fleißig, ist sehr schnell aber ist nicht eigenständig. Welche Sprache kann man benutzen, bei der sowohl wir Menschen, als auch diese Lebensform etwas versteht? Englisch würde zwar uns Menschen gefallen, aber Englisch hat zu viele Wörter, deren genaue Bedeutung unklar ist. "Mehrdeutigkeit" ist etwas mit der die Lebensform überhaupt nicht umgehen kann. Die Lebensform könnte eine Sprache vorschlagen, die nur aus Nullen und Einsen besteht, und ein so begrenztes Vokabular hat, dass jeder Begriff eine exakte Bedeutung hat. Damit kann der Mensch jedoch schlecht umgehen, weil er sich Zahlen schlecht merken kann und keine Intuition aufbaut was die Begriffe bedeuten. Lösung: Ein Mittelweg: Eine künstlich erfundene Sprache, die eine sehr begrenzte Anzahl Begriffe auf Englisch hat, die man sich gut merken kann und gleichzeitig eine exakt definierte Bedeutung hat, so dass das Wesen sich es auch merken kann. + \end{columns} +\end{frame} -\section{Warum mit Computer kommunizieren?} +\section{Kapitel 1: Mit einem Computer Reden} +\subsection{Was sind Computer?} \begin{frame} \slidehead - \vspace{3mm} + Computer \dots \begin{itemize}[<+->] - \item Computer sind rein-mathematische Maschinen - \item Computer führen einfache Arbeitsschritte extrem \textbf{schnell} aus - \item Programme sind aus vielen Arbeitsschritten zusammengesetzt - \kotlinfile{listings/Programmieren.txt} + \item \dots sind rein-mathematische Maschinen + \item \dots sprechen keine natürlichen Sprachen + \item \dots rechnen Arbeitsschritt für Arbeitsschritt + \item \dots dabei sind sie extrem \textbf{schnell} + \vspace{3em} + % Im Sinne: Das kann man gar nicht groß genug schreiben + \item \dots also sie sind wirklich \textbf{\Huge schnell} \end{itemize} \end{frame} -\section{Was tun wir hier eigentlich?} +\subsection{Ein Programm} \begin{frame} \slidehead - \begin{itemize}[<+->] - \item Programmieren mit Kotlin \textcolor{gray}{[\textprimstress{}k\textturnscripta{}tl\textsci{}n]} - \item Kotlin? - \begin{itemize}[<3->] - \item[] $\Rightarrow$ Programmiersprache! - \item[] $\Rightarrow$ Verständlicher für Menschen - \item[] $\Rightarrow$ Oft verwendet + \begin{columns} + \begin{column}{ 0.7\textwidth } + \begin{itemize}[<+->] + \item Aber wie schreiben wir die Arbeitsschritte auf? + \item Anweisung für Anweisung gemäß einer fest definierten Schreibweise. + \item Eine Liste von Arbeitsschritten nennen wir ein \emph{Programm} + \item Analog wie bei einem Kochrezept \end{itemize} - \end{itemize} - - \pause - \vspace{0.75cm} + \end{column}% + \begin{column}{ 0.3\textwidth } + \begin{figure} + \includegraphics{receipt.jpg} + \end{figure} + \end{column} + \end{columns} +\end{frame} - \tikzstyle{rect} = [rectangle, rounded corners, minimum width=3cm, minimum height=1cm,text centered, draw=., fill=\IfDarkModeTF{red!30!black}{red!10}] - \centering - \begin{tikzpicture}[node distance=5cm] - \node (syntax) [rect, text width=4cm, minimum height=2cm] {\textbf{Syntax}\\ Wortschatz}; - \node (grammatik) [rect, right of=syntax, text width=4cm, minimum height=2cm] {\textbf{Grammatik}\\ Regeln um Befehle zusammenzusetzen}; - \end{tikzpicture} +\subsection{Die Sprachen der Computer} +\begin{frame} + \slidehead + \begin{itemize}[<+->] + \item Was definiert die Schreibweise eines Programms? + % Hier ist die Analoge mit den Aliens gut angebracht + \item Arbeitsschritte müssen nach einen festen Schema geschrieben werden + \item Das Schema wird durch die \emph{Programmiersprache} fest gelegt + % An der Stelle eventuell Dschungel der Programmiersprachen von Ullmann erwähnen, + % falls das wieder stattfindet - ansonsten auf YouTube + \item Es gibt unzählige Programmiersprachen + \item Insbesondere gibt es nicht die \emph{eine} Programmiersprache + \end{itemize} +\end{frame} +\section{Python} +\subsection{Die Sprache des Vorkurses} +\begin{frame} + \slidehead + \begin{columns} + \begin{column}{ 0.7\textwidth } + \begin{itemize}[<+->] + \item \emph{Python} ist eine solche Programmiersprache + \item In Python bestehen Programme aus Text + \item Dieser Text wird auch \emph{Quelltext} (eng. Source Code) genannt + \item Man kann Python-Programme direkt in Python-Konsole eingeben + \item Alternativ kann man das Programm in einer Datei speichern + \item Diese Datei kann dann an Python übergeben werden + \item So kann man das selbe Programm noch Jahre später nutzen + \end{itemize} + \end{column}% + \begin{column}{ 0.3\textwidth } + \begin{figure} + \includegraphics[width=\textwidth]{python.jpg} + \end{figure} + \end{column} + \end{columns} \end{frame} -\begin{comment} - \section{Das erste Programm} - \subsection{Wie fange ich an?} - \begin{frame} - \slidehead - \begin{itemize} - \item Befehle bestehen aus Text - \item Mit einem einfachen Texteditor schreibt man Befehle in eine Datei - \item Anschließend interpretiert der Computer die Befehle - \end{itemize} - \end{frame} -\end{comment} +\livecoding -\section{Compiler?} +\section{Zusammenfassung} \begin{frame}[t] \slidehead \begin{columns}[T] \begin{column}{2cm} \begin{tikzpicture} - - \node[] (mensch) at (0,0) {\includeinvertablegraphics[height=1.3cm]{media/wesen_notebook.png}}; + \node[] (mensch) at (0,0) {\includegraphics[height=1.3cm]{media/wesen_notebook\IfDarkModeT{-dark}.png}}; \visible<2->{ - \node[fill=lightpetrol,draw, inner sep=5pt,rounded rectangle] (interpreter) at (0,-1.8) {Compiler}; + \node[fill=lightpetrol,draw, inner sep=5pt,rounded rectangle] (interpreter) at (0,-1.8) {Python}; \draw[->,line width=.6mm] (mensch.south) -- (interpreter.north); } \visible<3->{ - \node[fill=\IfDarkModeTF{.!30!\thepagecolor}{lightgray},draw, inner sep=5pt, rounded rectangle] (computer) at (0,-4) {Computer}; - \draw[->,line width=.6mm] (interpreter.south) -- (computer.north); } \end{tikzpicture} @@ -107,356 +186,32 @@ \section{Compiler?} \begin{column}{10cm} \begin{itemize} \item[] - \item \textbf{Der Mensch} beschreibt die Aufgabe in einer Programmiersprache $\Rightarrow$ Quelltext + \item \textbf{Der Mensch} schreibt ein Programm in Python-Quelltext \item[] \item[] \visible<2->{ - \item \textbf{Der Compiler} kompiliert den Quelltext zu Maschinenbefehlen + \item \textbf{Python} übersetzt den Quelltext in Anweisungen für den Computer } \item[] \item[] \visible<3->{ - \item \textbf{Der Computer} führt die Maschinenbefehle aus + \item \textbf{Der Computer} führt die Anweisungen aus } \end{itemize} \end{column} \end{columns} \end{frame} -%\nextvid{Erstes Programm}{} - -\subtitle{Kapitel 1: Erste Schritte} - -%Deckblatt -% \titlegraphic{ -% \begin{columns} -% \begin{column}{5.5cm} -% \begin{tikzpicture} -% \draw (0, 0) node[inner sep=0] {\includeinvertablegraphics[scale=0.265]{python.png}}; -% % ich habe eine Mail an xkcd geschrieben, es ist ok das wir die klammern einfügen :) -% \draw (-1.95, -2.33) node {\tiny (}; -% \draw (-1.02, -2.33) node {\tiny )}; -% \end{tikzpicture} -% \\ \sffamily \tiny Bild: \href{https://xkcd.com/353/}{https://xkcd.com/353/ [edit: Kammern eingefügt für Python 3]} -% \end{column} -% \begin{column}{5cm} -% \begin{center} -% \vspace{-3.5cm} -% {\huge Erstes Program} -% \end{center} -% \end{column} -% \end{columns} -% } -% \maketitle - -\section{Erstes Program} -\begin{frame}[fragile] - % Beispiel, um zu zeigen wie so ein Befehl aussieht (und ein Kommentar) - \slidehead - \hskip .8cm - \vspace{.5cm} - - \kotlinfile[escapeinside=\$\$,texcomments]{listings/helloworld.kts} - - \begin{tikzpicture}[remember picture,overlay] - \draw<2->[decorate,decoration={brace,amplitude=6pt}] ([yshift=1em]pic cs:commentstart) -- ([yshift=1em]pic cs:commentend) node [midway,yshift=15pt,xshift=3.4cm] {Kommentar: wird vom Computer \textbf{ignoriert}, ist für Menschen \textbf{nützlich}}; - \draw<3->[decorate,decoration={mirror,brace,amplitude=6pt}] ([yshift=-1ex]pic cs:commandstart) -- ([yshift=-1ex]pic cs:commandend) node [midway,yshift=-15pt] {Befehl}; - \draw<4->[decorate,decoration={mirror,brace,amplitude=6pt}] ([yshift=-1ex]pic cs:textstart) -- ([yshift=-1ex]pic cs:textend) node [midway,yshift=-15pt] {Text}; - \end{tikzpicture} - - \onslide<5-> - \vspace{0.25cm} - \begin{block}{Wichtig} - \begin{itemize} - \item Text muss in \kotlininline{" "} stehen - \item Verwende \textbf{aussagekräftige} Kommentare \footnotesize (dein späteres Ich wird es dir danken)! - \end{itemize} - \end{block} - \note{ - " und ' stehen nicht für Auslassungszeichen (Kopiere den Text von der Zeile oberhalb), sondern stehen für wörtliche Rede. - } -\end{frame} - - -\subsection{Textausgabe} +\section{Exkurs: Ordner und Dateien} \begin{frame} - % Beispiel wie kleinkariert man mit diesem Computer reden muss - unintuitiv für Menschen, dass man nicht einfach "Enter" drücken kann, sondern so kryptisch "\n" schreiben muss - \slidehead - \begin{itemize} - \item Mithilfe des Befehls \kotlininline{println()} kann Text auf der Konsole ausgeben werden - \end{itemize} - \pause - \begin{columns} - \begin{column}{.4\textwidth} - \kotlinfile{listings/print_Listing.kts} - \end{column}% - \begin{column}{.6\textwidth} - \kotlinfile{listings/printSingleLine_Listing.kts} - \end{column} - \end{columns} - \vspace{0.25cm} - \begin{block}{Merke} - \kotlininline{println()} erzeugt einen Zeilenumbruch nach der Ausgabe - \end{block} -\end{frame} - -\subsection{Steuerzeichen} -\begin{frame}[fragile] \slidehead - - \begin{table}[htbp] - \begin{tabular}{|l|l|} - \hline - \textbf{Symbol} & \textbf{Wirkung} \\ \hline - \verb+\n+ & Zeilenumbruch \\ \hline - \verb+\"+ & Doppeltes Anführungszeichen (nur in \kotlininline{" "} nötig) \\ \hline - % \verb+\'+ & Einfaches Anführungszeichen (nur in \kotlininline{' '} nötig) \\ \hline - \verb+\t+ & einen Tab einfügen \\ \hline - \verb+\\+ & Backslash \\ \hline - \end{tabular} - \label{} - \end{table} - \pause - \kotlinfile{listings/Steuerzeichen_Listing.kts} -\end{frame} - -\section{Dateisystem} -\begin{frame} - \slidehead - \begin{itemize} - \item Computer benutzen Dateisysteme, um ihre Dateien zu organisieren - \item Computer benutzen Dateien um Daten (Bilder, Texte, Programme, ...) permanent zu speichern - \item Dabei werden die Dateien oft in einer Ordnerstruktur abgelegt - \item Dateien haben einen eindeutigen Namen innerhalb ihres Ordners - \item Dateien haben meist eine Dateiendung, welche signalisiert, um welche Art von Datei es sich handelt. (z.B: .png, .txt, .doc, .kts, .exe) - \end{itemize} -\end{frame} - -\section{Vom Quelltext zum fertigen Programm} -\begin{frame} - \slidehead - - \begin{columns}[T] - \begin{column}{.4\textwidth} - \begin{tikzpicture} - \node[] (mensch) at (0,0) {\includeinvertablegraphics[height=1.3cm]{media/wesen_notebook.png}}; - - \node[fill=lightpetrol,draw, inner sep=5pt,rounded rectangle] (file) at (0,-1.8) {helloworld.kts}; - \draw[->,line width=.6mm] (mensch.south) -- (file.north); - - \node[fill=lightpetrol,draw, inner sep=5pt,rounded rectangle] (kotlin) at (0,-4) {\texttt{kotlin helloworld.kts}}; - \draw[->,line width=.6mm] (file.south) -- (kotlin.north); - \end{tikzpicture} - \end{column} - \begin{column}{.6\textwidth} - \begin{itemize} - \item Ausführen: \texttt{kotlin dateiName.kts} - \item Kotlin-Programme laufen überall, wo Kotlin installiert ist - \end{itemize} - \begin{block}{Hinweis} - Kotlin-Script-Quelltext mit der Dateiendung \texttt{.kts} kennzeichnen und sinnvoll benennen! Leerzeichen sind problematisch. - \end{block} - \end{column} - \end{columns} -\end{frame} - -\section{Ein Kotlin-Programm schreiben} -\begin{frame} - \slidehead - - \begin{center} - \vskip -10 pt - \includegraphics[scale=0.25]{HelloWorldImEditor\IfDarkModeT{_dark}} - \end{center} - - \begin{itemize} - \item Programm wird in einem herkömmlichen Editor geschrieben - \item hier ein paar Editor Beispiele: \texttt{Gedit}, \texttt{VS Code}, \texttt{Kate} - \end{itemize} - \begin{defBox}[title={Wichtig}] - Verwendet \textbf{keine} Textverarbeitung wie LibreOffice, Pages oder MS Word! - \end{defBox} -\end{frame} - -% \begin{frame} -% \slidehead -% Zusammenarbeiten hilft beim Lernen, leider ist das aktuell aber etwas schwierig.\\ -% Hier sind einige Möglichkeiten wie ihr das trotzdem tun könnt (alles freiwillig, natürlich): -% \vspace{0.5cm} -% -% \begin{itemize} -% \item Atom plugin \textbf{Teletype}:\\ \href{https://teletype.atom.io/}{\textbf{https://teletype.atom.io/}}\\(Benötigt GitHub account) -% \item Alternativ gibt es online-Services wie: -% \begin{itemize} -% \item \href{https://codecollab.io/}{https://codecollab.io/} (Wählt Python\textbf{3} aus!) -% \item \href{https://repl.it/}{https://repl.it/} -% \end{itemize} -% Bei beiden gilt, wenn ihr euch keinen Account erstellt, solltet ihr euren Code im Anschluss auf eurem Rechner herunter laden bzw. kopieren! -% \end{itemize} -% Ihr könnt euch während dessen natürlich auf Discord unterhalten. -% \end{frame} - -\section{Ein Kotlin-Programm ausführen} -\begin{frame}[fragile] - \slidehead - % \begin{noindent} - \begin{commandshell} -@\shellprefix@ kotlin HelloWorld.kts -Hello World! -@\shellprefix\shellcursor@ - \end{commandshell} - % \end{noindent} - \begin{itemize} - \item Programm mit Dateinamen \texttt{HelloWorld.kts} starten - \end{itemize} -\end{frame} - -\subsection{Interaktive Shell} -\begin{frame}[fragile] - \slidehead{} - \vspace{-1em} - %\begin{noindent} - \begin{commandshell}[][top=0cm,bottom=0cm] -@\shellprefix@ ki -ki-shell 0.5.2/1.7.0 -type :h for help -[0] println(@\PYG{l+s}{"Hello World!"}@) -Hello World! -[1] @\shellcursor@ - \end{commandshell} - %\end{noindent} - %|\texttt{Python 3.7.0 (default, Jul 15 2018, 10:44:58)}| - %|\texttt{[GCC 8.1.1 20180531] on linux}| - %|\texttt{Type {\ditto}help{\ditto}, {\ditto}copyright{\ditto}, {\ditto}credits{\ditto} or %{\ditto}license{\ditto} for more information.}| - - \vskip -.5em - - \begin{itemize} - \item Die Kotlin-Interactive-Shell hat einen interaktiven Modus - \item Dieser kann mit dem Konsolenbefehl \texttt{ki} gestartet werden - \item Anschließend können Kotlin-Befehle eingegeben werden - \item \textbf{Strg+D} (außer Windows) oder der Befehl \kotlininline{:quit} beendet die Shell wieder - \end{itemize} - \begin{defBox}[title={Wichtig}] - Die Kotlin-Interactive-Shell ist \textbf{kein} Editor! - \end{defBox} -\end{frame} - -\livecoding -\subsection{} - - -%\nextvid{Fehler}{Beispiel: Hello World} - -\subtitle{Kapitel 1: Erste Schritte} - -%Deckblatt -% \titlegraphic{ -% \begin{columns} -% \begin{column}{3cm} -% \begin{center} -% \vspace{2cm} -% {\huge Fehler} -% \end{center} -% \end{column} -% \begin{column}{5cm} -% \\ -% \vspace{1cm} -% \includeinvertablegraphics[scale=0.4]{wisdom_of_the_ancients.png} -% \\ \sffamily \tiny Bild: \href{https://xkcd.com/979/}{https://xkcd.com/979/} -% \end{column} -% \end{columns}} -% \maketitle - -\subsection{Fehlerarten} -\begin{frame} - \slidehead - \begin{itemize} - \item \textbf{Lexikalische Fehler} - \begin{itemize} - \item Beispielsweise Tippfehler - % ACHTUNG: print ist bewusst falsch geschrieben! - \item \kotlininline{pritln("Lexikalischer Fehler")} - \end{itemize} - \item \textbf{Syntaktische Fehler} - \begin{itemize} - \item Falsche Klammern - \item Anführungszeichen nicht geschlossen - \end{itemize} - \item \textbf{Semantische Fehler} - \begin{itemize} - \item Division durch 0 - \end{itemize} - \end{itemize} -\end{frame} - -\section{Fehlerbeispiele} -\subsection{Lexikalischer Fehler} -\begin{frame}[fragile] - \slidehead - \kotlinfile[][title=\codeBlockTitle{test.kts}]{listings/lexError_Listing.kts} - \pause - \begin{commandshell}[][minted language=text] - test.kts:1:1: error: unresolved reference: pritln - pritln("ein test") - ^ - \end{commandshell} - \pause - \begin{itemize}[<+->] - \item Fehler in \texttt{test.kts} - \item In \textbf{Zeile 1}, \textbf{Position 1} (Befehlsanfang) - \item Der Name \texttt{pritln} existiert nicht - \item Es war \texttt{println} gemeint (das weiß der Compiler natürlich nicht) - \end{itemize} -\end{frame} - -\subsection{Syntaktischer Fehler} - -\begin{frame}[fragile] - \slidehead - \kotlinfile[][title=\codeBlockTitle{zweiterTest.kts},top=0cm,bottom=0cm]{listings/otherSynError_Listing.kts} - \pause - % \begin{noindent} - \begin{commandshell}[fontsize=\small][minted language=text,top=0cm,bottom=0cm] - zweiterTest.kts:1:8: error: expecting an element - println) - ^ - zweiterTest.kts:1:1: error: function invocation 'println()' expected - println) - ^ - \end{commandshell} - % \end{noindent} - \pause \begin{itemize}[<+->] - \item Fehler in \texttt{zweiterTest.kts} - \item in \texttt{Zeile 1} an \textbf{Position 8} fehlt eine \texttt{(} - \item der Compiler versteht hier nicht was gemeint war, da das kein richtiger Kotlin-Code ist. - \end{itemize} -\end{frame} - -\begin{frame}[fragile] - \slidehead - \kotlinfile[][title=\codeBlockTitle{andererTest.kts}]{listings/eofError_Listing.kts} - \pause - % \begin{noindent} - \begin{commandshell}[][minted language=text] - andererTest.kts:1:24: error: expecting ')' - println("noch ein test" - ^ - \end{commandshell} - % \end{noindent} - \pause - \begin{itemize}[<+->] - \item Fehler in \texttt{andererTest.kts} - % \item In \texttt{line 3} stimmt hier nicht ganz, aber in \texttt{line 1} fehlt eine \texttt{)} - \item Der Compiler sucht nach der geöffneten Klammer nach \texttt{)}, aber die Datei ist nach \textbf{Zeile 1, Position 23} bereits zu ende. - % \item Deshalb \texttt{unexpected EOF}: \textbf{EOF} steht für \textbf{E}nd \textbf{O}f \textbf{F}ile + \item Computer benutzen \emph{Dateisysteme}, um ihre \emph{Dateien} zu organisieren + \item In Dateien sind Daten (Bilder, Texte, Programme, ...) permanent gespeichert + \item Dabei werden die Dateien oft in \emph{Ordnern} zusammengefasst + \item Dateien haben einen eindeutigen Namen innerhalb ihres Ordners + \item Dateien haben meist eine Dateiendung, welche signalisiert, um welche Art von Datei es sich handelt, z.B: \pythoninline{.png, .txt, .doc, .kts, .exe} \end{itemize} \end{frame} -\subsection{} -\livecoding - -%\nextvid{Datentypen}{} - \end{document} diff --git a/lecture/01_Einfuehrung/media/Z3_Deutsches_Museum.JPG b/lecture/01_Einfuehrung/media/Z3_Deutsches_Museum.JPG new file mode 100644 index 0000000..be1f262 Binary files /dev/null and b/lecture/01_Einfuehrung/media/Z3_Deutsches_Museum.JPG differ diff --git a/lecture/01_Einfuehrung/media/apollo_code.png b/lecture/01_Einfuehrung/media/apollo_code.png new file mode 100644 index 0000000..52a27b2 Binary files /dev/null and b/lecture/01_Einfuehrung/media/apollo_code.png differ diff --git a/lecture/01_Einfuehrung/media/code_quality-dark.png b/lecture/01_Einfuehrung/media/code_quality-dark.png new file mode 100644 index 0000000..cea943d Binary files /dev/null and b/lecture/01_Einfuehrung/media/code_quality-dark.png differ diff --git a/lecture/01_Einfuehrung/media/computer1917.jpg b/lecture/01_Einfuehrung/media/computer1917.jpg new file mode 100644 index 0000000..1890609 Binary files /dev/null and b/lecture/01_Einfuehrung/media/computer1917.jpg differ diff --git a/lecture/01_Einfuehrung/media/good_code-dark.png b/lecture/01_Einfuehrung/media/good_code-dark.png new file mode 100644 index 0000000..2452327 Binary files /dev/null and b/lecture/01_Einfuehrung/media/good_code-dark.png differ diff --git a/lecture/01_Einfuehrung/media/punchcards.png b/lecture/01_Einfuehrung/media/punchcards.png new file mode 100644 index 0000000..64c20a2 Binary files /dev/null and b/lecture/01_Einfuehrung/media/punchcards.png differ diff --git a/lecture/01_Einfuehrung/media/python-dark.png b/lecture/01_Einfuehrung/media/python-dark.png new file mode 100644 index 0000000..2a4386d Binary files /dev/null and b/lecture/01_Einfuehrung/media/python-dark.png differ diff --git a/lecture/01_Einfuehrung/media/python.jpg b/lecture/01_Einfuehrung/media/python.jpg new file mode 100644 index 0000000..401e043 Binary files /dev/null and b/lecture/01_Einfuehrung/media/python.jpg differ diff --git a/lecture/01_Einfuehrung/media/receipt.jpg b/lecture/01_Einfuehrung/media/receipt.jpg new file mode 100644 index 0000000..1f4c8e2 Binary files /dev/null and b/lecture/01_Einfuehrung/media/receipt.jpg differ diff --git a/lecture/01_Einfuehrung/media/wesen_notebook-dark.png b/lecture/01_Einfuehrung/media/wesen_notebook-dark.png new file mode 100644 index 0000000..bf4e9e4 Binary files /dev/null and b/lecture/01_Einfuehrung/media/wesen_notebook-dark.png differ diff --git a/lecture/01_Einfuehrung/media/wisdom_of_the_ancients-dark.png b/lecture/01_Einfuehrung/media/wisdom_of_the_ancients-dark.png new file mode 100644 index 0000000..e824911 Binary files /dev/null and b/lecture/01_Einfuehrung/media/wisdom_of_the_ancients-dark.png differ diff --git a/lecture/02_Operatoren/02_Operatoren.tex b/lecture/02_Operatoren/02_Operatoren.tex index ae1a98b..32f9b80 100644 --- a/lecture/02_Operatoren/02_Operatoren.tex +++ b/lecture/02_Operatoren/02_Operatoren.tex @@ -4,164 +4,54 @@ \input{../global.tex} \begin{document} -\subtitle{Kapitel 2: Spaß mit Daten} + +\subtitle{Kapitel 2: Operatoren} \titlegraphic{ - \begin{columns} - \begin{column}{6cm} - \vspace{4.32mm} - \begin{center} - {\huge Datentypen} - \end{center} - \vspace{0.1cm} - \begin{figure} - \centering - \includeinvertablegraphics[scale=1]{media/su_doku.png} - \\ \sffamily \tiny Bild: \href{https://xkcd.com/74/}{https://xkcd.com/74/} - \end{figure} - \end{column} - \end{columns}} + \vbox to \height {% + \vfill + \tikzstyle{rect} = [rectangle, rounded corners, minimum width=2.5cm, minimum height=1cm,text centered, draw, text width=5cm, fill=\IfDarkModeTF{TUDa-9b!30!black}{TUDa-9b!10}] + \centering + \begin{tikzpicture}[start chain=going below,node distance=.2cm] + \node[inner sep=.3cm, on chain] {\Huge Operatoren}; + \node[rect, on chain] {\textbf{Mathematische Operatoren}}; + \node[rect, on chain] {\textbf{Vergleichsoperatoren}}; + \node[rect, on chain] {\textbf{Logische Operatoren}}; + \end{tikzpicture} + \vfill + } +} \maketitle -\section{Was sind Typen?} -\subsection{Überblick} -\begin{frame} - \slidehead - \begin{itemize} - \item Daten können unterschiedliche \textit{Typen} haben - \item Wichtige primitive Datentypen: - \end{itemize} - \begin{center} - \begin{tabular}[h]{|c|c|c|} - \hline - \textbf{Typ} & \textbf{Wertebereich} & \textbf{Beispiele} \\ - \hline - Boolean & Wahrheitswert & \kotlininline{true}, \kotlininline{false} \\ - \hline - Int & Ganzzahl & 42, -2 \\ - \hline - Double & Fließkommazahl & 42.5, 0.1 \\ - \hline - String & Text & \kotlininline{"test"}, \kotlininline{"Zeilen\numbruch"} \\ - \hline - Char & einzelnes Textzeichen & \kotlininline{'a'}, \kotlininline{'€'}, \kotlininline[escapeinside=||]{|\PYG{l+s}{'\PYGZbs{}u263A'}|} \\ - \hline - \end{tabular}\\ - \end{center} - {\footnotesize Diese Liste ist unvollständig, es gibt noch weitere Typen.} % Zum Beispiel gibt es einen für Komplexe Zahlen. - \pause - \begin{block}{Wichtig} - Nutze einen Punkt als Dezimaltrenner für Fließkommazahlen! - \end{block} -\end{frame} - -\subsection{Technische Details} -\begin{frame} % Technische Details die man sich nicht merken muss, die aber trotzdem Pflicht sind zu sagen. - \slidehead - Es ist nicht ganz so einfach... - - \begin{itemize}[<+->] - \item Der verwendete Typ muss immer zur Compile-Zeit fest sein - \item Kann sehr oft weggelassen werden, weil der Compiler den Typ selber nachvollziehen kann\\ - \texttt{(Type inference)} - % \item Bei anderen Sprachen muss der verwendete Typ explizit festgelegt werden % Hier kann ich kein Beispiel geben, weil wir noch keine Variablen eingeführt haben - \item[$\Rightarrow$] Das werdet ihr morgen sehen - \end{itemize} - - % \pause % TODO: Ruben hilfe % Nein - % In Kotlin gilt: - % \begin{itemize}[<+->] - % \item \kotlininline{Double} kann nur Zahlen zwischen \kotlininline{-1.7976931348623157e+308} und \kotlininline{1.7976931348623157e+308} speichern - % \begin{itemize} - % \item Kleinster positiver \kotlininline{Double} ist \kotlininline{2.2250738585072014e-308} - % \end{itemize} - % \item \kotlininline{Int} kann nur Zahlen im Interval $[-2^{31}, 2^{31}-1]$ (inklusiv) speichern. - % \item Es gibt weitere Typen, die mehr speichern können - % \end{itemize} -\end{frame} - -% \nextvid{Operatoren}{} - -% !TeX document-id = {ecbf6175-be07-4601-b8eb-d3263d2bff07} -% !TeX TXS-program:compile = txs:///pdflatex/[--shell-escape] - - -%Deckblatt -% \subtitle{Kapitel 2: Spaß mit Daten} -% \titlegraphic{ -% \begin{columns} -% \begin{column}{10cm} -% \vspace{4.32mm} -% \begin{center} -% {\huge Operatoren} -% \end{center} -% \begin{figure} -% \centering -% \includeinvertablegraphics[scale=.35]{media/too_old_for_this_shit.png} -% \\ \sffamily \tiny Bild: \href{https://xkcd.com/447/}{https://xkcd.com/447/} -% \end{figure} -% \end{column} -% \end{columns}} -% \maketitle - -\section{Operatoren} -\begin{frame} - \slidehead - - \begin{itemize} - \item Symbol, das den \textbf{Compiler} zur Ausführung einer Aktion veranlasst - \item Operatortypen: - \end{itemize} - \tikzstyle{rect} = [rectangle, rounded corners, minimum width=3cm, minimum height=1cm,text centered, draw, text width=5cm, fill=\IfDarkModeTF{red!30!black}{red!10}] - \centering - \begin{tikzpicture}[node distance=1.5cm] - \node[rect] (1) {\textbf{Mathematische Operatoren}}; - \node[rect, below of=1] (2) {\textbf{Vergleichsoperatoren}}; - \node[rect, below of=2] (3) {\textbf{Bitoperatoren}}; - \end{tikzpicture} -\end{frame} - -\subsection{Mathematische Operatoren} -\begin{frame}[fragile] - \slidehead - \vspace{-0.2cm} - \tikzstyle{rect} = [rectangle, rounded corners, minimum width=3cm, minimum height=1cm, text centered, draw, text width=3cm, fill=\IfDarkModeTF{red!30!black}{red!10}] - \vspace{0.05cm} - \centering - \begin{tikzpicture} - \node[rect] (1) {Addition: \verb|+|}; - \node[rect, right=0.5em of 1] (2) {Subtraktion: \verb+-+}; - \node[rect, below=0.5em of 1] (3) {Multiplikation: \verb+*+}; - \node[rect, right=0.5em of 3] (4) {Division: \verb+/+}; - \node[rect] at ([yshift=-2em]$(3.south)!0.5!(4.south)$) (5) {Modulo: \verb+%+}; - \end{tikzpicture} - \pause - \vspace{-0.1cm} - \begin{block}{Hinweis} - \begin{itemize} - \item Modulo liefert den \textit{Rest einer Division}: \kotlininline{23 % 4 = 3} - \item Arithmetische Operationen zwischen Ganzzahlen und Fließkommazahlen resultieren in \textit{Fließkommazahlen}: \kotlininline{1 + 2.0 = 3.0} % Für die*den Programmieranfänger*innen mag es zwar total normal scheinen, dass man Kommazahlen mit Integers addieren kann, aber für den Computer ist das ein wichtiger Unterschied! Jetzt kommt der Moment wo ich alle überzeugen kann, dass der Computer wirklich komplett anders denkt als wir Menschen. Er hat ein komplett anderes Konzept, sich 0.1 vorzustellen. - - %Umfrage, glaubt ihr Computer können rechnen? - \pause - \item \kotlininline{0.1 + 0.2 =} \pause \kotlininline{0.30000000000000004} $\Rightarrow$ Fließkommazahlen sind nicht exakt - \end{itemize} - \end{block} -\end{frame} +% Für die*den Programmieranfänger*innen mag es zwar total normal scheinen, dass man Kommazahlen mit Integers addieren kann, aber für den Computer ist das ein wichtiger Unterschied! Jetzt kommt der Moment wo ich alle überzeugen kann, dass der Computer wirklich komplett anders denkt als wir Menschen. Er hat ein komplett anderes Konzept, sich 0.1 vorzustellen. +%Umfrage, glaubt ihr Computer können rechnen? -\subsection{Vergleichsoperatoren} +\section{Mathematische Operatoren} +\subsection{Python als Taschenrechner} \begin{frame} \slidehead - - \begin{itemize} - \item Vergleichsoperatoren werten zu einem Wert vom Typ \kotlininline{Boolean} aus - \item Beispiel: - \kotlinfile{listings/vergleich.kts} + \begin{itemize}[<+->] + \item Man kann mit ganzen Zahlen , z.B. \pythoninline{0, 1, -69, 420}, rechnen + \begin{itemize} + \item \dots wird in Python \pythoninline{int} genannt. + \end{itemize} + \item Alternativ mit Kommazahlen, z.B. \pythoninline{0.0, 1.0, -420.69, 3.14159, 2.7}. + \begin{itemize} + \item \dots wird in Python \pythoninline{float} genannt. + \end{itemize} + \item Kommazahlen sind ungenau: \pythoninline{0.1 + 0.2}. + \item Python kann \pythoninline{+, -, *, /} rechnen. + \item Es gibt noch weitere Operationen, z.B. \pythoninline{**, //,} {\color{gray} \%}. + \item Eine Liste aller Operationen kann man mit \pythoninline{help("+")} anzeigen. + \item Es gibt Punkt-vor-Strich bzw. PEMDAS. + \item Man kann klammern \pythoninline{()} wie gewohnt. \end{itemize} \end{frame} +\livecoding -\subsection{Vergleichsoperatoren - Übersicht} +\section{Vergleichsoperatoren} +\subsection{Erzeugen von Wahrheitswerten} \begin{frame} \slidehead @@ -172,177 +62,79 @@ \subsection{Vergleichsoperatoren - Übersicht} \begin{tabular}{|l|>{\ttfamily}c|>{\ttfamily}c|>{\ttfamily}c|} \hline \textbf{Operator} & \textbf{Symbol} & \textbf{Beispiel} & \textbf{Rückgabewert} \\ \hline - gleich & == & \kotlininline{100 == 50} & \kotlininline{false} \\ - & & \kotlininline{50 == 50} & \kotlininline{true} \\ \hline - ungleich & != & \kotlininline{100 != 50} & \kotlininline{true} \\ - & & \kotlininline{50 != 50} & \kotlininline{false} \\ \hline - größer als & > & \kotlininline{100 > 50} & \kotlininline{true} \\ - & & \kotlininline{50 > 50} & \kotlininline{false} \\ \hline - größer als oder gleich & >= & \kotlininline{100 >= 50} & \kotlininline{true} \\ - & & \kotlininline{50 >= 50} & \kotlininline{true} \\ \hline - kleiner als & < & \kotlininline{100 < 50} & \kotlininline{false} \\ - & & \kotlininline{50 < 50} & \kotlininline{false} \\ \hline - kleiner als oder gleich & <= & \kotlininline{100 <= 50} & \kotlininline{false} \\ - & & \kotlininline{50 <= 50} & \kotlininline{true} \\ \hline + gleich & == & \pythoninline{100 == 50} & \pythoninline{False} \\ + & & \pythoninline{50 == 50} & \pythoninline{True} \\ \hline + ungleich & != & \pythoninline{100 != 50} & \pythoninline{True} \\ + & & \pythoninline{50 != 50} & \pythoninline{False} \\ \hline + größer als & > & \pythoninline{100 > 50} & \pythoninline{True} \\ + & & \pythoninline{50 > 50} & \pythoninline{False} \\ \hline + größer als oder gleich & >= & \pythoninline{100 >= 50} & \pythoninline{True} \\ + & & \pythoninline{50 >= 50} & \pythoninline{True} \\ \hline + kleiner als & < & \pythoninline{100 < 50} & \pythoninline{False} \\ + & & \pythoninline{50 < 50} & \pythoninline{False} \\ \hline + kleiner als oder gleich & <= & \pythoninline{100 <= 50} & \pythoninline{False} \\ + & & \pythoninline{50 <= 50} & \pythoninline{True} \\ \hline \end{tabular} \endgroup \end{center} - - % \note{ - % == geht auch für Strings! - % } -\end{frame} - -\subsection{Bitoperatoren} -\begin{frame} - \slidehead - Ja, es gibt auch Bitoperatoren ... - - $\Rightarrow$ Die werden wir hier aber nicht behandeln \end{frame} \livecoding -\subsection{Operatorpräzedenz} +\section{Logische Operatoren} +\subsection{Vernüpfen von Vergleichsoperatoren} \begin{frame} \slidehead - - \kotlinfile{listings/rangfolge_basic.kts} + \begin{itemize}[<+(1)->] + \item Logisches \textbf{Nicht} (\pythoninline{not}) $\Rightarrow$ \pythoninline{not Ausdruck1} + \item Logisches \textbf{Und} (\pythoninline{and}) $\Rightarrow$ \pythoninline{Ausdruck1 and Ausdruck2} + \item Logisches \textbf{Oder} (\pythoninline{or}) $\Rightarrow$ \pythoninline{Ausdruck1 or Ausdruck2} + \end{itemize} \pause - \kotlinfile{listings/rangfolge_parenthesis.kts} + \pythonfile[][top=0cm,bottom=0cm]{listings/logische_operatoren_listing.py} \pause - \begin{itemize} - \item Die Operatorpräzedenz gibt die \textbf{Reihenfolge} vor, in der Ausdrücke ausgewertet werden: - \begin{enumerate} - \item Arithmetische Ausdrücke - \begin{itemize} - \item[$\Rightarrow$] Wie aus Schulmathematik bekannt - \end{itemize} - \item Vergleiche - \item Logische Ausdrücke (hierzu später mehr) - \item Zuweisungen - \end{enumerate} - \end{itemize} + \begin{block}{Hinweise} + \begin{itemize}[<+(1)->] + \item Auswertung in der Reihenfolge \pythoninline{not}, \pythoninline{and} und dann \pythoninline{or} + \item Reihenfolge immer beachten! + Klammern setzen falls nötig! + \end{itemize} + \end{block} \end{frame} -%\nextvid{Zeichenketten}{Operatoren Beispiel} -%\end{document} - -% !TeX document-id = {ecbf6175-be07-4601-b8eb-d3263d2bff07} -% !TeX TXS-program:compile = txs:///pdflatex/[--shell-escape] - -% -% %Deckblatt -% \subtitle{Kapitel 2: Spaß mit Daten} -% \titlegraphic{ -% \begin{columns} -% \begin{column}{10cm} -% \begin{center} -% {\huge Zeichenketten} -% \end{center} -% \vspace{-1mm} -% \begin{figure} -% \centering -% \includeinvertablegraphics[scale=.35]{media/mu.png} -% \\ \sffamily \tiny Bild: \href{https://xkcd.com/815/}{https://xkcd.com/815} -% \\ -% (Ich habe keinen passenden xkcd gefunden. Schlagt gerne welche vor.) -% \end{figure} -% \end{column} -% \end{columns}} -% \maketitle - -\subsection{} -\section{Zeichenketten} +\livecoding +\section{Konvertierung} \begin{frame} \slidehead \begin{itemize}[<+->] - \item Habt ihr vorhin kennengelernt - \item Zeichenketten werden als \textit{Strings} bezeichnet - \item Ein String kann beliebig viele Zeichen(\textit{Chars}) enthalten - \item Strings können mit \textbf{+} konkateniert werden + \item Wie können wir aus einem \pythoninline{int} einen \pythoninline{float} machen? + \item Python ermöglicht Konvertierung: \pythoninline{float(3)} + \item Analog dazu: \pythoninline{int(3.14)} \end{itemize} \end{frame} +\livecoding -%Vielleicht später mal nützlich: - -%\begin{frame} -% \slidehead -% \begin{itemize} -% \item String Slicing (Zerschneiden von Text) -% \pythonfile{listings/String_Slicing_Listing.py} -% \begin{block}{Wichtig} -% \begin{itemize} -% \item \textbf{[von : bis]} ist \textbf{inklusive} "`von"' und \textbf{exklusive} "`bis"' -% \item Mathematisch: Ein Interval $[von, bis)$ bzw. $[von, bis[$ -% \item Der erste Index beginnt mit der Zahl \textbf{0} -% \end{itemize} -% \end{block} -% \end{itemize} -%\end{frame} - -%\begin{frame} -% \slidehead -% \begin{itemize} -% \item String Slicing Teil 2 -% \pythonfile{listings/String_Slicing_Listing2.py} -% \begin{block}{Wichtig} -% \begin{itemize} -% \item \textbf{[: bis]} ist \textbf{exklusive} und \textbf{[von :]} ist \textbf{inklusive} der Grenze -% \item Auch hier beginnt der erste Index mit der Nummer \textbf{0} -% \item Es können auch beide Grenzen weggelassen werden -% \end{itemize} -% \end{block} -% \end{itemize} -%\end{frame} - -\subsection{Funktionen und Operatoren} -\begin{frame} - \slidehead - - \begin{itemize} - \item Länge eines Strings - \kotlinfile{listings/string_length.kts} - - \item Umwandeln in Kleinbuchstaben - \kotlinfile{listings/string_lowercase.kts} - - \item Umwandeln in Großbuchstaben - \kotlinfile{listings/string_uppercase.kts} - \end{itemize} -\end{frame} - - -\subsection{Konvertierung} -\begin{frame} - \slidehead - \begin{block}{Warnung} - Strings sind keine Zahlen - \end{block} - - \kotlinfile{listings/string_not_a_number.kts} - - \pause - - \begin{itemize}[<+->] - \item Strings müssen zum Rechnen konvertiert werden - \item \textbf{.toInt()} konvertiert x zu \kotlininline{Int} - \item \textbf{.toDouble()} konvertiert x zu \kotlininline{Double} - % \item \textbf{boolean(x)} konvertiert x zu boolean % Das lassen wir weg, weil es durch leere Zeichenketten und Zahlen zu mehr Verwirrung sorgt als es hilfreich ist - \item \textbf{.toString()} konvertiert x zu \kotlininline{String} - \end{itemize} - -\end{frame} - -\section{Konvertierung} -\subsection{} +\section{Ausblick: Weitere Funktionen, die wir kennen lernen werden} \begin{frame} \slidehead - \begin{block}{Beispiel} - \kotlinfile{listings/string_conversion.kts} - \end{block} + \begin{center} + \begin{tabular}{ l | l } + \pythoninline{int} & Konvertierung zu \pythoninline{int} \\ + \pythoninline{float} & Konvertierung zu \pythoninline{float} \\ + \pythoninline{str} & Konvertierung zu Text \\ + \pythoninline{abs} & Gibt den Absolutbetrag einer Zahl an \\ + \pythoninline{help} & Zeigt Hilfe an \\ + \pythoninline{len} & Länge von (manschen) Werten \\ + \pythoninline{print} & Ausgabe \\ + \pythoninline{input} & Eingabe \\ + \pythoninline{range} & Iterieren über Zahlen \\ + \end{tabular} + \end{center} + \vspace{\fill} + Es gibt aber noch viele weitere...\\ + \url{https://docs.python.org/3/library/functions.html} \end{frame} \livecoding @@ -351,14 +143,13 @@ \section{Quiz} \begin{frame} \slidehead \begin{itemize}[<+->] - \item Wie kann ich \kotlininline{"} in Strings verwenden? - \item Wo liegt der Unterschied zwischen \kotlininline{Int} und \kotlininline{Double}? - \item In welcher Reihenfolge wird \kotlininline{2 + 4 * 2 == 9} ausgewertet? + \item Wo liegt der Unterschied zwischen \pythoninline{int} und \pythoninline{float}? + \item Wie kann man in Python eine Zahl abrunden? + \item In welcher Reihenfolge wird \pythoninline{2 + 4 * 2 == 9} ausgewertet? + \item Was ist das Ergebnis? + \item In welcher Reihenfolge wird \pythoninline{1 < 7 and 7 < 10} ausgewertet? \item Was ist das Ergebnis? - \item Wofür gibt es Kommentare? \end{itemize} \end{frame} -%\nextvid{Variablen}{Zeichenketten Beispiel} - \end{document} diff --git a/lecture/03_Variablen/listings/logische_operatoren_listing.kts b/lecture/02_Operatoren/listings/logische_operatoren_listing.kts similarity index 100% rename from lecture/03_Variablen/listings/logische_operatoren_listing.kts rename to lecture/02_Operatoren/listings/logische_operatoren_listing.kts diff --git a/lecture/02_Operatoren/listings/logische_operatoren_listing.py b/lecture/02_Operatoren/listings/logische_operatoren_listing.py new file mode 100644 index 0000000..4ddb76c --- /dev/null +++ b/lecture/02_Operatoren/listings/logische_operatoren_listing.py @@ -0,0 +1,3 @@ +not 2 == 3 +2 == 7 and 8 == 5 +2 == 4 or 8 > 9 diff --git a/lecture/03_Variablen/03_Variablen.tex b/lecture/03_Variablen/03_Variablen.tex index c9b97bd..4f99ab9 100644 --- a/lecture/03_Variablen/03_Variablen.tex +++ b/lecture/03_Variablen/03_Variablen.tex @@ -7,20 +7,25 @@ %Deckblatt \subtitle{Kapitel 3: Daten Zwischenspeichern} -\titlegraphic{ - \begin{columns} - \begin{column}{10cm} - \begin{center} - {\huge Variablen} - \end{center} - \vspace{-1mm} - \begin{figure} - \centering - \includeinvertablegraphics[scale=.35]{media/x.png} - \\ \sffamily \tiny Bild: \href{https://xkcd.com/2309/}{https://xkcd.com/2309/} - \end{figure} - \end{column} - \end{columns}} +\titlegraphic{% + \vbox to \height {% + \vfill + \begin{columns} + \begin{column}{10cm} + \begin{center} + {\huge Variablen} + \end{center} + \vspace{-1mm} + \begin{figure} + \centering + \includegraphics[scale=.35]{media/x\IfDarkModeT{-dark}.png} + \\ \sffamily \tiny Bild: \href{https://xkcd.com/2309/}{https://xkcd.com/2309/} + \end{figure} + \end{column} + \end{columns} + \vfill + } +} \maketitle \section{Was sind Variablen?} @@ -30,87 +35,83 @@ \section{Was sind Variablen?} % Idee: Kinderspielzeug -> Bauklötze in verschiedenen Formen als Bild? \begin{itemize}[<+->] \item Speicherplatz für Werte - \item Ein Fach im Speicher, in das man Werte ablegen kann + \item Eine Box im Speicher, in der man Werte ablegen kann \item Variablennamen sind für Menschen besser zu merken als nummerierte Speicherplätze \end{itemize} \end{frame} -\section{Variablen und Konstanten} +\begin{frame}[fragile] + \slidehead + % Analogie: Fächer; Computer muss wissen, WAS in ein Fach gelegt werden soll. + % Idee: Kinderspielzeug -> Bauklötze in verschiedenen Formen als Bild? + \begin{figure} + \centering + \includegraphics[height=.6\textheight]{media/wip_variables_title\IfDarkModeT{-dark}.png} + \label{fig:variablen} + \caption{Variablen, Bild: Tristan Schulz} + \end{figure} +\end{frame} + +\section{Ablegen von werten in einer Variable} \subsection{Zuweisung} \begin{frame} \slidehead \begin{itemize}[<+->] - \item Konstanten, die \textbf{ein mal} zugewiesen werden können\\ - \kotlininline{val variableName = Wert} - \vspace{1em} - \item Variablen, die \textbf{mehrmals} zugewiesen werden können\\ - \kotlininline{var variableName = Wert} + \item Variablen kann ein Wert zugewiesen werden, indem man den Zuweisungsoperator \lstinline{=} verwendet\\ + \pythoninline{: = } + \end{itemize} \onslide<+-> - \kotlinfile{listings/variables.kts} + \pythonfile{listings/variables.py} \end{frame} -\begin{frame} - \slidehead - Den Typ kann man auch explizit hinschreiben - \vspace{1em} - \begin{itemize} - \item \kotlininline[escapeinside=||]{val variableName|\textcolor{red}{: Typ}| = Wert} - \vspace{1em} - \item \kotlininline[escapeinside=||]{var variableName|\textcolor{red}{: Typ}| = Wert} - \end{itemize} - \pause - \kotlinfile{listings/variables_typed.kts} -\end{frame} +\livecoding \begin{frame} \slidehead Variablennamen: \begin{itemize}[<+->] - \item können als Platzhalter für den darin stehenden Wert verwendet werden + \item sind ein Verweis auf die Stelle an dem der Wert der Variable liegt \item \textbf{müssen} mit einem Buchstaben oder Unterstrich beginnen - \item \textbf{dürfen keine} Punkte, Bindestriche, Sterne oder andere Sonderzeichen enthalten\only<3->{\footnote{Mit backticks ( \mintinline{text}{``} ) geht das ;)}} + \item \textbf{dürfen keine} Punkte, Bindestriche, Sterne oder andere Sonderzeichen enthalten \item sollten \textbf{aussagekräftig} sein! - \item können mit \kotlininline{println(variablenName)} ausgeben werden \item Groß- und Kleinschreibung ist \textbf{wichtig}! ("Case sensitive"):\\ $eineVariable \neq EINEVARIABLE \neq EiNeVaRiAbLe$. - \item Namenskonvention \kotlininline{camelCase} + \item Namenskonvention \pythoninline{snake_case} für Variablen \end{itemize} \end{frame} -\livecoding +\section{Variablen auf der Konsole ausgeben!} +\begin{frame} + \slidehead + Um verschiedene Informationen sichtbar für den Nutzer eines Programms zu machen, kann man den Befehl \pythoninline{print} verwenden. + \pythonfile{listings/printing.py} + Ausgabe auf der Konsole sieht wie folgt aus! + \pythonfile{listings/printing_console.sh} +\end{frame} -%\nextvid{Konsoleneingabe}{Variablen Beispiel} - -% \subtitle{Kapitel 3: Daten Zwischenspeichern} -% \titlegraphic{ -% \begin{columns} -% \begin{column}{10cm} -% \begin{center} -% {\huge Konsoleneingabe} -% \end{center} -% \vspace{-1mm} -% \begin{figure} -% \centering -% \includegraphics[scale=.35]{media/incident\IfDarkModeT{_dark}.png} -% \\ \sffamily \tiny Bild: \href{https://xkcd.com/838/}{https://xkcd.com/838/} -% \end{figure} -% \end{column} -% \end{columns}} -% \maketitle -%\subtitle{Konsoleneingabe} +%TODO: TOLLES +% \subsection{Exkurs: Historik von Print} +% \begin{frame} +% \slidehead +% Der Befehl heißt \pythoninline{print}, das +% \end{frame} +\section{Ablegen von werten in einer Variable} +\subsection{Zuweisung} +\livecoding \section{Exkurs: String Templates} \begin{frame} \slidehead + %TODO: Ich weiß nicht ob wir das hier reinbringen wollen, dass scheint mir etwas suspekt \begin{itemize}[<+->] - \item \textbf{Ziel}: Ausdrücke in einem \kotlininline{String} einfügen - \item Kann man so machen - \kotlinfile{listings/string_no_template.kts} - \item Jetzt nochmal in schön - \kotlinfile{listings/string_template.kts} + \item \textbf{Ziel}: Komplexere ausgaben ermöglichen durch nutzung von Strings (Zeichenketten). + \item Mithilfe der Funktion \pythoninline{str} und dem Konkatenationsoperator \pythoninline{+} können komplexere Ausdrücke zusammengebaut werden + \pythonfile{listings/string_no_template.py} + \item Dies kann man jedoch auch mit einem Template String umsetzen + \pythonfile{listings/string_template.py} \end{itemize} \end{frame} @@ -118,16 +119,10 @@ \section{Exkurs: String Templates} \slidehead \begin{itemize}[<+->] - \item \textbf{Problem}: Komplexere Ausdrücke gehen nicht - \kotlinfile{listings/string_template_complex_mistake.kts} - \item \textbf{Lösung}: Geschweifte klammern \kotlininline|"${ ... }"| - \kotlinfile{listings/string_template_complex.kts} + \item Komplexere Ausdrücke funktionieren selbstverständlich auch! \end{itemize} - \onslide<2-> - \vspace{-1ex} - \begin{block}{Faustregel} - Ausdrücke, die aus mehreren \enquote{Elementen} bestehen, brauchen die Klammern - \end{block} + \pythonfile{listings/string_template_complex.py} + \pythonfile{listings/string_template_complex_output.sh} \end{frame} \section{Exkurs: Konsoleneingabe} @@ -141,7 +136,7 @@ \section{Exkurs: Konsoleneingabe} \begin{block}{Beispiele} \begin{itemize} \item Zeichenkette einlesen - \kotlinfile[][top=0cm,bottom=0cm]{listings/input.kts} + \pythonfile[][top=0cm,bottom=0cm]{listings/input.py} \item Um andere Typen einzulesen, muss \textit{konvertiert} werden \end{itemize} \end{block} @@ -151,88 +146,15 @@ \section{Exkurs: Konsoleneingabe} \slidehead Beispiele: Eingabekonvertierung - \kotlinfile{listings/string_conversion.kts} + \pythonfile{listings/string_conversion.py} \begin{block}{Hinweis} - In \textbf{ki} kann man sich den Typ eines Ausdrucks mit dem Befehl \kotlininline{:type } ausgeben lassen + In python kann man sich den Typ eines Ausdrucks mit dem Befehl \pythoninline{type()} ausgeben lassen \end{block} \end{frame} \livecoding -%\nextvid{Anweisungen und Ausdrücke}{Konsoleneingabe Beispiele} - -% \subtitle{Kapitel 3: Daten Zwischenspeichern} -% \titlegraphic{ -% \begin{columns} -% \begin{column}{10cm} -% \begin{center} -% {\huge Anweisungen und Ausdrücke} -% \end{center} -% \vspace{-2mm} -% \begin{figure} -% \centering -% \includeinvertablegraphics[scale=.35]{media/sandwich.png} -% \\ \sffamily \tiny Bild: \href{https://xkcd.com/149/}{https://xkcd.com/149/} -% \end{figure} -% \end{column} -% \end{columns}} -% \maketitle - -%\begin{frame} -% \vspace{2cm} -% \begin{center} -% \huge Anweisungen und Ausdrücke -% \end{center} -%\end{frame} - - -\section{Anweisungen und Ausdrücke} -\begin{frame} - \slidehead - \begin{itemize} - \item Eine \textbf{Anweisung (Statement)} führt etwas aus - \item Ein \textbf{Ausdruck (Expression)} wertet zu einem \textit{Wert} aus - \end{itemize} - \pause - \kotlinfile{listings/anweisungen.kts} - \begin{itemize} - \item Jede oben gezeigte Zeile enthält \textit{eine Anweisung} - \item \kotlininline{1 + 42 + 5} ist ein \textit{Ausdruck} - \pause - \item Auch die Zahl $1$ ist hier ein Ausdruck, der zu dem Wert $1$ ausgewertet wird - \item Das gilt in Zeile 2 auch für den String - \end{itemize} - -\end{frame} - -\subsection{Zusammengesetze Operatoren} -\begin{frame}[fragile] - \slidehead - - \begin{itemize} - \item Häufig werden Variablen gelesen und gleichzeitig geschrieben - \end{itemize} - - \kotlinfile{listings/zusammengesetzeoperatoren.kts} - - \begin{itemize} - \item Es gibt noch weitere: - \begin{itemize} - \item \verb+-=+ - \item \verb+*=+ - \item \verb+/=+ - \item \verb+%=+ - \end{itemize} - \pause - \item Quiz: Was passiert bei \kotlininline{val} statt \kotlininline{var}? - \end{itemize} -\end{frame} - -\livecoding - -%\nextvid{If-Anweisung}{Anweisungen und Ausdrücke Beispiel} - \section{Control Flow} \subsection{If-Anweisung} \begin{frame} @@ -277,16 +199,15 @@ \subsection{If-Anweisung} \begin{itemize} \item Programm läuft sequentiell, d.h zeilenweise \item If-Anweisungen testen \textit{Bedingungen} - \item Bei Auswertung zu \kotlininline{false} wird der Block übersprungen, bei \kotlininline{true} wird dieser ausgeführt + \item Bei Auswertung zu \pythoninline{False} wird der Block übersprungen, bei \pythoninline{True} wird dieser ausgeführt \end{itemize}} - \kotlinfile[][top=0cm,bottom=0cm]{listings/if_anweisung.kts} + \pythonfile[][top=0cm,bottom=0cm]{listings/unformatted/if_anweisung.py} \onslide<3-> \vspace{-1ex} \begin{block}{Hinweis} \begin{itemize} - \item<3-> Nach der If-Anweisung kommen geschweifte klammern \textbf{ \{ ... \} } - \item<4-> Der Anweisungscode muss nicht eingerückt werden \only<5->{$\Rightarrow$ Ist aber sehr stark empfohlen} - \item<6-> Nein, es gibt keine If-Schleife + \item<3-> Der Anweisungscode muss eingerückt werden + \item<4-> Es gibt \textbf{keine} \enquote{If-Schleife} \end{itemize} \end{block} \end{frame} @@ -294,70 +215,42 @@ \subsection{If-Anweisung} \subsection*{Beispiel} \begin{frame}[c] \slidehead - \kotlinfile[][top=0cm,bottom=0cm]{listings/if_bsp1.kts} + \pythonfile[][top=0cm,bottom=0cm]{listings/if_if.py} + Ausgabe auf der Konsole: + \plainfile[][top=0cm,bottom=0cm]{listings/if_if_output.sh} \end{frame} -\livecoding -%\nextvid{Else-Klausel}{} \section{If-Anweisung} \subsection{Else-Klausel} -% \titlegraphic{ -% \begin{columns} -% \begin{column}{4cm} -% \vspace{2cm} -% \begin{center} -% {\huge Else-Klausel} -% \end{center} -% \end{column} -% \begin{column}{4cm} -% \vspace{5mm} -% \begin{figure} -% \centering -% \includeinvertablegraphics[scale=.35]{media/conditionals.png} -% \\ \sffamily \tiny Bild: \href{https://xkcd.com/1652/}{https://xkcd.com/1652/} -% \end{figure} -% \end{column} -% \end{columns}} -% \maketitle - - -\begin{frame} - \slidehead - \begin{itemize} - \item Oft müssen zwei Fälle unterschieden werden: - \kotlinfile[][top=0cm,bottom=0cm]{listings/if_if.kts} - \item[$\Rightarrow$] Dafür gibt es eine Kurzschreibweise - \end{itemize} -\end{frame} - \begin{frame} \slidehead \begin{itemize} - \item \kotlininline{else} bezeichnet einen \textit{alternativ auszuführenden Teil} des Codes + \item \pythoninline{else} bezeichnet einen \textit{alternativ auszuführenden Teil} des Codes \item Übersetzung: "`Wenn \textbf{DAS} zutrifft, mache \textbf{DIESES}; falls nicht, mache \textbf{JENES}"' \end{itemize} \onslide<2-> \vspace{-1ex} - \kotlinfile[][top=0cm,bottom=0cm]{listings/if_bsp2.kts} + \pythonfile[][top=0cm,bottom=0cm]{listings/if_bsp2.py} + Ausgabe auf der Konsole: + \plainfile[][top=0cm,bottom=0cm]{listings/if_if_output.sh} \vspace{-1ex} - \onslide<3-> - \begin{block}{Frage} - Was bringen Kurzschreibweisen wie z.B. \kotlininline{else} überhaupt? - \end{block} \end{frame} +\livecoding +%\nextvid{Else-Klausel}{} + \subsection{Else If-Klausel} \begin{frame} \slidehead \begin{itemize} \item Manchmal gibt es mehr als zwei Fälle: - \kotlinfile{listings/if_if_if.kts} + \pythonfile{listings/if_if_if.py} \item[$\Rightarrow$] Auch dafür gibt es eine Kurzschreibweise \end{itemize} \end{frame} @@ -366,80 +259,40 @@ \subsection{Else If-Klausel} \slidehead \begin{itemize} - \item Mit \kotlininline{else if} können mehrere If-Anweisungen aneinandergereiht werden - \item Es handelt sich um ein \kotlininline{else} gefolgt von einem \kotlininline{if} - \item Weitere \kotlininline{else if}-Klauseln werden nur dann überprüft, wenn alle vorherigen Klauseln nicht eingetreten sind. - \kotlinfile{listings/if_else_if_example.kts} + \item Mit \pythoninline{elif} können mehrere If-Anweisungen aneinandergereiht werden + \item Es handelt sich um ein \pythoninline{else} gefolgt von einem \pythoninline{if} + \item Weitere \pythoninline{else if}-Klauseln werden nur dann überprüft, wenn alle vorherigen Klauseln nicht eingetreten sind. + \pythonfile{listings/if_else_if_example.py} \end{itemize} \end{frame} \livecoding -\begin{frame} - \slidehead - \begin{itemize} - \item Mehrere \kotlininline{else if}-Klauseln können durch einer \kotlininline{when}-Klausel ersetzt werden - \kotlinfile{listings/when.kts} - \end{itemize} -\end{frame} - -\livecoding - -%\nextvid{Logische Operatoren}{if und elif Beispiele} - -\section{Logische Operatoren} - -% \titlegraphic{ -% \begin{columns} -% \begin{column}{4cm} -% \vspace{1.5cm} -% \begin{center} -% {\huge Logische Operatoren} -% \end{center} -% \end{column} -% \begin{column}{4cm} -% \vspace{-4mm} -% \begin{figure} -% \centering -% \includeinvertablegraphics[scale=.2]{media/logic_boat.png} -% \\ \sffamily \tiny Bild: \href{https://xkcd.com/1134/}{https://xkcd.com/1134/} -% \end{figure} -% \end{column} -% \end{columns}} -% \maketitle - -\begin{frame} - \slidehead - \begin{itemize} - \item Logisches \textbf{Nicht} (\kotlininline{!}) $\Rightarrow$ \kotlininline{not Ausdruck1} - \item Logisches \textbf{Und} (\kotlininline{&&}) $\Rightarrow$ \kotlininline{Ausdruck1 and Ausdruck2} - \item Logisches \textbf{Oder} (\kotlininline{||}) $\Rightarrow$ \kotlininline{Ausdruck1 or Ausdruck2} - \end{itemize} - \kotlinfile[][top=0cm,bottom=0cm]{listings/logische_operatoren_listing.kts} - \begin{block}{Hinweis} - \begin{itemize} - \item Auswertung in der Reihenfolge \kotlininline{!}, \kotlininline{&&} und dann \kotlininline{||} - \item Reihenfolge immer beachten! - Klammern setzen falls nötig! - \end{itemize} - \end{block} -\end{frame} - -\livecoding \section{Quiz} +% TODO: Quiz besser machen mit lösung anzeigen \begin{frame}[fragile] \slidehead \begin{itemize}[<+->] \item Was darf nicht in einem Variablennamen enthalten sein? - \item Was macht der \kotlininline{%=} Operator?% das % zeichen geht in minted nicht wie gedacht. - \item Sind \kotlininline{=} und \kotlininline{==} gleich? + \item Sind \pythoninline{=} und \pythoninline{==} die gleichen Operatoren? \item Darf der Rumpf einer If-Anweisung leer sein? \item Darf eine If-Anweisung im Rumpf einer anderen If-Anweisung stehen? \end{itemize} \end{frame} +\section{Python installieren} +\begin{frame} + \slidehead + \begin{itemize}[<+->] + \item Nicht jeder Rechner kann automatisch jede Sprache + \item Python muss - ähnlich wie eine Fremdsprache - erst beigebracht werden + \item Es kann wie jede andere Applikation installiert werden + \item detaillierte Guides findet ihr auf Moodle + \item Es folgt noch eine Live Demo für Windows, Linux, Mac + \end{itemize} +\end{frame} -%\nextvid{Warum Schleifen}{} +\livecoding \end{document} diff --git a/lecture/03_Variablen/listings/if_bsp1.py b/lecture/03_Variablen/listings/if_bsp1.py new file mode 100644 index 0000000..cc900ee --- /dev/null +++ b/lecture/03_Variablen/listings/if_bsp1.py @@ -0,0 +1,5 @@ +alter: int = 17 + +# Darf ich in Deutschland alleine Auto fahren? +if alter >= 18: + print("Ja! Aber nur mit Fuehrerschein.") diff --git a/lecture/03_Variablen/listings/if_bsp2.py b/lecture/03_Variablen/listings/if_bsp2.py new file mode 100644 index 0000000..9a391ff --- /dev/null +++ b/lecture/03_Variablen/listings/if_bsp2.py @@ -0,0 +1,7 @@ +meinAlter: int = 17 + +# Darf ich in Deutschland alleine Auto fahren? +if meinAlter >= 18: + print("Ja! Aber nur mit Fuehrerschein.") +else: + print("Das Taxi 'Mama' muss her!") diff --git a/lecture/03_Variablen/listings/if_else_if_example.py b/lecture/03_Variablen/listings/if_else_if_example.py new file mode 100644 index 0000000..21ea235 --- /dev/null +++ b/lecture/03_Variablen/listings/if_else_if_example.py @@ -0,0 +1,6 @@ +if a == b: + print("a ist gleich b") +elif a > b: + print("a ist größer als b") +else: + print("b ist größer als a") diff --git a/lecture/03_Variablen/listings/if_if.py b/lecture/03_Variablen/listings/if_if.py new file mode 100644 index 0000000..78a2b28 --- /dev/null +++ b/lecture/03_Variablen/listings/if_if.py @@ -0,0 +1,8 @@ +meinAlter: int = 17 + +# Darf ich in Deutschland alleine Auto fahren? +if meinAlter >= 18: + print("Ja! Aber nur mit Fuehrerschein.") + +if meinAlter < 18: + print("Das Taxi 'Mama' muss her!") diff --git a/lecture/03_Variablen/listings/if_if_if.py b/lecture/03_Variablen/listings/if_if_if.py new file mode 100644 index 0000000..fe377ee --- /dev/null +++ b/lecture/03_Variablen/listings/if_if_if.py @@ -0,0 +1,7 @@ +if a == b: + print("a ist gleich b") +else: + if a > b: + print("a ist größer als b") + else: + print("b ist größer als a") diff --git a/lecture/03_Variablen/listings/if_if_output.sh b/lecture/03_Variablen/listings/if_if_output.sh new file mode 100644 index 0000000..7e4c4e0 --- /dev/null +++ b/lecture/03_Variablen/listings/if_if_output.sh @@ -0,0 +1 @@ +> Das Taxi 'Mama' muss her! diff --git a/lecture/03_Variablen/listings/input.py b/lecture/03_Variablen/listings/input.py new file mode 100644 index 0000000..fb5c6d0 --- /dev/null +++ b/lecture/03_Variablen/listings/input.py @@ -0,0 +1,6 @@ +# Texteingabe mit Fragetext +print("Wie heißt du?") +name: str = input() + +# Ausgabe +print(f"Hallo {name}") diff --git a/lecture/03_Variablen/listings/printing.py b/lecture/03_Variablen/listings/printing.py new file mode 100644 index 0000000..9eb462c --- /dev/null +++ b/lecture/03_Variablen/listings/printing.py @@ -0,0 +1,4 @@ +# Den Wert 10 in 'x' speichern +x: int = 10 +# Ausgabe des Wertes, der sich in 'x' befindet, auf der Konsole +print(x) diff --git a/lecture/03_Variablen/listings/printing_console.sh b/lecture/03_Variablen/listings/printing_console.sh new file mode 100644 index 0000000..94247b7 --- /dev/null +++ b/lecture/03_Variablen/listings/printing_console.sh @@ -0,0 +1 @@ +> 10 diff --git a/lecture/03_Variablen/listings/string_conversion.py b/lecture/03_Variablen/listings/string_conversion.py new file mode 100644 index 0000000..e1108ab --- /dev/null +++ b/lecture/03_Variablen/listings/string_conversion.py @@ -0,0 +1,3 @@ +int_line: int = int(input()) +double_line: float = float(input()) +boolean_line: bool = bool(input()) diff --git a/lecture/03_Variablen/listings/string_no_template.py b/lecture/03_Variablen/listings/string_no_template.py new file mode 100644 index 0000000..dd5216f --- /dev/null +++ b/lecture/03_Variablen/listings/string_no_template.py @@ -0,0 +1,2 @@ +x: int = 5 +result = "The result is " + str(x) + " euros" diff --git a/lecture/03_Variablen/listings/string_template.py b/lecture/03_Variablen/listings/string_template.py new file mode 100644 index 0000000..01bf13b --- /dev/null +++ b/lecture/03_Variablen/listings/string_template.py @@ -0,0 +1,2 @@ +x: int = 5 +result = f"The result is {x} euros" diff --git a/lecture/03_Variablen/listings/string_template_complex.py b/lecture/03_Variablen/listings/string_template_complex.py new file mode 100644 index 0000000..a834a25 --- /dev/null +++ b/lecture/03_Variablen/listings/string_template_complex.py @@ -0,0 +1,4 @@ +y: str = "Fritz" +# len ist eine funktion, welche die "Länge" eines Objekts zurückgibt. +# Bei Zeichenketten ist es die Anzahl an Buchstaben. +result = f"Your name has {len(y)} letters" diff --git a/lecture/03_Variablen/listings/string_template_complex_output.sh b/lecture/03_Variablen/listings/string_template_complex_output.sh new file mode 100644 index 0000000..0d91a3a --- /dev/null +++ b/lecture/03_Variablen/listings/string_template_complex_output.sh @@ -0,0 +1 @@ +> Your name has 5 letters diff --git a/lecture/03_Variablen/listings/unformatted/if_anweisung.py b/lecture/03_Variablen/listings/unformatted/if_anweisung.py new file mode 100644 index 0000000..275c6ae --- /dev/null +++ b/lecture/03_Variablen/listings/unformatted/if_anweisung.py @@ -0,0 +1,3 @@ +if : + # code + ... diff --git a/lecture/03_Variablen/listings/variables.py b/lecture/03_Variablen/listings/variables.py new file mode 100644 index 0000000..183d95e --- /dev/null +++ b/lecture/03_Variablen/listings/variables.py @@ -0,0 +1,6 @@ +zuschauer: int = 42 +raumLaenge: float = 110.5 +hatMikrofon: bool = True + +einText: str = "hallo" +einText = "welt" diff --git a/lecture/03_Variablen/media/conditionals-dark.png b/lecture/03_Variablen/media/conditionals-dark.png new file mode 100644 index 0000000..03abeec Binary files /dev/null and b/lecture/03_Variablen/media/conditionals-dark.png differ diff --git a/lecture/03_Variablen/media/logic_boat-dark.png b/lecture/03_Variablen/media/logic_boat-dark.png new file mode 100644 index 0000000..8aac038 Binary files /dev/null and b/lecture/03_Variablen/media/logic_boat-dark.png differ diff --git a/lecture/03_Variablen/media/sandwich-dark.png b/lecture/03_Variablen/media/sandwich-dark.png new file mode 100644 index 0000000..759aae0 Binary files /dev/null and b/lecture/03_Variablen/media/sandwich-dark.png differ diff --git a/lecture/03_Variablen/media/wip_variables_title-dark.png b/lecture/03_Variablen/media/wip_variables_title-dark.png new file mode 100644 index 0000000..c64aa35 Binary files /dev/null and b/lecture/03_Variablen/media/wip_variables_title-dark.png differ diff --git a/lecture/03_Variablen/media/wip_variables_title.png b/lecture/03_Variablen/media/wip_variables_title.png new file mode 100644 index 0000000..f807eb2 Binary files /dev/null and b/lecture/03_Variablen/media/wip_variables_title.png differ diff --git a/lecture/03_Variablen/media/x-dark.png b/lecture/03_Variablen/media/x-dark.png new file mode 100644 index 0000000..b9fc1ea Binary files /dev/null and b/lecture/03_Variablen/media/x-dark.png differ diff --git a/lecture/04_Schleifen/04_Schleifen.tex b/lecture/04_Schleifen/04_Schleifen.tex index 28e2f56..039f5e3 100644 --- a/lecture/04_Schleifen/04_Schleifen.tex +++ b/lecture/04_Schleifen/04_Schleifen.tex @@ -1,6 +1,5 @@ % !TeX document-id = {3bcfab70-4d4f-4fac-ba3e-b78564f2abde} % !TeX TXS-program:compile = txs:///pdflatex/[--shell-escape] -% !TeX root = 04_Schleifen.tex \input{../global.tex} \begin{document} @@ -10,35 +9,38 @@ \section{Schleifen} \subtitle{Kapitel 4: Befehle wiederholen} \titlegraphic{ - \begin{columns}[c] - \begin{column}{4cm} - \begin{center} - {\huge Schleifen} - \end{center} - \end{column} - \begin{column}{4cm} - \vspace{2mm} - \begin{figure} - \centering - \includeinvertablegraphics[scale=.5]{media/flowchart.png} - \\ \sffamily \tiny Bild: \href{https://xkcd.com/1195/}{https://xkcd.com/1195/} - \end{figure} - \end{column} - \end{columns}} + \vbox to \height {% + \vfill + \begin{columns}[c] + \begin{column}{4cm} + \begin{center} + {\huge Schleifen} + \end{center} + \end{column} + \begin{column}{4cm} + \begin{figure} + \centering + \includegraphics[scale=.5]{media/flowchart\IfDarkModeT{-dark}.png} + \caption{\href{https://xkcd.com/1195/}{https://xkcd.com/1195/}} + \end{figure} + \end{column} + \end{columns} + \vfill + } +} \maketitle \section{Wofür Schleifen?} \begin{frame} - \slidehead - - \kotlinfile{listings/why.kts} + \pythonfile{listings/why.py} + \plainfile{listings/while_output.sh} \end{frame} \begin{frame} \slidehead \vspace{-1em} - \kotlinfile[][top=0pt,bottom=0pt]{listings/why2.kts} + \pythonfile[][top=0pt,bottom=0pt]{listings/why2.py} \pause \vspace{-1.5ex} \begin{block}{Hinweis} @@ -49,7 +51,7 @@ \section{Wofür Schleifen?} \begin{frame} \slidehead - \kotlinfile{listings/while.kts} + \pythonfile{listings/while.py} \begin{itemize} \item Code wird \textit{kürzer} \item Code wird \textit{lesbarer} @@ -63,33 +65,14 @@ \section{Wofür Schleifen?} \section{While-Schleife} \subtitle{Kapitel 4: Befehle wiederholen} -% \titlegraphic{ -% \begin{columns} -% \begin{column}{4cm} -% \vspace{1.5cm} -% \begin{center} -% {\huge While-Schleife} -% \end{center} -% \end{column} -% \begin{column}{4cm} -% \vspace{2mm} -% \begin{figure} -% \centering -% \includeinvertablegraphics[scale=.4]{media/loop.png} -% \\ \sffamily \tiny Bild: \href{https://xkcd.com/1411/}{https://xkcd.com/1411/} -% \end{figure} -% \end{column} -% \end{columns}} -% \maketitle - - \begin{frame} \slidehead + % Wäre es nicht sinnvoll das irgendwie vor zu schieben ? \begin{itemize} \item Syntax: - \kotlinfile{listings/while-syntax.kts} - \item Solange die Bedingung zu \kotlininline{true} ausgewertet wird, werden Anweisungen wiederholt + \pythonfile{listings/unformatted/while-syntax.py} + \item Solange die Bedingung zu \pythoninline{true} ausgewertet wird, werden Anweisungen wiederholt \item Zeile 1 wird \textbf{Schleifenkopf} genannt \item Alles zwischen den geschweiften Klammern wird \textbf{Schleifenkörper} bzw. \textbf{Schleifenrumpf} genannt \end{itemize} @@ -99,7 +82,7 @@ \section{While-Schleife} \slidehead \begin{itemize} \item Alle logischen Operatoren können als \textbf{Ausführbedingung} verwendet werden: - \kotlinfile{listings/while2.kts} + \pythonfile{listings/while2.py} \end{itemize} \end{frame} @@ -110,146 +93,150 @@ \subsection{Continue und break} \slidehead \begin{itemize} - \item \kotlininline{continue} springt zum Anfang der Schleife - \item \kotlininline{break} bricht die Schleife komplett ab + \item \pythoninline{continue} springt zum Anfang der Schleife + \item \pythoninline{break} bricht die Schleife komplett ab \end{itemize} - \kotlinfile{listings/continue-break.kts} + \pythonfile{listings/continue-break.py} \end{frame} \livecoding -%\nextvid{For-Schleife}{While-Schleife Beispiel} - -%Deckblatt -\section{For-Schleife} -\subtitle{Kapitel 4: Befehle wiederholen} - -% \titlegraphic{ -% \begin{columns} -% \begin{column}{4cm} -% \vspace{1.5cm} -% \begin{center} -% {\huge For-Schleife} -% \end{center} -% \end{column} -% \begin{column}{5cm} -% \vspace{2mm} -% \begin{figure} -% \centering -% \includeinvertablegraphics[scale=.35]{media/delicious.png} -% \\ \sffamily \tiny Bild: \href{https://xkcd.com/140/}{https://xkcd.com/140/} -% \end{figure} -% \end{column} -% \end{columns}} -% \maketitle - -\section{For-Schleife} +\subsection{Nicht jede schleife schleift gleich!} \begin{frame} \slidehead \begin{itemize} - %\vspace{-1ex} - \item Häufig gibt es folgende Schleifenart: - %\vspace{-1ex} - \kotlinfile[][top=0pt,bottom=0pt]{listings/while3.kts} - \pause - %\vspace{-1ex} - \item Kurzschreibweise: - %\vspace{-1ex} - \kotlinfile[escapeinside=\$\$][top=0pt,bottom=0pt]{listings/forschleife.kts} - %\vspace{-1ex} - \end{itemize}%\pause - % \begin{block}{Frage:} - % Von wo bis wo zählt diese Schleife? - % \end{block} + \item \textcolor{TUDa-9b}{Achtung} Nicht jede Programmiersprache sieht gleich aus, das wichtige ist das Konzept verstanden zu haben! + \item Manche Programmiersprachen besitzen auch keine Schleifen, sondern nutzen andere Konzepte (Ende vom Vorkurs) + \end{itemize} \end{frame} -\begin{frame}[fragile] +\section{Listen Erstellen und Werte Lesen} +\begin{frame} \slidehead \begin{itemize} - \item Schleife von 0 bis exklusive 10: - \begin{codeBlock}[]{minted language=kotlin} - for (zahl in 0 until 10) { - print(zahl + " ") - } // Ausgabe: 0 1 2 3 4 5 6 7 8 9 - \end{codeBlock} - \pause - \item Schleife von 0 bis inklusive 10: - \begin{codeBlock}[]{minted language=kotlin} - for (zahl in 0..10) { - print(zahl + " ") - } // Ausgabe: 0 1 2 3 4 5 6 7 8 9 10 - \end{codeBlock} + \item Wie können wir mehrere Werte die zusammengehören Speichern? + \item Antwort: Listen! + \item Listen sind zusammenhängende Boxen im Speicher, welche unter einem Namen angesprochen werden können \end{itemize} + + \begin{center} + \vfill + \begin{tikzpicture}[font=\sffamily,thick,remember picture]% + \def\blockheight{1cm} % Cell height + \def\blockwidth{1cm} % Cell width + \tikzset{ + arrayBase/.style={inner sep=0pt,outer sep=0pt}, + array/.style={arrayBase,draw,very thick,minimum height=\blockheight,minimum width=\blockwidth}, + index/.style={arrayBase,font=\footnotesize,color=TUDa-1\IfDarkModeTF{a}{b}}, + } + % draw Array + \foreach [count=\pos from 0] \x in {5,3,10,0,1,2,4,7,9,8}{% + \node[array] (n\pos) at (\pos*\blockwidth,0) {\x};% + \node[index, above=1ex of n\pos] (idx\pos) {\pos};% + } + + \end{tikzpicture}% + \begin{tikzpicture}[remember picture,overlay,thick,font=\sffamily] + % length indicator + \draw<2->[{Bar}{Latex}-{Latex}{Bar}, transform canvas={yshift=-0.5cm}] (n0.south west) -- node[fill=\thepagecolor] {Listenlänge ist 10} (n9.south east); + % index label + \draw<3->[Latex-,TUDa-1\IfDarkModeTF{a}{b}] ([xshift=-2mm]idx0.west) -- ++(-1,0) node[left] {Indizes}; + % indicate element at index 9 + \draw<4->[TUDa-3b,{Latex}-] (n9.north east) -- ++(.5,.5) node[above] {Element an Index 9}; + \end{tikzpicture} + \vfill + \label{fig:figure} + \end{center} + \end{frame} -% \begin{frame} -% \slidehead -% \begin{itemize} -% \item Sinnvoll, wenn eine Variable bis zu einem bestimmten Wert \textit{hochzählen} soll -% \item Syntax: -% \kotlinfile{listings/forschleife.kts} -% \item Beispiel: -% \kotlinfile{listings/forschleife-print.kts} -% \end{itemize} -% \end{frame} +% Hier listen +\subsection{Syntax} +\begin{frame} + \slidehead + Syntax einer Liste: + \pythonfile{listings/unformatted/listen_syntax.py} + Beispiel Verwendung: + \pythonfile{listings/listen1.py} +\end{frame} +\subsection{Elemente Hinzufügen} \begin{frame} \slidehead + \pythonfile{listings/listen_print.py} + \plainfile{listings/listen_print_output.sh} +\end{frame} - \begin{itemize} - \item Ein range kann auch bei einer bestimmten Zahl anfangen - \begin{itemize} - \item Schreibweise: \kotlininline{startwert until grenzwert} - \end{itemize} - \item Oder mit einer festen Schrittweite arbeiten: - \begin{itemize} - \item Schreibweise: \kotlininline{startwert until grenzwert step schrittweite} - \end{itemize} - \end{itemize} - \kotlinfile[]{listings/range.kts} +\subsection{Elemente Modifizieren} +\begin{frame} + \slidehead + \pythonfile{listings/listen_mod.py} + \plainfile{listings/listen_mod_output.sh} +\end{frame} + +\subsection{Elemente Entfernen} +\begin{frame} + \slidehead + \pythonfile{listings/listen_rem.py} + \plainfile{listings/listen_rem_output.sh} \end{frame} +\livecoding + +%Deckblatt +\section{While-Schleife} +\subtitle{Schleifen mit Listen} + \begin{frame}[fragile] \slidehead + Wir können mit Schleifen über Listenelemente laufen und diese weiter verarbeiten + \pythonfile{listings/listen_while.py} + \plainfile{listings/listen_while_output.sh} + Jedoch ist das auf dauer anstrengend, deshalb gibt es meist eine alternative variante in Programmiersprachen +\end{frame} - Man kann auch rückwärts zählen: - \begin{itemize} - \item Schreibweise: \kotlininline{startwert downTo endwert} - \begin{codeBlock}[]{top=0cm,bottom=0cm,minted language=kotlin} - for (zahl in 10 downTo 0) { - print(zahl + " ") - } - // Ausgabe: 10 9 8 7 6 5 4 3 2 1 0 - \end{codeBlock} - \item Schreibweise: \kotlininline{startwert downTo endwert step schrittweite} - \begin{codeBlock}[]{top=0cm,bottom=0cm,minted language=kotlin} - for (zahl in 10 downTo 0 step 2) { - print(zahl + " ") - } - // Ausgabe: 10 8 6 4 2 0 - \end{codeBlock} - \end{itemize} +\section{For-Schleife} +\begin{frame}[fragile] + \slidehead + Hierbei kann man direkt über die Elemente einer Liste laufen + \pythonfile{listings/listen_for.py} + Im allgemeinen nennt man das ganze eine ForEach-Schleife (Programmiersprachen übergreifend) +\end{frame} + +\livecoding + +\begin{frame} + \slidehead + Wenn man nun eine die Zahlen von 1 bis N ausgeben möchte kann man nun weiter vereinfachen + \pythonfile{listings/range1.py} + \plainfile{listings/range1_output.sh} + \pythoninline{range} ist ein Befehl, welcher eine Liste generiert welche die Zahlen 0 bis N erhalten kann + Syntax: \pythoninline{range(start, end, step)} +\end{frame} + +\begin{frame} + \slidehead + Wenn man nun eine die Zahlen von 1 bis N ausgeben möchte kann man nun weiter vereinfachen + \pythonfile{listings/for0ton.py} + \plainfile{listings/for0ton_output.sh} \end{frame} \subsection{Verschachtelte Schleifen} \begin{frame} \slidehead - \vspace{-1.2ex} Natürlich lassen sich Schleifen auch \textit{verschachteln}: - \vspace{-1.2ex} - \kotlinfile[][top=0cm,bottom=0cm]{listings/geschachteltfor.kts} + \pythonfile[][top=0cm,bottom=0cm]{listings/geschachteltfor.py} \pause - \vspace{-1.5ex} \begin{block}{Frage: Was wird ausgegeben?}\pause - \kotlininline{0000000000}\\ - \kotlininline{0000000000}\\ - \kotlininline{...}\\ - \kotlininline{0000000000 // insgesamt 10 mal} + \pythoninline{0000000000}\\ + \pythoninline{0000000000}\\ + \pythoninline{...}\\ + \pythoninline{0000000000 // insgesamt 10 mal} \end{block} \end{frame} @@ -260,13 +247,13 @@ \section{Quiz} \slidehead \pause \begin{itemize} - \item Welche Schleifenarten gibt es in Kotlin?\pause + \item Welche Schleifenarten gibt es in Python?\pause \item Was \textbf{muss} mit Code in einer Schleife gemacht werden?\pause - \item Wann ist die Verwendung einer \kotlininline{for}-Schleife sinnvoll?\pause - \item Ist es möglich, \kotlininline{while}-Schleifen in \kotlininline{for}-Schleifen zu verschachteln?\pause + \item Wann ist die Verwendung einer \pythoninline{for}-Schleife sinnvoll?\pause + \item Ist es möglich, \pythoninline{while}-Schleifen in \pythoninline{for}-Schleifen zu verschachteln?\pause \end{itemize} \begin{block}{Finde drei Fehler} - \kotlinfile{listings/FrageStunde_Schleife_ErrorListing.kts} + \pythonfile{listings/FrageStunde_Schleife_ErrorListing.py} \end{block} % while in range (Syntaxfehler) % println außerhalb der Schleife (Logikfehler) @@ -274,23 +261,27 @@ \section{Quiz} \end{frame} \section{Evaluation} -\begin{frame} +\begin{frame}[c] \slidehead \begin{columns} - \begin{column}{6cm} - \vspace{-0.5cm} + \begin{column}{7cm} \begin{figure} + \def\evallink{https://evaluation.tu-darmstadt.de/evasys/online.php?p=EM8JM} \centering - \includeinvertablegraphics[scale=.33]{media/QRCode_NYV4Q_VL.png} - \\ \sffamily \tiny Vorlesungsevaluation \href{https://evaluation.tu-darmstadt.de/evasys/online.php?p=NYV4Q}{https://evaluation.tu-darmstadt.de/evasys/online.php?p=NYV4Q} + \qrcode[height=4cm]{\evallink} + \caption{Vorlesungsevaluation \\ + \url{\evallink} + } \end{figure} \end{column} - \begin{column}{6cm} - \vspace{-0.5cm} + \begin{column}{7cm} \begin{figure} + \def\evallink{https://evaluation.tu-darmstadt.de/evasys/online.php?p=EVDN3} \centering - \includeinvertablegraphics[scale=.33]{media/QRCode_78NRQ_UE.png} - \\ \sffamily \tiny Übungsevaluation: \href{https://evaluation.tu-darmstadt.de/evasys/online.php?p=78NRQ}{https://evaluation.tu-darmstadt.de/evasys/online.php?p=78NRQ} + \qrcode[height=4cm]{\evallink} + \caption{Übungsevaluation \\ + \url{\evallink} + } \end{figure} \end{column} \end{columns} diff --git a/lecture/04_Schleifen/listings/FrageStunde_Schleife_ErrorListing.py b/lecture/04_Schleifen/listings/FrageStunde_Schleife_ErrorListing.py new file mode 100644 index 0000000..2c5be72 --- /dev/null +++ b/lecture/04_Schleifen/listings/FrageStunde_Schleife_ErrorListing.py @@ -0,0 +1,2 @@ +while zahl range(10) +println("Dies wird 10 mal ausgeführt") diff --git a/lecture/04_Schleifen/listings/continue-break.py b/lecture/04_Schleifen/listings/continue-break.py new file mode 100644 index 0000000..119417c --- /dev/null +++ b/lecture/04_Schleifen/listings/continue-break.py @@ -0,0 +1,9 @@ +i: int = 0 +while i != 5: + i = i + 1 + if i == 2: + break + else: + continue + + print("nicht erreichbar") diff --git a/lecture/04_Schleifen/listings/for0ton.py b/lecture/04_Schleifen/listings/for0ton.py new file mode 100644 index 0000000..737b434 --- /dev/null +++ b/lecture/04_Schleifen/listings/for0ton.py @@ -0,0 +1,3 @@ +# Zahlen von 0 bis 9 ausgeben +for i in range(10): + print(i, end=" ") diff --git a/lecture/04_Schleifen/listings/for0ton_output.sh b/lecture/04_Schleifen/listings/for0ton_output.sh new file mode 100644 index 0000000..42640be --- /dev/null +++ b/lecture/04_Schleifen/listings/for0ton_output.sh @@ -0,0 +1 @@ +0 1 2 3 4 5 6 7 8 9 diff --git a/lecture/04_Schleifen/listings/geschachteltfor.py b/lecture/04_Schleifen/listings/geschachteltfor.py new file mode 100644 index 0000000..0040dfb --- /dev/null +++ b/lecture/04_Schleifen/listings/geschachteltfor.py @@ -0,0 +1,5 @@ +for y in range(10): + s: str = "" + for x in range(10): + s = s + "0" + print(s) diff --git a/lecture/04_Schleifen/listings/listen1.py b/lecture/04_Schleifen/listings/listen1.py new file mode 100644 index 0000000..79831d1 --- /dev/null +++ b/lecture/04_Schleifen/listings/listen1.py @@ -0,0 +1,6 @@ +# Erstellen einer Liste +werte: list[int] = [] +# Hinzufügen von Werten in die Liste +werte.append(1) +# Auslesen von werten der Liste +werte[0] diff --git a/lecture/04_Schleifen/listings/listen_for.py b/lecture/04_Schleifen/listings/listen_for.py new file mode 100644 index 0000000..ac50f83 --- /dev/null +++ b/lecture/04_Schleifen/listings/listen_for.py @@ -0,0 +1,3 @@ +tolle_liste = [5, 1, 4, 2, 3] +for x in tolle_liste: + print(x, end=" | ") diff --git a/lecture/04_Schleifen/listings/listen_mod.py b/lecture/04_Schleifen/listings/listen_mod.py new file mode 100644 index 0000000..401caed --- /dev/null +++ b/lecture/04_Schleifen/listings/listen_mod.py @@ -0,0 +1,7 @@ +werte: list[int] = [3, 5, 1, 2] + +werte[0] = 10 +werte[1] = 20 + +print(f"0: {werte[0]}") +print(f"2: {werte[2]}") diff --git a/lecture/04_Schleifen/listings/listen_mod_output.sh b/lecture/04_Schleifen/listings/listen_mod_output.sh new file mode 100644 index 0000000..450da28 --- /dev/null +++ b/lecture/04_Schleifen/listings/listen_mod_output.sh @@ -0,0 +1,2 @@ +> 0: 10 +> 2: 1 diff --git a/lecture/04_Schleifen/listings/listen_print.py b/lecture/04_Schleifen/listings/listen_print.py new file mode 100644 index 0000000..dc61248 --- /dev/null +++ b/lecture/04_Schleifen/listings/listen_print.py @@ -0,0 +1,6 @@ +# Erstellen einer Liste +werte: list[int] = [3, 5, 1, 2] + +# Ausgeben von Elementen +print(f"0: {werte[0]}") +print(f"2: {werte[2]}") diff --git a/lecture/04_Schleifen/listings/listen_print_output.sh b/lecture/04_Schleifen/listings/listen_print_output.sh new file mode 100644 index 0000000..1f77b27 --- /dev/null +++ b/lecture/04_Schleifen/listings/listen_print_output.sh @@ -0,0 +1,2 @@ +> 0: 3 +> 2: 1 diff --git a/lecture/04_Schleifen/listings/listen_rem.py b/lecture/04_Schleifen/listings/listen_rem.py new file mode 100644 index 0000000..4607205 --- /dev/null +++ b/lecture/04_Schleifen/listings/listen_rem.py @@ -0,0 +1,6 @@ +werte: list[int] = [3, 5, 1, 2] + +werte.pop(0) +werte.pop(2) + +print(werte) diff --git a/lecture/04_Schleifen/listings/listen_rem_output.sh b/lecture/04_Schleifen/listings/listen_rem_output.sh new file mode 100644 index 0000000..d084af2 --- /dev/null +++ b/lecture/04_Schleifen/listings/listen_rem_output.sh @@ -0,0 +1 @@ +[5, 1] diff --git a/lecture/04_Schleifen/listings/listen_while.py b/lecture/04_Schleifen/listings/listen_while.py new file mode 100644 index 0000000..20adf6a --- /dev/null +++ b/lecture/04_Schleifen/listings/listen_while.py @@ -0,0 +1,5 @@ +i: int = 0 +tolle_liste = [5, 1, 4, 2, 3] +while i < len(tolle_liste): + print(tolle_liste[i], end=" | ") + i = i + 1 diff --git a/lecture/04_Schleifen/listings/listen_while_output.sh b/lecture/04_Schleifen/listings/listen_while_output.sh new file mode 100644 index 0000000..2a4d1d4 --- /dev/null +++ b/lecture/04_Schleifen/listings/listen_while_output.sh @@ -0,0 +1 @@ +5 | 1 | 4 | 2 | 3 | ⏎ diff --git a/lecture/04_Schleifen/listings/range1.py b/lecture/04_Schleifen/listings/range1.py new file mode 100644 index 0000000..b2999a9 --- /dev/null +++ b/lecture/04_Schleifen/listings/range1.py @@ -0,0 +1,2 @@ +zero_to_n: list[int] = list(range(10)) +print(zero_to_n) diff --git a/lecture/04_Schleifen/listings/range1_output.sh b/lecture/04_Schleifen/listings/range1_output.sh new file mode 100644 index 0000000..20dcf58 --- /dev/null +++ b/lecture/04_Schleifen/listings/range1_output.sh @@ -0,0 +1 @@ +> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] diff --git a/lecture/04_Schleifen/listings/unformatted/listen_syntax.py b/lecture/04_Schleifen/listings/unformatted/listen_syntax.py new file mode 100644 index 0000000..cd05b9b --- /dev/null +++ b/lecture/04_Schleifen/listings/unformatted/listen_syntax.py @@ -0,0 +1 @@ +: list[] = [ e1, ... , eN ] diff --git a/lecture/04_Schleifen/listings/unformatted/while-syntax.py b/lecture/04_Schleifen/listings/unformatted/while-syntax.py new file mode 100644 index 0000000..e363c50 --- /dev/null +++ b/lecture/04_Schleifen/listings/unformatted/while-syntax.py @@ -0,0 +1,3 @@ +while : + # code + # ... diff --git a/lecture/04_Schleifen/listings/while.py b/lecture/04_Schleifen/listings/while.py new file mode 100644 index 0000000..a6ac0f8 --- /dev/null +++ b/lecture/04_Schleifen/listings/while.py @@ -0,0 +1,6 @@ +# Gib die Zahlen von 0 bis 4 auf dem Bildschirm aus +zahl: int = 0 + +while zahl < 5: + print(zahl) + zahl = zahl + 1 diff --git a/lecture/04_Schleifen/listings/while2.py b/lecture/04_Schleifen/listings/while2.py new file mode 100644 index 0000000..180ca1b --- /dev/null +++ b/lecture/04_Schleifen/listings/while2.py @@ -0,0 +1,5 @@ +while 5 < 10: + # code + +while hund != katze: + # code diff --git a/lecture/04_Schleifen/listings/while3.py b/lecture/04_Schleifen/listings/while3.py new file mode 100644 index 0000000..01fa56c --- /dev/null +++ b/lecture/04_Schleifen/listings/while3.py @@ -0,0 +1,4 @@ +zahl: int = 0 +while zahl < 100: + # code + zahl = zahl + 1 diff --git a/lecture/04_Schleifen/listings/while_output.sh b/lecture/04_Schleifen/listings/while_output.sh new file mode 100644 index 0000000..2bd956f --- /dev/null +++ b/lecture/04_Schleifen/listings/while_output.sh @@ -0,0 +1,5 @@ +> 0 +> 1 +> 2 +> 3 +> 4 diff --git a/lecture/04_Schleifen/listings/why.py b/lecture/04_Schleifen/listings/why.py new file mode 100644 index 0000000..3e1a027 --- /dev/null +++ b/lecture/04_Schleifen/listings/why.py @@ -0,0 +1,6 @@ +# Gib die Zahlen von 0 bis 4 auf dem Bildschirm aus +print(0) +print(1) +print(2) +print(3) +print(4) diff --git a/lecture/04_Schleifen/listings/why2.py b/lecture/04_Schleifen/listings/why2.py new file mode 100644 index 0000000..9e53cc5 --- /dev/null +++ b/lecture/04_Schleifen/listings/why2.py @@ -0,0 +1,11 @@ +# Gib die Zahlen von 0 bis 4 auf dem Bildschirm aus +zahl: int = 0 +print(zahl) +zahl = zahl + 1 +print(zahl) +zahl = zahl + 1 +print(zahl) +zahl = zahl + 1 +print(zahl) +zahl = zahl + 1 +print(zahl) diff --git a/lecture/04_Schleifen/media/QRCode_78NRQ_UE.png b/lecture/04_Schleifen/media/QRCode_78NRQ_UE.png deleted file mode 100644 index 28cad8d..0000000 Binary files a/lecture/04_Schleifen/media/QRCode_78NRQ_UE.png and /dev/null differ diff --git a/lecture/04_Schleifen/media/QRCode_NYV4Q_VL.png b/lecture/04_Schleifen/media/QRCode_NYV4Q_VL.png deleted file mode 100644 index e5f6c5c..0000000 Binary files a/lecture/04_Schleifen/media/QRCode_NYV4Q_VL.png and /dev/null differ diff --git a/lecture/04_Schleifen/media/QRCode_Q5ZNR_UE.png b/lecture/04_Schleifen/media/QRCode_Q5ZNR_UE.png deleted file mode 100644 index 8355424..0000000 Binary files a/lecture/04_Schleifen/media/QRCode_Q5ZNR_UE.png and /dev/null differ diff --git a/lecture/04_Schleifen/media/QRCode_TLGAK_VL.png b/lecture/04_Schleifen/media/QRCode_TLGAK_VL.png deleted file mode 100644 index ff876df..0000000 Binary files a/lecture/04_Schleifen/media/QRCode_TLGAK_VL.png and /dev/null differ diff --git a/lecture/04_Schleifen/media/delicious-dark.png b/lecture/04_Schleifen/media/delicious-dark.png new file mode 100644 index 0000000..91b4db2 Binary files /dev/null and b/lecture/04_Schleifen/media/delicious-dark.png differ diff --git a/lecture/04_Schleifen/media/flowchart-dark.png b/lecture/04_Schleifen/media/flowchart-dark.png new file mode 100644 index 0000000..feb1aed Binary files /dev/null and b/lecture/04_Schleifen/media/flowchart-dark.png differ diff --git a/lecture/04_Schleifen/media/loop-dark.png b/lecture/04_Schleifen/media/loop-dark.png new file mode 100644 index 0000000..dd453db Binary files /dev/null and b/lecture/04_Schleifen/media/loop-dark.png differ diff --git a/lecture/06_Funktionen/06_Funktionen.tex b/lecture/06_Funktionen/06_Funktionen.tex index 8d98200..0af1bea 100644 --- a/lecture/06_Funktionen/06_Funktionen.tex +++ b/lecture/06_Funktionen/06_Funktionen.tex @@ -8,25 +8,29 @@ %Deckblatt \subtitle{Kapitel 6: wie Funktionen funktionieren} \titlegraphic{ - \begin{columns} - \begin{column}{10cm} - %\vspace{1.5cm} - \begin{center} - {\huge Funktionen} - \end{center} - \begin{figure} - \centering - \includeinvertablegraphics[scale=.4]{media/proofs.png} - \\ \sffamily \tiny Bild: \href{https://xkcd.com/1724/}{https://xkcd.com/1724/} - \end{figure} - \end{column} - \end{columns}} + \vbox to \height {% + \vfill + \begin{columns} + \begin{column}{10cm} + \begin{center} + {\huge Funktionen} + \end{center} + \begin{figure} + \centering + \includegraphics[scale=.4]{media/proofs\IfDarkModeT{-dark}.png} + \caption{\url{https://xkcd.com/1724/}} + \end{figure} + \end{column} + \end{columns} + \vfill + } +} \maketitle \section{Schlechtes Beispiel} \begin{frame}[c] \slidehead - \kotlinfile{listings/beispiel_schlecht.kts} + \pythonfile{listings/beispiel_schlecht.py} \small (Namen generiert auf www.listofrandomnames.com) \end{frame} @@ -34,7 +38,7 @@ \section{Schlechtes Beispiel} \section{Gutes Beispiel} \begin{frame} \slidehead - \kotlinfile{listings/beispiel_gut.kts} + \pythonfile{listings/beispiel_gut.py} \end{frame} \section{Idee von Funktionen} @@ -48,33 +52,18 @@ \section{Idee von Funktionen} \end{itemize} \vspace{1cm} \begin{block}{Hinweis} - Einige Funktionen haben wir schon kennengelernt, z.B. \kotlininline{println("Hello World")} + Einige Funktionen haben wir schon kennengelernt, z.B. \pythoninline{print("Hello World")} \end{block} \end{frame} -%\nextvid{Funktionen Syntax}{} - \subtitle{Kapitel 6: wie Funktionen funktionieren} -%Deckblatt -% \titlegraphic{ -% \begin{columns} -% \begin{column}{6cm} -% \vspace{18mm} -% \begin{center} -% {\huge Funktionen Syntax} -% \end{center} -% \end{column} -% \end{columns} -% } -% \maketitle - \section{Woraus besteht eine Funktion?} \begin{frame}[c] \slidehead \begin{itemize}[<+->] - \item Syntax: \kotlinfile{listings/fun_syntax.kts} - \item Beispiel: \kotlinfile{listings/fun_syntax_concrete.kts} + \item Syntax: \pythonfile{listings/fun_syntax.py} + \item Beispiel: \pythonfile{listings/fun_syntax_concrete.py} \end{itemize} \end{frame} @@ -83,39 +72,16 @@ \subsection{Return-Statement} \slidehead \begin{itemize} \item Funktionen können Rückgabewerte haben - \item Der Rückgabetyp muss im Methodenkopf stehen - \item Dazu wird \kotlininline{return} gefolgt vom Rückgabewert geschrieben + \item Der Rückgabetyp kann im Methodenkopf stehen + \item Dazu wird \pythoninline{return} gefolgt vom Rückgabewert geschrieben \pause - \item Syntax \kotlinfile{listings/fun_syntax_return.kts} + \item Syntax \pythonfile{listings/fun_syntax_return.py} \end{itemize} \end{frame} -\begin{frame} - \slidehead - \kotlinfile{listings/fun_example_return_block.kts} - \pause - Funktionen, die nur die \kotlininline{return}-Anweisung haben, können auch so geschrieben werden - \kotlinfile{listings/fun_example_return_expression.kts} -\end{frame} - \livecoding -%\nextvid{Funktion Fallbeispiel}{} - -\subtitle{Kapitel 6: wie Funktionen funktionieren} - -%Deckblatt -% \titlegraphic{ -% \begin{columns} -% \begin{column}{6cm} -% \vspace{18mm} -% \begin{center} -% {\huge Funktionen Fallbeispiel} -% \end{center} -% \end{column} -% \end{columns} -% } -% \maketitle +\subtitle{Kapitel 6: Wie Funktionen funktionieren} \section{Fallbeispiel: Geometrie} \begin{frame}[c] @@ -126,7 +92,7 @@ \section{Fallbeispiel: Geometrie} %Hinweis: dieses Bild wurde von uns erstellt und kann ohne Referenz verwendet werden. %Viele Grüße %Kevin - \includeinvertablegraphics[width=0.8\textheight]{geometrie} + \includegraphics[width=0.8\textheight]{geometrie\IfDarkModeT{-dark}.png} \end{figure} \end{frame} @@ -134,7 +100,7 @@ \section{Fallbeispiel: Geometrie} \subsection{Flächeninhalt eines Kreises} \begin{frame} \slidehead - \kotlinfile{listings/bsp_geometrie_schlecht.kts} + \pythonfile{listings/bsp_geometrie_schlecht.py} \begin{block}{Problem} Immer, wenn irgendwo der Flächeninhalt gebraucht wird, muss er neu geschrieben werden $\Rightarrow$ Viel Code und viele mögliche Fehlerquellen @@ -145,21 +111,21 @@ \subsection{Flächeninhalt eines Kreises} \slidehead \vspace{-1ex} \begin{onlyenv}<1> - \kotlinfile{listings/bsp_geometrie_1.kts} + \pythonfile{listings/bsp_geometrie_1.py} \end{onlyenv} \begin{onlyenv}<2> - \kotlinfile{listings/bsp_geometrie_2.kts} + \pythonfile{listings/bsp_geometrie_2.py} \end{onlyenv} \pause - In diesem Beispiel, ist \kotlininline{r} ein \textbf{Parameter} und \kotlininline{radius} das \textbf{Argument} für \kotlininline{r} + In diesem Beispiel, ist \pythoninline{r} ein \textbf{Parameter} und \pythoninline{radius} das \textbf{Argument} für \pythoninline{r} \end{frame} \subsection{Wiederverwendbarkeit} \begin{frame} \slidehead \vspace{-1ex} - \kotlinfile[][top=0cm,bottom=0cm]{listings/reusability.kts} + \pythonfile[][top=0cm,bottom=0cm]{listings/reusability.py} \vspace{-1ex} \begin{block}{Hinweis} Nun kann die Funktion auch in anderen Funktionen verwendet werden. @@ -180,38 +146,28 @@ \section{Vorteile von Funktionen} \livecoding -%\nextvid{Scope}{Funktionen Beispiele} - %Deckblatt \subtitle{Kapitel 6: wie Funktionen funktionieren} -% \titlegraphic{ -% \begin{columns} -% \begin{column}{6cm} -% \vspace{18mm} -% \begin{center} -% {\huge Scope} -% \end{center} -% \end{column} -% \end{columns}} -% \maketitle - \section{Scope} \subsection{Lokale Variablen} \begin{frame}[fragile] \slidehead \vspace{-1em} - \kotlinfile{listings/scope_1.kts} + \pythonfile[][top=0cm,bottom=0cm]{listings/scope_1.py} \pause \vspace{-1em} %\begin{noindent} \begin{commandshell}[fontsize=\footnotesize][minted language=text,top=0cm,bottom=0cm] - scope_1.kts:6:9: error: unresolved reference: variable - println(variable) - ^ + Traceback (most recent call last): + File "scope_1.py", line 5, in + print(variable) + ^^^^^^^^ + NameError: name 'variable' is not defined. Did you mean: 'callable'? \end{commandshell} %\end{noindent} \vspace{-1em} + \vfill \begin{block}{Hinweis:} Variablen, die innerhalb einer Funktion erstellt werden, werden gelöscht, sobald die Funktion endet. Diese Variablen heißen \textbf{lokale Variablen}. @@ -221,7 +177,7 @@ \subsection{Lokale Variablen} \subsection{Globale Variablen} \begin{frame} \slidehead - \kotlinfile{listings/scope_2.kts} + \pythonfile{listings/scope_2.py} \begin{itemize} \item Variablen die außerhalb von Funktionen erstellt wurden, werden als \textbf{globale Variablen} bezeichnet \item Auf globale Variablen kann auch in Funktionen zugegriffen werden @@ -230,41 +186,17 @@ \subsection{Globale Variablen} \begin{frame} \slidehead - \kotlinfile{listings/scope_3.kts} + \pythonfile{listings/scope_3.py} \begin{itemize} - \item Die globale Variable \kotlininline{zahl} bleibt unverändert + \item Die globale Variable \pythoninline{zahl} bleibt unverändert \item Es wird eine lokale Variable mit dem \textit{gleichen} Namen erstellt \end{itemize} \end{frame} \livecoding -%\nextvid{Rekursion}{Scope Beispiele} - \subtitle{Kapitel 6: wie Funktionen funktionieren} -%Deckblatt -% \titlegraphic{ -% \begin{columns} -% \begin{column}{4cm} -% \vspace{1.5cm} -% \begin{center} -% {\huge Rekursion} -% \end{center} -% \end{column} -% \begin{column}{4cm} -% \vspace{-5mm} -% \begin{figure} -% \centering -% \includeinvertablegraphics[scale=2.5]{media/tabletop_roleplaying.png} -% \\ \sffamily \tiny Bild: \href{https://xkcd.com/244/}{https://xkcd.com/244/} -% \end{figure} -% %\raisebox{-5cm}{für mehr Informationen siehe Foliensatz "`Rekursion"'} -% %} -% \end{column} -% \end{columns}} -% \maketitle - \section{Rekursion} \begin{frame}[t] \slidehead @@ -281,7 +213,7 @@ \section{Rekursion} \begin{column}{7cm} \begin{figure} \IfFileExists{\jobname_tmp.pdf}{ - \includegraphics[width=\textwidth,page=24]{\jobname_tmp.pdf} + \includegraphics[width=\textwidth,page=22]{\jobname_tmp.pdf} }{} \end{figure} \end{column} @@ -299,7 +231,7 @@ \section{Rekursion} \begin{column}{5cm} \begin{figure} \IfFileExists{\jobname_tmp.pdf}{ - \includegraphics[width=\textwidth,page=25]{\jobname_tmp.pdf} + \includegraphics[width=\textwidth,page=23]{\jobname_tmp.pdf} }{} \end{figure} \end{column} @@ -307,7 +239,7 @@ \section{Rekursion} \begin{column}{5cm} \begin{figure} \IfFileExists{\jobname_tmp.pdf}{ - \includegraphics[width=\textwidth,page=25]{\jobname_tmp.pdf} + \includegraphics[width=\textwidth,page=23]{\jobname_tmp.pdf} }{} \end{figure} \end{column} @@ -321,11 +253,11 @@ \subsection*{Beispiel} \begin{itemize} \item Fibonacci-Zahlen: \texttt{1, 1, 2, 3, 5, 8, 13, 8+13 = 21, ...} \begin{onlyenv}<1> - \kotlinfile{listings/bsp_recursion_1.kts} + \pythonfile{listings/bsp_recursion_1.py} \end{onlyenv} \begin{onlyenv}<2> - \kotlinfile{listings/bsp_recursion_2.kts} + \pythonfile{listings/bsp_recursion_2.py} \end{onlyenv} \item<2> Rekursionsanker sorgt für den Abbruch @@ -335,70 +267,45 @@ \subsection*{Beispiel} \subsection{Rekursionsbaum} -%The biggest Latex Monstrosity ever conceived: -%greetings -%Kevin O. -\newcommand{\mytree}{ - \ifnum \val = 0 - \draw[draw=., ultra thick] (\x,\y) rectangle ++(0.75,0.75); - \node at (\x+0.375,\y+0.375) {f(\the\val)}; - \fi - \ifnum \val = 1 - \draw[draw=., ultra thick] (\x,\y) rectangle ++(0.75,0.75); - \node at (\x+0.375,\y+0.375) {f(\the\val)}; - \fi - \ifnum \val > 1 - - \draw[draw=., ultra thick] (\x,\y) rectangle ++(0.75,0.75); - \node at (\x+0.375,\y+0.375) {f(\the\val)}; - - \advance \val -1 - \advance \y -2 - \tmp=-\val*0.01 - \advance \tmp -1 - - \advance \x \tmp - \draw [->, thick] (\x-\tmp,\y+2) -- (\x+0.75,\y+0.75); - \mytree; - - \tmp=\val*0.01 - \advance \tmp 1 - - \advance \x \tmp - \advance \val -1 - \tmp=\val*0.01 - \advance \tmp 1 - - \advance \x \tmp - - \draw [->, thick] (\x-\tmp+0.75,\y+2) -- (\x,\y+0.75); - \mytree; - - %everything back to normal - \tmp=-\val*0.01 - \advance \tmp -1 - - \advance \val +2 - \advance \x \tmp - \advance \y +2 - \fi -} - - -\begin{frame} +\begin{frame}[c] \slidehead \centering - \vspace{-0.1cm} - \begin{tikzpicture}[scale=.9, every node/.style={scale=1}] - \newcount\val - \newcount\x - \newcount\y - \newcount\tmp - \val=4; - \x=0; - \y=0; - \mytree; - \end{tikzpicture} + \begin{forest} + % if you think this tree code is unreadable, just look at the previous one from Kevin + % Fixed by: Ruben + for tree={ + draw, + very thick, + edge={-Latex,thick}, + minimum size=.75cm, + l+=5mm, + s sep+=2cm, + if n=1{ % honor the fancy edge style of the old tree + edge path={ + \noexpand\path[\forestoption{edge}] + (!u.south west) -- (.north east)\forestoption{edge label}; + }, + }{ + edge path={ + \noexpand\path[\forestoption{edge}] + (!u.south east) -- (.north west)\forestoption{edge label}; + }, + }, + } + [f(4) + [f(3) + [f(2) + [f(1)] + [f(0)] + ] + [f(1)] + ] + [f(2) + [f(1)] + [f(0)] + ] + ] + \end{forest} \end{frame} \subsection{Rekursive Summe in Kotlin} @@ -413,7 +320,7 @@ \subsection{Rekursive Summe in Kotlin} \end{itemize} \vspace{1em} \pause - \kotlinfile{listings/recursiveSum.kts} + \pythonfile{listings/recursiveSum.py} \end{frame} \livecoding @@ -431,9 +338,9 @@ \section{Quiz} Was ist ein Argument? Wie untescheiden sie sich? \pause - \item Darf ich meine Funktion \kotlininline{while} nennen? + \item Darf ich meine Funktion \pythoninline{while} nennen? \pause - \item Braucht eine Funktion ein \kotlininline{return}-Statement? + \item Braucht eine Funktion ein \pythoninline{return}-Statement? \pause \item Solltet ihr alle zur Ophase gehen? \end{itemize} diff --git a/lecture/06_Funktionen/listings/beispiel_gut.kts b/lecture/06_Funktionen/listings/beispiel_gut.kts deleted file mode 100644 index 13eafd9..0000000 --- a/lecture/06_Funktionen/listings/beispiel_gut.kts +++ /dev/null @@ -1,12 +0,0 @@ -fun sagHallo(person: String) { - print("Hallo $person") - print("Schoen geschlafen?") - print("Ich habe gut geschlafen.") -} - -// Hauptprogram Anfang: -sagHallo("Georgia Lubin") -// Code ... -sagHallo("Avis Santiago") -// anderer Code .. -sagHallo("Earnest Whitehead") diff --git a/lecture/06_Funktionen/listings/beispiel_gut.py b/lecture/06_Funktionen/listings/beispiel_gut.py new file mode 100644 index 0000000..870692a --- /dev/null +++ b/lecture/06_Funktionen/listings/beispiel_gut.py @@ -0,0 +1,12 @@ +def sag_hallo(person): + print(f"Hallo {person}") + print("Schoen geschlafen?") + print("Ich habe gut geschlafen.") + + +# Hauptprogram Anfang: +sag_hallo("Georgia Lubin") +# Code ... +sag_hallo("Avis Santiago") +# anderer Code .. +sag_hallo("Earnest Whitehead") diff --git a/lecture/06_Funktionen/listings/beispiel_schlecht.kts b/lecture/06_Funktionen/listings/beispiel_schlecht.kts deleted file mode 100644 index eec9601..0000000 --- a/lecture/06_Funktionen/listings/beispiel_schlecht.kts +++ /dev/null @@ -1,11 +0,0 @@ -println("Hallo Georgia Lubin") -println("Schoen geschlafen?") -println("Ich habe gut geschlafen.") -// code ... -println("Hallo Avis Santiago") -println("Schoen geschlafen?") -println("Ich habe gut geschlafen.") -// anderer code ... -println("Hallo Earnest Whitehead") -println("Schoen geschlafen?") -println("Ich habe gut geschlafen.") diff --git a/lecture/06_Funktionen/listings/beispiel_schlecht.py b/lecture/06_Funktionen/listings/beispiel_schlecht.py new file mode 100644 index 0000000..a6f877b --- /dev/null +++ b/lecture/06_Funktionen/listings/beispiel_schlecht.py @@ -0,0 +1,11 @@ +print("Hallo Georgia Lubin") +print("Schoen geschlafen?") +print("Ich habe gut geschlafen.") +# code ... +print("Hallo Avis Santiago") +print("Schoen geschlafen?") +print("Ich habe gut geschlafen.") +# anderer code ... +print("Hallo Earnest Whitehead") +print("Schoen geschlafen?") +print("Ich habe gut geschlafen.") diff --git a/lecture/06_Funktionen/listings/bsp_geometrie_1.kts b/lecture/06_Funktionen/listings/bsp_geometrie_1.kts deleted file mode 100644 index d12485c..0000000 --- a/lecture/06_Funktionen/listings/bsp_geometrie_1.kts +++ /dev/null @@ -1,3 +0,0 @@ -fun kreisFlaeche(r: Double): Double { - return r * r * Math.PI -} diff --git a/lecture/06_Funktionen/listings/bsp_geometrie_1.py b/lecture/06_Funktionen/listings/bsp_geometrie_1.py new file mode 100644 index 0000000..b838907 --- /dev/null +++ b/lecture/06_Funktionen/listings/bsp_geometrie_1.py @@ -0,0 +1,2 @@ +def kreis_flaeche(r): + return r * r * math.pi diff --git a/lecture/06_Funktionen/listings/bsp_geometrie_2.kts b/lecture/06_Funktionen/listings/bsp_geometrie_2.kts deleted file mode 100644 index 60e237b..0000000 --- a/lecture/06_Funktionen/listings/bsp_geometrie_2.kts +++ /dev/null @@ -1,10 +0,0 @@ -fun kreisFlaeche(r: Double): Double { - return r * r * Math.PI -} - -// Hauptprogramm -val radius = 20.5 -println( - "Der Flächeninhalt eines Kreises mit Radius $radius" + - " cm ist ${kreisFlaeche(radius)} cm^2" -) diff --git a/lecture/06_Funktionen/listings/bsp_geometrie_2.py b/lecture/06_Funktionen/listings/bsp_geometrie_2.py new file mode 100644 index 0000000..a51c534 --- /dev/null +++ b/lecture/06_Funktionen/listings/bsp_geometrie_2.py @@ -0,0 +1,9 @@ +def kreis_flaeche(r): + return r * r * math.pi + +# Hauptprogramm +radius: float = 20.5 +print( + "Der Flächeninhalt eines Kreises mit Radius $radius" + + " cm ist {} cm^2".format(kreis_flaeche(radius)) +) diff --git a/lecture/06_Funktionen/listings/bsp_geometrie_schlecht.kts b/lecture/06_Funktionen/listings/bsp_geometrie_schlecht.kts deleted file mode 100644 index 07ec8ad..0000000 --- a/lecture/06_Funktionen/listings/bsp_geometrie_schlecht.kts +++ /dev/null @@ -1,5 +0,0 @@ -val radius = 20.5 -println( - "Der Flächeninhalt eines Kreises mit Radius $radius" + - " cm ist ${radius * radius * Math.PI} cm^2" -) diff --git a/lecture/06_Funktionen/listings/bsp_geometrie_schlecht.py b/lecture/06_Funktionen/listings/bsp_geometrie_schlecht.py new file mode 100644 index 0000000..caeea99 --- /dev/null +++ b/lecture/06_Funktionen/listings/bsp_geometrie_schlecht.py @@ -0,0 +1,5 @@ +radius: float = 20.5 +print( + "Der Flächeninhalt eines Kreises mit Radius $radius" + + " cm ist {} cm^2".format(radius * radius * math.pi) +) diff --git a/lecture/06_Funktionen/listings/bsp_recursion_1.kts b/lecture/06_Funktionen/listings/bsp_recursion_1.py similarity index 51% rename from lecture/06_Funktionen/listings/bsp_recursion_1.kts rename to lecture/06_Funktionen/listings/bsp_recursion_1.py index 5b3390e..083f7d8 100644 --- a/lecture/06_Funktionen/listings/bsp_recursion_1.kts +++ b/lecture/06_Funktionen/listings/bsp_recursion_1.py @@ -1,6 +1,5 @@ -fun fib(x: Int): Int { - if (x <= 1) { +def fib(x): + if (x <= 1): return 1 - } + return fib(x - 1) + fib(x - 2) -} diff --git a/lecture/06_Funktionen/listings/bsp_recursion_2.kts b/lecture/06_Funktionen/listings/bsp_recursion_2.kts deleted file mode 100644 index 00c8ee7..0000000 --- a/lecture/06_Funktionen/listings/bsp_recursion_2.kts +++ /dev/null @@ -1,7 +0,0 @@ -fun fib(x: Int): Int { - if (x <= 1) { // Rekursionsanker - return 1 - } - // Rekursionsaufruf - return fib(x - 1) + fib(x - 2) -} diff --git a/lecture/06_Funktionen/listings/bsp_recursion_2.py b/lecture/06_Funktionen/listings/bsp_recursion_2.py new file mode 100644 index 0000000..1b20ac2 --- /dev/null +++ b/lecture/06_Funktionen/listings/bsp_recursion_2.py @@ -0,0 +1,6 @@ +def fib(x): + if (x <= 1): # Rekursionsanker + return 1 + + # Rekursionsaufruf + return fib(x - 1) + fib(x - 2) diff --git a/lecture/06_Funktionen/listings/fun_example_return_block.kts b/lecture/06_Funktionen/listings/fun_example_return_block.kts deleted file mode 100644 index aaa614a..0000000 --- a/lecture/06_Funktionen/listings/fun_example_return_block.kts +++ /dev/null @@ -1,4 +0,0 @@ -// block body -fun kreisFlaeche(r: Double): Double { - return r * r * Math.PI -} diff --git a/lecture/06_Funktionen/listings/fun_example_return_block.py b/lecture/06_Funktionen/listings/fun_example_return_block.py new file mode 100644 index 0000000..24c7591 --- /dev/null +++ b/lecture/06_Funktionen/listings/fun_example_return_block.py @@ -0,0 +1,3 @@ +# block body +def kreis_flaeche(r): + return r * r * math.pi diff --git a/lecture/06_Funktionen/listings/fun_example_return_expression.kts b/lecture/06_Funktionen/listings/fun_example_return_expression.kts deleted file mode 100644 index 8a6e281..0000000 --- a/lecture/06_Funktionen/listings/fun_example_return_expression.kts +++ /dev/null @@ -1,2 +0,0 @@ -// expression body -fun kreisFlaeche(r: Double): Double = r * r * Math.PI diff --git a/lecture/06_Funktionen/listings/fun_example_return_expression.py b/lecture/06_Funktionen/listings/fun_example_return_expression.py new file mode 100644 index 0000000..63a1860 --- /dev/null +++ b/lecture/06_Funktionen/listings/fun_example_return_expression.py @@ -0,0 +1,3 @@ +# expression body +def kreis_flaeche(r): + return r * r * math.pi diff --git a/lecture/06_Funktionen/listings/fun_syntax.kts b/lecture/06_Funktionen/listings/fun_syntax.kts deleted file mode 100644 index 38693cc..0000000 --- a/lecture/06_Funktionen/listings/fun_syntax.kts +++ /dev/null @@ -1,3 +0,0 @@ -fun name(param1: Typ1, param2: Typ2) { - // code -} diff --git a/lecture/06_Funktionen/listings/fun_syntax.py b/lecture/06_Funktionen/listings/fun_syntax.py new file mode 100644 index 0000000..0bbcb1f --- /dev/null +++ b/lecture/06_Funktionen/listings/fun_syntax.py @@ -0,0 +1,2 @@ +def name(param1, param2): + # code diff --git a/lecture/06_Funktionen/listings/fun_syntax_concrete.kts b/lecture/06_Funktionen/listings/fun_syntax_concrete.kts deleted file mode 100644 index c0fccdc..0000000 --- a/lecture/06_Funktionen/listings/fun_syntax_concrete.kts +++ /dev/null @@ -1,3 +0,0 @@ -fun sagHallo(name: String) { - println("Hallo $name") -} diff --git a/lecture/06_Funktionen/listings/fun_syntax_concrete.py b/lecture/06_Funktionen/listings/fun_syntax_concrete.py new file mode 100644 index 0000000..b0c8336 --- /dev/null +++ b/lecture/06_Funktionen/listings/fun_syntax_concrete.py @@ -0,0 +1,2 @@ +def sag_hallo(name): + print(f"Hallo {name}") diff --git a/lecture/06_Funktionen/listings/fun_syntax_return.kts b/lecture/06_Funktionen/listings/fun_syntax_return.kts deleted file mode 100644 index 672c172..0000000 --- a/lecture/06_Funktionen/listings/fun_syntax_return.kts +++ /dev/null @@ -1,4 +0,0 @@ -fun name(param1: Typ1, param2: Typ2): Rückgabetyp { - // code - return ausdruck -} diff --git a/lecture/06_Funktionen/listings/fun_syntax_return.py b/lecture/06_Funktionen/listings/fun_syntax_return.py new file mode 100644 index 0000000..17126c6 --- /dev/null +++ b/lecture/06_Funktionen/listings/fun_syntax_return.py @@ -0,0 +1,3 @@ +def name(param1, param2): + # code + return ausdruck diff --git a/lecture/06_Funktionen/listings/recursiveSum.kts b/lecture/06_Funktionen/listings/recursiveSum.py similarity index 53% rename from lecture/06_Funktionen/listings/recursiveSum.kts rename to lecture/06_Funktionen/listings/recursiveSum.py index b8af27f..7a99635 100644 --- a/lecture/06_Funktionen/listings/recursiveSum.kts +++ b/lecture/06_Funktionen/listings/recursiveSum.py @@ -1,7 +1,6 @@ -fun sum(wert: Int): Int { - if (wert <= 0) { +def sum(wert): + if (wert <= 0): return 0 - } return wert + sum(wert - 1) -} + print(sum(20)) diff --git a/lecture/06_Funktionen/listings/reusability.kts b/lecture/06_Funktionen/listings/reusability.kts deleted file mode 100644 index d438804..0000000 --- a/lecture/06_Funktionen/listings/reusability.kts +++ /dev/null @@ -1,9 +0,0 @@ -fun kreisFlaeche(r: Double) = r * r * Math.PI - -// Volumen eines Zylinders berechnen -fun zylinderVol(r: Double, h: Double) = kreisFlaeche(r) * h -// Oberfläche einer Kugel berechen -fun kugelOberflaeche(r: Double) = 4 * kreisFlaeche(r) -// Oberfläche einer Halbkugel berechnen -fun hemisphereOberflaeche(r: Double) = - kugelOberflaeche(r) / 2 + kreisFlaeche(r) diff --git a/lecture/06_Funktionen/listings/reusability.py b/lecture/06_Funktionen/listings/reusability.py new file mode 100644 index 0000000..c174bd8 --- /dev/null +++ b/lecture/06_Funktionen/listings/reusability.py @@ -0,0 +1,8 @@ +def kreis_flaeche(r): + return r * r * math.pi +def zylinder_vol(r, h): # Volumen eines Zylinders + return kreis_flaeche(r) * h +def kugel_oberflaeche(r): # Oberfläche einer Kugel + return 4 * kreis_flaeche(r) +def hemisphere_oberflaeche(r): # Oberfläche einer Halbkugel + return kugel_oberflaeche(r) / 2 + kreis_flaeche(r) diff --git a/lecture/06_Funktionen/listings/scope_1.kts b/lecture/06_Funktionen/listings/scope_1.kts deleted file mode 100644 index f7de3f7..0000000 --- a/lecture/06_Funktionen/listings/scope_1.kts +++ /dev/null @@ -1,6 +0,0 @@ -fun erstelleVariable() { - val variable = 5 -} - -erstelleVariable() -println(variable) diff --git a/lecture/06_Funktionen/listings/scope_1.py b/lecture/06_Funktionen/listings/scope_1.py new file mode 100644 index 0000000..ee9aba3 --- /dev/null +++ b/lecture/06_Funktionen/listings/scope_1.py @@ -0,0 +1,5 @@ +def erstelle_variable(): + variable: int = 5 + +erstelle_variable() +print(variable) diff --git a/lecture/06_Funktionen/listings/scope_2.kts b/lecture/06_Funktionen/listings/scope_2.kts deleted file mode 100644 index dd30261..0000000 --- a/lecture/06_Funktionen/listings/scope_2.kts +++ /dev/null @@ -1,7 +0,0 @@ -var zahl = 0 - -fun printZahl() { - print(zahl) -} - -printZahl() diff --git a/lecture/06_Funktionen/listings/scope_2.py b/lecture/06_Funktionen/listings/scope_2.py new file mode 100644 index 0000000..2dd2361 --- /dev/null +++ b/lecture/06_Funktionen/listings/scope_2.py @@ -0,0 +1,6 @@ +zahl: int = 0 + +def print_zahl(): + print(zahl) + +print_zahl() diff --git a/lecture/06_Funktionen/listings/scope_3.kts b/lecture/06_Funktionen/listings/scope_3.kts deleted file mode 100644 index 74581c2..0000000 --- a/lecture/06_Funktionen/listings/scope_3.kts +++ /dev/null @@ -1,8 +0,0 @@ -var zahl = 0 - -fun setZahl() { - val zahl = 5 -} - -setZahl() -println(zahl) // 0 diff --git a/lecture/06_Funktionen/listings/scope_3.py b/lecture/06_Funktionen/listings/scope_3.py new file mode 100644 index 0000000..be0305c --- /dev/null +++ b/lecture/06_Funktionen/listings/scope_3.py @@ -0,0 +1,7 @@ +zahl: int = 0 + +def set_zahl(): + zahl: int = 5 + +set_zahl() +print(zahl) # 0 diff --git a/lecture/06_Funktionen/media/geometrie-dark.png b/lecture/06_Funktionen/media/geometrie-dark.png new file mode 100644 index 0000000..dc962cb Binary files /dev/null and b/lecture/06_Funktionen/media/geometrie-dark.png differ diff --git a/lecture/06_Funktionen/media/proofs-dark.png b/lecture/06_Funktionen/media/proofs-dark.png new file mode 100644 index 0000000..fe9834c Binary files /dev/null and b/lecture/06_Funktionen/media/proofs-dark.png differ diff --git a/lecture/06_Funktionen/media/tabletop_roleplaying-dark.png b/lecture/06_Funktionen/media/tabletop_roleplaying-dark.png new file mode 100644 index 0000000..9146944 Binary files /dev/null and b/lecture/06_Funktionen/media/tabletop_roleplaying-dark.png differ diff --git a/lecture/Makefile b/lecture/Makefile index eefed57..349d03c 100644 --- a/lecture/Makefile +++ b/lecture/Makefile @@ -93,7 +93,7 @@ clean: @echo -e "\e[1;34mCleaning up leftover build files...$<\e[0m" @latexmk -C -f $(call remove_files,**/options.cfg) - $(call remove_files,**/*.pdf,,$(OUT_DIR) media) + $(call remove_files,**/*.pdf,,$(OUT_DIR) media globalMedia) $(call remove_files,**/*.aux) $(call remove_files,**/*.fdb_latexmk) $(call remove_files,**/*.fls) @@ -120,6 +120,8 @@ clean: $(call remove_files,**/*.run.xml) $(call remove_files,**/*.bak[0-9]*) $(call remove_files,**/_minted-*) + $(call remove_files,**/svg-inkscape) + $(call remove_files,**/svg-inkscape-*) @echo -e "\e[1;44mDone cleaning up leftover build files.$<\e[0m" cleanBuild: diff --git a/lecture/default_description.txt b/lecture/default_description.txt index 87751c4..53e83d5 100644 --- a/lecture/default_description.txt +++ b/lecture/default_description.txt @@ -1,9 +1,9 @@ -[PUT VIDEO DESCRIPTION HERE] +Title: Programmiervorkurs -Nächstes Video: [PUT LINK HERE] -Playlist: [PUT LINK HERE] +Desc: +Bei inhaltlichen Fragen: https://d120.de/fragen +Weiteres gerne über das Moodle oder Discord. +Beide Links unter: https://d120.de/vorkurs -Bei inhaltlichen Fragen, meldet euch gerne über das Moodle oder Discord. - -Bei generellen Fragen, Verbesserungsvorschlägen, Feedback und ähnlichem, könnt ihr uns unter Vorkurs@d120.de erreichen. +Bei generellen Fragen, Verbesserungsvorschlägen, Feedback und ähnlichem, könnt ihr uns unter vorkurs@d120.de erreichen. Alle Folien findet ihr auf Github unter https://github.com/d120/vorkurs/ diff --git a/lecture/global.tex b/lecture/global.tex index 59ad57d..6caa897 100644 --- a/lecture/global.tex +++ b/lecture/global.tex @@ -1,7 +1,3 @@ -% <<<<<<< HEAD -% \documentclass[accentcolor=3c,landscape,ngerman,presentation,t,usenames,dvipsnames,svgnames,table,colorframetitle=true]{tudabeamer} -% ======= - \RequirePackage[minted_workaround,caption_workaround,boxarc]{algo-common} %include guard: @@ -12,8 +8,7 @@ \gdef\GlobalAlreadyIncluded{} % -\documentclass[accentcolor=3c,landscape,ngerman,presentation,t,usenames,dvipsnames,svgnames,table, aspectratio=169,colorframetitle=true,design=2008]{tudabeamer} -%>>>>>>> online_rebase +\documentclass[accentcolor=3b,landscape,ngerman,presentation,t,usenames,dvipsnames,svgnames,table, aspectratio=169,colorframetitle=true,design=2008]{tudabeamer} % Template-Modifikationen \addtobeamertemplate{frametitle}{}{\vspace{-1em}} % mehr Platz vor dem Inhalt @@ -62,7 +57,13 @@ %Listing-Style pyhon \title[Programmiervorkurs]{Programmiervorkurs Wintersemester \the\year/\NextYearShort} \subtitle{{\small der Fachschaft Informatik}} -\logo*{\includegraphics{../globalMedia/bildmarke_ohne_rand}} +\logo*{ + \IfDarkModeTF{ + \includegraphics{../globalMedia/logo-dark.pdf} + }{ + \includegraphics{../globalMedia/logo.pdf} + } +} \institute{Fachschaft Informatik} \date{Wintersemester \the\year/\NextYearShort} @@ -70,8 +71,9 @@ % macros \newcommand{\livecoding}{ %\ifdefined\StreamSlides - \begin{frame} - \frametitle{\insertsectionhead \\ {\small \insertsubsectionhead}}\centering \huge \vskip 2cm\textbf{\textcolor{red}{Live-Coding}} + \begin{frame}[c] + \slidehead + \centering\huge\textbf{\textcolor{TUDa-9b}{Live-Coding}} \end{frame} %\fi } @@ -127,3 +129,8 @@ \end{figure} \end{frame} } + +% Center Captions +\captionsetup[figure]{justification=centering} +\captionsetup[subfigure]{justification=centering} +\captionsetup[table]{justification=centering} diff --git a/lecture/globalMedia/.gitignore b/lecture/globalMedia/.gitignore new file mode 100644 index 0000000..13f0a16 --- /dev/null +++ b/lecture/globalMedia/.gitignore @@ -0,0 +1 @@ +!*.pdf diff --git a/lecture/globalMedia/d120-breit-bunt-pfad.pdf b/lecture/globalMedia/d120-breit-bunt-pfad.pdf new file mode 100644 index 0000000..36e52be Binary files /dev/null and b/lecture/globalMedia/d120-breit-bunt-pfad.pdf differ diff --git a/lecture/globalMedia/d120-breit-bunt-pfad.svg b/lecture/globalMedia/d120-breit-bunt-pfad.svg new file mode 100644 index 0000000..e0cdb5d --- /dev/null +++ b/lecture/globalMedia/d120-breit-bunt-pfad.svg @@ -0,0 +1,176 @@ + + + + diff --git a/lecture/globalMedia/d120-breit-transparent-dunkel-pfad.pdf b/lecture/globalMedia/d120-breit-transparent-dunkel-pfad.pdf new file mode 100644 index 0000000..ba0eccb Binary files /dev/null and b/lecture/globalMedia/d120-breit-transparent-dunkel-pfad.pdf differ diff --git a/lecture/globalMedia/d120-breit-transparent-dunkel-pfad.svg b/lecture/globalMedia/d120-breit-transparent-dunkel-pfad.svg new file mode 100644 index 0000000..0f07b1e --- /dev/null +++ b/lecture/globalMedia/d120-breit-transparent-dunkel-pfad.svg @@ -0,0 +1,171 @@ + + + + diff --git a/lecture/globalMedia/d120-breit-transparent-hell-pfad.pdf b/lecture/globalMedia/d120-breit-transparent-hell-pfad.pdf new file mode 100644 index 0000000..41f0989 Binary files /dev/null and b/lecture/globalMedia/d120-breit-transparent-hell-pfad.pdf differ diff --git a/lecture/globalMedia/d120-breit-transparent-hell-pfad.svg b/lecture/globalMedia/d120-breit-transparent-hell-pfad.svg new file mode 100644 index 0000000..d0dc897 --- /dev/null +++ b/lecture/globalMedia/d120-breit-transparent-hell-pfad.svg @@ -0,0 +1,176 @@ + + + + diff --git a/lecture/globalMedia/logo-bunt.pdf b/lecture/globalMedia/logo-bunt.pdf new file mode 100644 index 0000000..f1374a8 Binary files /dev/null and b/lecture/globalMedia/logo-bunt.pdf differ diff --git a/lecture/globalMedia/logo-bunt.svg b/lecture/globalMedia/logo-bunt.svg new file mode 100644 index 0000000..0165268 --- /dev/null +++ b/lecture/globalMedia/logo-bunt.svg @@ -0,0 +1,113 @@ + + + + diff --git a/lecture/globalMedia/logo-dark.pdf b/lecture/globalMedia/logo-dark.pdf new file mode 100644 index 0000000..f0f984a Binary files /dev/null and b/lecture/globalMedia/logo-dark.pdf differ diff --git a/lecture/globalMedia/logo-dark.svg b/lecture/globalMedia/logo-dark.svg new file mode 100644 index 0000000..664f977 --- /dev/null +++ b/lecture/globalMedia/logo-dark.svg @@ -0,0 +1,140 @@ + + + + diff --git a/lecture/globalMedia/logo.pdf b/lecture/globalMedia/logo.pdf new file mode 100644 index 0000000..759fe77 Binary files /dev/null and b/lecture/globalMedia/logo.pdf differ diff --git a/lecture/globalMedia/logo.svg b/lecture/globalMedia/logo.svg new file mode 100644 index 0000000..2985a0c --- /dev/null +++ b/lecture/globalMedia/logo.svg @@ -0,0 +1,145 @@ + + + + diff --git a/lecture/thumbnail.png b/lecture/thumbnail.png new file mode 100644 index 0000000..2374708 Binary files /dev/null and b/lecture/thumbnail.png differ diff --git a/misc/linux_commands/Makefile b/misc/guides/Makefile similarity index 100% rename from misc/linux_commands/Makefile rename to misc/guides/Makefile diff --git a/misc/guides/PythonInstallieren.tex b/misc/guides/PythonInstallieren.tex new file mode 100644 index 0000000..cbe6421 --- /dev/null +++ b/misc/guides/PythonInstallieren.tex @@ -0,0 +1,139 @@ +% !TeX document-id = {505cbeed-ac21-4fdd-a7f4-eefb28b91c1e} +% !TeX TXS-program:compile = txs:///pdflatex/[--shell-escape] +% !TeX root = PythonInstallieren.tex +% \documentclass[accentcolor=3c,colorbacktitle,12pt]{tudaexercise} +\RequirePackage{import} +\subimport{../../exercises}{preamble.tex} +\usepackage{hyperref} +\title{Installation von Python} +\subsubtitle{vorkurs@d120.de} + +\begin{document} +\maketitle + +Bitte schaue vorher, dass dein System auf dem aktuellen Stand ist. + +In dieser Installationsanleitung installieren wir: +\begin{itemize} + \item \href{https://www.python.org/}{Python Version 3.X.X} + \item \href{https://ipython.org/}{ipython (\underline{I}nteractive \underline{P}ython)} +\end{itemize} + +\section*{Windows} +\begin{hinweis} + Die \verb+$+ Zeichen in den Befehlen sind Platzhalter für den Terminal-Prompt. Sie dürfen \textbf{nicht} mitkopiert werden. +\end{hinweis} +\subsection*{Automatische Installation durch scoop} + +\subsubsection*{Terminal öffnen (Powershell)} +Siehe Terminal Guide. + +Darauf achten, dass \textbf{nicht} als Admin + +\subsubsection*{Scoop installieren} +Anhand der Anleitung auf \url{https://scoop.sh/} folgendes ins Terminal eingeben. +%\begin{noindent} +\begin{commandshell} +@\shellprefix{}@Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser +\end{commandshell} +Das muss mit \verb#A + Enter# bestätigt werden. + +Dann das hier eingeben und Enter drücken: +\begin{commandshell} +@\shellprefix{}@irm get.scoop.sh | iex +\end{commandshell} + +\subsubsection*{Python installieren} +\begin{commandshell} + @\shellprefix{}@scoop install python +\end{commandshell} +\section*{ipython installieren} +\begin{commandshell} +@\shellprefix{}@python -m pip install ipython +\end{commandshell} +Nun kannst du die Installation überprüfen (siehe Abschnitt \nameref{sec:check}). + +\newpage +\section*{Mac OS} + +\subsection*{Homebrew Installieren} +\begin{hinweis} + Die \verb+$+ Zeichen in den Befehlen sind Platzhalter für den Terminal-Prompt. Sie dürfen \textbf{nicht} mitkopiert werden. +\end{hinweis} +\begin{itemize} + \item Auf der seite \url{https://brew.sh} den Befehl kopieren + \item Im terminal diesen Befehl einfügen + \item Installations-Anweisungen folgen (passwort eingeben), die Installation dauert ca. 2 Minuten + \item Sobald der homebrew install Befehl fertig ist, diese Befehle ausführen + %\begin{noindent} + \begin{commandshell} +@\shellprefix{}@(echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') @\texttt{>>}@ ~/.profile + \end{commandshell} + \begin{commandshell} +@\shellprefix{}@eval "$(/opt/homebrew/bin/brew shellenv)" + \end{commandshell} + %\end{noindent} +\end{itemize} + +\subsection*{Automatische Installation durch Homebrew} +\begin{itemize} + \item Gebe in der Kommandozeile den folgenden Befehl ein und drücke Enter\footnote{Befehle generiert mit \url{https://formulae.brew.sh/formula/ipython}}: + %\begin{noindent} +\begin{commandshell} +@\shellprefix{}@brew install ipython +\end{commandshell} + %\end{noindent} + Python wird automatisch mit installiert + \item Warte, bis die Installation abgeschlossen ist + \item Überprüfe die Installation (siehe Abschnitt \nameref{sec:check}) +\end{itemize} + +Anmerkung: bei einer Installation über Brew bei Mac OS der python-Befehl \texttt{python3} und nicht \texttt{python}. Der \texttt{ipython}-Befehl bleibt gleich. + +\newpage +\section*{Linux} +Auf dem meisten Distros heißt das zu installierende Paket einfach {\ttfamily python}. +\begin{hinweis} + Die \verb+$+ Zeichen in den Befehlen sind Platzhalter für den Terminal-Prompt. Sie dürfen \textbf{nicht} mitkopiert werden. +\end{hinweis} +\begin{commandshell}[][minted language=text] + @\shellprefix{}@pacman -S python @\PYG{c+c1}{# Arch Linux}@ +\end{commandshell} + +\begin{commandshell}[][minted language=text] + @\shellprefix{}@apt install python @\PYG{c+c1}{# Debian, Ubuntu, Mint, ...}@ +\end{commandshell} + +\subsection*{ipython} +Jeweils mit pip installieren: +\begin{commandshell}[][minted language=text] + @\shellprefix{}@python -m pip install ipython +\end{commandshell} + +\section*{Überprüfung der Installation}\label{sec:check} +Um zu testen ob alles geklappt hat, öffne eine Kommandozeile und gebe den folgenden Befehl ein: +\begin{commandshell} + @\shellprefix{}@python --version +\end{commandshell} + +Wenn alles geklappt hat, sollte die Ausgabe in etwa so aussehen (die Versionsnummern können abweichen): +\begin{commandshell}[][] + @\shellprefix{}@ python --version + Python 3.12.6 +\end{commandshell} + +Ob \texttt{ipython} funktioniert, kannst du mit dem folgenden Befehl testen: +\begin{commandshell} + @\shellprefix{}@ipython +\end{commandshell} +Wenn alles geklappt hat, sollte die Ausgabe in etwa so aussehen (die Versionsnummern können abweichen): +\begin{commandshell}[][minted language=text] + @\shellprefix@ipython + Python 3.12.6 (main, Sep 8 2024, 13:18:56) [GCC 14.2.1 20240805] + Type 'copyright', 'credits' or 'license' for more information + IPython 8.27.0 -- An enhanced Interactive Python. Type '?' for help. + + In [1]: @\shellcursor@ +\end{commandshell} + +\end{document} diff --git a/misc/linux_commands/TerminalGuide.tex b/misc/guides/TerminalGuide.tex similarity index 77% rename from misc/linux_commands/TerminalGuide.tex rename to misc/guides/TerminalGuide.tex index a89d013..842764d 100644 --- a/misc/linux_commands/TerminalGuide.tex +++ b/misc/guides/TerminalGuide.tex @@ -146,61 +146,82 @@ \subsection{nano und gedit} Mit Strg+O kann man die Datei speichern, man wird nach dem Pfad zum Speichern gefragt und kann diesen mit Enter bestätigen.\\ Mit Strg+X verlässt man den Editor. -\subsection{Kotlin} +\subsection{Python} \begin{defBox} \fatsf{Hinweis:} siehe Installationsanleitung \end{defBox} -\paragraph*{Compiler}\mbox{} +\paragraph*{Programme}\mbox{} -Mit \textit{kotlin} kann man kts-Skripte ausführen. +Mit \textit{python} kann man Python-Programme ausführen. \begin{defBox} \fatsf{Achtung:} Die Dateiendung ist hierbei entscheidend. \end{defBox} \begin{commandshell} - @\shellprefix@kotlin @\textit{\PYG{l+s}{}}@ + @\shellprefix@python @\textit{\PYG{l+s}{}}@ \end{commandshell} -\clearpage -\paragraph*{REPL}\mbox{} +\begin{commandshell} + @\shellprefix@python load.py + Hello world +\end{commandshell} -Die REPL (\enquote{\underline{R}ead-\underline{E}val-\underline{P}rint-\underline{L}oop}) \mintinline{text}{ki} (\enquote{\underline{K}otlin-\underline{I}nteractive-Shell}) kann mit dem Befehl \mintinline{text}{ki} gestartet werden. Alternativ kann auch \mintinline{text}{kotlin} ausgeführt werden, um in die standard-REPL zu gelangen. Diese ist aber nicht so komfortabel wie \mintinline{text}{ki} und wird daher nicht empfohlen. +\paragraph*{Python-Konsole}\mbox{} + +Die Konsole oder REPL (\enquote{\underline{R}ead-\underline{E}val-\underline{P}rint-\underline{L}oop}) \mintinline{text}{ipython} (\enquote{\underline{I}nteractive-\underline{P}Python}) kann mit dem Befehl \mintinline{text}{ipython} gestartet werden. Alternativ kann auch \mintinline{text}{python} ausgeführt werden, um in die Standard-REPL zu gelangen. +Diese ist aber nicht so komfortabel wie \mintinline{text}{ipython} +und wird daher nicht empfohlen. \begin{commandshell}[][minted language=text] - @\shellprefix@kotlin - Welcome to Kotlin version 1.9.10 (JRE 11.0.20.1+1) - Type :help for help, :quit for quit - @\texttt{>>>}@ @\shellcursor@ + @\shellprefix@ python + Python 3.12.6 (main, Sep 8 2024, 13:18:56) [GCC 14.2.1 20240805] on linux + Type "help", "copyright", "credits" or "license" for more information. + >>> @\shellcursor@ \end{commandshell} \begin{commandshell}[][minted language=text] - @\shellprefix@ki - ki-shell 0.5.2/1.7.0 - type :h for help - [0] @\shellcursor@ + @\shellprefix@ipython + Python 3.12.6 (main, Sep 8 2024, 13:18:56) [GCC 14.2.1 20240805] + Type 'copyright', 'credits' or 'license' for more information + IPython 8.27.0 -- An enhanced Interactive Python. Type '?' for help. + + In [1]: @\shellcursor@ \end{commandshell} -In einer Repl kannst du einfach Kotlin-Code eingeben und er wird sofort ausgeführt. Z.B.: +In einer REPL kannst du einfach Python-Code eingeben +und er wird sofort ausgeführt. Z.B.: \begin{commandshell}[][minted language=text] - @\shellprefix@ki - ki-shell 0.5.2/1.7.0 - type :h for help - [0] 2 * 3.1415 - res0: Double = 6.283 - [1] @\shellcursor@ + @\shellprefix@ipython + Python 3.12.6 (main, Sep 8 2024, 13:18:56) [GCC 14.2.1 20240805] + Type 'copyright', 'credits' or 'license' for more information + IPython 8.27.0 -- An enhanced Interactive Python. Type '?' for help. + + In [1]: 3 * 3.1415 + Out[1]: 9.4245 + + In [2]: @\shellcursor@ \end{commandshell} -Alles weitere ist für die \mintinline{text}{ki}-REPL ausgelegt. +Alles weitere ist für die \mintinline{text}{ipython}-REPL ausgelegt. -Mit \textit{:load} kann man kts-Skripte auch direkt in eine Repl laden. Wenn wir z.B. eine Datei \mintinline{text}{helloWorld.kts} haben, können wir diese mit \textit{:load} laden: -\begin{codeBlock}[]{minted language=kotlin,title=\codeBlockTitle{helloWorld.kts}} - println("Hello World!") +Mit \textit{\%load} kann man Python-Programme auch direkt in eine REPL laden. Wenn wir z.B. eine Datei \mintinline{text}{load.py} haben, können wir diese mit \textit{\%load} laden: +\begin{codeBlock}[]{minted language=kotlin,title=\codeBlockTitle{load.py}} + print('Hello') + a = 2+ 4 \end{codeBlock} \begin{commandshell}[][minted language=text] - @\shellprefix@ki - ki-shell 0.5.2/1.7.0 - type :h for help - [0] :load helloWorld.kts - Hello World! - [1] @\shellcursor@ + @\shellprefix@ipython + Python 3.12.6 (main, Sep 8 2024, 13:18:56) [GCC 14.2.1 20240805] + Type 'copyright', 'credits' or 'license' for more information + IPython 8.27.0 -- An enhanced Interactive Python. Type '?' for help. + + In [1]: %load load.py + + In [2]: # %load load.py + ...: print('Hello') + ...: a = 2+ 4 + ...: + Hello + + In [3]: @\shellcursor@ \end{commandshell} \end{document} diff --git a/misc/linux_commands/KotlinInstallieren.tex b/misc/linux_commands/KotlinInstallieren.tex deleted file mode 100644 index 86b7480..0000000 --- a/misc/linux_commands/KotlinInstallieren.tex +++ /dev/null @@ -1,230 +0,0 @@ -% !TeX document-id = {505cbeed-ac21-4fdd-a7f4-eefb28b91c1e} -% !TeX TXS-program:compile = txs:///pdflatex/[--shell-escape] -% \documentclass[accentcolor=3c,colorbacktitle,12pt]{tudaexercise} -\RequirePackage{import} -\subimport{../../exercises}{preamble.tex} -\usepackage{hyperref} -\title{Installation von Kotlin} -\subsubtitle{vorkurs@d120.de} - -\begin{document} -\maketitle - -Bitte schaue vorher, dass dein System auf dem aktuellen Stand ist. - -In dieser Installationsanleitung installieren wir: -\begin{itemize} - \item Kotlin version 1.9 - \item Java JDK 11+ (wird für Kotlin benötigt) - \item \href{https://github.com/Kotlin/kotlin-interactive-shell}{ki (\underline{K}otlin \underline{I}nteractive-Shell)} -\end{itemize} -\section*{Windows} -\subsection*{Automatische Installation durch scoop} -\subsubsection*{Terminal öffnen (Powershell)} -Siehe Terminal Guide -\subsubsection*{Scoop installieren} -Anhand der Anleitung auf \url{https://scoop.sh/} folgendes ins Terminal eingeben und nach jeder Zeile Enter drücken: -%\begin{noindent} -\begin{commandshell} -@\shellprefix{}@Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser -@\shellprefix{}@irm get.scoop.sh | iex -@\shellprefix{}@scoop install git -\end{commandshell} -%\end{noindent} -\subsubsection*{Java installieren} -Als Erstes kannst du mit folgendem Befehl überprüfen, ob du Java installiert hast: -\begin{commandshell} - @\shellprefix{}@javac -version -\end{commandshell} -Wenn mindestens Version 11 angezeigt wird, hast du eine ausreichend aktuelle Version. Wir empfehlen aber in allen Fällen die neuste Version mit den folgenden Befehlen zu installieren: -%\begin{noindent} -\begin{commandshell} -@\shellprefix{}@scoop bucket add java -@\shellprefix{}@scoop install java/openjdk -\end{commandshell} -%\end{noindent} -\subsubsection*{Kotlin installieren} -\begin{commandshell} - @\shellprefix{}@scoop install main/kotlin -\end{commandshell} -\subsubsection*{Kotlin Interactive Shell installieren} -%\begin{noindent} -\begin{commandshell} -@\shellprefix{}@scoop bucket add extras -@\shellprefix{}@scoop install extras/kotlin-interactive-shell -\end{commandshell} -%\end{noindent} -Nun kannst du die Installation überprüfen (siehe Abschnitt \nameref{sec:check}). -% \subsection*{Kommandozeile öffnen (Powershell)} -% Siehe Terminal guide -% \subsection*{Automatische Installation durch Winget} -% \begin{hinweis} -% Winget gibt es erst ab Windows 10 2004. Wenn du eine ältere Version hast, musst du die manuelle Installation verwenden. -% \end{hinweis} -% \begin{itemize} -% \item Als erstes musst du die JDK installieren. Ob du bereits eine JDK installiert hast, kannst du mit dem folgenden Befehl feststellen: -% \begin{commandshell} -% @\shellprefix{}@java -version -% \end{commandshell} -% Wenn die Rückgabe sowas wie \verb+java version "17.0.1"+ ist, hast du bereits eine JDK installiert. In diesem Fall kannst du die JDK-Installation überspringen. Für die aktuelle Kotlin Version wird mindestens JDK-Version 17 benötigt. -% \item Gebe in der Powershell den folgenden Befehl ein und drücke Enter\footnote{Befehl generiert mit \url{https://winstall.app/apps/JetBrains.Kotlin.Compiler}}: -% \begin{commandshell} -% @\shellprefix{}@winget install --id=EclipseAdoptium.Temurin.17.JDK -e -% \end{commandshell} -% \item Wenn verlangt wird, dass du die Nutzungsbedingungen akzeptierst, drücke \texttt{y} und Enter -% \item Warte, bis die Installation abgeschlossen ist -% \item Als nächstes installieren wir den Kotlin Compiler. Gebe dazu den folgenden Befehl ein und drücke Enter\footnote{Befehl generiert mit \url{https://winstall.app/apps/JetBrains.Kotlin.Compiler}}: -% \begin{commandshell} -% @\shellprefix{}@winget install --id=JetBrains.Kotlin.Compiler -e -% \end{commandshell} -% \item Damit die neuen Befehle erkannnt werden, musst du die Kommandozeile neu starten, also einmal schließen und wieder öffnen. -% \item Überprüfe die Installation (siehe Abschnitt \nameref{sec:check}) -% \end{itemize} -% \subsection*{Automatische Installation durch Chocolatey} -% \subsubsection*{Chocolatey installieren} -% \begin{itemize} -% \item Falls chocolatey schon installiert ist, kannst du diesen Schritt überspringen -% \item Gebe in der Powershell den folgenden Befehl ein und drücke Enter\footnote{Befehl generiert mit \url{https://chocolatey.org/install}} (da der Befehl sich nicht gut kopieren lässt am Besten aus dem Link der Fußnote kopieren): -% \begin{commandshell} -% @\shellprefix{}@Set-ExecutionPolicy Bypass -Scope Process -Force; -% [System.Net.ServicePointManager]::SecurityProtocol = -% [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; -% iex ((New-Object System.Net.WebClient) -% .DownloadString('https://community.chocolatey.org/install.ps1')) -% \end{commandshell} -% \item Warte, bis die Installation abgeschlossen ist -% \end{itemize} -% \begin{hinweis} -% Ab Windows 10 kann chocolatey auch über winget per \texttt{winget install chocolatey} installiert werden. -% \end{hinweis} -% \clearpage -% \subsubsection*{JVM und Kotlin Compiler durch Chocolatey installieren} -% \begin{itemize} -% \item Gebe in der Powershell den folgenden Befehl ein und drücke Enter\footnote{siehe auch \url{https://community.chocolatey.org/packages/kotlinc} und \url{https://community.chocolatey.org/packages/Temurin17/}}: -% \begin{commandshell} -% @\shellprefix{}@choco install temurin17 kotlinc -y -% \end{commandshell} -% \item Warte, bis die Installation abgeschlossen ist -% \item Damit die neuen Befehle erkannnt werden, musst du die Kommandozeile neu starten, also einmal schließen und wieder öffnen. -% \item Überprüfe die Installation (siehe Abschnitt \nameref{sec:check}) -% \end{itemize} -% \subsubsection{ki} -% Aktuell gibt es leider keinen \enquote{schönen} Weg, \texttt{ki} über einen Paketmanager zu installieren. Stattdessen kannst du \texttt{ki} lokal installieren. Dazu musst du folgende Schritte ausführen: -% \begin{itemize} -% \item Lade KI von hier herunter \url{https://github.com/Kotlin/kotlin-interactive-shell/releases/tag/v0.5.2} -% \item Entpacke die Datei in einen Ordner deiner Wahl. -% \item Gehe nun in den bin-Ordner der entpackten Datei und öffne dort ein Terminal. (Siehe Terminal-Anleitung) -% \item Es kann sein, dass du statt dem Befehl \texttt{ki} den Befehl \mintinline{text}{.\ki.bat} ausführen musst. -% \item Überprüfe die Installation (siehe Abschnitt \nameref{sec:check}) -% \end{itemize} -% \begin{hinweis} -% Diese Installation funktioniert nur, solange sich deine Kommandozeile im bin-Ordner befindet. Wenn du die Kommandozeile schließt, musst du beim nächsten Öffnen erneut in den bin-Ordner wechseln. -% \end{hinweis} -% \subsubsection*{ki durch Chocolatey installieren} -% \begin{itemize} -% \item Gebe in der Powershell den folgenden Befehl ein und drücke Enter\footnote{siehe auch \url{https://community.chocolatey.org/packages/ki}}: -% \begin{commandshell} -% @\shellprefix{}@choco install ki -y -% \end{commandshell} -% \item Selbes Spiel wie oben -% \end{itemize} - - -% \subsection*{Manuell (nicht empfohlen!!!, nur wenn Winget und Chocolatey nicht funktionieren)} -% \subsubsection*{Download} -% \begin{itemize} -% \item JDK 17 oder höher wird vorausgesetzt -% \item Gehe auf die Seite \url{https://github.com/JetBrains/kotlin/releases} und lade die neuste Version herunter (die neuste Version ist die oberste in der Liste). Die Datei sollte den Namen \texttt{kotlin-compiler-.zip} haben. -% \item Entpacke die Datei in einen Ordner deiner Wahl. -% \item Gehe nun in den bin-Ordner der entpackten Datei und öffne dort ein Terminal. (Shift + Rechtsklick $\rightarrow$ \enquote{Eingabeaufforderung hier öffnen} oder \enquote{PowerShell-Fenster hier öffnen}). -% \item Überprüfe die Installation (siehe Abschnitt \nameref{sec:check}) -% \end{itemize} -% \begin{hinweis} -% Diese Installation funktioniert nur, solange sich deine Kommandozeile im bin-Ordner befindet. Wenn du die Kommandozeile schließt, musst du sie erneut öffnen und in den bin-Ordner wechseln. -% \end{hinweis} -\section*{Mac OS} -% Kaufe jetzt das Kotlin Starter Kit für nur 99,99€ im App Store und erhalte eine kostenlose Kotlin-Tasse im Wert von 9,99€ dazu! Nur solange der Vorrat reicht! (Nein, Spaß, aber wir haben leider keine Macs zum Testen.) - -\subsection*{Homebrew Installieren} -\begin{itemize} - \item Auf der seite \url{https://brew.sh} den Befehl kopieren - \item Im terminal diesen Befehl einfügen - \item Installations-Anweisungen folgen (passwort eingeben), die Installation dauert ca. 2 Minuten - \item Sobald der homebrew install Befehl fertig ist, diese Befehle ausführen - %\begin{noindent} - \begin{commandshell} -@\shellprefix{}@(echo; echo 'eval "$(/usr/local/bin/brew shellenv)"') @\texttt{>>}@ ~/.profile -@\shellprefix{}@eval "$(/usr/local/bin/brew shellenv)" - \end{commandshell} - %\end{noindent} -\end{itemize} - -\subsection*{Automatische Installation durch Homebrew} -\begin{itemize} - \item Gebe in der Kommandozeile den folgenden Befehl ein und drücke Enter\footnote{Befehle generiert mit \url{https://formulae.brew.sh/formula/kotlin} und \url{https://formulae.brew.sh/formula/ki}}: - %\begin{noindent} -\begin{commandshell} -@\shellprefix{}@brew install kotlin -@\shellprefix{}@brew install ki -\end{commandshell} - %\end{noindent} - \item Warte, bis die Installation abgeschlossen ist - \item Überprüfe die Installation (siehe Abschnitt \nameref{sec:check}) -\end{itemize} - -\section*{Linux} -\subsection*{JVM und Kotlin} -Auf dem meisten Distros heißt das zu installierende Paket einfach {\ttfamily kotlin} und hat automatisch die korrekte java-Version als Abhängigkeit. -\begin{commandshell}[][minted language=text] - @\shellprefix{}@pacman -S kotlin @\PYG{c+c1}{# Arch Linux}@ -\end{commandshell} - -\begin{commandshell}[][minted language=text] - @\shellprefix{}@apt install kotlin @\PYG{c+c1}{# Debian, Ubuntu, Mint, ...}@ -\end{commandshell} - -\subsection*{ki} -Für Arch-Linux gibt es ein AUR-Paket: \url{https://aur.archlinux.org/packages/ki/} -Für alle anderen haben wir \href{https://raw.githubusercontent.com/d120/vorkurs/91e562678d871e52162ac98ee7175842ba628a96/misc/scripts/install-ki-locally.sh}{ein script} bereitgestellt: -\begin{commandshell} - wget -O - https://raw.githubusercontent.com\ - /d120/vorkurs/91e562678d871e52162ac98ee7175842ba628a96\ - /misc/scripts/install-ki-locally.sh | bash -\end{commandshell} - -\section*{Überprüfung der Installation}\label{sec:check} -Um zu testen ob alles geklappt hat, öffne eine Kommandozeile und gebe den folgenden Befehl ein: -\begin{commandshell} - @\shellprefix{}@kotlin -version -\end{commandshell} - -Wenn alles geklappt hat, sollte die Ausgabe in etwa so aussehen (die Versionsnummern können abweichen): -\begin{commandshell}[][] - @\shellprefix{}@kotlin -version - Kotlin version 1.9.10-release-459 (JRE 17.0.8.1+1) -\end{commandshell} - -Ob \texttt{ki} funktioniert, kannst du mit dem folgenden Befehl testen: -\begin{commandshell} - @\shellprefix{}@ki -\end{commandshell} -Wenn alles geklappt hat, sollte die Ausgabe in etwa so aussehen (die Versionsnummern können abweichen): -\begin{commandshell}[][minted language=text] - @\shellprefix@ki - ki-shell 0.5.2/1.7.0 - type :h for help - [0] @\shellcursor@ -\end{commandshell} -Falls folgende Ausgabe kommt, ist nicht mindestens Java 11 installiert und muss anhand der Anleitung oben nachgeholt werden: -\nopagebreak -\begin{commandshell}[][minted language=text] - Error: LinkageError occurred while loading main class org.jetbrains.kotlinx.ki.shell.KotlinShell - java.lang.UnsupportedClassVersionError: org/jetbrains/kotlinx/ki/shell/KotlinShell has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 54.0 -\end{commandshell} -Falls folgende Ausgabe kommt, ist Java gar nicht installiert und muss anhand der Anleitung oben nachgeholt werden: -\nopagebreak -\begin{commandshell}[][minted language=text] - The syntax of the command is incorrect. -\end{commandshell} - -\end{document} diff --git a/shared/globalCommon.tex b/shared/globalCommon.tex index 119793f..98ee807 100644 --- a/shared/globalCommon.tex +++ b/shared/globalCommon.tex @@ -4,6 +4,7 @@ \usepackage{float} \usepackage{graphicx} \usepackage{minted} +\usepackage{forest} \RequirePackage{csquotes} \RequirePackage{fontawesome5} @@ -125,11 +126,13 @@ } } -\let\origpythonfile\pythonfile -\renewcommand{\pythonfile}[1]{\pythonfileh{#1}{}} -\newcommand{\pythonfileh}[2]{\origpythonfile[#2]{#1}} +% \let\origpythonfile\pythonfile +% \renewcommand{\pythonfile}[1]{\pythonfileh{#1}{}} +% \newcommand{\pythonfileh}[2]{\origpythonfile[#2]{#1}} \DeclareDocumentCommand{\kotlinfile}{O{} O{} m}{\inputCode[#1]{minted language=kotlin,minted style/.expanded=\IfDarkModeTF{native}{friendly},#2}{#3}} +\DeclareDocumentCommand{\pythonfile}{O{} O{} m}{\inputCode[#1]{minted language=python,minted style/.expanded=\IfDarkModeTF{native}{friendly},#2}{#3}} +\DeclareDocumentCommand{\plainfile}{O{} O{} m}{\inputCode[#1]{minted language=text,minted style/.expanded=\IfDarkModeTF{native}{friendly},#2}{#3}} \newcommand*{\ditto}{\texttt{\char`\"}} @@ -156,8 +159,8 @@ #1 }, #2, - % before upper={\textcolor{red}{\small\ttfamily\bfseries root \$> }}, - % every listing line={\textcolor{red}{\small\ttfamily\bfseries root \$> }} + % before upper={\textcolor{TUDa-9b}{\small\ttfamily\bfseries root \$> }}, + % every listing line={\textcolor{TUDa-9b}{\small\ttfamily\bfseries root \$> }} } \ExplSyntaxOn