Príklad ponuky: Riešenie: vrch. hodnota 3 hodnota 2 hodnota 1

Podobné dokumenty
KEO - Register obyvateľov Prevod údajov

Metóda vetiev a hraníc (Branch and Bound Method)

Vytvorenie používateľov a nastavenie prístupov

Užívateľská príručka systému CEHZ. Základné zostavy Farmy podľa druhu činnosti

Strojový kód, assembler, emulátor počítača

Programovanie v jazyku C - pole treba poorat...

INTERNET BANKING. Platby cez Internet banking VŠETKO, ČO JE MOŽNÉ. with.vub.sk, Bank of

Dealer Extranet 3. Cenové ponuky

PLASTOVÉ KARTY ZÁKAZNÍKOV

KOMISNÝ PREDAJ. Obr. 1

Návod k servisnému programu pre fiskálny modul FM2000. manuál. (c)varos

Modul PROLUC Podvojné účtovníctvo

Import Excel Univerzál

MANUÁL K TVORBE CVIČENÍ NA ÚLOHY S POROZUMENÍM

Externé zariadenia Používateľská príručka

Textový editor WORD. Práca s obrázkami a automatickými tvarmi vo Worde

Microsoft Project CVIČENIE 6 1

DOBROPISY. Dobropisy je potrebné rozlišovať podľa základného rozlíšenia: 1. dodavateľské 2. odberateľské

Microsoft Outlook. Stručný prehľad základných funkcií. Ing.Anna Grejtáková, SPP DFBERG

Konfigurácia IP Bell 02C Dverný vrátnik a FIBARO Home Center 2

Využívanie multifunkčných zariadení Konica Minolta študentmi

Ekvia s.r.o EKVIA PREMIUMPRO. Užívateľský manuál

VYSPORIADANIE PREHRADENÝCH ZÁVÄZKOV A POHĽADÁVOK

ezakazky Manuál uchádzača

2. PRIDANIE ZÁVEREČNEJ PRÁCE DO EVIDENCIE ZÁVEREČNÝCH PRÁC (EZP) A OZNAČENIE PRÁCE AKO FINÁLNEJ.

PODPROGRAMY. Vyčlenenie podprogramu a jeho pomenovanie robíme v deklarácii programu a aktiváciu vykonáme volaním podprogramu.

TomTom Referenčná príručka

ANALÝZA PRÍPADNÉHO ROZDIELU A SPÔSOB JEHO ODSTRÁNENIA

Kombinatorická pravdepodobnosť (opakovanie)

Používateľská príručka: MOODLE

Matematika test. 1. Doplň do štvorčeka číslo tak, aby platila rovnosť: (a) 9 + = (b) : 12 = 720. (c) = 151. (d) : 11 = 75 :

Preprava lítiových batérií. Začať

Predaj cez PC pokladňu

Operačný systém Úvodná prednáška

Optimik Exporter Inštalácia 1. Otvoriť stránku nabytok.com, v záložke POREZ DTD kliknúť na Stiahnuť Optimik Exporter

Spracovanie informácií

Blokové a prúdové šifry

Príručka Mobility Tool + pre príjemcov grantu

Imagine. Popis prostredia:

Rozšírený zápis ZoznamŠkôl.eu

MONTÁŽNY POSTUP VÝSTUPNÝCH ČASTÍ 307 HC/HZ/HK/PC/PZ/PK/NHC/NPC

NA POUŽITIE ŠABLÓNY PRE PÍSANIE ZÁVEREČNEJ PRÁCE

P R O L E M FAKTURA Z VYDAJA OBSAH. Vystavenie faktúry z výdaja postup, podmienky... 2

M úlohy (vyriešené) pre rok 2017

MAIS. Verejný portál - kalendárny rozvrh. Používateľská minipríručka pre používateľov systému MAIS. APZ Bratislava

Funkcia - priradenie (predpis), ktoré každému prvku z množiny D priraďuje práve jeden prvok množiny H.

PLA-401 v3 Ethernetový adaptér PowerLine (prenos dát cez silové elektrické káble)

Návod na použite plaftormy ELMARK E- Business obsahuje popis hlavných možností a funkcií programu. Príručka je štruktúrovaná podľa poradia možností.

Hromadná korešpondencia v programe Word Lektor: Ing. Jaroslav Mišovych

Import cenových akcií FRESH

Výzvy na podávanie žiadostí o poskytnutie dotácie a výzvy na podávanie žiadostí o financovanie rozvojového projektu

Tabuľkový kalkulátor EXCEL Základné operácie v programe Excel

Používateľská príručka pre autorov

7.1 Návrhové zobrazenie dotazu

Základy algoritmizácie a programovania

Prehľad nového TwinSpace

Užívateľská príručka. Vytvorte 1 medzi stránkami v niekoľkých jednoduchých krokoch

Úroveň strojového kódu procesor Intel Pentium. Adresovanie pamäte

[1] ICAReNewZEP v1.2 Užívateľská príručka

FREEIP. Aplikácia pre Android

Formuláre PowerPoint MGR. LUCIA BUDINSKÁ,

1. Otec, mama a dcéra majú spolu 69 rokov. Koľko rokov budú mať spolu o 7 rokov? a) 76 b) 90 c) 83 d) 69

Polia a matice v jazyku C. Michal Kvasnica

Ministerstvo školstva Slovenskej republiky

Postup a podmienky spracovania výkazov INTRASTAT. Evidencia dod. faktúry podklady pre výkaz PRIJATIE TOVARU

DALI, pomoc a riešenia

Ak si plánujete založiť účet, tento článok je určený pre Vás. Pozrite sa na prehľad služieb a ceny všetkých bánk na slovenskom trhu.

Vytvorenie účtovnej knihy

Prevody z pointfree tvaru na pointwise tvar

KEGA manuál pre posudzovateľov

Návod Môj Slovanet Krátky sprievodca registráciou a obnovou hesla

2. Nahratie mapy pre Locus Map - formát sqlite alebo mbtiles do zariadenia (telefón, tablet) s OS Android.

Organizačné štruktúry.

eformulár ČSOB Leasing užívateľský manuál verzia 1.0

Plánovanie procesov a vlákien

Pracovné prostredie MS EXCEL 2003.

8. Relácia usporiadania

Návod na inštaláciu sieťovej tlačiarne KONICA MINOLTA C20P pre Windows XP a Vista

nastavenie a realizácia vzájomných zápočtov v Money S4 / Money S5

Používateľská príručka k aplikácii na SOČ

MANUÁL K PROGRAMU MATEMATIKA 2.0 STIAHNUTIE A INŠTALÁCIA PROGRAMU:

P R O L U C. POZNÁMKY individuálnej účtovnej závierky pre rok 2014

Užívateľská príručka k funkcii Zastavenie a pretočenie obrazu

Prihlásenie do ibankingu

Mgr. Stanislav Fila, psychológ CPPPaP Banská Bystrica Centrum pedagogicko-psychologického poradenstva a prevencie (bývalá KPPP) Banská Bystrica

1. Formát exportov typu *.gpc (ABO)

Triedenie. Príklad T.1 Vytvorte funkciu, ktorá zistí počet rôznych hodnôt v poli.

ZADANIE 1. PDF vytvorené pomocou súšobnej verzie pdffactory

Riešené úlohy Testovania 9/ 2011

Referenčná ponuka na prístup ku káblovodom a infraštruktúre. Príloha 7 Poplatky a ceny

Práca s elektronickou prihláškou SOČ

NÁVOD NA INŠTALÁCIU A OBSLUHU SAMOOBSLUŽNÉHO AKTIVAČNÉHO PORTÁLU

POSTUP GENEROVANIA ŽIADOSTI O KVALIFIKOVANÝ CERTIFIKÁT POMOCOU PROGRAMU COMFORTCHIP.

DOTAZNÍK STARÉ MESTO BEZ BARIÉR! kaviareň/pub/bar reštaurácia galéria múzeum kino iné... ulica...

Téma : Špecifiká marketingu finančných služieb

Používanie webových služieb na sieťové skenovanie (Windows Vista SP2 alebo novší, Windows 7 a Windows 8)

28 PRÍSLUŠENSTVO. siegmund

Zápis predmetov do AiSu na aktuálny akademický rok

Postup pre firmy s licenciou Profesionál účtovná firma

ONLINE POBOČKA. pre zamestnávateľov MANUÁL

Transkript:

Zásobník je abstraktný dátový typ, na ktorom sú dovolené len operácie: vytvoriť prázdny zásobník pridať prvok na vrch zásobníka odobrať prvok z vrchu zásobníka zistiť, či je zásobník prázdny Nie je možné (dovolené) prechádzať zásobníkom! hodnota 3 hodnota 2 hodnota 1 Zásobník nám umožňuje dočasne uložiť údaje a spracovať ich až neskôr - v opačnom poradí, ako boli vložené. Zásobník sa označuje aj ako štruktúra LIFO (Last In - First Out, posledný dnu prvý von). Zásobník, ako typ pamäte, sa používa na odkladanie návratových adries pred odchodom do podprogramov, na odkladanie hodnôt lokálnych premenných, na odkladanie vonkajších častí vyhodnocovaných aritmetických výrazov pri vnáraní do nich, pri metóde rozdeľ a panuj, pri prehľadávaní do hĺbky a pod. Pomocou metód zoznamu append() a pop() možno simulovať operácie zásobníka. >>> zas = [] # vytvorenie prázdneho zásobníka >>> zas # vypísanie obsahu zásobníka [] >>> zas.append(1) # pridanie hodnoty 1 do zásobníka >>> zas [1] >>> zas.append(2) # pridatie hodnoty 2 do zásobníka >>> zas [1, 2] >>> zas.pop() # odobratie hodnoty zo zásobníka 2 >>> zas [1] >>> zas.pop() # odobratie hodnoty zo zásobníka 1 >>> zas [] >>> zas.pop() # pokus o odobratie hodnoty z prázdneho zásobníka Traceback (most recent call last): File "<pyshell#11>", line 1, in <module> zas.pop() IndexError: pop from empty list >>> Príklad Z.1 Vytvorte program na simulovanie práce zásobníka. Program vytvorí prázdny zásobník a umožní vkladať hodnoty na vrch zásobníka, odoberať hodnoty z vrchu zásobníka a pozrieť sa, aká hodnota je na vrchu zásobníka. Príklad ponuky: Z Á S O B N Í K Vložiť na vrch... 1 Odobrať z vrchu... 2 Hodnota na vrchu... 3 Koniec...? Tvoja voľba? vrch Riešenie: def ponuka(): print(12*" ","Z Á S O B N Í K") print("vložiť na vrch... 1") print("odobrať z vrchu... 2") print("hodnota na vrchu... 3") print("koniec...?") 1

odpoved = input("tvoja voľba? ") vlozit() vybrat() elif odpoved == "3": hodnotanavrchu() def vlozit(): hodnota = input("vložiť hodnotu: ") zas.append(hodnota) print("vložil som hodnotu:", hodnota) def vybrat(): if len(zas) > 0: hodnota = zas.pop() print("odobral som hodnotu:", hodnota) print("zásobník je prázdny!") def hodnotanavrchu(): if len(zas) > 0: print("hodnota na vrchu:", zas[-1]) print("zásobník je prázdny!") # ================== HLAVNÝ PROGRAM ================== zas = [] # po spustení programu sa vytvorí prázdny zásobník! print("vytvoril som prázdny zásobník!") ponuka() Príklad Z.1 doplňte o funkciu na zistenie a vypísanie, či je zásobník prázdny. Ozrejmite si vzťah medzi hodnotou len(zásobník) a vrch zásobníka. Príklad Z.2 Funkcie z príkladu Z.1 zovšeobecnite použitím parametrov a predpokladajte, že zásobník má konečnú veľkosť - kapacitu. Ponuku doplňte voľbou: Je zásobník prázdny?. def vlozit(zas): if len(zas) < KAPACITA_ZASOBNIKA: hodnota = input("vložiť hodnotu: ") zas.append(hodnota) print("vložil som hodnotu:", hodnota) print("zásobník je plný!") # test, či nie je zásobník plný! def vybrat(zas): if len(zas) > 0: # hodnota len(zas) napovedá o pozícii vrchu zásobníka hodnota = zas.pop() print("odobral som hodnotu:", hodnota) 2

print("zásobník je prázdny!") def hodnotanavrchu(zas): if len(zas) > 0: print("hodnota na vrchu:", zas[-1]) print("zásobník je prázdny!") def jeprazdny(zas): if len(zas) == 0: print("zásobník je prázdny!") print("zásobník nie je prázdny!") # ================= HLAVNÝ PROGRAM ================== KAPACITA_ZASOBNIKA = 5 # maximálne päť hodnôt z1 = [] print("vytvoril som prázdny zásobník!") print(12*" ","Z Á S O B N Í K") print("vložiť na vrch... 1") print("odobrať z vrchu... 2") print("hodnota na vrchu... 3") print("je prázdny?... 4") print("koniec...?") odpoved = input("tvoja voľba? ") vlozit(z1) vybrat(z1) elif odpoved == "3": hodnotanavrchu(z1) elif odpoved == "4": jeprazdny(z1) Príklad Z.3 Vytvorte program, ktorý umožní pomocou voľby vložiť hodnotu do zásobníka 1 alebo vložiť hodnotu do zásobníka 2 a na voľbu odobrať odoberie hodnotu z toho zásobníka, v ktorom je väčšia hodnota na vrchu. Ak sú v oboch zásobníkoch na vrchoch rovnaké hodnoty, odoberie obe. Ak je jeden zo zásobníkov prázdny, ďalej odoberá hodnoty z neprázdneho zásobníka, až kým nie sú oba zásobníky prázdne. Pri riešení vytvorte a použite funkcie zlozit(zas), odobrat(zas), jeprazdny(zas) a hodnotanavrchu(zas). Príklad ponuky: Z Á S O B N Í K Y Vložiť do zásobníka 1... 1 Vložiť do zásobníka 2... 2 Odobrať zo zásobníka s väčšou hodnotou... 3 Koniec...? Tvoja voľba? 3

def vlozit(zas): hodnota = input("vložiť hodnotu: ") zas.append(hodnota) print("\nvložil som hodnotu:", hodnota) def odobrat(zas): hodnota = zas.pop() print("odobral som hodnotu:", hodnota) def jeprazdny(zas): return len(zas) == 0 def hodnotanavrchu(zas): return zas[-1] # netestuje, či nie je zásobník prázdny! def odobratvacsiuhodnotu(zas1, zas2): if jeprazdny(zas1) and jeprazdny(zas2): print("zásobníky sú prázdne!") if jeprazdny(zas1): odobrat(zas2) elif jeprazdny(zas2): odobrat(zas1) if hodnotanavrchu(zas1) > hodnotanavrchu(zas2): odobrat(zas1) elif hodnotanavrchu(zas1) < hodnotanavrchu(zas2): odobrat(zas2) odobrat(zas1) odobrat(zas2) # ================= HLAVNÝ PROGRAM ================== z1 = [] z2 = [] print("vytvoril som prázdne zásobníky z1 a z2!") print(10*" ","Z Á S O B N Í K Y") print("vložiť do zásobníka 1... 1") print("vložiť do zásobníka 2... 2") print("odobrať zo zásobníka s väčšou hodnotou... 3") print("koniec...?") odpoved = input("tvoja voľba? ") vlozit(z1) vlozit(z2) elif odpoved == "3": odobratvacsiuhodnotu(z1,z2) 4

Rad je abstraktný dátový typ, na ktorom sú dovolené len operácie: vytvoriť prázdny rad pridať prvok na koniec radu odobrať prvok zo začiatku radu zistiť, či je rad prázdny začiatok h1 h2 h3 h4 koniec Rad nám umožňuje dočasne uložiť údaje a spracovať ich neskôr v poradí, ako boli vložené. Označuje sa aj ako štruktúra FIFO (First In - First Out, prvý dnu prvý von). Rad, ako typ pamäte, sa používa na radenie úloh prichádzajúcich s požiadavkou na tlač (s rovnakou prioritou), pri prehľadávaní do šírky a pod. Český názov pre rad je fronta. Príklad R.1 Vytvorte program na simulovanie práce radu. Program vytvorí prázdny rad a umožní vkladať hodnoty na koniec radu, odoberať hodnoty zo začiatku radu a zistiť, či je rad prázdny. def ponuka(): print(15*" ","R A D") print("vložiť na koniec... 1") print("odobrať zo začiatku... 2") print("hodnota na začiatku... 3") print("je prázdny?... 4") print("koniec...?") odpoved = input("tvoja voľba? ") vlozit() vybrat() elif odpoved == "3": hodnotanazaciatku() elif odpoved == "4": jeprazdny() def vlozit(): hodnota = input("vložiť hodnotu: ") rad.append(hodnota) print("vložil som hodnotu:", hodnota) def vybrat(): if len(rad) > 0: hodnota = rad.pop(0) print("odobral som hodnotu:", hodnota) print("rad je prázdny!") def hodnotanazaciatku(): if len(rad) > 0: print("hodnota na zaciatku:", rad[0]) print("rad je prázdny!") 5

def jeprazdny(): if len(rad) == 0: print("je prázdny!") print("nie JE prázdny!") # ================= HLAVNÝ PROGRAM ================== rad = [] print("vytvoril som prázdny rad!") ponuka() Príklad R.2 Použitie funkcií z príkladu R.1 zovšeobecnite doplnením o parametre a použite v situácii, keď sú dané dva rady a prednostne sa odoberá a) z radu 1, a až keď je prázdny, z radu 2 b) z radu, v ktorom je na začiatku väčšia (menšia) hodnota Príklad R.3 Zákazník príde do čakárne a klikne na tlačidlo Príchod. Vytvorte program, ktorý umožní 1. evidovať čas príchodu zákazníka do čakárne, 2. odstránenie z radu po voľbe Odchod a vypísanie času stráveného v zariadení, 3. vypísanie počtu čakajúcich zákazníkov. Ukážka: Príchod... 1 Odchod... 2 Počet čakajúcich... 0 Koniec...? Vlož voľbu: 1 Príchod 11:24:33 Príchod... 1 Odchod... 2 Počet čakajúcich... 0 Koniec...? Vlož voľbu: 2 Odchod 11:24:49 Dĺžka obsluhy 0:00:15 Využite funkciu datetime.now() modulu datetime (pozri študijný text Použitie štandardných funkcií na prácu s reťazcami - úloha 7). import datetime def vloz(): rad.append(datetime.datetime.now()) print("príchod", str(rad[-1])[11:19]) def odober(): if len(rad) > 0: prisiel = rad.pop(0) odisiel = datetime.datetime.now() print("odchod", str(odisiel)[11:19]) print("dĺžka obsluhy", str(odisiel-prisiel)[:7]) print("musíš najprv zaznamenať príchod!\n") 6

def pocetcakajucich(): print("počet čakajúcich:", len(rad)) # ======================= HLAVNÝ PROGRAM ======================= rad = [] print("príchod... 1") print("odchod... 2") print("počet čakajúcich... 0") print("koniec...?") odpoved = input("vlož voľbu: ") vloz() odober() elif odpoved == "0": pocetcakajucich() Príklad R.3 doplňte o poznatok: Obsluha zariadenia je schopná denne obslúžiť najviac 5 zákazníkov. Príklad R.4 Klienti prichádzajú k výťahu a stavajú sa do radu (nech program po voľbe Prišiel klient vygeneruje náhodné celé číslo od 15 do 130 kg a zaradí ho do radu čakajúcich). Po príchode výťahu (voľba Prišiel výťah) nastupujú klienti do výťahu. Vo výťahu je tlaková váha, ktorá automaticky určí súčet hmotností ľudí vo výťahu. Ak súčet ich hmotností prekročí nosnosť výťahu, klient, ktorý nastúpil posledný, musí vystúpiť. Vytvorte program simulujúci opísaný dej. import random def ponuka(): print("prišiel klient... 1") print("prišiel výťah... 0") print("koniec...?") odpoved = input("nastala udalosť: ") prisielklient() elif odpoved == "0": prisielvytah() def prisielklient(): hmotnost_klienta = random.randint(15,130) # hmotnosť klienta je náhodné celé číslo od 15 do 130 kg rad.append(hmotnost_klienta) print("hmotnosť {} kg\n".format(rad[-1])) 7

def prisielvytah(): if len(rad) == 0: print("nik nečaká!\n") sucet_hmotnosti = rad[0] # nastúpil do výťahu na test - z radu neodstráni! nastupia = 0 while sucet_hmotnosti <= NOSNOST_VYTAHU: rad.pop(0) # môže zostať vo výťahu:) - až teraz odstráni z radu! nastupia += 1 # ďalší sa môže odviezť výťahom if len(rad) > 0: # ak ešte niekto čaká sucet_hmotnosti += rad[0] # nastúpi do výťahu na test súčtu hmotností print("nastúpia: {}\n".format(nastupia)) # ================== HLAVNÝ PROGRAM ================ NOSNOST_VYTAHU = 150 #kg rad = [] ponuka() Program R.4 doplňte o situáciu: ak je v rade viac ako 10 osôb, nech program oznámi: Použite schodište. Program R.4 doplňte o hlásenie: ak je hmotnosť klienta nad 100 kg, nech program vypíše: Odporúčam použiť schodište! Poznámka Modelovanie odobratia prvku zo začiatku radu pri použití pop() typu list nie je časovo efektívne, pretože sa musia všetky prvky zoznamu posunúť (preindexovať) o jednu pozíciu doľava. Preto knižnica collections obsahuje špecializovaný typ deque s rýchlymi funkciami append() a popleft(). Ukážka: >>> from collections import deque = deque([]) >>> print(rad) deque([]).append("peter") deque(['peter']) = deque(['peter', 'Roman', 'Filip']) deque(['peter', 'Roman', 'Filip']).append("Karol") deque(['peter', 'Roman', 'Filip', 'Karol']) >>> print(rad.popleft()) Peter deque(['roman', 'Filip', 'Karol']) >>> meno = rad.popleft() >>> meno 'Roman' deque(['filip', 'Karol']) 8