"""Téma č. 8 Porovnání dvou čísel"""

while True:  # nekonečný cyklus
    
    # kod
    try:
        a = float(input("Zadej první číslo: "))    # vstup z klávesnice a převod na float
        b = float(input("Zadej druhé číslo: "))    # vstup z klávesnice a převod na float
    except Exception:    # když dojde k výjimce
        print ("Špatné zadání, zadej znovu")  # výstup
        continue    # vyskoč z aktuálního cyklu a začni nový
        
    if (a>b):
        print ("první číslo je větší")  # výstup
    else:
        print ("druhé číslo je větší")  # výstup
    
    odpo = input("Pokračovat? a/n")
    if (odpo == "n"):
            break   # vyskoč z cyklu úplně
        
print("Konec programu")   # konec, po vyskočení z cyklu

"""
Program pro zjištění dělitelnosti 2,3, ...
Zadání, výpočet modulo, if zbytek==0, je číslo dělitelné beze zbytku
"""
while True:     # nekonečný cyklus
    vstup=input("Zadej číslo nebo q pro ukončení programu ") # uživatel zadá číslo
    if (vstup=="Q" or vstup=="q"):  # if quit, ukončit program
        break   # ukonci cyklus a i program
    try:                    # ošetření vstupu
        cislo = int(vstup)  # if uživatel nezadá číslici, dojde k výjimce
    except:
        print("Špatné zadání, znovu")
        continue      # nový cyklus

    if (cislo%3==0):  # kontrola zbytku po dělění
        print("Cislo je delitelné 3")
    else:
        print("Cislo není delitelné 3")

 

"""
Téma č. 11 Rozlišení čísel na lichá/sudá, zadání z klávesnice za použití nekonečného cyklu
"""

while True:  # nekonečný cyklus
    try:
        a = int(input("Zadej celé číslo: "))    # vstup z klávesnice a převod na int
    except Exception:    # když dojde k výjimce
        print ("Špatné zadání, zadej znovu")  # výstup
        continue    # vyskočí z aktuálního cyklu a začni nový
        
    if (a%2==0):    # je zbytek po dělení dvěma rovný nule?
        print ("Číslo je sudé")   # výstup
    else:
        print ("Číslo je liché")  # výstup    
   
    odpo = input("Pokračovat? a/n")
    if (odpo == "n"):
            break   # vyskoč z cyklu úplně
    

print("Konec programu")   # konec
"""Téma č. 17 Nalezení prvku s nejmenším číslem v seznamu"""

seznam = [11,22,33,44,0,258,999,1000,23,-24,9,-3,4,6]   # např.
#nejv = float("inf") # do proměnné dám nejv číslo, tj. každé číslo bude menší než toto NEBO
nejm = seznam[0]  # možná varianta- buď bude nejmenší toto číslo, nebo jiné v seznamu
# prohédnu celý seznam
for i in range(0,len(seznam)): # projde všechny prvky seznamu
    if seznam[i]<nejm:  # if je nejaky prvek < nejm, přiřaď ho do nejm
        nejm = seznam[i]

print(seznam)  # vytiskne  seznam
print("Nejmenší číslo je : ",nejm)   # vytiskne nejmenší číslo seznamu
""" Téma č. 6 Vyhodnocení diskriminantu kvadratické rovnice"""

while 1:    # nekonečný cyklus
    try:    # ošetřím výjimky - mohou nastat při převodu na float
        a = float(input("a: "))  # ax2 + bx + c =0
        b = float(input("b: "))
        c = float(input("c: "))
        break  # správné zadání, vyskoč z cyklu
    except Exception:
        print("Chyba zadání ", Exception)
        continue   # na začátek cyklu
    break   # když nejdojde k výjimce, je zadání v proměnných
            # ukončí cyklus

D = b**2 - (4*a*c)   # výpočet D

# vyhodnocení
if (D > 0):
    print("2 kořeny")
elif(D == 0):
    print("1 dvojnásobný kořen")
else:
    print("Nema reseni v oboru reálných cisel")
""" Téma č. 13 nový seznam pouze sudých/lichých čísel ze zadaného seznamu"""

seznam = [1,2,3,4,5,6,7,8,9,10,11,12]   # příklad zadaného seznamu
suda_seznam = []                        # prázdný seznam sudých

for i in range(len(seznam)):            # prochází seznam
    if(seznam[i]%2 == 0):               # if modulo dva = 0, je sudé
        suda_seznam.append(seznam[i])   # přidej do seznamu sudých

print(suda_seznam)
"""
Téma č. 15 Výměna m-tého a n-tého prvku v seznamu, zadání seznamu z klávesnice
budeme zadávat seznam z řetězců, nepřevádíme vstup (ale můžeme, jde to s libovolnými datovými typy
"""

seznam =[]  # vytvoříme prázdný seznam
dale ="a"  # proměnná musí existovat před testem v cyklu
while dale != "n":  # opakuj dokud neodpoví zadavatel n
    
    # kod zadávání
    prvek_seznamu = input("Zadej prvek seznamu a stiskni enter: ")
    seznam.append(prvek_seznamu) 
    dale = input("Pokračovat? a/n: ")  # chceme ještě dále zadávat?
    
    
# výměna prvků, šlo by i čísla prvků zadávat ze vstupu
print("Seznam před výměnou prvků: ",seznam)          # seznam před výměnou prvků

pomocna = seznam[0]    # první prvek umístím do pom. proměnné
seznam[0] = seznam[1]  # na pozici 0 přiřadím prvek z pozice 1
seznam[1] = pomocna    # na pozici 1 dám prvek z pomocné prom.

print("Seznam po výměně prvků: ",seznam)          # seznam po výměně prvků
        
print("Konec programu")   # konec
""" Téma č. 25 Program pro zašifrování a dešifrování slova zadaného z klávesnice"""

slovo = input("Zadej slovo: ")
klic =int(input("Zadej klíč: "))

def sifr(slovo,klic):
    sifra = ""
    for i in range(len(slovo)):          # projde všechny znaky slova, lze zapsat i jinak
        sifra+=(chr(ord(slovo[i])+klic)) # příslušný znak slova převede na jeho číselnou reprezentaci a přičte klíč
                                         # potom nové číslo převede zpět na znak a připojí znak k řetězci 
    return sifra                         # funkce vrátí zašifrované slovo

def desifr(sifra,klic):
    slovo = ""
    for i in range(len(sifra)):          # projde všechny znaky slova
        slovo+=(chr(ord(sifra[i])-klic)) # příslušný znak slova převede na jeho číselnou reprezentaci a odečte klíč
                                         # potom nové číslo převede zpět na znak a připojí znak k řetězci
    return slovo                         # funkce vrátí dešifrované slovo

print(sifr(slovo,klic))                 # volání funkce, vytiskne zašifrované slovo
print(desifr(sifr(slovo,klic),klic))         # volání funkce, vytiskne dešifrované slovo

# pozn. slovo, sifra, klic se vyskytuje v programu vícekrát, ale mohou to být různé proměnné

Řadicí algoritmus. Cílem je seřadit zadaný seznam dle velikosti.

"""
Select sort
Vybere vždy ze zbytku největší prvek a ukládá je vlevo na začáek zbytku.
""" 

seznam = [12,13,1,25,13,16,1,8,2]  # např.

print("neseřazeno:")
print(seznam)

for i in range (0,len(seznam)-1):  # prochází celý seznam-1, poslední prvek netřeba řadit
    maxindex= i                     # index-pozice, na kterém je největší prvek
    for j in range (i+1,len(seznam)):  # prochází neseřazený zbytek seznamu od i+1 a vybírá největší prvek
        if (seznam[j] > seznam[maxindex]):  # if prvek na indexu j > prvek na maxindexu
            maxindex=j          # dej na maxindex(pozici největšího prvku) největší prvek
    # potom přehodí řazený prvek, který je na pozici maxindex, na pozici i
    tmp = seznam[i]             # nakonec prohoď prvky, prvek na indexu i odlož
    seznam[i]=seznam[maxindex]  # na přední místo dej prvek na maxindexu
    seznam[maxindex]=tmp        # do zbytku seznamu na maxindexu dej původní prvek na indexu i


print("seřazeno:") 
print(seznam)       # vytiskne seřazený seznam

Řadicí algoritmus. Cílem je seřadit zadaný seznam dle velikosti.

"""
Insert sort
Vezme následující prvek a vkládá ho na příslušnou správnou pozici seřazené části seznamu vlevo.

"""
seznam = [12,13,1,25,13,16,1,8,2]  # např.

print("neseřazeno:")
print(seznam)

for i in range (0,len(seznam)-1):  # prochází celý seznam -1
    j=i+1       # vezme další prvek po prvních seřazených, na začátku je to druhý prvek
    tmp = seznam[j]   # umístí ho do pom. proměnné   
    # v cyklu vytvořím místo a uloží nový prvek v tmp na správné místo   
    while j>0 and tmp>seznam[j-1]:   # dokud není zleva na začátku, uvolní místo hodnotě
        seznam[j]=seznam[j-1]  # posouvá prvky doprava, dokud řazený prvek je menší, než stávající
        j=j-1    # sníží proměnnou cyklu
    seznam[j]=tmp  # řazený prvek, který je v tmp uloží o jeden dopředu

print("seřazeno:")
print(seznam)

 

Řadicí algoritmus. Cílem je seřadit zadaný seznam dle velikosti.

"""
Bubble sort
Porovnává dva sousední prvky a větší řadí vlevo, "nějvětší postupně probublává"
"""

seznam = [12,13,1,25,13,16,1,8,2] # např.

print("neseřazeno:")
print(seznam)

for i in range(0,len(seznam)-1):  # prochází celý seznam ikrát - kolik je prvků-1(poslední cyklus by neměl význam)
    for j in range (0,len(seznam)-1-i):  # jeden průchod - vnitřní cyklus, zkrátí se o seřazenou část
        if (j<len(seznam)-1):  # musím ošetřit délku seznamu, abych neměl j+1 mimo seznam
            if (seznam[j] < seznam[j+1]): # if pravý prvek>levý, prohoď
                tmp=seznam[j]             # prohoď dva sousední prvky
                seznam[j]=seznam[j+1]  
                seznam[j+1]=tmp

print("seřazeno:")
print(seznam)
"""Téma č. 5 Tkinter, Canvas, zobrazení základních geometrických tvarů"""

import tkinter  # nahraji knihovnu grafických funkcí

okno = tkinter.Tk()   # vytvořím moje okno, instance třídy Tk

platno = tkinter.Canvas(width="800", height="600",background="yellow")   # vytvořím plátno
platno.pack()   # umístím plátno do okna
platno.create_line(10,15,200,230, fill="red", width=5)   # nakreslím úsečku, barva červená
platno.create_rectangle(100,150,300,400, fill = "white", outline="blue", width=10)  # obdélník
#fill = výplň, outline = obrys, width = šířka obrysu
platno.create_oval(10,10,200,500)  # elipsa pomyslně vepsaná do zadaného obdélníku
platno.create_polygon(10,10,30,90,50,60,10,10) # v tomto případě trojúhelník - 3 úsečky
platno.create_text(100,100,text="AHOJ", font="Arial 10") # text, souřadnice jsou na střed textu
# u textu mohu zadat další parametry - např. font="Arial 40 bold, fill="blue"

okno.mainloop()  # hlavní smyčka
""" Téma č. 2 převod čísla z desítkové do dvojkové soustavy"""

desitkove=int(input("Zadej desítkové číslo: "))  # vstup, převod na int
dvojkove=""   # výstup - dvojkové číslo, na začátku prázdný řetězec

while (desitkove>=1):    # cyklus dokud není zbytek<1
    zbytek = desitkove%2  # vypočítám zbytek
    desitkove = desitkove//2 # vypočítám nové číslo pro delění 2
    dvojkove = str(zbytek)+dvojkove  # spojuji do řetezce
       
print(dvojkove)  # tiskne výsledek

 

""" Téma 12 Vytvořte generátor pěti náhodných čísel z rozsahu zadaného vstupem"""

import random  # modul s funkcemi pro náhodná čísla

# zadání rozsahu
min = int(input("Zadej minimální číslo: "))    # vstup z klávesnice a převod na int
max = int(input("Zadej maximální číslo: "))    # vstup z klávesnice a převod na int

# vygenerujeme seznam
seznam=[]   # vytvoříme prázdný seznam
for i in range(5):   # rozsah 0 až 5, tj. 5 prvků (cyklus pro 0,1,2,3,4)
    seznam.append(random.randrange(min,max+1))  # do prázdného seznamu přidá náh. číslo
print(seznam)  # vytiskne hotový seznam
""" Téma č. 18 Tkinter - Rozmístění prvků v okně pomocí grid() a pack()
příklad pack()
"""

import tkinter
import tkinter.ttk  # nebo novější prvky label....

root =tkinter.Tk()  # vytvoř okno
label_1 = tkinter.ttk.Label(root, text="Hello world!",background="blue")
label_2 = tkinter.ttk.Label(root, text="   AHOJ   ")
canvas= tkinter.Canvas(width=500,height=500,background="red")

label_1.pack()  # label 1 v okně
label_2.pack()  # label 1 v okně, další prvek pod první
canvas.pack()   # canvas v okně, další prvek pod druhý

root.mainloop()  # hlavní smyčka programu
""" Téma č. 18 Tkinter - Rozmístění prvků v okně pomocí grid() a pack()
"""

import tkinter
import tkinter.ttk  # nebo novější prvky label....

root =tkinter.Tk()  # vytvoř okno
label_1 = tkinter.ttk.Label(root, text="Hello world!",background="blue")
label_2 = tkinter.ttk.Label(root, text="   AHOJ   ")
canvas= tkinter.Canvas(width=500,height=500,background="red")

label_1.grid(column=1, row=1)  # label 1 v pomyslné mřížce sloupec, řádek
label_2.grid(column=2, row=2)  # label 1 v pomyslné mřížce sloupec, řádek
canvas.grid(column=2, row=1)   # canvas v pomyslné mřížce sloupec, řádek

root.mainloop()  # hlavní smyčka programu
""" Téma č. 14 ovládací prvky GUI
Vytváříme instance tříd Label, Button, Entry...
Při vytváření instance můžeme předat argumenty např. text, background atd.
U tlačítka zadáme i jméno fce, která bude volána (command=tiskni).
U Entry, příp. jiných prvků můžeme nastavit proměnnou, pomocí které budeme hodnotu prvku číst/nastavovat (metoda get a set).
Proměnná je spec. typu a je ji třeba deklarovat před použitím. U Entry použijeme proměnnou typu StringVar.
"""

import tkinter
#import tkinter.ttk

okno = tkinter.Tk()   # vytvořím okno

def konec():          # funkce ukončí okno
    okno.quit()
    print("konec")    # do terminálu
    
hodnota_text = tkinter.StringVar()    # proměnná je instance StringVar

def tiskni_entry():  
    print(entry1.get())    # získáme obsah proměnné textboxu, volá metodu get()
   
def nastav_entry():
    entry1.set("AHOJ")     # nastavím obsah textboxu, volá metodu set()

label1 = tkinter.Label(okno,text="Toto je nápis č. 1", background="red")  # vytvoření instance
label1.pack()        # umístění do okna
label2 = tkinter.Label(okno,text="Zadej text", background="yellow")  # vytvoření instance
label2.pack()        # umístění do okna
entry1 = tkinter.Entry(okno, textvariable=hodnota_text)
entry1.pack()

button_nast=tkinter.Button(okno, text="Nastav text Ahoj do entry", background="yellow", command=nastav_entry)    # vytvoření instance
button_nast.pack()              # umístění do okna
button_konec=tkinter.Button(okno, text="Konec programu", background="green", command=tiskni_entry)    # vytvoření instance
button_konec.pack()              # umístění do okna
canvas=tkinter.Canvas(background="blue")
canvas.pack()

okno.mainloop()      # spustím hlavní smyčku



Pěkné vysvětlení je na http://tkinter.py.cz/python_tkinter.html

 

""" Téma č. 19 Tkinter - Tvorba nabídek"""

import tkinter

# funkce, které přiřadíme v command
def test():
    print("Test!")

def konec():
    root.quit()
    
root = tkinter.Tk()  # vytvoříme okno jako instanci třídy Tk, nazveme ho root

# vytvoříme instanci menu - pás, lištu umístíme v okně root 
menubar = tkinter.Menu(root)    
root.config(menu=menubar) # voláme metodu okna config() a nastavíme její proměnnou menu na menubar

# do tohoto pásu nabídek vytvoříme "kaskádu" položek menu
# nyní vytváříme instance menusoubor, menuedit, menuhelp... v menubar
menusoubor = tkinter.Menu(menubar)    # vytvoříme menu File jako instance menu v menubaru
menubar.add_cascade(label="File",menu=menusoubor) # přidáme do menu, zavoláme metodu add_cascade(), přiřadíme název a menu

menuedit = tkinter.Menu(menubar)    # menu Edit
menubar.add_cascade(label="Edit",menu=menuedit ,underline=0) # underline - 1.znak je E pro Alt_e

menuhelp = tkinter.Menu(menubar)    # menu Help
menubar.add_cascade(label="Help",menu=menuhelp)

# do těchto rozbalovacích nabídek přidáme položky metodou add_command (to už nejsou menu)
menusoubor.add_command(label="Otevřít",command=test) # přiřadíme fci, pouze název fce (nevoláme ji)
menusoubor.add_command(label="Uložit",command=konec) 
menusoubor.add_command(label="Uložit jako")
menusoubor.add_command(label="Konec",command=konec)
# zvýraznění - horké klávesy např. zde Alt-D
menuedit.add_command(label="Další",underline=0, command=test) # underline - 1.znak je D pro zkratku Alt_d

root.mainloop()  # hlavní smyčka programu