Programování. Programování s řetězci. Martin Urza

Podobné dokumenty
- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

NPRG030 Programování I, 2017/18 1 / :22:16

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

Programovací jazyk Pascal

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Programování. Debugging a testování. Martin Urza

Sada 1 - Základy programování

Programovací jazyk. - norma PASCAL (1974) - implementace Turbo Pascal, Borland Pascal FreePascal Object Pascal (Delphi)

dovolují dělení velkých úloh na menší = dekompozice

Programování. Psaní čistého kódu. Martin Urza

POČÍTAČE A PROGRAMOVÁNÍ

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Úvod do programování 6. hodina

Sada 1 - Základy programování

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Řízení toku programu Programátor musí být schopen nějak ovlivňovat běh programu a k tomu má několik možností:

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Object Pascal je přísně typový procedurální jazyk, který umožňuje jak strukturované, tak objektově orientované programování.

Sada 1 - Základy programování

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

Příklady: (y + (sin(2*x) + 1)*2)/ /2 * 5 = 8.5 (1+3)/2 * 5 = /(2 * 5) = 1.3. Pavel Töpfer, 2017 Programování 1-3 1

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; }

Základy programování Proměnné Procedury, funkce, události Operátory a podmínková logika Objekt Range a Cells, odkazy Vlastnosti, metody a události

SPJA, cvičení 1. ipython, python, skripty. základy syntaxe: základní datové typy, řetězce. podmínky: if-elif-else, vyhodnocení logických výrazů

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

VÝRAZY výrazy = operandy prokládané operátory, vyhodnocované podle priority operátorů

Programování. Jak fungují imperativní jazyky. Martin Urza

Sada 1 - Základy programování

NPRG030 Programování I, 2016/17 1 / :58:13

Úvod do programování

Uplatnění metod na zvolený jazyk

Sada 1 - Základy programování

ALGORITMIZACE A PROGRAMOVÁNÍ

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

2 Strukturované datové typy Pole Záznam Množina... 4

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1

NPRG030 Programování I, 2010/11

Obecná informatika. Matematicko-fyzikální fakulta Univerzity Karlovy v Praze. Podzim 2012

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

- speciální symboly + - * / =., < > <> <= >= a další. Klíčová slova jsou chráněnými útvary, které nelze použít ve významu identifikátorů.

Algoritmizace a programování

Pseudonáhodná čísla = algoritmicky generovaná náhrada za náhodná čísla

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

VISUAL BASIC. Práce se soubory

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Jednoduché příkazy jazyka Pascal

Programování v jazyce C pro chemiky (C2160) 4. Textové řetězce, zápis dat do souboru

Anotace. Ordinalni typy - typ char, funkce ord, chr, succ, prev, inc, dec,

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

Zápis programu v jazyce C#

Pointery II. Jan Hnilica Počítačové modelování 17

NPRG030 Programování I, 2018/19 1 / :25:37

Sada 1 - Základy programování

Skripta ke školení. Základy VBA. vypracoval: Tomáš Herout. tel:

- jak udělat konstantu long int: L long velka = 78L;

Identifikátory označují objekty v programu používané (proměnné, typy, podprogramy).

Programování v jazyce C pro chemiky (C2160) 5. Čtení dat ze souboru

VY_32_INOVACE_08_2_04_PR

LEKCE 6. Operátory. V této lekci najdete:

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

LZ77 KNIHOVNA PRO KOMPRESI A DEKOMPRESI DAT POMOCÍ ALGORITMU LZ77. Příručka uživatele a programátora

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

IB015 Neimperativní programování. Seznamy, Typy a Rekurze. Jiří Barnat Libor Škarvada

NPRG030 Programování I, 2015/16 1 / :25:32

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Da D to t v o é v ty t py IB111: Datové typy

ADT/ADS = abstraktní datové typy / struktury

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

programátorský manuál

Systém je citlivý na velikost písmen CASE SENSITIVE rozeznává malá velká písmena, např. PROM=1; PROm=1; PRom=1; Prom=1; prom=1; - 5 různých proměnných

Stručný návod k programu Octave

Martin Hejtmánek hejtmmar

O datových typech a jejich kontrole

Poslední aktualizace: 14. října 2011

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory

Radomíra Duží L Datový typ množina

Základy programovacího jazyka Turbo Pascal

Seminář IVT. MS Excel, opakování funkcí

Standardní algoritmy vyhledávací.

IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1

Programování v jazyce JavaScript

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

Poslední nenulová číslice faktoriálu

Programovací jazyk PASCAL Turbo

Úvod do programování. Úvod do programování. ing. Miroslav Jílek 2009, SJOP Poděbrady

Tabulkový procesor. Základní rysy

Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

4a. Makra Visual Basic pro Microsoft Excel Cyklické odkazy a iterace Makra funkce a metody

Algoritmizace a programování

Transkript:

Programování Programování s řetězci Martin Urza

Motivace Programování s textovými řetězci patří k nezbytným součástem dovednosti tvorby programů, bez které se prakticky nedá stvořit žádná rozumná aplikace. Programů, které pracují s textem (byť okrajově) je v praxi mnohem víc, než programů, které například něco velkolepého počítají. Řetězcové operace (minimálně ty základní) využijete např. při každém rozumnějším formátování ne zcela triviálního výstupu. V Pascalu (ale i v Delphi) jsou operace s řetězci velmi pohodlně vyřešeny (zejména třeba oproti čistému C), pro programátory je práce s nimi opravdu snadná.

Typ string String je pole znaků indexované od 0 do 255. type string = array [0..255] of char; V případě potřeby lze vyrobit řetězec i kratší; jeho délku uveďte do hranaté závorky (např. string[32]). type string[n] = array [0..n] of char; Přiřadíte-li textový řetězec do proměnné typu string, vyplní tuto proměnnou po znacích od indexu 1 dál. Je-li s proměnná typu string a přiřadíme-li do ní text 'ahoj', pak s[1] = 'a', s[2] = 'h', s[3] = 'o' a s[4] = 'j'. Na indexu 0 je uložena délka řetězce. Řetězec délky n obsahuje na indexu 0 znak, který je n-tý v ASCII. Délka řetězce se nastavuje automaticky.

Délka řetězců Jak bylo uvedeno na minulém slajdu, délka řetězce je uložena ve znaku na nultém indexu řetězce. Typ char je ordinální; má jednoznačné uspořádání. Pořadí znaku v tomto uspořádání (v Pascalu shodou okolností ASCII) lze zjistit pomocí funkce ord, jež má jediný parametr typu char; vrací hodnotu typu integer. Je-li s string a přiřadíme-li mu 'ahoj', pak ord(s[0]) = 4. Když změníte obsah řetězce, znak na nultém indexu se sám modifikuje tak, aby délka odpovídala (o to se nemusí programátor nijak starat). Délku řetězce lze zjistit i funkcí length, jež má jediný parametr typu string a vrací jedno délku.

Cvičení Napište program, který přečte ze vstupu nějaký text (slovo, větu, číslo, shluk znaků,.) a ten pak vypíše na výstup. Délka textu bude menší než 256 znaků. program readandwrite; var word : string; begin writeln('napiste nejaky text:'); readln(word); writeln(); writeln('napsal jste:'); writeln(word); writeln(); writeln('pro ukonceni programu stisknete ENTER.'); readln(); end. * Upravte program, aby daný text vypsal n-krát, kde n je délka onoho textu ve znacích. ** Modifikujte program tak, aby před každý z výpisů textu napsal jeho pořadové číslo. Navíc ať program nevypisuje žádný text více než 8x.

Přístup k jednotlivým znakům řetězce Jak již bylo řečeno, řetězec (string) je pole znaků. To znamená, že se k němu tak může programátor ve všech ohledech chovat. Potřebujeme-li přistupovat k jednotlivým znakům řetězce, lze toho (pro čtení i zápis) docílit pomocí indexů znaků v poli. Je-li s proměnná typu string, pak je n-tý znak textu v proměnné přístupný přes identifikátor s[n]. Chcete-li tento znak změnit, přiřaďte do něj jiný: s[n] := 'x'; Podobně lze ten znak přiřadit do proměnné typu char: c := s[n];

Cvičení Napište program, který přečte text ze vstupu, nahradí každý druhý znak písmenem 'x' a pak vše vypíše na výstup. * Upravte program, aby každý sudý znak nenahrazoval 'x', ale znakem, který je v řetězci před ním, např. 'Jadzia Dax' změní na 'JJddii aa'. program modifychars; var word : string; loop1 : integer; begin writeln('zadejte text:'); readln(word); for loop1 := 1 to length(word) do if (0 = (loop1 mod 2)) then word[loop1] := 'x'; writeln(word); readln(); end. ** Modifikujte předchozí program tak, aby upravený text (tedy ten se zduplikovanými znaky z minulého příkladu) vypsal pozpátku. Hint: Řetězec nevypisujte jako řetězec, ale po znacích; využijte cyklu.

Stringové operátory Jazyk Pascal umožňuje velmi snadnou manipulaci s řetězci; operátory fungují velmi intuitivně. Operátor zřetězení je plus (+). Spojí dva řetězce do jednoho. Např. str := str + ' ' + str; přidá k řetězci str mezeru a za ni str znovu zkopíruje (bez mezery). 'Seven ' + 'of ' + 'Nine' = 'Seven of Nine' Stringy lze porovnávat logickými operátory = a <> jako čísla a funguje to intuitivně (stejné stringy se rovnají). Toto opět v mnohých jazycích intuitivně nefunguje. Operátory < a > fungují na řetězce taky. Zjednodušeně lze říci, že řetězec je menší než jiný, pokud by se při zařazení řetězců do telefonního seznamu nacházel blíže začátku (tedy větší jsou dále v abecedě).

Funkce copy function copy (str : string; idx, cnt : integer) : string; Vrátí řetězec, který vznikne tak, že se z kopíruje cnt znaků z řetězce str počínaje znakem na pozici idx. Například copy('seven of Nine', 2, 9) = 'even of N'. Tuto funkci lze dobře kombinovat s funkcí length. Funkci copy lze použít i k odmazání několika znaků. word := copy(word, 3, length(word) - 2); Smaže dva první znaky. (Je jasné proč?) Nesmyslné hodnoty nezpůsobí pád programu (což je oproti mnohým jiným jazykům luxus). copy('the Doctor', 5, 128) = 'Doctor' copy('kathryn Janeway', -2, 7) = 'Kathryn'

Procedura delete procedure delete (var str : string; idx, cnt : integer); Procedura smaže z řetězce str odpovídající část, která začíná na indexu idx a je dlouhá cnt znaků. Proměnná str je proceduře předávána odkazem, aby mohla být změněna; parametr nemůže být konstanta! Je-li v proměnné name uloženo 'T Pol', pak po zavolání delete(name, 2, 2) v name zbyde 'Tol'. Pochopitelně nelze zavolat delete('t Pol', 2, 2), protože konstantu není možné předat odkazem. Ani procedura delete nezpůsobí pád programu při zadání nesmyslných parametrů. Může být nahrazena funkcí copy (viz. minulý slajd).

Procedura insert pr. insert (src : string; var dst : string; idx : integer); Procedura vloží (celý) řetězec src do řetězce dst tak, aby nově vložená část začínala na pozici idx. Do src procedura nezasahuje, do dst ano, proto je src předáván hodnotou a dst odkazem (viz. minulý slajd). Je-li v proměnné name 'Seven Nine', pak po volání insert('of ', name, 7) bude v name 'Seven of Nine'. Procedura insert opět není nezbytná a lze ji nahradit pomocí funkce copy a operátoru zřetězení, kterým je možno spojovat jednotlivé návratové hodnoty funkcí copy. Ani procedura insert nezpůsobuje pády programu.

Funkce pos function pos (substr, str : string) : integer; Funkce pos vrací pozici podřetězce substr v řetězci str; nenachází-li se substr ve str, vrací nulu. Vyskytuje-li se substr ve str víckrát, najde první výskyt. Příklady: pos('dax', 'Jadzia Dax') = 8 pos('a', 'Jadzia Dax') = 2 pos('xxx', 'Jadzia Dax') = 0 pos('j', 'Jadzia Dax') = 0 Oba řetězce jsou předávány hodnotou, proto lze hledat i konstanty (či v konstantách). Tato funkce je velmi vhodná k parsování řetězců.

Další funkce Funkce concat má alespoň jeden (ale může jich mít mnoho) parametr typu string. Tyto řetězce spojí do jednoho a vrátí výsledek. Stejného efektu se dá dosáhnout pomocí operátoru +, ale ten v některých verzích Pascalu nefunguje. Funkce lowercase změní všechna velká písmena v řetězci na malá, např. lowercase('borg') = 'borg'. Funkce upcase změní všechna malá písmena řetězce na velká, např. upcase('borg') = 'BORG'. Chcete-li porovnávat řetězce case-insensitive, oba změňte na lowercase/upcase a porovnejte. Totéž lze praktikovat při používání funkce pos.

Náročnost řetězcových operací Budete-li psát větší programy, které pracují s textem (obecně s řetězci), je třeba mít na paměti, že textové operace jsou výrazně časově i prostorově náročnější, než operace s čísly. Klasická proměnná typu integer v Pascalu zabírá jen dva bajty paměti. Řetězec potřebuje jeden bajt na každý znak (je výrazně větší). Funkce typu pos musí celý řetězec po znaku procházet. Sečtení dvou čísel typicky procesor zvládne v jednom tiku (taktu). Při sčítání řetězců jsou data kopírována z místa na místo; to trvá dlouho, jsou-li řetězce moc dlouhé.

Cvičení Napište program, který na vstupu dostane číslo a na výstup vrátí stejné číslo, avšak oddělené čárkami mezi každou trojicí cifer; existuje-li skupina méně než tří cifer, pak musí být tato skupina první. program modifychars; var numin : string; numout : string; function max(a, b : integer) : integer; begin if (a > b) then max := a else max := b; end; begin readln(numin); while (0 < length(numin)) do begin numout := copy(numin, length(numin) - 2, 3) + numout; delete(numin, max(1, length(numin) - 2), 3); if (0 < length(numin)) then numout := concat(',', numout); end; writeln(numout); end. * Upravte program tak, aby místo dělících čárek vkládal znaky udávající řád: tisíce jako k, miliony M, miliardy G, biliony T a dále P, E, Z, Y a pak už jen čárky. Například z čísla 4194304 udělá 4M194k304.

Rekapitulace Operace s řetězci patří k nejdůležitějším aspektům programování; drtivá většina aplikací nějak rozumně formátuje vstup (a k tomu využívá tyto operace). Řetězce jsou v Pascalu reprezentovány poli znaků, která mají na nultém indexu uloženou informaci o délce řetězce (nikoliv číselnou, nýbrž jako znak). Základní funkce (vestavěné v Pascalu) pro práci s řetězci jsou copy, delete, insert, pos, length, concat, lowercase a upcase (typicky jsou nahraditelné). Úkony s řetězci jsou většinou výrazně náročnější (na výkon procesoru i spotřebu paměti) než operace s čísly (což na malých datech nevadí).