Warning
This page is located in archive.

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).

Řešení
TBD

 

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í

Bude zveřejněno na konci třetího dne.

Ú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í

Bude zveřejněno na konci třetího dne.

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í

Bude zveřejněno na konci třetího dne.

Ú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í

Bude zveřejněno na konci třetího dne.

Ú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í

 

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í

Bude zveřejněno na konci třetího dne.

Úkol 2

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

Řešení

Bude zveřejněno na konci třetího dne.

Ú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í

Bude zveřejněno na konci třetího dne.

Ú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í

Bude zveřejněno na konci třetího dne.

Úkol 5

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

Řešení

# Pavlík Dudlík
cisla = [5,4,6,2,1,0]
serazeno=False
for i in range(len(cisla)):
    serazeno = True
    for j in range(len(cisla)-1-i):
        if (cisla[j]>cisla[j+1]):
            cisla[j],cisla[j+1] = cisla[j+1],cisla[j]
            serazeno = False
    if serazeno:
        break    
print(cisla)

TBD

Hry v terminálu

Knihovna textgame.py (0.0.5)

from textgame import *

Textová hra

state = "zacatek"
while state != "konec":
 
    if state == "zacatek":
        print("")
        print("Jsi sladkem ve znamem pivovaru. Je rano a zvoni ti budik.")
        print("Co udelas?")
        print("1: Pujdu do prace.")
        print("2: Zustanu doma.")
        choice = input("Tvoje volba: ")
        if choice == 1:
            state = "vyhra"
        if choice == 2:
            state = "prohra"
 
    if state == "vyhra":
        print("")
        print("Sel jsi do pivovaru a odvedl jsi dobrou praci. Vyhral jsi!")
        state = "konec"
 
    if state == "prohra":
        print("")
        print("Zustal jsi doma a z prace te vyhodili. Prohral jsi.")
        state = "konec"
 
print("Konec hry.")

Kviz

import random
 
pocet = input("Zadejte pocet otazek: ")
for i in range(1, pocet+1):
    otazka = random.randint(1, 2)
    print("")    
 
    if otazka == 1:
        print("Jake je hlavni mesto Australie?")
        print("1. Canberra")
        print("2. Sydney")
        print("3. Praha")
        odpoved = input("Vase odpoved: ")
        if odpoved == 1:
            print("Spravne!")
        else:
            print("Spatne!")
 
    if otazka == 2:
        print("V jakem roce byl zalozen Plzensky Prazdroj?")
        print("1. 1841")
        print("2. 1842")
        print("3. 1843")
        odpoved = input("Vase odpoved: ")
        if odpoved == 2:
            print("Spravne!")
        else:
            print("Spatne!")

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: 2017/09/20 17:39 by kubikji2