• Forside
  • Blogg
  • Apper på Apple Appstore
  • App Bug tracer
  • Tjenestetilbud
  • Kontakt meg
  • Login

🐍 Kodeboken - Python Programmering

Introduksjon til Kodeboken

Velkommen til denne kodeboken! Denne boken er laget for å gi en strukturert og lettfattelig oversikt over Python-koden i dette prosjektet. Målet er å hjelpe både nybegynnere og erfarne utviklere med å forstå, bruke og videreutvikle koden.

Vanskelighetsgrad

Hvert prosjekt i denne boken har fått en vurdering av vanskelighetsgrad på en skala fra 1 til 6, der 1 er enklest og 6 er mest utfordrende:

  • 1: Grunnleggende konsepter, egnet for nybegynnere
  • 2-3: Litt mer avanserte konsepter, men fortsatt overkommelige
  • 4-5: Krever en god forståelse av programmering og algoritmer
  • 6: Avanserte konsepter og komplekse implementasjoner

Hva finner du i denne boken?

  • Kodeeksempler: Forklaringer og eksempler på hvordan koden fungerer
  • Konsepter: Introduksjon til viktige programmeringskonsepter brukt i prosjektet
  • Tips og triks: Beste praksis og nyttige tips for å skrive og forstå Python-kode

Hvem er denne boken for?

Denne boken er for alle som ønsker å lære mer om Python-programmering, enten du er nybegynner eller ønsker å dykke dypere inn i koden i dette prosjektet.


1. tilfeldigheter.py

Vanskelighetsgrad: 1
📝 Beskrivelse

Dette programmet demonstrerer bruk av tilfeldigheter i Python ved hjelp av random-modulen. Det simulerer:

  • Et kast med en terning (1-6)
  • Trekking av et tilfeldig kort fra en kortstokk
🎯 Læringsmål
  • Bruk av random.randint for å generere tilfeldige tall
  • Bruk av random.choice for å velge et tilfeldig element fra en liste
💻 Kode
import random

def kast_terning():
    """Simulerer et kast med en terning (1-6)."""
    return random.randint(1, 6)

def trekk_kort():
    """Simulerer trekking av et tilfeldig kort fra en kortstokk."""
    farger = ['Hjerter', 'Ruter', 'Kløver', 'Spar']
    verdier = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'Knekt', 'Dame', 'Konge', 'Ess']
    farge = random.choice(farger)
    verdi = random.choice(verdier)
    return f"{verdi} av {farge}"

# Eksempel på bruk
if __name__ == "__main__":
    print("Kaster terning...")
    print(f"Du fikk: {kast_terning()}")
    
    print("\nTrekker et kort...")
    print(f"Du trakk: {trekk_kort()}")

2. terningkaster_tkinter.py

Vanskelighetsgrad: 2
📝 Beskrivelse

En enkel GUI-applikasjon som simulerer et terningkast ved hjelp av tkinter. Resultatet vises i en popup-melding.

🎯 Læringsmål
  • Introduksjon til GUI-programmering med tkinter
  • Bruk av knapper og meldingsbokser
💻 Kode
import random
import tkinter as tk
from tkinter import messagebox

def roll_dice():
    result = random.randint(1, 6)
    messagebox.showinfo("Terningkast", f"Du rullet: {result}")

# Opprett hovedvinduet
root = tk.Tk()
root.title("Terning-Simulator")

# Lag en knapp for å rulle terningen
roll_button = tk.Button(root, text="Rull terningen", command=roll_dice)
roll_button.pack(pady=20)

# Lag en knapp for å avslutte programmet
exit_button = tk.Button(root, text="Avslutt", command=root.quit)
exit_button.pack(pady=10)

# Start hovedløkken
root.mainloop()

3. sende_hemmelig_meldinger.py

Vanskelighetsgrad: 3
📝 Beskrivelse

Dette programmet implementerer Caesar Cipher, en enkel krypteringsalgoritme for å kode og dekode meldinger.

🎯 Læringsmål
  • Forstå grunnleggende kryptering og dekryptering
  • Bruk av løkker og strengmanipulasjon
💻 Kode
def caesar_cipher_encode(message, shift):
    """Koder en melding ved å bruke Caesar Cipher."""
    encoded_message = ""
    for char in message:
        if char.isalpha():
            shift_base = ord('A') if char.isupper() else ord('a')
            encoded_message += chr((ord(char) - shift_base + shift) % 26 + shift_base)
        else:
            encoded_message += char
    return encoded_message

def caesar_cipher_decode(encoded_message, shift):
    """Dekoder en melding som er kodet med Caesar Cipher."""
    return caesar_cipher_encode(encoded_message, -shift)

# Eksempelbruk
if __name__ == "__main__":
    print("Velkommen til Caesar Cipher!")
    valg = input("Vil du (K)ode eller (D)ekode en melding? ").strip().upper()

    if valg in ['K', 'D']:
        melding = input("Skriv inn meldingen: ")
        forskyvning = int(input("Skriv inn forskyvningen (et tall): "))

        if valg == 'K':
            kodet_melding = caesar_cipher_encode(melding, forskyvning)
            print(f"Kodet melding: {kodet_melding}")
        elif valg == 'D':
            dekodet_melding = caesar_cipher_decode(melding, forskyvning)
            print(f"Dekodet melding: {dekodet_melding}")
    else:
        print("Ugyldig valg. Vennligst prøv igjen.")

4. rotere_en_tabell.py

Vanskelighetsgrad: 4
📝 Beskrivelse

En funksjon som roterer en 2D-tabell (matrise) 90 grader med klokken.

🎯 Læringsmål
  • Arbeid med 2D-lister
  • Forstå algoritmer for matriserotasjon
💻 Kode
def roter_tabell(tabell):
    """
    Pedagogisk algoritme for å rotere en 2D-tabell med 90 grader med klokken.
    """
    # Sjekk om tabellen er tom
    if not tabell or not tabell[0]:
        return []

    # Finn antall rader og kolonner
    antall_rader = len(tabell)
    antall_kolonner = len(tabell[0])

    # Opprett en ny tabell for den roterte versjonen
    rotert_tabell = [[0] * antall_rader for _ in range(antall_kolonner)]

    # Roter tabellen
    for i in range(antall_rader):
        for j in range(antall_kolonner):
            rotert_tabell[j][antall_rader - 1 - i] = tabell[i][j]

    return rotert_tabell

# Eksempelbruk
if __name__ == "__main__":
    tabell = [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]
    ]
    rotert_tabell = roter_tabell(tabell)
    for rad in rotert_tabell:
        print(rad)

5. simuleringer.py

Vanskelighetsgrad: 5
📝 Beskrivelse

En implementasjon av Conway's Game of Life med visualisering ved hjelp av matplotlib.

🎯 Læringsmål
  • Forstå grunnleggende simuleringer og celleautomata
  • Bruk av matplotlib for visualisering
💻 Kode
import numpy as np
import matplotlib.pyplot as plt

def create_grid(size, randomize=True):
    """Opprett et rutenett av gitt størrelse."""
    if randomize:
        return np.random.choice([0, 1], size=(size, size))
    return np.zeros((size, size), dtype=int)

def count_neighbors(grid, x, y):
    """Tell levende naboer rundt en celle."""
    neighbors = [
        (-1, -1), (-1, 0), (-1, 1),
        (0, -1),         (0, 1),
        (1, -1), (1, 0), (1, 1)
    ]
    count = 0
    for dx, dy in neighbors:
        nx, ny = x + dx, y + dy
        if 0 <= nx < grid.shape[0] and 0 <= ny < grid.shape[1]:
            count += grid[nx, ny]
    return count

def step(grid):
    """Utfør ett steg i Game of Life."""
    new_grid = grid.copy()
    for x in range(grid.shape[0]):
        for y in range(grid.shape[1]):
            live_neighbors = count_neighbors(grid, x, y)
            if grid[x, y] == 1:
                if live_neighbors < 2 or live_neighbors > 3:
                    new_grid[x, y] = 0
            else:
                if live_neighbors == 3:
                    new_grid[x, y] = 1
    return new_grid

def simulate(size=20, steps=50, interval=0.2):
    """Kjør simuleringen av Game of Life."""
    grid = create_grid(size)
    plt.ion()
    fig, ax = plt.subplots()
    for _ in range(steps):
        ax.clear()
        ax.imshow(grid, cmap='binary')
        plt.title("Conway's Game of Life")
        plt.pause(interval)
        grid = step(grid)
    plt.ioff()
    plt.show()

if __name__ == "__main__":
    simulate()

6. sporfinning_med_rutenett.py

Vanskelighetsgrad: 6
📝 Beskrivelse

En visuell implementasjon av A*-algoritmen for å finne den korteste stien i et rutenett. Programmet bruker pygame for grafisk visualisering.

🎯 Læringsmål
  • Forstå A*-algoritmen
  • Bruk av pygame for grafisk visualisering
💻 Kode
import pygame
import heapq

pygame.init()

WIDTH, HEIGHT = 800, 800
ROWS, COLS = 20, 20
CELL_SIZE = WIDTH // COLS
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Pathfinding med A*")

class Node:
    def __init__(self, row, col):
        self.row = row
        self.col = col
        self.x = col * CELL_SIZE
        self.y = row * CELL_SIZE
        self.color = WHITE
        self.neighbors = []
        self.g = float('inf')
        self.h = 0
        self.f = float('inf')
        self.previous = None

    def __lt__(self, other):
        return self.f < other.f

    def draw(self):
        pygame.draw.rect(screen, self.color, (self.x, self.y, CELL_SIZE, CELL_SIZE))

    def add_neighbors(self, grid):
        if self.row > 0 and grid[self.row - 1][self.col].color != BLACK:
            self.neighbors.append(grid[self.row - 1][self.col])
        if self.row < ROWS - 1 and grid[self.row + 1][self.col].color != BLACK:
            self.neighbors.append(grid[self.row + 1][self.col])
        if self.col > 0 and grid[self.row][self.col - 1].color != BLACK:
            self.neighbors.append(grid[self.row][self.col - 1])
        if self.col < COLS - 1 and grid[self.row][self.col + 1].color != BLACK:
            self.neighbors.append(grid[self.row][self.col + 1])

def heuristic(a, b):
    return abs(a.row - b.row) + abs(a.col - b.col)

def a_star(grid, start, end):
    open_set = []
    heapq.heappush(open_set, (0, start))
    start.g = 0
    start.f = heuristic(start, end)

    while open_set:
        current = heapq.heappop(open_set)[1]

        if current == end:
            path = []
            while current.previous:
                path.append(current)
                current = current.previous
            return path

        for neighbor in current.neighbors:
            temp_g = current.g + 1
            if temp_g < neighbor.g:
                neighbor.g = temp_g
                neighbor.h = heuristic(neighbor, end)
                neighbor.f = neighbor.g + neighbor.h
                neighbor.previous = current
                heapq.heappush(open_set, (neighbor.f, neighbor))

    return None

grid = [[Node(row, col) for col in range(COLS)] for row in range(ROWS)]

running = True
start = None
end = None

while running:
    screen.fill(WHITE)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        if pygame.mouse.get_pressed()[0]:
            pos = pygame.mouse.get_pos()
            row, col = pos[1] // CELL_SIZE, pos[0] // CELL_SIZE
            node = grid[row][col]
            if not start and node != end:
                start = node
                start.color = GREEN
            elif not end and node != start:
                end = node
                end.color = RED
            elif node != start and node != end:
                node.color = BLACK

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE and start and end:
                for row in grid:
                    for node in row:
                        node.add_neighbors(grid)

                path = a_star(grid, start, end)
                if path:
                    for node in path:
                        node.color = BLUE

    for row in grid:
        for node in row:
            node.draw()

    for x in range(0, WIDTH, CELL_SIZE):
        pygame.draw.line(screen, BLACK, (x, 0), (x, HEIGHT))
    for y in range(0, HEIGHT, CELL_SIZE):
        pygame.draw.line(screen, BLACK, (0, y), (WIDTH, y))

    pygame.display.flip()

pygame.quit()

7. selection_sort.py

Vanskelighetsgrad: 2
📝 Beskrivelse

En implementasjon av Selection Sort-algoritmen for å sortere en liste.

🎯 Læringsmål
  • Forstå hvordan Selection Sort fungerer
  • Arbeid med løkker og indekser
💻 Kode
def selectionSort(arr):
    for i in range(len(arr)):
        min_idx = i
        for j in range(i+1, len(arr)):
            if arr[j] < arr[min_idx]:
                min_idx = j

        arr[i], arr[min_idx] = arr[min_idx], arr[i]

def printArray(arr):
    for i in range(len(arr)):
        print("%d" % arr[i], end=" ")
    print()

if __name__ == "__main__":
    arr = [64, 25, 12, 22, 11]
    selectionSort(arr)
    print("Sortert array")
    printArray(arr)

8. julie_kode.py

Vanskelighetsgrad: 1
📝 Beskrivelse

En enkel kalkulator som utfører grunnleggende matematiske operasjoner basert på brukerens valg.

🎯 Læringsmål
  • Bruk av if-elif-else-strukturer
  • Håndtering av brukerinput
💻 Kode
tall1 = int(input("Gi meg tall 1? "))
tall2 = int(input("Gi meg tall 2? "))
tall3 = int(input("Hva vil du regne ut? Trykk 1 for addisjon  2 for subtraksjon 3 for multiplikasjon 4 for divisjon: "))

if tall3 == 1:
    print(f"Tallet {tall1} pluss tallet {tall2} er lik {tall1 + tall2}")
elif tall3 == 2:
    print(f"Tallet {tall1} minus tallet {tall2} er lik {tall1 - tall2}")
elif tall3 == 3:
    print(f"Tallet {tall1} gange tallet {tall2} er lik {tall1 * tall2}")
elif tall3 == 4:
    if tall2 == 0:
        print("Det går ikke")
    else:
        print(f"Tallet {tall1} delt på tallet {tall2} er lik {tall1 / tall2}")
else:
    print("Jeg forstår ikke hva du mener")

9. sporfinning.py

Vanskelighetsgrad: 5
📝 Beskrivelse

En tekstbasert implementasjon av A*-algoritmen for å finne den korteste stien i et rutenett.

🎯 Læringsmål
  • Forstå A*-algoritmen uten grafisk visualisering
  • Arbeid med prioritetskøer (heapq)
💻 Kode
import heapq

class Node:
    def __init__(self, x, y, cost=0, heuristic=0, parent=None):
        self.x = x
        self.y = y
        self.cost = cost
        self.heuristic = heuristic
        self.parent = parent

    def __lt__(self, other):
        return (self.cost + self.heuristic) < (other.cost + other.heuristic)

def heuristic(a, b):
    """Beregner Manhattan-avstanden mellom to punkter."""
    return abs(a[0] - b[0]) + abs(a[1] - b[1])

def a_star(grid, start, goal):
    """Implementerer A*-algoritmen for å finne den korteste stien i et rutenett."""
    rows, cols = len(grid), len(grid[0])
    open_set = []
    heapq.heappush(open_set, Node(start[0], start[1], heuristic=heuristic(start, goal)))
    closed_set = set()

    while open_set:
        current = heapq.heappop(open_set)

        if (current.x, current.y) == goal:
            path = []
            while current:
                path.append((current.x, current.y))
                current = current.parent
            return path[::-1]

        closed_set.add((current.x, current.y))

        for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
            nx, ny = current.x + dx, current.y + dy

            if 0 <= nx < rows and 0 <= ny < cols and grid[nx][ny] == 0 and (nx, ny) not in closed_set:
                neighbor = Node(nx, ny, current.cost + 1, heuristic((nx, ny), goal), current)
                heapq.heappush(open_set, neighbor)

    return None

if __name__ == "__main__":
    grid = [
        [0, 1, 0, 0, 0],
        [0, 1, 0, 1, 0],
        [0, 0, 0, 1, 0],
        [0, 1, 1, 1, 0],
        [0, 0, 0, 0, 0]
    ]
    start = (0, 0)
    goal = (4, 4)

    path = a_star(grid, start, goal)
    if path:
        print("Funnet sti:", path)
    else:
        print("Ingen sti funnet.")

10. norske_flagg.py

Vanskelighetsgrad: 3
📝 Beskrivelse

En animasjon som viser det norske flagget ved hjelp av matplotlib.

🎯 Læringsmål
  • Bruk av matplotlib for å lage animasjoner
  • Arbeid med geometriske former
💻 Kode
from matplotlib.animation import FuncAnimation
import matplotlib.pyplot as plt
import matplotlib.patches as patches

def draw_flag(ax, progress):
    ax.clear()
    ax.set_xlim(0, 22)
    ax.set_ylim(0, 16)
    ax.set_aspect('equal')
    ax.axis('off')

    ax.add_patch(patches.Rectangle((0, 0), 22, 16, color='red'))
    ax.add_patch(patches.Rectangle((6, 0), 4, 16, color='white'))
    ax.add_patch(patches.Rectangle((0, 6), 22, 4, color='white'))
    ax.add_patch(patches.Rectangle((6 + progress, 0), 2, 16, color='blue'))
    ax.add_patch(patches.Rectangle((0, 6 + progress), 22, 2, color='blue'))

def update(frame):
    progress = frame / 20
    draw_flag(ax, progress)

fig, ax = plt.subplots(figsize=(8, 6))
ani = FuncAnimation(fig, update, frames=21, interval=100, repeat=False)

plt.show()

11. matplotlib_fractals.py

Vanskelighetsgrad: 4
📝 Beskrivelse

Genererer og visualiserer Koch-snøfnugg-fraktalen ved hjelp av matplotlib.

🎯 Læringsmål
  • Forstå rekursive algoritmer
  • Bruk av matplotlib for å tegne komplekse figurer
💻 Kode
import matplotlib.pyplot as plt

def koch_snowflake(order, length):
    """Genererer koordinater for Koch-snøfnugget."""
    def koch_curve(order, p1, p2):
        if order == 0:
            return [p1, p2]
        else:
            x1, y1 = p1
            x2, y2 = p2

            dx = (x2 - x1) / 3
            dy = (y2 - y1) / 3

            pA = (x1 + dx, y1 + dy)
            pB = (x1 + 2 * dx, y1 + 2 * dy)
            pC = (x1 + dx - dy * (3**0.5) / 2, y1 + dy + dx * (3**0.5) / 2)

            return (
                koch_curve(order - 1, p1, pA)[:-1] +
                koch_curve(order - 1, pA, pC)[:-1] +
                koch_curve(order - 1, pC, pB)[:-1] +
                koch_curve(order - 1, pB, p2)
            )

    p1 = (0, 0)
    p2 = (length, 0)
    p3 = (length / 2, length * (3**0.5) / 2)

    points = (
        koch_curve(order, p1, p2)[:-1] +
        koch_curve(order, p2, p3)[:-1] +
        koch_curve(order, p3, p1)
    )
    return points

def plot_koch_snowflake(order, length):
    """Tegner Koch-snøfnugget ved hjelp av matplotlib."""
    points = koch_snowflake(order, length)
    x, y = zip(*points)

    plt.figure(figsize=(8, 8))
    plt.plot(x, y, color="blue")
    plt.axis("equal")
    plt.title(f"Koch-snøfnugg (Rekursjonsdybde: {order})")
    plt.show()

if __name__ == "__main__":
    plot_koch_snowflake(order=4, length=400)

12. binary_search.py

Vanskelighetsgrad: 2
📝 Beskrivelse

En implementasjon av binærsøk for å finne et element i en sortert liste.

🎯 Læringsmål
  • Forstå binærsøk-algoritmen
  • Effektiv søking i sorterte datastrukturer
💻 Kode
def binary_search(sorted_list, target):
    """Utfører et binært søk på en sortert liste for å finne et mål."""
    low = 0
    high = len(sorted_list) - 1

    while low <= high:
        mid = (low + high) // 2
        guess = sorted_list[mid]

        if guess == target:
            return mid
        elif guess < target:
            low = mid + 1
        else:
            high = mid - 1

    return -1

if __name__ == "__main__":
    numbers = [1, 3, 5, 7, 9, 11, 13, 15]
    target = 7

    result = binary_search(numbers, target)
    if result != -1:
        print(f"Fant {target} på indeks {result}.")
    else:
        print(f"{target} finnes ikke i listen.")

13. matte_animasjoner.py

Vanskelighetsgrad: 4
📝 Beskrivelse

En animasjon av grafen til funksjonen y = x² ved hjelp av manim.

🎯 Læringsmål
  • Bruk av manim for å lage matematiske animasjoner
  • Visualisering av funksjoner
💻 Kode
from manim import *

class QuadraticFunction(Scene):
    def construct(self):
        axes = Axes(
            x_range=[-3, 3, 1],
            y_range=[-1, 9, 1],
            axis_config={"include_numbers": True},
        )

        labels = axes.get_axis_labels(x_label="x", y_label="y")
        quadratic_graph = axes.plot(lambda x: x**2, color=BLUE)

        self.play(Create(axes), Write(labels))
        self.play(Create(quadratic_graph))

        self.wait(2)

if __name__ == "__main__":
    config.media_width = "75%"
    scene = QuadraticFunction()
    scene.render()
    print("Animasjonen er lagret som quadratic_function.mp4")

14. magic_square_odd_order.py

Vanskelighetsgrad: 3
📝 Beskrivelse

Genererer et magisk kvadrat for oddetallsstørrelser.

🎯 Læringsmål
  • Forstå algoritmer for å generere magiske kvadrater
  • Arbeid med 2D-lister
💻 Kode
def generateMagicSquare(n):
    if n % 2 == 0:
        raise ValueError("n må være et oddetall")

    magic_square = [[0] * n for _ in range(n)]
    i, j = 0, n // 2

    for num in range(1, n * n + 1):
        magic_square[i][j] = num
        i -= 1
        j += 1

        if num % n == 0:
            i += 2
            j -= 1
        elif j == n:
            j -= n
        elif i < 0:
            i += n

    print("Magisk kvadrat for n =", n)
    print("Summen av hver rad, kolonne eller diagonal er", n * (n * n + 1) // 2)
    for i in range(n):
        for j in range(n):
            print("%2d " % (magic_square[i][j]), end=" ")
        print()

    return magic_square

try:
    tall = int(input("Gi meg et odde-tall for å lage et magisk kvadrat: "))
    if tall % 2 == 0:
        raise ValueError("Tallet må være et oddetall!")
    magic_square = generateMagicSquare(tall)
except ValueError as e:
    print(e)

15. grunnlegende_kontroll_struktur.py

Vanskelighetsgrad: 1
📝 Beskrivelse

En enkel kalkulator som demonstrerer grunnleggende kontrollstrukturer som løkker og if-setninger.

🎯 Læringsmål
  • Bruk av løkker og betingelser
  • Håndtering av brukerinput
💻 Kode
def kalkulator():
    print("Velkommen til kalkulatoren!")
    print("Velg en operasjon:")
    print("1. Addisjon")
    print("2. Subtraksjon")
    print("3. Multiplikasjon")
    print("4. Divisjon")
    print("5. Avslutt")

    while True:
        try:
            valg = int(input("Skriv inn ditt valg (1-5): "))
            if valg == 5:
                print("Avslutter kalkulatoren. Ha en fin dag!")
                break

            if valg < 1 or valg > 5:
                print("Ugyldig valg. Prøv igjen.")
                continue

            tall1 = float(input("Skriv inn det første tallet: "))
            tall2 = float(input("Skriv inn det andre tallet: "))

            if valg == 1:
                print(f"Resultat: {tall1} + {tall2} = {tall1 + tall2}")
            elif valg == 2:
                print(f"Resultat: {tall1} - {tall2} = {tall1 - tall2}")
            elif valg == 3:
                print(f"Resultat: {tall1} * {tall2} = {tall1 * tall2}")
            elif valg == 4:
                if tall2 == 0:
                    print("Feil: Kan ikke dele på null.")
                else:
                    print(f"Resultat: {tall1} / {tall2} = {tall1 / tall2}")
        except ValueError:
            print("Ugyldig input. Vennligst skriv inn et tall.")

kalkulator()

16. fibonacci_recursion.py

Vanskelighetsgrad: 3
📝 Beskrivelse

En rekursiv implementasjon av Fibonacci-sekvensen. Funksjon som kaller opp seg selv.

🎯 Læringsmål
  • Forstå rekursjon
  • Arbeid med matematiske sekvenser
💻 Kode
def fibonacci(n):
    """
    Beregner Fibonacci-tall ved hjelp av rekursjon.
    
    Args:
        n (int): Indeksen til Fibonacci-tallet som skal beregnes.
        
    Returns:
        int: Fibonacci-tallet på indeks n.
    """
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n - 1) + fibonacci(n - 2)

if __name__ == "__main__":
    print("Fibonacci-sekvens:")
    try:
        n = int(input("Skriv inn et tall for å beregne Fibonacci-sekvensen: "))
        if n < 0:
            print("Vennligst skriv inn et ikke-negativt tall.")
        else:
            print(f"F({n}) = {fibonacci(n)}")
    except ValueError:
        print("Vennligst skriv inn et gyldig heltall.")

17. turtle_fractals.py

Vanskelighetsgrad: 4
📝 Beskrivelse

Tegner Koch-snøfnugg-fraktalen ved hjelp av turtle.

🎯 Læringsmål
  • Bruk av rekursjon for å tegne fraktaler
  • Introduksjon til turtle-modulen
💻 Kode
import turtle

def draw_fractal_line(t, length, depth):
    """Tegner en rekursiv linje som en del av Koch-snøfnugg-fraktalen."""
    if depth == 0:
        t.forward(length)
    else:
        length /= 3.0
        draw_fractal_line(t, length, depth - 1)
        t.left(60)
        draw_fractal_line(t, length, depth - 1)
        t.right(120)
        draw_fractal_line(t, length, depth - 1)
        t.left(60)
        draw_fractal_line(t, length, depth - 1)

def draw_koch_snowflake(t, length, depth):
    """Tegner et Koch-snøfnugg ved å kombinere tre fraktallinjer."""
    for _ in range(3):
        draw_fractal_line(t, length, depth)
        t.right(120)

def main():
    """Hovedfunksjonen som setter opp skjermen og tegner Koch-snøfnugget."""
    screen = turtle.Screen()
    screen.setup(width=800, height=800)
    screen.title("Turtle Fractals - Koch Snowflake")

    t = turtle.Turtle()
    t.speed(0)
    t.penup()
    t.goto(-200, 100)
    t.pendown()

    draw_koch_snowflake(t, 400, 4)

    t.hideturtle()
    screen.mainloop()

if __name__ == "__main__":
    main()

18. game_oflife.py

Vanskelighetsgrad: 5
📝 Beskrivelse

En implementasjon av Conway's Game of Life med animasjon ved hjelp av matplotlib.

🎯 Læringsmål
  • Forstå celleautomata og Conway's Game of Life
  • Bruk av matplotlib.animation for å lage animasjoner
💻 Kode
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

def create_grid(size, random_seed):
    """Oppretter et rutenett (grid) med tilfeldige verdier (0 eller 1)."""
    np.random.seed(random_seed)
    return np.random.randint(2, size=(size, size))

def count_neighbors(grid, x, y):
    """Teller antall levende naboer (1) rundt en celle i rutenettet."""
    neighbors = [
        (-1, -1), (-1, 0), (-1, 1),
        (0, -1),         (0, 1),
        (1, -1), (1, 0), (1, 1)
    ]
    count = 0
    for dx, dy in neighbors:
        nx, ny = x + dx, y + dy
        if 0 <= nx < grid.shape[0] and 0 <= ny < grid.shape[1]:
            count += grid[nx, ny]
    return count

def next_generation(grid):
    """Beregner neste generasjon av rutenettet basert på Conway's Game of Life-regler."""
    new_grid = grid.copy()
    for x in range(grid.shape[0]):
        for y in range(grid.shape[1]):
            neighbors = count_neighbors(grid, x, y)
            if grid[x, y] == 1:
                if neighbors < 2 or neighbors > 3:
                    new_grid[x, y] = 0
            elif neighbors == 3:
                new_grid[x, y] = 1
    return new_grid

def update(frame, img, grid, history):
    """Oppdaterer rutenettet for hver generasjon og oppdaterer bildet."""
    new_grid = next_generation(grid[0])
    new_state = tuple(map(tuple, new_grid))
    if new_state in history:
        print("Syklus oppdaget. Simuleringen stopper.")
        plt.close()
        return img,
    history.add(new_state)
    img.set_data(new_grid)
    grid[0] = new_grid
    return img,

def run_game(size, random_seed, generations, interval):
    """Starter Conway's Game of Life med matplotlib-animasjon."""
    grid = create_grid(size, random_seed)
    fig, ax = plt.subplots()
    img = ax.imshow(grid, cmap="binary", interpolation="nearest")
    ax.axis("off")

    history = set()
    history.add(tuple(map(tuple, grid)))

    ani = animation.FuncAnimation(
        fig, update, fargs=(img, [grid], history), frames=generations, interval=interval, blit=True
    )
    plt.show()

# Parametere for spillet
size = 20
random_seed = 42
generations = 100
interval = 200

# Start spillet
run_game(size, random_seed, generations, interval)

19. kodefeil.py

Vanskelighetsgrad: 5
📝 Beskrivelse

Kode med logisk feil som kan brukes til å lære kodesporing. Finn feilen som gjør at resultatet ikke blir riktig.

🎯 Læringsmål
  • Bruk av IDE (programmeringsprogrammet) og kodesporing til å finne feil
  • Forstå logiske feil i kode
💻 Kode
# Denne koden har en logisk feil som kan brukes til å lære kodesporing
def finn_største_tall(tall_liste):
    største = 0  # Logisk feil: Hva om listen inneholder negative tall?
    for tall in tall_liste:
        if tall > største:
            største = tall
    return største

# Eksempelbruk
tall = [-5, -2, -8, -1]
print("Det største tallet er:", finn_største_tall(tall))

# Hva er feilen her? Prøv å finne den og rett den!

Hvordan bruke denne kodeboken

  1. Utforsk hvert prosjekt for å lære spesifikke programmeringskonsepter
  2. Kjør koden for å se hvordan den fungerer i praksis
  3. Eksperimenter med å endre parametere og funksjoner for å forstå hvordan de påvirker resultatet
  4. Start med lavere vanskelighetsgrad hvis du er nybegynner, og arbeid deg opp til mer komplekse prosjekter

God programmering! 🚀

No comments on “Kodeboken for barn og nybegynnere”

We use cookies

This website uses first- and third-party cookies to analyse and improve your browsing experience.

Cookie Policy
Information on the use of cookies

Cookies are small pieces of information that are sent to and stored on the user's computer hard drive through the browser when connecting to a website. Cookies can be used to collect and store user data while connected in order to provide the requested services, and are sometimes not retained. Cookies may be first- or third-party.

There are several types of cookies:

  • Technical cookies that facilitate user navigation and the use of the different options or services offered by the website, such as identifying the session, allowing access to certain areas, facilitating orders, purchases, form completion, registrations, security, and enabling functionalities (videos, social networks, etc.).
  • Personalisation cookies that allow the user to access services according to their preferences (language, browser, configuration, etc.).
  • Analytics cookies that allow anonymous analysis of the behaviour of website users and enable measurement of user activity and the development of browsing profiles with the aim of improving websites.

Therefore, when accessing our website, in compliance with Article 22 of Law 34/2002 on Information Society Services, for analytics cookies we have requested your consent for their use. This is to improve our services. We use Google Analytics to collect anonymous statistical information, such as the number of visitors to our site. Cookies added by Google Analytics are governed by the Google Analytics privacy policies. If you wish, you can disable Google Analytics cookies.

In any case, you can enable or disable these cookies by following the instructions of your Internet browser.

Cookie preferences
Necessary cookies

Essential for basic site functions and cannot be disabled.

3 cookies detected.

  • jbcookies (JoomBall!)
    Stores the consent given by the user on the website.
  • joomla_user_state (Joomla!)
    Preserves the user's authentication state.
  • joomla_remember_me_* (Joomla!)
    Keeps the session remembered for the authenticated user.
Analytics cookies

They help us understand usage and improve performance.

No cookies have been detected in this category yet.

Marketing cookies

They personalise advertising and measure the effectiveness of campaigns.

No cookies have been detected in this category yet.

Unclassified cookies

Cookies pending review or automatic classification.

No cookies have been detected in this category yet.