$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \renewcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mss}{\,\mathrm{\frac{m}{s^2}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link.
Nažalost nismo trenutno u mogućnosti da obradimo vaš zahtev.
Molimo vas da pokušate kasnije.

Час 13 - Торке, листе, ниске, скупови, речници

У свим програмима које смо до сада писали податке смо чували у појединачним променљивама. То су били обично појединачни бројеви или евентуално краћи делови текста (нпр. име или презиме). Елементарни подаци које смо до сада сретали били су цели бројеви (типа int), реални бројеви (типа float), логичке вредности (типа bool) и ниске (типа str). У многим реалним применама имамо потребу да у програму запамтимо, а касније и обрадимо веће количине података. У тим ситуацијама коришћење појединачних променљивих за памћење сваког појединачног података није практично или, чак, није могуће и потребно је користити структуре података које нам омогућавају да помоћу једне променљиве представимо читаве колекције података, које се састоје од више вредности неког једноставнијег типа. У зависности од података које желимо да сачувамо и операција које са њима желимо да спроведемо, бирамо коју од неколико различитих врста структура података које имамо на располагању треба да употребимо.

Торке и листе

Запитајмо се како бисмо у програму могли представити списак имена кошаркаша у једном тиму? Нека је то наша кошаркашка репрезентација која се 2019. такмичила на светском првенству у кошарци. Претпоставићемо да сваки играч има свој редни број и то од 1 до 12.

Један могући начин би био да уведемо пуно засебних променљивих:

Међутим, оваква репрезентација података није згодна јер не можемо једноставно да одговоримо на разна интересантна питања о кошаркашима (на пример, колико укупно има играча, ко носи број који се уноси са улаза, који број носи неки дати играч и слично). Бољи начин да представимо списак играча је да употребимо торку или листу. На пример, торку имена кошаркаша можемо дефинисати на следећи начин.

Запис облика (35, 128) се у математици назива уређени пар, запис облика (250, 120, 310) уређена тројка, запис облика (135, 22, 83, 57) уређена четворка итд. Када дужина није позната, каже се уређена n-торка (уређена енторка), али у програмирању је одомаћено краће име - торка.

Дакле, торку дефинишемо тако што између обичних малих заграда (заграда ( и )) наводимо елементе раздвојене зарезима. Приметимо да је листа имена кошаркаша веома дугачка, тако да смо је прегледности ради разбили у више редова. Иако у општем случају није допуштено делити наредбе на више линија, то је могуће ако је садржај тих линија окружен неким заградама (пошто је у првој линији отворена заграда (, након читања прве, аутоматски се читају и друга и трећа и четврта линија, све док се не наиђе на затворену заграду )).

Дефинисање листе би се разликовало од дефинисања торке само по томе што би се уместо обичних малих заграда (...) употребиле угласте заграде употребиле обичне заграде [...].

Суштинска разлика између торке и листе је то што је торка имутабилна што значи да јој не можемо мењати вредности када је једном дефинишемо. Са друге стране, листе допуштају да им мењамо појединачне елементе, уклањамо елементе, додајемо нове и слично. Све операције у којима се врши анализа садржаја биће идентичне, без обзира да ли се ради о листи или о торки и описаћемо их у наставку (иако ћемо у примерима користити торке, све оне се на потпуно исти начин могу применити и на листе). Операције у којима се врши промена су специфичне за листе и није их могуће спровести над торкама па ћемо њих описати засебно.

Појединачни чланови торке или листе називају се и елементи. Елементи могу бити ниске (као у овом примеру), али и бројеви, друге торке или листе и било шта друго. Чак је могуће у исту торку тј. листу поставити елементе различитог типа. Као пример торке бројева, формирајмо торку висина ових наших кошаркаша.

Двочлане торке (уређени парови) и вишечлане торке ( уређене тројке, четворке итд.) се најчешће користе за груписање тек неколико појединачних података. На пример, позицију фигуре на шаховској табли можемо представити помоћу уређеног пара који чини ознака врсте (слова од a до h) и ознака колоне (броја од 1 до 8). На пример, ("b", 6). Слично, позиције на географској карти се описују помоћу географске ширине и дужине тј. помоћу пара реалних бројева. Тако се град Париз налази на позицији која се може описати помоћу пара (48.8566, 2.3522). Време можемо представити помоћу уређене тројке коју чине сат, минут и секунд (на пример, (7, 25, 37)).

За груписање већег броја података чешће се користе листе, поготово ако није унапред познато колико таквих података може бити тј. ако се број података може изменити током рада програма. На пример, ако желимо да представимо оцене ученика, чешће бисмо употребили листу јер ученик може да добије још неку оцену, па је листу његових оцена потребно проширити, што није могуће ако се оцене представе торком.

Већина програмских језика не разликује имутабилне и мутабилне колекције. Зато програмери често користе искључиво листе, чак и у ситуацијама када је коришћење торки примереније. То се не сматра великим пропустом.

Издвајање елемената

Елементима торке (или листе) приступа се на основу њихове позиције тј. индекса. Бројање креће од нуле. Први елемент листе се налази на позицији 0, други на позицији 1 и тако даље. На пример, елементи у листи a = [3, 7, 4, 2, 5] се броје на следећи начин.

индекс

0

1

2

3

4

вредност

3

7

4

2

5

Зато је првом елементу могуће приступити са a[0] и вредност тога израза је 3 (јер се на позицији 0 у листи налази број 3), другом елементу са a[1] и вредност тог израза је 7 и тако даље.

Негативни индекси упућују на бојање од краја (с десна на лево), па -1 означава последњи елемент, -2 претпоследњи и тако даље.

индекс

-5

-4

-3

-2

-1

вредност

3

7

4

2

5

Зато је последњем елементу могуће приступити помоћу a[-1], претпоследњем помоћу a[-2] итд.

Још једна операција која је често корисна је издвајање дела торке тј. листе. Елементима између позиција a и b укључујући позицију a, али искључујући позицију b могуће је приступити помоћу a[a:b].

На пример, ime[1:4] издваја елементе имена на позицијама 1, 2 и 3 (распон [1:4] је полуотворен тј. позиција 1 је урачуната, а позиција 4 није). Ако је a = [3, 7, 4, 2, 5] тада је a[1:4] листа чија је вредност [7, 4, 2]. Ако се изостави број иза двотачке, издвајају се елементи до краја. На пример a[2:] је листа која има вредност [4, 2, 5].

Употребимо ове операције да решимо неколико задатака о нашим играчима.

Играч са датим бројем дреса

Познат је списак играча у тиму. Они носе дресове са бројевима од 1 па на даље. Напиши програм који за дати број дреса одређује играча који игра под тим редним бројем.

Пошто се уносе бројеви од 1 до дужине торке (или листе), а индекси се крећу од 0 па до претходника дужине торке, након учитавања броја дреса приступиће се елементу чији је индекс за 1 мањи од броја дреса.

Начин да се избегне ово померање индекса за 1 био би да се на почетно место убаци неки вештачки елемент (на пример, празна ниска).

Играчи са датим бројевима дреса

Испиши имена играча са бројевима дреса 2, 3 и 4, као и име играча који има највећи број дреса у тиму.

Када би се дресови бројали од 0, као што се броје индекси, потребно би било издвојити елементе у распону [2:5] (то обухвата тачно индексе 2, 3 и 4). Пошто се места броје од 1, потребно је вредности наведене у распону умањити за 1 тј. употребити распон [1:4]. Последњи играч тј. последњи елемент листе се увек налази на позицији -1.

Ако исправиш програм како треба, требало би да добијеш одговоре ['Василије Мицић', 'Богдан Богдановић', 'Марко Гудурић'] и Никола Милутинов.

Ако је на прво место у листи играча уписана празна листа, напиши програм који одређује играче са бројевима 7, 8 и 9, као и претпоследњег играча у тиму.

Ако урадиш све како треба, требало би да добијеш одговоре ["Стефан Бирчевић", "Немања Бјелица", "Никола Јокић"] и Мирослав Радуљица.

Распакивање

Ако знамо дужину торке или листе, могуће је на лак начин именовати сваки њен елемент тј. сместити сваки елемент у посебну променљиву.

На пример, претпоставимо да торка matematicari садржи пуна имена четири велика математичара: Ренеа Декарта, Жозефа Луја Лагранжа, Карла Фридриха Гауса и Леонарда Ојлера. Направимо четири посебне променљиве dekart, lagranz, gaus и ojler које ће садржати пуна имена одговарајућих математичара.

Један начин да се то уради је да се помоћу индекса приступи појединачним елементима.

Међутим, постоји и једноставнији начин да се постигне исти ефекат.

Првој променљивој са леве стране се додељује први елемент листе са десне стране, другој променљивој други елемент листе и тако даље. Овај поступак називамо распакивање. Исти ефекат би се постигао и да су четири променљиве са леве стране биле наведене у склопу торке тј. листе.

Распакивање се може применити и на уређене парове и торке. Примени то у решавању наредног једноставног задатка.

Географске координате

Уређени пар садржи географске координате града Париза. Напиши програм који одређује и посебно исписује његову географску ширину и географску дужину.

Задатак можемо решити очитавањем елемената на основу индекса.

Реши сада задатак применом распакивања.

Функције за рад са торкама и листама

Језик Python нам на располагање ставља неколико функција којима можемо одредити често коришћене статистике елемената листе. Функцијом len израчунавамо дужину листе, функцијом sum израчунавамо збир елемената листе, функцијом min најмањи елемент у листи, а функцијом max највећи. Ове функције можемо употребити да једноставно решимо разне практичне задатке.

Просечна оцена

Дате су оцене из неколико предмета. Израчунај просечну оцену.

Просек тј. аритметичка средина се једноставно добија дељењем збира елемената њиховим бројем.

Победнички скок

На Олимпијским играма у Рију наша атлетичарка Ивана Шпановић је скакала редом 6,95m, затим у наредне две серије преступила, а затим скакала, 6,91m, 7,08m и 7,05m. Одреди дужину скока (у метрима) који јој је донео бронзану медаљу.

Да би се ордредио најдужи скок потребно је одредити највећи елемент који садржи дата торка.

Наравно, програм ако је исправан треба да испише 7.08.

Најмања оцена

Ако се зна да су оцене из природних наука последње три у листи оцена, израчунај Горанову најмању оцену из тих предмета.

У овом задатку комбиновање идвајање сегмента елемената торке и функцију за проналажење минимума.

Распон температура

Време се често мења и дешава се да се у једној недељи смењују и хладни и топли дани. Ако су дате су температуре у подне у данима током једне недеље, одреди колики је распон температура тј. разлика између највише и најниже подневне температуре.

Претрага

Проверу да ли елемент припада торки тј. листи могуће је извршити коришћењем оператора in (на пример, "Бобан Марјановић" in igraci). У наредном примеру проверавамо да ли је кошаркаш чије се име и презиме учитавају при покретању програма играо за репрезентацију на СП 2019. године.

Проналажење најмање позиције (индекса) на којој се налази неки тражени елемент може се урадити коришћењем методе index, којој се као једини параметар прослеђује елемент који се тражи.

Методе су посебан облик функција које се позивају у облику struktura.funkcija(parametri), уместо у облику funkcija(struktura, parametri). Дакле, ако у листи igraci тражимо Николу Јокића, уместо да наведемо index(igraci, "Никола Јокић"), навешћемо igraci.index("Никола Јокић"). Приметимо да су све наредбе корњачи заправо биле методе (користили смо turtle.forward(100), а не forward(turtle, 100).

Број дреса датог играча

Који број дреса носи Никола Јокић?

Кроз овај задатак можемо илустровати претрагу тј. проналажење индекса (позиције) у торци тј. листи на којој се налази тражени елемент. Један начин да се то уради је помоћу методе index која враћа индекс (подсетимо се, индекси се броје од 0) првог појављивања траженог елемента тј. проузрокује грешку ако се тај елемент не налази у листи.

Ако торку не допунимо празним елементом на позицији 0, пошто се дресови броје од 1, а индекси од 0, пронађени индекс је потребно увећати за 1.

Надовезивање

Две торке тј. листе можемо надовезати (спојити у једну) коришћењем операције +. Тиме се формира нова торка тј. листа, док се оригинали не мењају. Није могуће надовезати торку и листу, нити листу и торку.

Висине девојчица и дечака у одељењу

Познате су висине девојчица и висине дечака у једном одељењу. Направи торку свих висина и израчунај затим број и просечну висину свих ђака.

Слично као што код бројева множење представља узастопно сабирање, исти је случај и овде и може се наслутити да множење ниске природним бројем заправо представља њено понављање одређени број пута. На пример, ако желимо да направимо листу која садржи 100 нула, то можео урадити изразом [0] * 100, док израз (0, 1, 2) * 3 гради торку (0, 1, 2, 0, 1, 2, 0, 1, 2).

Сортирање

Елементе торке тј. листе је веома једноставно уредити од најмањег до највећег (па и обратно, од највећег до најмањег). Функција sorted се може применити и на торке и на листе и она на основу датих података гради нову торку тј. листу која садржи исте податке, у сортираном редоследу. Метода sort применљива је само на листе и она мења листу тако што јој елементе rеђа у сортираном редоследу. Ово је ефикасније него да се прави нова листа, али се оригинални редослед елемената губи.

Три најјефтинија и најскупља производа

Дата је листа цена производа. Колико коштају три најјефтинија, а колико три најскупља производа?

Сортирање имена ученика

Наставница треба да у дневник унесе имена ученика, међутим, од педагога је добила списак ученика који није сортиран. Напиши програм који помаже наставници да добије ученике сортиране по абецедном реду.

Приликом сортирања, ниске се пореде по абецедном поретку (више о овом поретку биће речено у делу о нискама). Напоменимо да овакво сортирање може имати проблем са нашим карактерима ćđščž (потребно је навести посебне опције функцији sort ако желимо да наш језик буде обрађен потпуно исправно, али се тиме у овом приручнику нећемо бавити).

Враћање торки из функције

Као што смо већ раније поменули, торке могу бити веома корисне да би се вратило више вредности из функције. Подсетимо сеове корисне технике.

Конверзија угла у степене и минуте

Напиши функцију која за угао дат у облику децималног броја степени одређује њему најближи угао дат у степенима и минутима. Употреби га да одредиш колико степени и минута има угао \(36,2^\circ\).

Приметимо да се приликом прихватања резултата врши распакивање торке тј. да се променљивима stepeni и minuta додељују редом први и други елемент уређеног пара који је функција вратила.

Сложене торке и листе

Торке и листе могу да буду елементи других торки тј. листа. Направимо, на пример, торку која садржи податке о месецима током једне године која није преступна. За сваки месец знамо назив и број дана и те податке ћемо организовати помоћу уређених парова (на пример, ("април", 30)).

Дани у месецу

Помоћну променљиву mesec није било неопходно користити. Поправи индексе у наредном програму тако да ради исто као и претходни.

Ниске

Поред бројева, рачунари су веома добри и у раду са текстом и, као што смо видели, за рад са текстом се користе ниске и променљиве типа str. Иако се могу посматрати и као атомичке вредности (појединачни подаци), ниске се могу посматрати и као торке карактера (слова, интерпункцијских знакова и слично). Самим тим, на ниске се примењују скоро све технике које се користе у раду са торкама. Нагласимо да су, као и торке, и ниске имутабилне и да једном формирану ниску није могуће променити.

Надовезивање ниски

Слично као и над листама, над нискама се могу вршити одређене операције. Једна од основних операција је спајање две ниске. Ова операција донекле подсећа на сабирање и обележава се знаком +. На пример, вредност израза "abraka" + "dabra" је "abrakadabra". Још једна интересантна операција је да се ниска помножи природним бројем. И множење ниске бројем функционише исто као код торки тј. листа. На пример, вредност израза "ba"*2 је "baba".

    Q-15: Који од наредних израза крију у себи исправно записан назив воћа?

  • "ba" + "na" * 2
  • Тачно! "banana"
  • "a" + "na" * 2 + "s"
  • Тачно! "ananas"
  • "ba" * 2 + "na"
  • Нетачно! "babana"
  • "an" * 2 + "nas"
  • Нетачно! "anannas"

Допуни наредни програм тако да исправно испише име и презиме (у овом примеру треба да се испише Петар Петровић).

А шта је са цифрама у ниски?

Ниске у себи могу да садрже цифре, па чак могу да буду састављене искључиво од цифара. Међутим, када се на две ниске примени оператор + ниске се надовезују. Тако је резултат операције "12" + "34" једнак "1234", а не 46 како би неки очекивали. Помоћу input уноси се увек текст, тј. резултат ове операције је увек ниска, чак иако тај текст садржи само цифре. Имајући ово у виду, покушај да предвидиш шта ће израчунати наредни програм када, након његовог покретања, корисник унесе 3, а затим и 5.

    Q-16: Који је резултат извршавања претходног програма ако корисник унесе прво 3, а затим 5.

  • 8
  • Нетачно! Иако корисник куца цифре, ``prvi_sabirak`` и ``drugi_sabirak`` нису бројеви него ниске (текст) и зато се оператором ``+`` оне надовезују.
  • 15
  • Нетачно! Покушај поново.
  • "35"
  • Тачно!
  • "8"
  • Нетачно! Иако корисник куца цифре, ``prvi_sabirak`` и ``drugi_sabirak`` нису бројеви него ниске (текст) и зато се оператором ``+`` оне надовезују.

Ако текст садржи само цифре, онда се број представљен тим цифрама може добити помоћу int. На пример, int("123") је број 123. Тако је int("12") + int("34") једнако 12 + 34 тј. 46. Стога се учитавање броја може постићи помоћу int(input("Unesi broj: ")). Тако се претходни програм који сабира два учитана броја може поправити на следећи начин:

Ниска може да садржи и децимални запис неког броја и тада се број представљен том ниском може добити помоћу float. На пример, float("123.45") je број 123.45. Претварање ниске у број је и у овом случају веома важно урадити, јер се у супротном оператор + односи на надовезивање ниски, а не на сабирање бројева. Провери да ли ово добро разумеш.

    Покушај поново
  • float("3.5") + float("3.5")
  • 7.0
  • "3.5" + "0.5"
  • "3.50.5"
  • 3.5 + "3.5"
  • greška
  • float("2.5") + 1.5
  • 4.0

Тако се децимални број може унети са broj = float(input("Unesi decimalan broj:")).

Дужина ниске, издвајање делова ниске

Дужину ниске тј. број њених карактера можемо добити помоћу функције len. Тако је len("Zdravo") једнако 6, јер ниска "Zdravo" има тачно 6 карактера.

Вредност len("Popokatepetl") је

Вредност len("Супер Марио 3!") је

Као и у другим торкама и листама и карактери у ниски имају своје редне бројеве тј. позиције. Први карактер се налази на позицији 0, други на позицији 1 и тако даље. Могуће је издвојити појединачни карактер из ниске. На пример, ако је ime = "Zorana" тада се карактер Z може добити изразом ime[0], а карактер r изразом ime[2].

Подржани су и негативни индекси тако што -1 означава последњи карактер, -2 претпоследњи и тако даље. На пример, ако је ime = "Zorana" тада је ime[-1] карактер a док је ime[-4] карактер r.

И издвајање дела ниске (подниске) функционише на исти начин као и код других торки тј. листа. Подсети се овога.

Дата је ниска s = "Programiranje je mnogo zabavno". Вредност израза s[0:4] је

Израз којим је из ниске s могуће издвојити реч mnogo је

И наредни задатак се могу урадити коришћењем издвајања делова ниске.

ЈМБГ

Сваки грађанин Републике Србије има свој јединствени матични број (ЈМБГ). У њему прве две цифре одређују дан рођења, друге две месец, а наредне три цифре одређују годину рођења. Наредне две цифре одређују општину рођења, наредне три цифре су јединствене за ту особу при чему се из њих може одредити пол (комбинације од 000 до 499 се додељују дечацима, а од 500 до 999 девојчицама). Последња цифра је контролна. Она се израчунава применом једне посебне формуле на претходне цифре. За дати ЈМБГ одредите ког дана и месеца се особа родила.

Иако делује да је ЈМБГ број, њега је боље посматрати као ниску карактера тј. стринг. Наиме, обично смо заинтересовани само за издвајање одређених делова ЈМБГ, док на ЈМБГ никада не примењујемо аритметичке операције (нпр. нема смисла сабирати два ЈМБГ нити ЈМБГ множити са 2). Издвајање делова је веома једноставно ако ЈМБГ представимо у облику ниске.

Претрага ниске

Често је потребно да проверимо да ли једна ниска садржи неки карактер или садржи неку другу ниску. То можемо урадити коришћењем find. На пример, ако је ime_i_prezime = "Љубица Љубичић" тада је вредност ime_i_prezime.find(" ") једнака 6, јер се размак може наћи на позицији 6. Ако потражимо карактер који ниска не садржи (на пример, ime_i_prezime.find(",")), добићемо вредност -1. Уместо find можемо употребити и index (као и код торки и листа), међутим, када се оно што се тражи не налази у ниски, find враћа вредност -1, док index даје грешку при извршавању програма.

Претрагу можемо употребити да бисмо, на пример, издвојили име и презиме из датог имена и презимена (што је управо супротно од задатка у којем смо на основу посебног имена и презимена и добили спојено име и презиме).

Овај задатак има и лепше решење које користи функцију split, која формира листу речи дате реченице (врши поделу ниске на подниске на основу размака који се јављају унутар ниске).

Осим што можемо пронаћи позицију на којој се неко слово или нека подниска јавља унутар ниске, можемо и избројати колико се пута оно појављује. За то можемо користити count. На пример, број појављивања слова a у неком имену можемо израчунати помоћу ime.count("a"). Наредни задатак се веома једноставно може урадити применом методе count.

Врсте реченица

Дат је текст (ниска) који садржи неколико једноставних реченица. Одреди колико међу њима има обавештајних, колико има упитних и колико има узвичних реченица.

Обавештајне реченице се завршавају тачком, упитне знаком питања, а узвичне узвичником. Број реченица сваке врсте можемо одредити тако што пребројимо колико се пута јавља сваки од ова три карактера (карактер тачка ., карактер упитник ? и карактер узвичник !).

Измене листе

Торке и ниске су имутабилни типови података, што значи да се, када се једном формирају, они не могу даље мењати. Са друге стране, листе је могуће мењати. Појединачни елементи листе се могу мењати на следећи начин.

На првом месту у листи црвену боју смо заменили љубичастом, а на последњем плаву са нарандџастом, тако да на крају програма листа boje чува вредности ["purple", "green", "orange"].

Елемент на крај листе можемо додати методом append. На пример, уместо да мењамо, листу боја можемо да проширимо за две вредности.

На крају овог програма, листа садржи вредности ["red", "green", "blue", "purple", "orange"].

Елементе из листе можемо брисати помоћу del. На пример, ако из листе дана желимо да обришемо дане викенда, то можемо урадити на наредни начин.

Скупови

Ако знамо имена свих фудбалера који су давали голове током једне ревијалне утакмице и то редом, како су давали голове можемо једноставно одредити скуп свих фудбалера који су се уписали у листу стрелаца. Наиме, ако формирамо скуп на основу имена стрелаца аутоматски ће бити уклоњени дупликати.

Скуп дефинишемо тако што између витичастих заграда (заграда { и }) наводимо елементе раздвојене зарезима. Елементи скупа у овом примеру су биле ниске, а можемо разматрати и скупове елемената другог типа (на пример, скупове бројева).

Скуп од торке/листе/ниске

Ако су елементи скупа чланови неке торке или листе, можемо лако добити скуп свих елемената (коришћењем функције set као у следећем програму).

И од ниске можемо једноставно добити скуп карактера које она садржи (опет помоћу функције set).

Провера припадности скупу

Слично као и код осталих структура података, провера припадности скупу може се извршити оператором in. Покушај да то примениш у наредном задатку.

Да ли је Миодраг награђен?

Познат је скуп награђених ученика. Напиши програм који проверава да ли је Миодраг освојио награду.

Скуповне операције

У језику Python можемо веома једноставно израчунати унију, пресек и разлику скупова. Ако су A и B скупови, онда је A | B њихова унија, A & B њихов пресек, а A - B њихова разлика. Провери да ли се сећаш ових операција из математике тако што ћеш решити наредни тест.

    Q-18: Ако је A = {3, 6, 7}, а B = {3, 4, 5}, повежи скуповне операције са њиховим резултатима.
  • A & B
  • {3}
  • A | B
  • {3, 4, 5, 6, 7}
  • A - B
  • {6, 7}
  • B - A
  • {4, 5}
  • (A - B) | (B - A)
  • {4, 5, 6, 7}

Прикажимо како се скуповне операције могу употребити у решењу наредног задатка.

Девојчице које тренирају два спорта

Један скуп садржи девојчице из одељења које тренирају ритмичку гимнастику, а други оне које тренирају одбојку. Одреди скуп девојчица које тренирају оба спорта, скуп девојчица које тренирају бар један од њих и скуп девојчица које тренирају само одбојку.

Ако све урадиш како треба, добићеш решење

{'Milica', 'Jovana'}
{'Ana', 'Milica', 'Jovana', 'Gordana', 'Tara', 'Nađa', 'Aleksandra'}
{'Tara', 'Nađa', 'Aleksandra'}

Речници

Листе нам дају могућност да организујемо податке за које је познат неки редослед и у којима сваки податак има свој редни број (на пример, листу смо употребили да организујемо имена путника у авиону или податке о месецима у години) и приступ елементима листе врши се на основу њиховог индекса (редног броја, тј. позиције). Међутим, често подаци представљају неко пресликавање у којем на основу датог кључа желимо да приступимо вредности која је придружена том кључу. На пример, на основу шифре производа приступамо његовој цени, на основу ЈМБГ грађана приступамо његовом имену, на основу броја банковног рачуна приступамо салду (износу новца) на том рачуну и слично. У тим ситуацијама уместо листе много је боље користити речнике (каже се и мапе или асоцијативне низове).

Дефинисање и коришћење речника

Цене аутомобила

Аутомобили у каталогу имају придружене цене и ми желимо да у нашем програму можемо да одредимо цену аутомобила на основу његовог модела. Напиши програм који на основу унетог модела аутомобила (ниска) одређује његову цену (цео број).

../_images/sajam_automobila.jpg

Кључна одлука за ефикасно решење овог задатка је да каталог цена аутомобила представимо помоћу речника.

У претходном примеру модели аутомобила су кључеви који се пресликавају у цене аутомобила које су вредности. Кључеви су биле ниске, а вредности цели бројеви, што је чест случај.

Географске координате градова

У наредном примеру вредности у речнику су уређени парови.

Познате су географске координате неколико главних европских градова. За дато име града одреди њене географске координате. Одреди посебно географску дужину и посебно географску ширину.

Цена производа

Слично као и код осталих структура података и провера да ли је неком кључу у речнику придружена вредност се може проверити оператором in.

У речнику се чувају цене различитих производа у продавници. Пронађи и испиши цену датог производа или пријави да се тај производ не продаје.

Домаћи задатак

Ова лекција је била прилично обимна, па је могуће да нисте током часа успели да је целу пређете. За домаћи пређи све задатке које су на часу остали неурађени, а затим уради и наредних неколико задатака.

Задаци

Да ли си награђен?

Позната је листа награђених ученика. Напиши програм који проверава да ли је корисник чије се име учитава на почетку програма освојио награду.

Путници на датим седиштима у авиону

Познат је списак имена путника у авиону. Седишта су нумерисана од 1 па надаље. Ако стјуардеса унесе број седишта, напиши програм који одређује име путника на том седишту. Након тога испиши имена путника која седе на прва четири, као и на последња два седишта, као и број седишта на којем седи Мика Микић.

Да бисмо олакшали бројање, на првом месту у листи је постављен вештачки елемент (празна ниска).

Шифра

Лидијина шифра за gmail се састоји од 6 слова. Одлучила је да је закомпликује, али на правилан начин, тако да касније може да је се сети. Шифру ће закомпликовати тако што ће заменити редослед прва два и последња два слова, а средња два слова поновити два пута. На пример, ако јој је шифра била lidija закомпликована шифра јој је jadidili. Напиши програм који исписује закомпликовану шифру.

Учитавање разломка

Корисник уноси текст који описује разломак (на пример, 3/4). Израчунај децималну вредност тог разломка.

Сугласници

Сугласници се по месту изговора могу бити предњонепчани (Ј, Љ, Њ, Ћ, Ђ, Ш, Ж, Ч, Џ) и задњонепчани К, Г, Х. По звучности, сугласници се деле на звучне (Б, Г, Д, Ђ, Ж, З, Џ), безвучне (П, К, Т, Ћ, Ш, С, Ч, Ф, Х, Ц), и сонанте(М, В, Р, Л, Н, Љ, Њ, Ј).

  • Који сугласници су истовремено и звучни и предњонепчани?

  • Који безвучни сугласници нису задњонепчани?

  • Који сугласници су сонанти или звучни?

Поправи наредни код тако да исправно решава овај задатак. Програм након покретања треба да испише наредне резултате.

{'Ђ', 'Џ', 'Ж'}
{'Ч', 'Ћ', 'Ш', 'Т', 'П', 'Ф', 'С', 'Ц'}
{'Џ', 'З', 'Д', 'Ђ', 'Ј', 'Л', 'Н', 'М', 'Г', 'Р', 'Б', 'Љ', 'Њ', 'Ж', 'В'}

Звучни и безвучни сугласници

Звучни и безвучни сугласници јављају се у паровима. Звучни сугласници су БГДЂЖЗЏ (можеш их лакше запамтити помоћу првих слова реченице Баба грди деду: „Ђаволе живи зашто џандрљаш”?) Њихови безвучни парови су редом ПКТЋШСЧ. Напиши програм који за дати звучни сугласник одређује његов безвучни пар.

Поправи наредни програм тако што ћеш попунити речник одговарајућим паровима сугласника. Ако све урадиш како треба, требало би да добијеш 7 зелених поља (сваки сугласник мора да прође тест). Користи велика слова ћирилице.

Главни градови

У речнику се чувају главни градови неколико држава. Напиши програм који учитава име државе и исписује главни град или каже да одговор на то питање не зна.