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

Den 3

Opakování for-cyklu

Úkol 1

Aritmetická posloupnost je posloupnost čísel, která má stálý rozdíl sousední členů. Tomuto rozdílu říkáme diference. Například posloupnost

0 5 10 15 20 25 30 ...

má diferenci 5.

  • Napište program, který vypíše prvních dvacet členů této posloupnosti.
  • Rozšiřte program tak, aby nejprve načetl požadovanou diferenci a následně vypsal dvacet členů odpovídající posloupnosti. Příklad:
Zadejte diferenci: 7
0 7 14 21 28 35 42 49 56 63 70 77 84 91 98 105 112 119 126 133
  • Rozšiřte program tak, aby nejprve načetl první člen posloupnosti a diferenci a následně vypsal prvních dvacet členů odpovídající posloupnosti. Příklad:
Zadejte prvni clen posloupnosti: 14
Zadejte diferenci: 7
14 21 28 35 42 49 56 63 70 77 84 91 98 105 112 119 126 133 140 147
Řešení

# Vasek
a = int(input("Zadejte diferenci: "))
b = int(input("Zadejte prvni clen: "))
 
for i in range(b,a*20,a):
    print(i)

Úkol 2

Jednou z možností, jak můžeme odhadnout hodnotu čísla pi, je následující rovnice:

Napište program, který podle této rovnice odhadne hodnotu pi (zkuste co nejpřesněji).

Jako referenční hodnotu Pi můžete použít knihovnu math:
import math
 
refPi = math.pi
Řešení

 
# Jirka
 
suma = 0 # vnitrek zavorky z rovnice
 
# 10000 iteraci cyklu dava pomerne hezke reseni
# s vetsim poctem opakovani je hodnota pi presnejsi
for i in range(0,1000):
 
    clen = 1/(2*i+1) # aktualni clen posloupnosti v zavorce
 
    # rozhodovani o znamenku
    if(i%2 == 0):
        suma = suma + clen
    else:
        suma = suma - clen
 
pi = 4*suma
 
print(pi)

Opakování vnořeného for-cyklu

Úkol 1

Vykreslete následující matice:

1 1 1 1 1
0 0 0 0 0
1 1 1 1 1
0 0 0 0 0
1 1 1 1 1

1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
Řešení

# Cvicici (Jirka)
 
size = 5 # VOLITELNE, velikost matice
 
# prvni matice 
for i in range(0, size):
    for j in range(0, size):
        # kdyz ke radek sudy, tak na nem jsou jednicky, jinak nuly
        if(i%2==0): 
            print("1 ", end="")
        else:
            print("0 ", end="")
    # zalomeni radku    
    print("")
 
# prazdny radek mezi maticemi
print("")
 
# druha matice
for i in range(0, size):
    for j in range(0, size):
        # kdyz je soucet indexu (i+j) sudym vypis jednicku, jinak nulu
        if((i+j)%2==0):
            print("1 ", end="")
        else:
            print("0 ", end="")
    # zalomeni radku    
    print("") 

Úkol 2

Napište program, který vykreslí tabulku malé násobilky, tj. tabulku všech vzájemných násobků čísel 1 až 10 (dodržte zarovnání v jednotlivých sloupcích):

 1  2  3  4  5  6  7  8  9
 2  4  6  8 10 12 14 16 18
 3  6  9 12 15 18 21 24 27
 4  8 12 16 20 24 28 32 36
 5 10 15 20 25 30 35 40 45
 6 12 18 24 30 36 42 48 54
 7 14 21 28 35 42 49 56 63
 8 16 24 32 40 48 56 64 72
 9 18 27 36 45 54 63 72 81 
K naformátování výpisu čísla a zabírající například 5 míst je možné použít příkaz:
print("%5d" % a)

Další informace o formátování výpisu v dokumentaci.

Řešení

#Lukas Halaska
for i in range(1, 11):
    for j in range(1, 11):
        x = i*j
        if j==1:
            if (len(str(x))==2):
                print(end=str(x))
            else:
                print(" ", end=str(x))
        elif j==10:
            if (len(str(x))==3):
                print(" ", x, sep="")
            elif (len(str(x))==2):
                print("  ", x, sep="")
            else:
                print("   ", x, sep="")
        else:
            if (len(str(x))==2):
                print("  ", end=str(x))
            else:
                print("   ", end=str(x))

#Vojta J.
for k in range (1,10):
    for l in range (1,10):
        print("%2d" % (k*l), end=" ")
 
    print(" ")

Úkol 3

Vykreslete následující obrazce:

X
X X
X X X
X X X X
X X X X X
X X X X X
  X X X X
    X X X
      X X
        X
X X X X X
X       X
X       X
X       X
X X X X X
Řešení

# Cvicici (Jirka)
 
size = 5 # VOLITELNE, velikost matice
 
# prvni obrazec
for i in range(0, size):
    # vypis tolik "X", kolikaty mam radek
    # (nejhornejsi radek je prvni)
    #                   |
    #                   V 
    for j in range(0, i+1):
        print("X ", end="")
    # VOLITELNE, zbytek radku vypln mezerami
    for j in range(0,size-i):
        print("  ", end="")
    # zalomeni radku    
    print("")
 
# volny radek mezi obrazci
print("")
 
# druhy obrazec
for i in range(0, size):
    # vypis tolik mezer, kolikaty mame radek
    # (nejhornejsi radek je nulty)
    for j in range(0, i):
        print("  ", end="")
    # zbytek radku vypln "X"
    for j in range(0,size-i):
        print("X ", end="")
    print("")
 
# volny radek mezi obrazci
print("")
 
# treti obrazec
for i in range(0, size):
    for j in range(0, size):
        # "X" jsou v prvnim a poslednim radku a take v prvnim a poslednim sloupci
        # plati-li alespon jedno, vypis "X"
        if(i==0) or (i==size-1) or (j==0) or (j==size-1):
            print("X ", end="")
        else:
            print("  ", end="")
    print("")

While cyklus

Dalším typem cyklu je while cyklus. Ten opakuje vnitřní příkazy do té doby, dokud platí jeho podmínka.

V následujícím příkladě se vypisuje text “Hello world!” do té doby, dokud se hodnota i nesníží na nulu. V každé iteraci se hodnota i sníží o jedna, a tak se tento text vypíše právě 10-krát.

i = 10
while i > 0:
    print("Hello world!")
    i = i - 1

Všechny programy zapsané pomocí for cyklu je možné přepsat i pomocí while cyklu.

Úkoly na while cyklus

Úkol 1

Napište program, který bude číst čísla ze vstupu, dokud uživatel nezadá nulu. Poté vypíše jejich součet.

Upravete tento program tak, aby také vypsal:

  1. délku posloupnosti a počet lichých čísel v posloupnosti
  2. největší číslo
  3. druhé největší číslo
Řešení

# Jan Tosner
 
y = 0
x = 1
z = 0
l = 0
n = 0
s = 0
while x != 0:
	x = int(float(input("Zadejte číslo: ")))
	y = y+x
	z = z+1
	if x%2 != 0:
		l = l+1
	if x > n:
		s = n
		n = x
	elif (x > s):
		s = x
print("Součet je "+str(y)+".")
print("Délka posloupnosti je "+str(z-1)+".")
print("Lichých čísel je "+str(l)+".")
print("Největší číslo je "+str(n)+".")
print("Druhé největší číslo je "+str(s)+".")

Úkol 2

Přečtěte čísla A a B. Vypište nejmenší číslo, které je dělitelné B a je větší než A.

Řešení

# Jan Tosner
 
A = float(input("Zadejte číslo A: "))
B = float(input("Zadejte číslo B: "))
x = 1
while x != 0:
	A = A+1
	x = A%B
print("Nejmenší číslo dělitelné číslem B a je větší než číslo A je: "+str(A)+".")

Úkol 3

Přečtěte na vstupu jedno celé číslo a vypište jeho binární zápis.

Hodnotu posledního bitu můžete určit podle toho, zda-li je zadaté číslo liché.

Vzorový vstup:

21

Vzorový výstup:

10101

Řešení

#Lucka
cislo=int(input("Zadej cislo v desitkove soustave: "))
retezec=""
while cislo>0:
    if cislo%2==0:
        retezec=retezec+"0"
    else:
        retezec=retezec+"1"
    cislo=cislo//2
retezec2=""
for i in range(len(retezec)):
    retezec2=retezec2+retezec[len(retezec)-1-i]
print(retezec2)

#Vojta
import math
deka = int(input("Zadej cislo v desitkove soustave: "))
zbytek = deka
exp = int(math.log(zbytek, 2))+1  
cislo = 0
while(zbytek>0):
    cislo += (zbytek%2)*10**exp
    exp += 1
    zbytek=zbytek//2
 
cislo = int(cislo / 10**(int(math.log(deka, 2))+1)) 
print(cislo)    

Úkol 4

Počítač vygeneruje náhodné číslo od 1 do 100 a vy ho musíte uhádnout. Když odpovíte špatně, počítač vám prozradí, jestli je vygenerované čílo větší nebo menší. Když uhádnete, program končí a pogratuluje vám.

Vygenerovat náhodné číslo je možné pomocí následujícího kódu s použitím balíčku random:
import random
max = 100
to_be_guessed = int(max * random.random()) + 1

Vzorový průběh:

Zkus uhadnout moje cislo: 50
Moje cislo je mensi.
Zkus uhadnout moje cislo: 20
Moje cislo je vetsi.
Zkus uhadnout moje cislo: 30
Moje cislo je vetsi.
Zkus uhadnout moje cislo: 40
Moje cislo je vetsi.
Zkus uhadnout moje cislo: 45
Uhadl jsi :-)
45

Řešení

#Lukas Halaska
import random
a = int(100 * random.random()) + 1
b = int(input("Zkus uhadnout cislo: "))
while b!=a:
    if b>a:
        print("Moje cislo je mensi")
    else:
        print("Moje cislo je vetsi")
    b = int(input("Zkus uhadnout cislo: "))
print("Uhodl jsi")

Úkol 5

Člověk si myslí číslo od 1 do 100 a počítač se jej snaží uhádnout. Může se ovšem zeptat pouze, jestli je hádané čílo větší než nějaká hodnota. Napiště program, který co nejrychleji uhádne toto číslo.

Vzorový průběh:

Myslete si cislo mezi 1 a 100
Je tvoje cislo vetsi nez  50 ? (y/n) 
n
Je tvoje cislo vetsi nez  25 ? (y/n) 
y
Je tvoje cislo vetsi nez  38 ? (y/n) 
y
Je tvoje cislo vetsi nez  44 ? (y/n) 
n
Je tvoje cislo vetsi nez  41 ? (y/n) 
y
Je tvoje cislo vetsi nez  43 ? (y/n) 
n
Je tvoje cislo vetsi nez  42 ? (y/n) 
n
Vase cislo je  42

Řešení

# Jirka a Honza
dolni = 1
horni = 100
 
while horni != dolni:
    stred = ((horni+dolni)//2)
    c = input("Je tvoje cislo vetsi nez " + str(stred) + "? (y/n)")
    if c == "y":
        dolni = stred + 1
    else:
        horni = stred
 
print("Tvoje cislo je: " + str(horni))    

Úkol 6

Načtěte celé číslo ze standardního vstupu a vypište nejmenší prvočíslo, které je větší než zadané číslo.

Řešení

# anonym
 
import math
x = int(input("Zadejte cislo "))
a = 1
nejvetsi = 0
while a!=0:
    x = x + 1
    for i in range (2, int(math.sqrt(x)+1)):
        if x%i == 0:
            a = 2
    if a==1:
        nejvetsi = x
        break
    a = 1            
print(nejvetsi)

Složené datové typy

Seznamy

Pokud pracujeme s větším množstvím hodnot, je téměř nemožné mít pro každou hodnotu vlastní proměnnou. V těchto případech používáme seznam (anglicky list), který je uspořádanou skupinou více hodnot. Seznam vytvoříte pomocí hranatých závorek.

cisla = [3, 5, 7, 11]

Seznam může mít libovolný počet prvků a může tedy být i prázdný!

Přístup k prvkům

Pro zjištění prvku na i-té pozici lze použít indexování.

seznam[i]

Nezapomínejte, že seznam je indexovaný od nuly (tedy první prvek má index 0.) Dokonce je možné indexovat prvky seznamu odzadu.

seznam[-1] # Posledni prvek
seznam[-2] # Predposledni prvek

Pokud prvek seznamu neexistuje, program skončí s chybou, tedy je duležité vědět, jak velký seznam je. Pro tento případ se používá funkce len(), která vrátí počet prvků.

velikost = len(seznam)

Slicing

Pokud chcete získat více prvků, lze použít takzvaný slicing.

seznam2 = seznam[2:4]

Tento příkaz vrátí nový seznam o dvou prvcích s indexy 2 a 3. Obecně slicing funguje podobně jako range, tedy seznam[a:b] bere prvky s indexy <a; b).

Stejně jako u range funguje i takzvanný step, tedy kód

seznam[2:6:2]
vypíše prvky s indexy 2 a 4.

Operace se seznamem

  • append(x) - Přidá prvek na konec seznamu.
  • extend(L) - Na konec seznamu přidá všechny prvky seznamu L.
  • insert(i, x) - Vloží prvek x na pozici i.
  • pop(i) - Odstraní prvek na pozici i a vrátí jeho hodnotu.
  • count(x) Vrátí počet všech výskytů prvků, jejichž hodnota je rovna x.
  • sort() - Seřadí prvky seznamu podle velikosti.
  • reverse() - Obrátí pořadí prvků v seznamu.

Příklady použití:

cisla = [2, 3, 5, 7]  # vytvoreni seznamu
print(cisla)          # vypise [2, 3, 5, 7]
cisla.append(13)      # pridani cisla 13 na konec seznamu
print(cisla)          # vypise [2, 3, 5, 7, 13]
cisla.insert(4, 11)   # pridani cisla 11 na pozici 4
print(cisla)          # vypise [2, 3, 5, 7, 11, 13]
x = cisla.pop(0)      # odstrani prvni cislo ze seznamu
print(cisla)          # vypise [3, 5, 7, 11, 13]   

cisla = [3, 2, 1, 4, 5] 
cisla.sort()          # serazeni seznamu podle velikosti
print(cisla)          # vypise [1, 2, 3, 4, 5]
cisla.reverse()       # obraceni poradi cisel v seznamu  
print(cisla)          # vypise [5, 4, 3, 2, 1]

N-tice

N-tice (anglicky tuple) je datová struktura podobná seznamu. N-tice se od seznamů liší tím, že je nelze měnit, a tedy nelze volat funkce append(), insert(), atd. Proto se používají v případech, kdy data nepotřebujeme a nechceme měnit. N-tici vytvoříte pomocí kulatých závorek.

dny = ("pondeli", "utery", "streda", "ctvrtek", "patek", "sobota", "nedele")

Ze seznam můžeme vytvořit novou n-tici použitím funkce tuple().

Z n-tice můžeme vytvořit nový seznam použitím funkce list().

Úkoly

Úkol 1

Napište program, který načte 10 čísel, uloží je do seznamu a obrátí jejich pořadí. Nepoužívejte funkci reverse().

Řešení

# Jan Tosner
 
seznam = []
for i in range(0,10):
	x = int(float(input("Zadejte číslo: ")))
	seznam.insert(0,x)
print(seznam)

Úkol 2

Napište program, který načte 5 čísel a najde medián.

Řešení

# Stepan
 
numbers = []
y = 5
for i in range (0, 5):
    x = input ("zadejte " + str(y) + " cisel")
    x = int (x)
    numbers.append(x)
numbers.sort ()
z = len (numbers)
if z%2 == 0:
    med = (numbers[z/2]+numbers[(z/2)+1])/2
    print (med)
else:
    med = numbers[(int(z/2))]
    print (med)

Úkol 3

Napište program, který načte 10 čísel najde mezi nimi dvě čísla taková, že jejich rozdíl je největší možný.

Řešení

# Jan Tosner
 
seznam = []
for i in range(0,10):
	x = int(float(input("Zadejte číslo: ")))
	seznam.append(x)
seznam.sort()
print("Jsou to tato čísla:",seznam[-1], "a", seznam[0])

Úkol 4

Napište program, který načte 10 čísel najde mezi nimi dvě čísla taková, že jejich rozdíl je nejmenší možný.

Řešení

# Jan Tosner
 
seznam = []
for i in range(0,10):
	x = int(float(input("Zadejte číslo: ")))
	seznam.append(x)
seznam.sort()
z = seznam[1]-seznam[0]
for i in range(0,9):
	if (seznam[i+1]-seznam[i]) <= z:
		x = seznam[i+1]
		y = seznam[i]
		z = x-y
print("Jsou to tato čísla:",x, "a", y)

Úkol 5

Napište program, který načte 10 čísel a vypíše je seřazené podle velikosti. Nepoužívejte funkci sort().

Řešení

# Jan Tosner
 
seznam = []
for i in range(0,10):
	x = int(float(input("Zadejte číslo: ")))
	seznam.append(x)
for i in range(9,0,-1):
	for j in range(9,0,-1):
		if seznam[j] < seznam[j-1]:
			z = seznam.pop(j)
			seznam.insert(j-1,z)
print(seznam)

Kreslení obrázků

Nechť sem vstoupí jen programátor zručný a zvídavý! Ale vážně, tohle už jsou pokročilé věci!!!

V této sekci se lehce seznámíme s dalším odvětvím informatiky, známým pod pojmem počítačová grafika, a hlavně si tu zopakujeme vše, co se dosud probíralo a co už byste měli ovládat (větvení programu, cykly, funkce, moduly, seznamy).

Pokud jste v terminologii počítačové grafiky trochu zběhlí, pravděpodobně některé informace v následujícím odstavci budete chtít označit jako chybné. V rámci rozsahu osnov BootCampu jsme některé informace zjednodušili na možná ne zcela přesné, ale zato, dle nás, názornější a jednodušší na pochopení.

Každý obrázek v počítači se skládá z mnoha malých čtverečků, kterým se říká pixely. Pixely tvoří pravoúhlou mřížku (označme ji jako bitmapu), která pokrývá celý obrázek (Ano. I tenhle obrázek, který na vás svítí z monitoru!) Jeden pixel typicky v paměti počítače popíšeme pomocí tří čísel. Tato trojice je známá jako RGB. Jedná se o tři základní barvy (červená, zelená a modrá). Každé z těchto tří čísel vyjadřuje, jak moc daná barva ovlivní výslednou barvu celého pixelu. Kombinací hodnot jednotlivých barev (což za nás dělá displej), pak dostaneme výslednou barvu, kterou nám náš monitor odpovídající pixel obarví.

V následujícím cvičení si zkusíme zapsat do paměti počítače posloupnost čísel a necháme počítač, aby tato čísla interpretoval jako hodnoty RGB. Uvidíme, jestli se nám podaří tímto postupem nakreslit nějaký pěkný obrázek.

Paměť počítače pro nás bude jednoduše pythonovský seznam. Do seznamu budeme zapisovat postupně RGB všech pixelů na obrázku, který se snažíme vytvořit. Tento seznam pak uložíme do souboru a počítači řekneme, že tento soubor je obrázek.

Zní to složitě?

Nebojte se, část práce jsme již udělali za vás. Stáhněte si modul libbitmap.py, ve kterém jsou již uložené RGB některých základních barev a který nabízí funkci na zápis seznamu s daty do souboru .PPM, což je jednoduchý obrázkový soubor (mnohem jednodušší než například .PNG, .JPG či jiné, které pravděpodobně znáte).

Ufff. To už je ale textu. Rychle sem hodíme nějaký ukázkový kód, který nakreslí třeba žlutý čtverec o délce strany 50 pixelů.

"""
bitmap_test.py
created by Jan Toth
(c) 2017
 
Ukazka pouziti knihovny 'libbitmap.py'
"""
 
# Importujeme vse z knihovny 'libbitmap.py'
from libbitmap import *
 
# Nastavime si pocatecni hodnoty nasich dat
rozmer = 50
obrazek = []
 
# Zapiseme data do seznamu
# Colours.<barva> nam poskytuje importovana knihovna
   # Pro prehled vsech dostupnych barev nahlednete do knihovny
for i in range(rozmer**2):
	obrazek.extend(Colours.YELLOW)
 
# Ulozime vytvorena data do souboru
# save_image(obrazek, jmeno, sirka, vyska) nam poskytuje importovana knihovna
save_image(obrazek, "zluty_ctverec", rozmer, rozmer)

Přijde vám, že se nic nestalo? Podívejte se do adresáře, ve kterém máte tento skript uložený.

Zdá se vám to jednoduché? Pokud ano, zkuste nakreslit vlastní obrázky a pochlubte se ostatním. Zajímavé mohou být státní vlajky. Začněte například polskou, pak můžete přejít na německou či francouzskou. No a samozřejmě by byla také hezká vlajka česká!

Pokud si vzhled všech vlajek nepamatujete, strejda Google vám určitě poradí ;-)
Pokud by vám nestačily barvy, které vám dává k dispozici poskytnutá knihovna, můžete např. zde vytouženou barvu najít. Potom zkopírujte hexadecimální vyjádření vámi vybrané barvy (ta čísla, která následují po znaku '#') a ve vašem kódu tuto hodnotu pošlete jako argument funkci Colours.get_colour_from_hex(), která vám na oplátku vrátí seznam s RGB hodnotami dané barvy.

from libbitmap import*
moje_barva = Colours.get_colour_from_hex(66ffe0)
# A muzete pouzivat novou barvu!

Pokud vám to jednoduché nepřijde, nebojte se zeptat!

Pokud se budete chtít svými výtvory pochlubit, pravděpodobně je budete chtít zobrazit ve Windows. Tento operační systém však bohužel tak jednoduchý formát, jako je .PPM, nezvládá interpretovat. Pro převod na např. .PNG můžete použít tento online konvertor.

courses/pri-bootcamp/03.txt · Last modified: 2018/09/27 11:02 by kubikji2