Warning
This page is located in archive. Go to the latest version of this course pages. Go the latest version of this page.

Den 4

Úkoly na funkce

Úkol 0

TODO

Úkol 1

# riskoana
def BMI_num(vyska_m, hmotnost_kg):
    return(hmotnost_kg/(vyska_m**2))
 
def BMI_eval(BMI):
    if BMI < 18.5:
        print("podvaha")
    elif BMI > 30:
        print("nadvaha")
    else:
        print("zdrava vaha")
 
 
hmotnost_kg = float(input("Zadejte vahu v kg: "))
vyska_m = float(input("Zadejte vysku v m: "))
 
hodnota = BMI_num(vyska_m, hmotnost_kg)
print(hodnota)
print(BMI_eval(hodnota))


Úkol 2

# riskoana
def swap(numbers, index_1, index_2):
    # ověření, jestli jsou dodané indexy validní
    if (index_1 < 0) or (index_2 < 0) or (index_1 > len(numbers) - 1) or (index_2 > len(numbers) - 1) or (index_1 == index_2):
        print("zkus to znova, prosímtě")
    else:
        i = numbers[index_1]
        j = numbers[index_2]
        numbers[index_1] = j
        numbers[index_2] = i
        return numbers
# část pro testování
numbers = [1, 2, 3, 4, 5]
swap(numbers, 0, 1)
print(numbers)


Úkol 3

# riskoana
import math
 
def smallest_number(numbers):
    # minimum nastavíme na hodotu, oproti které je jakékoliv číslo menší
    min = math.inf
    index = len(numbers) + 1 # index nastaven na nevalidní hodnotu - pokud bude vrácena -1, máme jistotu selhání
    for i in range(len(numbers)):
        if numbers[i] < min:
            min = numbers[i]
            index = i
    return index
 
numbers = [1, 2, 3, 4, 5, 0]
print(smallest_number(numbers))


Úkol 4

# riskoana
 
from ukol3_reseni import smallest_number
 
# Napr opet za pomoci selection sort
def sort(array):
    for i in range(len(array)):
        idx_of_smallesrt = i + smallest_number(array[i:])
        tmp = array[i]
        array[i] = array[idx_of_smallesrt]
        array[idx_of_smallesrt] = tmp
 
 
arr = [64, 25, 12, 22, 11, 3, 4, 53, 42]
print("Pred serazenim: " + str(arr))
sort(arr)
print("Po serazeni: " + str(arr))


Rozsáhlejší úkoly

Úkol 1

# riskoana
import math
 
def read_input():
    array = []
    a = float(input())
    while a != 0:
        array.append(a)
        a = float(input())
    return array
 
def get_sum(array):
    Sum = 0
    for i in range(len(array)):
        Sum += array[i]
    return Sum
 
def get_sum_lazy(array):
    return sum(array)
 
def get_avg(array):
    return (get_sum(array) / len(array))
 
#další funkce
def get_max(array):
    max = -(math.inf)
    for i in range(len(array)):
        if array[i] > max:
            max = array[i]
    return max
 
def get_min(array):
    min = math.inf
    for i in range(len(array)):
        if array[i] < min:
            min = array[i]
    return min
 
def array_contains(array, number):
    for i in range(len(array)):
        if array[i] == number:
            return True
    return False
 
def print_receipt(array):
    for i in range(len(array)):
        print(array[i])
 
def serve_custormer():
    prices = read_input()
    print_receipt(prices)


Úkol 2

# author kubikji2
 
import random
 
# minimalni hodnota ve vektoru
MIN_NUM = -10
# maximalni hodnota ve vektoru
MAX_NUM = 10
# rozsah hodnot ve vektoru
# '-> POZNAMKA: vsimni si, ze konstanta je psana velkymi pismena a je tedy
#               pro Python neco jineho nez `range` ve for-cyklu
RANGE = MAX_NUM-MIN_NUM
 
# funkce pro kontrolu hodnoty delky vstupu
def check_length(length):
    if length <= 0:
        print("Vektor musi mit alespon jeden prvek.")
        return False
    else:
        return True
 
# funkce pro generovani vektoru dane delky
def generate_vector(length):
    # prazdny seznam pro vektor
    v = []
    # pro kazdy prvek vektoru ...
    for i in range(length):
        # ... nahodne vygeneruji cislo ...
        el = random.random()*(RANGE)+MIN_NUM  # [1]
        # ... a cislo pridej do vektoru
        v.append(el)
    # vrat vektor
    return v
# [1] altenativne lze pouzit randomrange, ktery generuje cela cisla:
#     el = random.randrange(MIN_NUM, MAX_NUM)
 
# funkce pro vypocet skalarniho soucinu
def scalar_product(v1,v2):
    # zjisti delku vektoru (bez obav, oba jsou stejne dlouhe)
    length = len(v1)
    result = 0
    # pro kazdou pozici ve vektorech ...
    for i in range(length):
        # ... vynasob cisla a pridej je k vysledku
        result += v1[i]*v2[i]
    return result
 
# vytiskne vektor na jeden radek
def print_vector(vec):
    # zjisti delku vektoru
    length = len(vec)
    # leva zavorka s mezerou ...
    print("[ ", end="")
    # ... vsechna cisla s mezerou na konci
    for i in range(length):
        print("{:5.2f} ".format(vec[i]), end="")
    # ... prava zavorka bez mezery
    print("]", end="")   
 
 
# 1. nacist a zkontroloval velikost vektoru
length = int(input("Zadej delku vektoru: "))
is_length_ok = check_length(length)
# 2. je-li vse ok pokracovat
if is_length_ok:
    # 3. vygenerovat oba vektory
    v1 = generate_vector(length)
    v2 = generate_vector(length)
    # 4. provest skalarni soucin
    a = scalar_product(v1,v2)
    # 5. vypsat
    print_vector(v1)
    print(" . ", end="")
    print_vector(v2)
    print(" = {:5.2f}".format(a))


Rozšíření 2.1

# author kubikji2
 
import random
 
# minimalni hodnota ve vektoru
MIN_NUM = -10
# maximalni hodnota ve vektoru
MAX_NUM = 10
# rozsah hodnot ve vektoru
# '-> POZNAMKA: vsimni si, ze konstanta je psana velkymi pismena a je tedy
#               pro Python neco jineho nez `range` ve for-cyklu
RANGE = MAX_NUM-MIN_NUM
 
# funkce pro kontrolu hodnoty delky vstupu
def check_length(length):
    if length <= 0:
        print("Vektor musi mit alespon jeden prvek.")
        return False
    else:
        return True
 
# funkce pro generovani vektoru dane delky
def generate_vector(length):
    # prazdny seznam pro vektor
    v = []
    # pro kazdy prvek vektoru ...
    for i in range(length):
        # ... nahodne vygeneruji cislo ...
        el = random.random()*(RANGE)+MIN_NUM  # [1]
        # ... a cislo pridej do vektoru
        v.append(el)
    # vrat vektor
    return v
# [1] altenativne lze pouzit randomrange, ktery generuje cela cisla:
#     el = random.randrange(MIN_NUM, MAX_NUM)
 
# funkce pro vypocet skalarniho soucinu
def scalar_product(v1,v2):
    # zjisti delku vektoru (bez obav, oba jsou stejne dlouhe)
    length = len(v1)
    result = 0
    # pro kazdou pozici ve vektorech ...
    for i in range(length):
        # ... vynasob cisla a pridej je k vysledku
        result += v1[i]*v2[i]
    return result
 
# vytiskne vektor na jeden radek
def print_vector(vec):
    # zjisti delku vektoru
    length = len(vec)
    # leva zavorka s mezerou ...
    print("[ ", end="")
    # ... vsechna cisla s mezerou na konci
    for i in range(length):
        print("{:5.2f} ".format(vec[i]), end="")
    # ... prava zavorka bez mezery
    print("]", end="")   
 
# funkce pro kontrolu zadaneho cisla
def check_number(num):
    if num >= MIN_NUM and num <= MAX_NUM:
        return True
    else:
        print("Zadane cislo mimo rozsah [{},{}]".format(MIN_NUM, MAX_NUM))
        return False
 
# funkce pro opakovane cteni prvku matice
def read_single_number():
    num = float(input(""))
    is_num_ok = check_number(num)
    # dokud neni nactene cislo ok, tak otravuj uzivatele
    while not is_num_ok:
        num = float(input("Zkus to znovu: "))
        is_num_ok = check_number(num)
    return num
 
def read_vector(length):
    # prazdny seznam pro vektor    
    vec = []
    # pro kazdy prvek vektoru ...
    for i in range(length):
        # ... nacti od uzivatele cislo ...
        print("Zadavas cislo na pozici {}".format(i))
        num = read_single_number()
        # ... a cislo pridej do vektoru ...
        vec.append(num)
    # vrat vektor
    return vec
 
# 1. nacist a zkontroloval velikost vektoru
length = int(input("Zadej delku vektoru: "))
is_length_ok = check_length(length)
# 2. je-li vse ok pokracovat
if is_length_ok:
    # 3. vygenerovat oba vektory
    print("Zadavas prvni vektor:")
    v1 = read_vector(length)
    print("Zadavas druhy vektor:")
    v2 = read_vector(length)
    # 4. provest skalarni soucin
    a = scalar_product(v1,v2)
    # 5. vypsat
    print_vector(v1)
    print(" . ", end="")
    print_vector(v2)
    print(" = {:.2f}".format(a))


Úkol 3

# author kubikji2
 
import random
 
# maximalni velikost matic
MAX_SIZE = 10
 
# minimalni hodnota v matici
MIN_NUM = -10
# maximalni hodnota v matici
MAX_NUM = 10
# rozsah hodnot v matici
# '-> POZNAMKA: vsimni si, ze konstanta je psana velkymi pismena a je tedy
#               pro Python neco jineho nez `range` ve for-cyklu
RANGE = MAX_NUM-MIN_NUM
 
# funkce vygeneruje matici zadane velikosti
def generate_matrix(size):
    # vytvor prazdny seznam reprezentujici matici
    mat = []
    # pro kazdy radkovy index
    for row_i in range(size):
        # ... vytvor prazdny seznam reprezentujici novy radek
        row = []
        # ... pro kazdy sloupcovy index (v novem radku) ...
        for col_i in range(size):
            # ... nahodne vygeneruji cislo ...
            el = random.random()*(RANGE)+MIN_NUM  # [1]
            # ... a cislo pridej do radku ...
            row.append(el)
        # ... ted je radek hotovy, tak ho pridej do matice
        mat.append(row)
    # vrat vygerovany seznam seznamu (matici)
    return mat
 
# [1] altenativne lze pouzit randomrange, ktery generuje cela cisla:
#     el = random.randrange(MIN_NUM, MAX_NUM)
 
# funkce vytiskne matici
def print_matrix(mat):
    # zjistime jeji velikost (bez obav, je zajisteno, ze je ctvercova)
    size = len(mat)
    # pro kazdy radkovy index ...
    for row_i in range(size):
        # ... a kazdy sloupcovy index ...
        for col_i in range(size):
            # ... vypis cislo na prislusnych indexech ...
            el = mat[row_i][col_i]
            # ... celkem 7 znaku:
            #     '-> minimum a maximum je dvojmistne, navic mozne minus,
            #         tecka, dve desetinna mista a jedna oddelujici mezera
            print("{:7.2f}".format(el), end="")
        # zalomeni radku
        print()
 
# funkce secte matice
def add_matrices(A,B):
    # zjistime jeji velikost (bez obav, je zajisteno, ze jsou obe stejne velke a ctvercove)
    size = len(A)
    # vysledek
    C = []
    # pro kazdy radkovy index ...
    for row_i in range(size):
        # ... vytvor prazdny seznam reprezentujici novy radek
        row = []
        # ... pro kazdy sloupcovy index (v novem radku) ...
        for col_i in range(size):
            # ... secti cisla na prislusnych indexech v maticich A a B...
            el = A[row_i][col_i] + B[row_i][col_i]
            # ... a cislo pridej do radku ...
            row.append(el)
        # ... ted je radek hotovy, tak ho pridej do matice
        C.append(row)
    # vrat vygerovany seznam seznamu (matici)
    return C
 
# funkce pro kontrolu velikosti matice
def check_size(size):
    # matice nemuze mit velikost mensi nez 1 ...
    if size < 1:
        print("Matice nemuze mit velikost mensi nez 1.")
        return False
    # ... ani nemuze byt moc velka ...
    elif size > MAX_SIZE:
        print("Matice nemuze mit velikost vetsi nez " + str(MAX_SIZE))
        return False
    # ... jinak je ale v pohode
    else:
        return True
 
# 1. nacti a zkontroluj velikost
size = int(input("Zadej velikost matice: "))
is_size_ok = check_size(size)
# 2. je-li velikost ok, pokracuj
if is_size_ok:
    # 3. vygeneruj obe matice
    A = generate_matrix(size)
    B = generate_matrix(size)
    # 4. secti matice
    C = add_matrices(A,B)
    # 5. vytiskni matice i jejich soucet
    print_matrix(A)
    print("+")
    print_matrix(B)
    print("=")
    print_matrix(C)


Rozšíření 3.1

# author kubikji2
 
import random
 
# maximalni velikost matic
MAX_SIZE = 10
 
# minimalni hodnota v matici
MIN_NUM = -10
# maximalni hodnota v matici
MAX_NUM = 10
# rozsah hodnot v matici
# '-> POZNAMKA: vsimni si, ze konstanta je psana velkymi pismena a je tedy
#               pro Python neco jineho nez `range` ve for-cyklu
RANGE = MAX_NUM-MIN_NUM
 
# funkce vygeneruje matici zadane velikosti
def generate_matrix(size):
    # vytvor prazdny seznam reprezentujici matici
    mat = []
    # pro kazdy radkovy index
    for row_i in range(size):
        # ... vytvor prazdny seznam reprezentujici novy radek
        row = []
        # ... pro kazdy sloupcovy index (v novem radku) ...
        for col_i in range(size):
            # ... nahodne vygeneruji cislo ...
            el = random.random()*(RANGE)+MIN_NUM  # [1]
            # ... a cislo pridej do radku ...
            row.append(el)
        # ... ted je radek hotovy, tak ho pridej do matice
        mat.append(row)
    # vrat vygerovany seznam seznamu (matici)
    return mat
 
# [1] altenativne lze pouzit randomrange, ktery generuje cela cisla:
#     el = random.randrange(MIN_NUM, MAX_NUM)
 
# funkce vytiskne matici
def print_matrix(mat):
    # zjistime jeji velikost (bez obav, je zajisteno, ze je ctvercova)
    size = len(mat)
    # pro kazdy radkovy index ...
    for row_i in range(size):
        # ... a kazdy sloupcovy index ...
        for col_i in range(size):
            # ... vypis cislo na prislusnych indexech ...
            el = mat[row_i][col_i]
            # ... celkem 7 znaku:
            #     '-> minimum a maximum je dvojmistne, navic mozne minus,
            #         tecka, dve desetinna mista a jedna oddelujici mezera
            print("{:7.2f}".format(el), end="")
        # zalomeni radku
        print()
 
# funkce secte matice
def add_matrices(A,B):
    # zjistime jeji velikost (bez obav, je zajisteno, ze jsou obe stejne velke a ctvercove)
    size = len(A)
    # vysledek
    C = []
    # pro kazdy radkovy index ...
    for row_i in range(size):
        # ... vytvor prazdny seznam reprezentujici novy radek
        row = []
        # ... pro kazdy sloupcovy index (v novem radku) ...
        for col_i in range(size):
            # ... secti cisla na prislusnych indexech v maticich A a B...
            el = A[row_i][col_i] + B[row_i][col_i]
            # ... a cislo pridej do radku ...
            row.append(el)
        # ... ted je radek hotovy, tak ho pridej do matice
        C.append(row)
    # vrat vygerovany seznam seznamu (matici)
    return C
 
# funkce odecte od sebe matice
def subtract_matrices(A,B):
    # zjistime jeji velikost (bez obav, je zajisteno, ze jsou obe stejne velke a ctvercove)
    size = len(A)
    # vysledek
    C = []
    # pro kazdy radkovy index ...
    for row_i in range(size):
        # ... vytvor prazdny seznam reprezentujici novy radek
        row = []
        # ... pro kazdy sloupcovy index (v novem radku) ...
        for col_i in range(size):
            # ... odecti cisla na prislusnych indexech v maticich A a B...
            el = A[row_i][col_i] - B[row_i][col_i]
            # ... a cislo pridej do radku ...
            row.append(el)
        # ... ted je radek hotovy, tak ho pridej do matice
        C.append(row)
    # vrat vygerovany seznam seznamu (matici)
    return C
 
# funkce pro kontrolu velikosti matice
def check_size(size):
    # matice nemuze mit velikost mensi nez 1 ...
    if size < 1:
        print("Matice nemuze mit velikost mensi nez 1.")
        return False
    # ... ani nemuze byt moc velka ...
    elif size > MAX_SIZE:
        print("Matice nemuze mit velikost vetsi nez " + str(MAX_SIZE))
        return False
    # ... jinak je ale v pohode
    else:
        return True
 
# 1. nacti a zkontroluj velikost
size = int(input("Zadej velikost matice: "))
is_size_ok = check_size(size)
# 2. je-li velikost ok, pokracuj
if is_size_ok:
    # 3. vygeneruj obe matice
    A = generate_matrix(size)
    B = generate_matrix(size)
    # 4. odecti matice
    C = subtract_matrices(A,B)
    # 5. vytiskni matice i jejich rozdil
    print_matrix(A)
    print("-")
    print_matrix(B)
    print("=")
    print_matrix(C)


Rozšíření 3.2

# author kubikji2
 
import random
 
# maximalni velikost matic
MAX_SIZE = 10
 
# minimalni hodnota v matici
MIN_NUM = -10
# maximalni hodnota v matici
MAX_NUM = 10
# rozsah hodnot v matici
# '-> POZNAMKA: vsimni si, ze konstanta je psana velkymi pismena a je tedy
#               pro Python neco jineho nez `range` ve for-cyklu
RANGE = MAX_NUM-MIN_NUM
 
# funkce vygeneruje matici zadane velikosti
def generate_matrix(size):
    # vytvor prazdny seznam reprezentujici matici
    mat = []
    # pro kazdy radkovy index
    for row_i in range(size):
        # ... vytvor prazdny seznam reprezentujici novy radek
        row = []
        # ... pro kazdy sloupcovy index (v novem radku) ...
        for col_i in range(size):
            # ... nahodne vygeneruji cislo ...
            el = random.random()*(RANGE)+MIN_NUM  # [1]
            # ... a cislo pridej do radku ...
            row.append(el)
        # ... ted je radek hotovy, tak ho pridej do matice
        mat.append(row)
    # vrat vygerovany seznam seznamu (matici)
    return mat
 
# [1] altenativne lze pouzit randomrange, ktery generuje cela cisla:
#     el = random.randrange(MIN_NUM, MAX_NUM)
 
# funkce vytiskne matici
def print_matrix(mat):
    # zjistime jeji velikost (bez obav, je zajisteno, ze je ctvercova)
    size = len(mat)
    # pro kazdy radkovy index ...
    for row_i in range(size):
        # ... a kazdy sloupcovy index ...
        for col_i in range(size):
            # ... vypis cislo na prislusnych indexech ...
            el = mat[row_i][col_i]
            # ... celkem 7 znaku:
            #     '-> minimum a maximum je dvojmistne, navic mozne minus,
            #         tecka, dve desetinna mista a jedna oddelujici mezera
            print("{:7.2f}".format(el), end="")
        # zalomeni radku
        print()
 
# funkce secte matice
def add_matrices(A,B):
    # zjistime jeji velikost (bez obav, je zajisteno, ze jsou obe stejne velke a ctvercove)
    size = len(A)
    # vysledek
    C = []
    # pro kazdy radkovy index ...
    for row_i in range(size):
        # ... vytvor prazdny seznam reprezentujici novy radek
        row = []
        # ... pro kazdy sloupcovy index (v novem radku) ...
        for col_i in range(size):
            # ... secti cisla na prislusnych indexech v maticich A a B...
            el = A[row_i][col_i] + B[row_i][col_i]
            # ... a cislo pridej do radku ...
            row.append(el)
        # ... ted je radek hotovy, tak ho pridej do matice
        C.append(row)
    # vrat vygerovany seznam seznamu (matici)
    return C
 
# funkce odecte od sebe matice
def subtract_matrices(A,B):
    # zjistime jeji velikost (bez obav, je zajisteno, ze jsou obe stejne velke a ctvercove)
    size = len(A)
    # vysledek
    C = []
    # pro kazdy radkovy index ...
    for row_i in range(size):
        # ... vytvor prazdny seznam reprezentujici novy radek
        row = []
        # ... pro kazdy sloupcovy index (v novem radku) ...
        for col_i in range(size):
            # ... odecti cisla na prislusnych indexech v maticich A a B...
            el = A[row_i][col_i] - B[row_i][col_i]
            # ... a cislo pridej do radku ...
            row.append(el)
        # ... ted je radek hotovy, tak ho pridej do matice
        C.append(row)
    # vrat vygerovany seznam seznamu (matici)
    return C
 
# vynasobi matici danym cislem
def multiply_matrix(k,A):
    # zjistime jeji velikost (bez obav, je zajisteno, ze matice ctvercova)
    size = len(A)
    # vysledek
    C = []
    # pro kazdy radkovy index ...
    for row_i in range(size):
        # ... vytvor prazdny seznam reprezentujici novy radek
        row = []
        # ... pro kazdy sloupcovy index (v novem radku) ...
        for col_i in range(size):
            # ... vynasob cislo na prislusnych indexech v maticich A, cislem k...
            el = k*A[row_i][col_i]
            # ... a cislo pridej do radku ...
            row.append(el)
        # ... ted je radek hotovy, tak ho pridej do matice
        C.append(row)
    # vrat vygerovany seznam seznamu (matici)
    return C
 
# funkce pro kontrolu velikosti matice
def check_size(size):
    # matice nemuze mit velikost mensi nez 1 ...
    if size < 1:
        print("Matice nemuze mit velikost mensi nez 1.")
        return False
    # ... ani nemuze byt moc velka ...
    elif size > MAX_SIZE:
        print("Matice nemuze mit velikost vetsi nez " + str(MAX_SIZE))
        return False
    # ... jinak je ale v pohode
    else:
        return True
 
# 1. nacti a zkontroluj velikost
size = int(input("Zadej velikost matice: "))
is_size_ok = check_size(size)
# 2. je-li velikost ok, pokracuj
if is_size_ok:
    # 3. vygeneruj matici ...
    A = generate_matrix(size)
    # ... a nahodnou konstantu (treba v rozsahu [0,1) )
    k = random.random()
    # 4. secti matice
    C = multiply_matrix(k,A)
    # 5. vytiskni konstantu, matici i vysledek
    print("{:7.2f}".format(k))
    print("*")
    print_matrix(A)
    print("=")
    print_matrix(C)


Rozšíření 3.3

# author kubikji2
 
import random
 
# maximalni velikost matic
MAX_SIZE = 10
 
# minimalni hodnota v matici
MIN_NUM = -10
# maximalni hodnota v matici
MAX_NUM = 10
# rozsah hodnot v matici
# '-> POZNAMKA: vsimni si, ze konstanta je psana velkymi pismena a je tedy
#               pro Python neco jineho nez `range` ve for-cyklu
RANGE = MAX_NUM-MIN_NUM
 
# funkce vygeneruje matici zadane velikosti
def generate_matrix(size):
    # vytvor prazdny seznam reprezentujici matici
    mat = []
    # pro kazdy radkovy index
    for row_i in range(size):
        # ... vytvor prazdny seznam reprezentujici novy radek
        row = []
        # ... pro kazdy sloupcovy index (v novem radku) ...
        for col_i in range(size):
            # ... nahodne vygeneruji cislo ...
            el = random.random()*(RANGE)+MIN_NUM  # [1]
            # ... a cislo pridej do radku ...
            row.append(el)
        # ... ted je radek hotovy, tak ho pridej do matice
        mat.append(row)
    # vrat vygerovany seznam seznamu (matici)
    return mat
 
# [1] altenativne lze pouzit randomrange, ktery generuje cela cisla:
#     el = random.randrange(MIN_NUM, MAX_NUM)
 
# funkce vytiskne matici
def print_matrix(mat):
    # zjistime jeji velikost (bez obav, je zajisteno, ze je ctvercova)
    size = len(mat)
    # pro kazdy radkovy index ...
    for row_i in range(size):
        # ... a kazdy sloupcovy index ...
        for col_i in range(size):
            # ... vypis cislo na prislusnych indexech ...
            el = mat[row_i][col_i]
            # ... celkem 7 znaku:
            #     '-> minimum a maximum je dvojmistne, navic mozne minus,
            #         tecka, dve desetinna mista a jedna oddelujici mezera
            print("{:7.2f}".format(el), end="")
        # zalomeni radku
        print()
 
# funkce secte matice
def add_matrices(A,B):
    # zjistime jeji velikost (bez obav, je zajisteno, ze jsou obe stejne velke a ctvercove)
    size = len(A)
    # vysledek
    C = []
    # pro kazdy radkovy index ...
    for row_i in range(size):
        # ... vytvor prazdny seznam reprezentujici novy radek
        row = []
        # ... pro kazdy sloupcovy index (v novem radku) ...
        for col_i in range(size):
            # ... secti cisla na prislusnych indexech v maticich A a B...
            el = A[row_i][col_i] + B[row_i][col_i]
            # ... a cislo pridej do radku ...
            row.append(el)
        # ... ted je radek hotovy, tak ho pridej do matice
        C.append(row)
    # vrat vygerovany seznam seznamu (matici)
    return C
 
# funkce odecte od sebe matice
def subtract_matrices(A,B):
    # zjistime jeji velikost (bez obav, je zajisteno, ze jsou obe stejne velke a ctvercove)
    size = len(A)
    # vysledek
    C = []
    # pro kazdy radkovy index ...
    for row_i in range(size):
        # ... vytvor prazdny seznam reprezentujici novy radek
        row = []
        # ... pro kazdy sloupcovy index (v novem radku) ...
        for col_i in range(size):
            # ... odecti cisla na prislusnych indexech v maticich A a B...
            el = A[row_i][col_i] - B[row_i][col_i]
            # ... a cislo pridej do radku ...
            row.append(el)
        # ... ted je radek hotovy, tak ho pridej do matice
        C.append(row)
    # vrat vygerovany seznam seznamu (matici)
    return C
 
# vynasobi matici danym cislem
def multiply_matrix(k,A):
    # zjistime jeji velikost (bez obav, je zajisteno, ze matice ctvercova)
    size = len(A)
    # vysledek
    C = []
    # pro kazdy radkovy index ...
    for row_i in range(size):
        # ... vytvor prazdny seznam reprezentujici novy radek
        row = []
        # ... pro kazdy sloupcovy index (v novem radku) ...
        for col_i in range(size):
            # ... vynasob cislo na prislusnych indexech v maticich A, cislem k...
            el = k*A[row_i][col_i]
            # ... a cislo pridej do radku ...
            row.append(el)
        # ... ted je radek hotovy, tak ho pridej do matice
        C.append(row)
    # vrat vygerovany seznam seznamu (matici)
    return C
 
# funkce pro kontrolu velikosti matice
def check_size(size):
    # matice nemuze mit velikost mensi nez 1 ...
    if size < 1:
        print("Matice nemuze mit velikost mensi nez 1.")
        return False
    # ... ani nemuze byt moc velka ...
    elif size > MAX_SIZE:
        print("Matice nemuze mit velikost vetsi nez " + str(MAX_SIZE))
        return False
    # ... jinak je ale v pohode
    else:
        return True
 
# funkce pro kontrolu operace
def check_operation(oper):
    if (oper == "+") or (oper == "-") or (oper == "*"):
        return True
    else:
        print("Zadana neplatna operace!")
        return False
 
# funkce pro vykonani scitani
def execute_addition(size):
    # 1. vygeneruj obe matice
    A = generate_matrix(size)
    B = generate_matrix(size)
    # 2. secti matice
    C = add_matrices(A,B)
    # 3. vytiskni matice i jejich soucet
    print_matrix(A)
    print("+")
    print_matrix(B)
    print("=")
    print_matrix(C)
 
# funkce pro vykonani odcitani
def execute_subtraction(size):
    # 1. vygeneruj obe matice
    A = generate_matrix(size)
    B = generate_matrix(size)
    # 2. odecti matice
    C = subtract_matrices(A,B)
    # 3. vytiskni matice i jejich rozdil
    print_matrix(A)
    print("-")
    print_matrix(B)
    print("=")
    print_matrix(C)
 
# funkce pro vykonani nasobeni cislem
def execute_multiplication(size):
    # 1. vygeneruj matici ...
    A = generate_matrix(size)
    # ... a nahodnym cislem (treba v rozsahu [0,1) )
    k = random.random()
    # 2. vynasob matici cislem
    C = multiply_matrix(k,A)
    # 3. vytiskni cislo, matici i vysledek
    print("{:7.2f}".format(k))
    print("*")
    print_matrix(A)
    print("=")
    print_matrix(C)
 
# 1. nacti a zkontroluj velikost ...
size = int(input("Zadej velikost matice: "))
is_size_ok = check_size(size)
#  ... je-li ok, tak:
if is_size_ok:
    # 2. nacti a zkontroluj operaci
    operation = input("Zadejte operaci (+/-/*): ")
    is_operation_ok = check_operation(operation)
    # 3. je-li operace ok, pokracuj
    if is_operation_ok:
        # 4. rozhodni, jakou operaci budeme vykonavat
        if operation == "*":
            execute_multiplication(size)
        elif operation == "+":
            execute_addition(size)
        elif operation == "-":
            execute_subtraction(size)


Rozšíření 3.4

# author kubikji2
 
import random
 
# maximalni velikost matic
MAX_SIZE = 10
 
# minimalni hodnota v matici
MIN_NUM = -10
# maximalni hodnota v matici
MAX_NUM = 10
# rozsah hodnot v matici
# '-> POZNAMKA: vsimni si, ze konstanta je psana velkymi pismena a je tedy
#               pro Python neco jineho nez `range` ve for-cyklu
RANGE = MAX_NUM-MIN_NUM
 
# funkce vygeneruje matici zadane velikosti
def generate_matrix(size):
    # vytvor prazdny seznam reprezentujici matici
    mat = []
    # pro kazdy radkovy index
    for row_i in range(size):
        # ... vytvor prazdny seznam reprezentujici novy radek
        row = []
        # ... pro kazdy sloupcovy index (v novem radku) ...
        for col_i in range(size):
            # ... nahodne vygeneruji cislo ...
            el = random.random()*(RANGE)+MIN_NUM  # [1]
            # ... a cislo pridej do radku ...
            row.append(el)
        # ... ted je radek hotovy, tak ho pridej do matice
        mat.append(row)
    # vrat vygerovany seznam seznamu (matici)
    return mat
 
# [1] altenativne lze pouzit randomrange, ktery generuje cela cisla:
#     el = random.randrange(MIN_NUM, MAX_NUM)
 
# funkce vytiskne matici
def print_matrix(mat):
    # zjistime jeji velikost (bez obav, je zajisteno, ze je ctvercova)
    size = len(mat)
    # pro kazdy radkovy index ...
    for row_i in range(size):
        # ... a kazdy sloupcovy index ...
        for col_i in range(size):
            # ... vypis cislo na prislusnych indexech ...
            el = mat[row_i][col_i]
            # ... celkem 7 znaku:
            #     '-> minimum a maximum je dvojmistne, navic mozne minus,
            #         tecka, dve desetinna mista a jedna oddelujici mezera
            print("{:7.2f}".format(el), end="")
        # zalomeni radku
        print()
 
# funkce secte matice
def add_matrices(A,B):
    # zjistime jeji velikost (bez obav, je zajisteno, ze jsou obe stejne velke a ctvercove)
    size = len(A)
    # vysledek
    C = []
    # pro kazdy radkovy index ...
    for row_i in range(size):
        # ... vytvor prazdny seznam reprezentujici novy radek
        row = []
        # ... pro kazdy sloupcovy index (v novem radku) ...
        for col_i in range(size):
            # ... secti cisla na prislusnych indexech v maticich A a B...
            el = A[row_i][col_i] + B[row_i][col_i]
            # ... a cislo pridej do radku ...
            row.append(el)
        # ... ted je radek hotovy, tak ho pridej do matice
        C.append(row)
    # vrat vygerovany seznam seznamu (matici)
    return C
 
# funkce odecte od sebe matice
def subtract_matrices(A,B):
    # zjistime jeji velikost (bez obav, je zajisteno, ze jsou obe stejne velke a ctvercove)
    size = len(A)
    # vysledek
    C = []
    # pro kazdy radkovy index ...
    for row_i in range(size):
        # ... vytvor prazdny seznam reprezentujici novy radek
        row = []
        # ... pro kazdy sloupcovy index (v novem radku) ...
        for col_i in range(size):
            # ... odecti cisla na prislusnych indexech v maticich A a B...
            el = A[row_i][col_i] - B[row_i][col_i]
            # ... a cislo pridej do radku ...
            row.append(el)
        # ... ted je radek hotovy, tak ho pridej do matice
        C.append(row)
    # vrat vygerovany seznam seznamu (matici)
    return C
 
# vynasobi matici danym cislem
def multiply_matrix(k,A):
    # zjistime jeji velikost (bez obav, je zajisteno, ze matice ctvercova)
    size = len(A)
    # vysledek
    C = []
    # pro kazdy radkovy index ...
    for row_i in range(size):
        # ... vytvor prazdny seznam reprezentujici novy radek ... 
        row = []
        # ... pro kazdy sloupcovy index (v novem radku) ...
        for col_i in range(size):
            # ... vynasob cislo na prislusnych indexech v maticich A, cislem k...
            el = k*A[row_i][col_i]
            # ... a cislo pridej do radku ...
            row.append(el)
        # ... ted je radek hotovy, tak ho pridej do matice
        C.append(row)
    # vrat vygerovany seznam seznamu (matici)
    return C
 
# funkce pro kontrolu velikosti matice
def check_size(size):
    # matice nemuze mit velikost mensi nez 1 ...
    if size < 1:
        print("Matice nemuze mit velikost mensi nez 1.")
        return False
    # ... ani nemuze byt moc velka ...
    elif size > MAX_SIZE:
        print("Matice nemuze mit velikost vetsi nez " + str(MAX_SIZE))
        return False
    # ... jinak je ale v pohode
    else:
        return True
 
# funkce pro kontrolu operace
def check_operation(oper):
    if (oper == "+") or (oper == "-") or (oper == "*"):
        return True
    else:
        print("Zadana neplatna operace!")
        return False
 
# funkce pro kontrolu zadaneho cisla
def check_number(num):
    if num >= MIN_NUM and num <= MAX_NUM:
        return True
    else:
        print("Zadane cislo mimo rozsah [{},{}]".format(MIN_NUM, MAX_NUM))
        return False
 
# funkce pro opakovane cteni prvku matice
def read_single_number():
    num = float(input(""))
    is_num_ok = check_number(num)
    # dokud neni nactene cislo ok, tak otravuj uzivatele
    while not is_num_ok:
        num = float(input("Zkus to znovu: "))
        is_num_ok = check_number(num)
    return num
 
# funkce pro nacteni cele matice danne velikosti
def read_matrix(size):
    # vysledek
    mat = []
    # pro kazdy radkovy index ...
    for row_i in range(size):
        # ... vytvor prazdny seznam reprezentujici novy radek ... 
        row = []
        # ... pro kazdy sloupcovy index (v novem radku) ...
        for col_i in range(size):
            # ... nacti od uzivatele cislo ...
            print("Zadavas cislo na indexu [{},{}]: ".format(row_i, col_i))
            num = read_single_number()
            # ... a cislo pridej do radku ...
            row.append(num)
        # ... ted je radek hotovy, tak ho pridej do matice
        mat.append(row)
    # vrat nacteny seznam seznamu (matici)
    return mat
 
 
# funkce pro vykonani scitani
def execute_addition(size):
    # 1. nacti obe matice
    print("Zadavas matici A:")
    A = read_matrix(size)
    print("Zadavas matici B:")
    B = read_matrix(size)
    # 2. secti matice
    C = add_matrices(A,B)
    # 3. vytiskni matice i jejich soucet
    print_matrix(A)
    print("+")
    print_matrix(B)
    print("=")
    print_matrix(C)
 
# funkce pro vykonani odcitani
def execute_subtraction(size):
    # 1. nacti obe matice
    print("Zadavas matici A:")
    A = read_matrix(size)
    print("Zadavas matici B:")
    B = read_matrix(size)
    # 2. odecti matice
    C = subtract_matrices(A,B)
    # 3. vytiskni matice i jejich rozdil
    print_matrix(A)
    print("-")
    print_matrix(B)
    print("=")
    print_matrix(C)
 
# funkce pro vykonani nasobeni cislem
def execute_multiplication(size):
    # 1. nacti cislo ...
    print("Zadavas cislo k: ")
    k = read_single_number()
    # ... nacti matici
    print("Zadavas matici A:")
    A = read_matrix(size)
    # 2. vynasob matici konstantou
    C = multiply_matrix(k,A)
    # 3. vytiskni cislo, matici i vysledek
    print("{:7.2f}".format(k))
    print("*")
    print_matrix(A)
    print("=")
    print_matrix(C)
 
# 1. nacti a zkontroluj velikost ...
size = int(input("Zadej velikost matice: "))
is_size_ok = check_size(size)
#  ... je-li ok, tak:
if is_size_ok:
    # 2. nacti a zkontroluj operaci
    operation = input("Zadejte operaci (+/-/*): ")
    is_operation_ok = check_operation(operation)
    # 3. je-li operace ok, pokracuj
    if is_operation_ok:
        # 4. rozhodni, jakou operaci budeme vykonavat
        if operation == "*":
            print("Vybral si nasobeni cislem ve tvaru k * A.")
            execute_multiplication(size)
        elif operation == "+":
            print("Vybral si scitani matic ve tvaru A + B.")
            execute_addition(size)
        elif operation == "-":
            print("Vybral si odcitani matic ve tvaru A - B.")
            execute_subtraction(size)


Úkol 4

# proposed by LaSer
 
numbers = [5, 6, -11, 7, 3, 0, -5]
 
print("pred:", numbers)
 
unordered_idx = 0
while unordered_idx < len(numbers) - 1:
    for index in range(unordered_idx, len(numbers)):
        if numbers[unordered_idx] > numbers[index]:
            numbers[unordered_idx], numbers[index] = numbers[index], numbers[unordered_idx]
    unordered_idx += 1
 
print("po:", numbers)


Úkol 5

# proposed by jiri.moravcik
n = int(input('Zadejte vysku Pascalova trojuhelniku: '))
 
# vypocet podle
# https://en.wikipedia.org/wiki/Pascal's_triangle
# "Calculating a row or diagonal by itself"
 
rows = []
for line in range(1, n + 1):
    num = 1
    row = []
    for i in range(1, line + 1):
        row.append(num)
        num = int(num * (line - i) / i)
    rows.append(row)
 
# pokrocilejsi formatovani tisku
 
last_row_length = len(' '.join(map(str, rows[-1])))
if last_row_length % 2 != 0:
    last_row_length += 1
for row in rows:
    row_to_print = ' '.join(map(str, row))
    row_length = len(row_to_print)
    if row_length % 2 != 0:
        row_length += 1
    spaces_to_print = (last_row_length - row_length) // 2
    for i in range(spaces_to_print):
        print(" ", end="")
    print(row_to_print, end="")
    for i in range(spaces_to_print):
        print(" ", end="")
    print("")


Rekurze

Úkol 1

# proposed by mareddan, adapted by kubikji2
 
import random
 
MIN_INT = 1
MAX_INT = 100
 
# vnejsi funkce s jednoduchym rozhranim
def generate_random_array(length):
    return add_to_array_recursive([], length)
 
# rekurzivni pridavani do seznamu
def add_to_array_recursive(my_list, remaining_els):
    # ukoncovaci podminka
    # '-> vrat seznam, kdyz pocet zbyvajicich prvku je 0 ...
    # '-> vrat (prazdny) seznam, i kdyz uzivatel zadal zapornou delku
    if remaining_els <= 0:
        return my_list
    # ... jinak vygeneruj novy prvek ...
    el = random.randint(MIN_INT, MAX_INT)
    # ... vloz ho do listu ...
    my_list.append(el)
    # ... a skoc o jednu uroven rekurze niz ---------------v
    return add_to_array_recursive(my_list, remaining_els - 1)
 
 
TEST_LEN = 10
generated_array = generate_random_array(TEST_LEN)
print("Nahodne generovane pole o", TEST_LEN, "prvcich:", generated_array)


Úkol 2

# proposed by mareddan, adapted by kubikji2
 
# rekurzivni faktorial
def factorial(x):
    # je-li x rovno 1, vrat jednicku ...
    if x == 1:
        return 1
    # ... jinak vrat: x.(x-1)!
    return x * factorial(x-1)
 
TEST_NUMBER = 5
result = factorial(TEST_NUMBER)
print("Faktorial cisla", TEST_NUMBER, "je:", result)


Úkol 3

# author kubikji2
 
# rekurzivni Fibonacci
def fibonacci(x):
    # nulty clen Fibbonaciho posloupnosti je nula (zde i pro x < 0) ...
    if x <= 0:
        return 0
    # ... prvni a druhy clen Fibonacciho jsou jedna ...
    elif x <= 2:
        return 1
    # ... a vechny ostatni jsou souctem dvou predchazejicich clenu
    return fibonacci(x - 1) + fibonacci(x - 2)
 
number = int(input("Zadej poradi ve fibonacciho posloupnosti: "))
result = fibonacci(number)
print("{}-ty prvek Fibonacciho posloupnosti ma hodnotu {}".format(number, result))


Úkol 4

# proposed mareddan, riskoana, adapted by kubikji2
 
# vnejsi funkce s jednoduchym rozhranim pro generovani matice
def generate_matrix(size):
    return add_to_matrix(size, MAX_NUMBER, [])
 
# rekurzivni funkce pro pridani radku (sub array)
def add_to_matrix(size, max_number, matrix):
    # ukoncovaci podminka
    # '-> vrat matici, kdyz maximalni cislo k pridani je mensi nez 0 ...
    # '-> vrat (prazdnou) matici, i kdyz uzivatel zadal zapornou velikost
    if max_number <= 0:
        return matrix
    # ... jinak vytvor pod pole (radek matice) ... 
    sub_array = add_to_sub_array(size, max_number, [])
    # ... a to pridej do matice ...
    matrix.append(sub_array)
    # ... a skoc o uroven rekurze niz ------v
    return add_to_matrix(size, max_number - size, matrix)
 
# rekurzivni pridavani prvku do seznamu
def add_to_sub_array(size, max_number, array):
    # ukoncovaci podminka
    # '-> vrat seznam, kdyz pocet zbyvajicich prvku je 0 ...
    # '-> vrat (prazdny) seznam, i kdyz uzivatel zadal zapornou delku
    if size <= 0:
        return array
    # ... jinak pridej aktualni cislo do seznamu ...
    array.append(max_number)
    # ... a skoc o uroven rekurze nize
    return add_to_sub_array(size - 1, max_number - 1, array)
 
SIZE = 5
MAX_NUMBER = SIZE * SIZE - 1
result = generate_matrix(SIZE)
print(str(SIZE) + "x" + str(SIZE) + " matrix is:", result)

Úkol 5

# proposed by LaSer
 
# chessboard row/column coordinates in range 0 - 8 (9 squares)
# as array indexes always start at 0 this is easier to code
# than using more "human readable" 1 - 9 range
 
# a 9x9(!) chessboard
chessboard = [
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0]
]
 
# knight moves are explicitly listed here
# can be done in a shorter but imho less clear way
knightMovesList = [
    [-1, -2],
    [-2, -1],
    [-1, 2],
    [-2, 1],
    [1, -2],
    [2, -1],
    [1, 2],
    [2, 1]
]
 
def knight_move(row, column, move_count):
    # mark our current position
    chessboard[row][column] = 1
    # end condition
    if move_count > 0:
        for by_row, by_column in knightMovesList:
            to_row = row + by_row
            to_column = column + by_column
            # prevent jumping off the board
            if 0 <= to_row <= 8 and 0 <= to_column <= 8:
                knight_move(to_row, to_column, move_count - 1) # decrease count
    # (unmarked) return happens, when end condition is reached
 
def print_chessboard():
    for row in chessboard:
        for square in row:
            print(square, end=" ")
        print("")
 
moves = 3 # this includes the initial move to square 4,4...
 
knight_move(4, 4, moves - 1) # ...so decrement before calling the recursion
print_chessboard()

courses/pri-bootcamp/solutions/day4.txt · Last modified: 2022/09/11 23:03 by kubikji2