VBA – 6# Lekce – Textové funkce

V dnešní lekci se podíváme na práci s textem. Bude se jednat o úpravy textu vyhledávání znaků zjišťování délky řetězce pomocí zabudovaných funkcí, které nalezneme ve VBA. Abychom mohli efektivně pracovat s textovými řetězci, potřebujeme znát právě tyto funkce. Aby se nám lépe demonstrovaly jednotlivé funkce, uvažujme, že máme proměnnou txt, ve které máme uložen text ‚abeceda je veda‘. V kódu zapsáno takto txt=‘abeceda je veda‘. Nyní se již vrhněme na jednotlivé funkce

Funkce Len

nám zjistí počet znaků v textu. Jako jediný parametr požaduje právě text, který má spočítat. Text může být reprezentován jak proměnnou, tak samotným textem v uvozovkách.

Ukázka syntaxe:

Delka=len(txt)
Msgbox(len(txt))

V prvním řádku jde o uložení délky proměnné txt do proměnné délka. Na druhém řádku, dojde k vypsání délky v naše případě se vypíše číslo 15. Je nutné mít na paměti, že do délky textového řetězce se započítávají jak mezery, tak znaménka tak čísla. K lepšímu zapamatování této funkce uvedu, že len je zkrácenina slova length, které v překladu z angličtiny znamená délka ;).

Instr

jedná se o vyhledávací funkci. Zde už se setkáváme s mírně složitějším zapsáním.  Tato fůnkce vyžaduje hned tři parametry, ale není se čeho bát, všechny tři vyplývají z logiky této funkce. Nejdříve tedy musíme zadat startovní pozici to je pozice, na které se začne vyhledávat, jako druhý argument zadáme, kde se má hledat, čili v jakém textovém řetězci v našem modelovém příkladu to bude proměnná txt, jako poslední chce funkce znát hledaný řetězec, který musí být uveden v uvozovkách, hledat můžeme jak jednotlivé znaky, tak i více znaku najednou ba do konce i celé věty podmínka je však, že musí být ohraničeno uvozovkami.

Ukázka syntaxe

Msgbox Instr(1,txt,“j“)

Vidíme tedy, že funkce bude vyhledávat od první pozice v proměnné txt a bude hledat znak „j“.  V našem případě, tedy vrátí hodnotu 9. Pokud bychom hledali více znaků, funkce vrátí vždy pozici, na které hledaný řetězec začíná. Pokud bychom hledali slovní spojení „je“ funkce vrátí opět 9.

Left

Při použití této funkce dojde k vrácení jenom určité části textu. Konkretně vrací zadaný počet znaků od začátku námi zvoleného textového řetězce. Z čeho vyplývá, že požaduje dva parametry textový řetězec odkud bude vracet znaky a počet znaků.

Ukázka syntaxe

Msgbox left(txt,7)
Kus_textu=left(text,7)

S takto zadanou funkcí dostaneme na výsledku slovo „abeceda“. Na druhém řádku se nic nevypisuje, pouze uložíme výstup z funkce do nové proměnné. Je třeba si uvědomit, že funkce nic nemění, pouze vypisuje pokud tedy chceme pracovat jen s určitou části, musíme si ji uložit do jiné proměnné, jako jsem naznačil na druhém řádku.

Right 

tato funkce je zcela totožná jako výše uvedená left jediné co se mění je, že tato funkce zobrazuje znaky zprava nebo chcete-li od konce textového řetězce syntaxe je zcela stejná. Pomocí této funkce můžeme zjistit také velice jednoduše poslední znak v textu.

Ukázka syntaxe

Msgbox right(txt,7)

Toto nám vypíše retězec „je veda“

Mid

nám umožní zobrazit určitou část textu. Vyžaduje k tomu tři parametry, první z nich je jak už jste si asi zvykli, textový řetězec odkud budeme část vybírat v našem případě tedy opět txt. Jako druhý parametr chce funkce znát číslo, které reprezentuje pozici, odkud má začít brát znaky a jako poslední chce číslo, které zastupuje počet zobrazených znaků.

Ukázka syntaxe

Msgbox mid(txt,9,2)

Takto zapsaný řádek nám vypíše pomocí msgboxu prostřední část našeho textu tedy „je“ funkce tedy vrací námi zadaný interval znaku pomoci počáteční pozice a počtu znaků.

Ucase

tato funkce převádí zadaný textový řetězec na velká písmena, vyžaduje pouze jeden parametr a to řetězec, který chceme převést.

Ukázka syntaxe

Ucase(„ahoj“)

Toto vrátí  „AHOJ“.

Lcase

je pravý opak Ucase znamená to tedy, že převede textový řetězec na malé znaky.

vbCrlF

Nejde o funkci spíš o jakousi konstantu, která nám v kódu nahrazuje funkci enter. Jedná se tedy o zalomení řádku. Používá se například při výpisu v Msgboxu pro zpřehlednění informace. Nebo v komentáři u inputboxu. Ukážeme si použití.

Ukázka syntaxe

Msgbox(„Textový řetězec  1“ & vbcrlf & „Textový řetězec 2“ & vbcrlf & „Textový retězec 3“)
Inputbox(„Textový řetězec  1“ & vbcrlf & „Textový řetězec 2“)

U inputboxu se nám řádky zalamují na místě pro popis, je možné tedy přehledně stylovat zprávy pro uživatele jaká data má zadávat.

Příklad 1. Zde si pouze ukážeme vše co jsme si výše popsali.

Sub priklad1()

txt = "abeceda je věda"

MsgBox ("délka je (funkce len) " & vbCrLf & Len(txt))
MsgBox ("hledaný řetězec je na pozici (funkce Instr) " & vbCrLf & InStr(1, txt, "j"))
MsgBox ("funkce left " & vbCrLf & Left(txt, 4))
MsgBox ("funkce right " & vbCrLf & Right(txt, 7))
MsgBox ("funkce mid " & vbCrLf & Mid(txt, 9, 2))
MsgBox ("Vše na velké (funkce Ucase) " & vbCrLf & UCase(txt))

End Sub 

Příklad 2. Nyní si ukažme trošku těžší avšak z mého pohledu velmi praktický příklad.

Uživatel zadá textový řetězec a následně bude dotázán na hledaný znak. Program vypíše, kolikrát se znak v řetězci objevuje a na jakých pozicích.

Sub priklad1b()
    Dim Text As String
    Dim hledany As String
    Dim kde As String
    Dim pozice As Integer
    Dim Cetnost As Integer
    Dim pocatek As Integer
    
    Text = InputBox("zadej text")
    hledany = InputBox("zadej hledany text")
    
    pocatek = 1
    Do
        pozice = InStr(pocatek, Text, hledany)
        If pozice > 0 Then
            Cetnost = Cetnost + 1
            kde = kde + Str(pozice) + ","
            pocatek = pozice + 1
        End If
    Loop Until pozice = 0
    
    MsgBox ("cetnost:" + Str(Cetnost) + ";  " + "pozice:" + kde)


End Sub

Popis kódu již snad není nutný. Hlavní funkcí pro tento příklad je InStr. Pokud by však někomu dělalo potíže porozumět, doporučuji pustit si program debugem a projít si jednotlivé kroky a podívat se co se kam načítá a co se s kódem děje.

Závěr

To bude pro dnešek vše. Příště se podíváme na skládání textových funkcí a zadáme si nějaké komplexnější příklady na procvičení těchto funkci. Příklady budou podobného typu dnešního 2. příkladu budou tedy i trochu prakticky využitelné 😉 máte se tedy na co těšit.

Pascal – #4 Práce s datovými typy, textové funkce

V dnešní lekci si ukážeme použití proměnných a základní práci s datovými typy k tomuto si také představíme některé textové funkce. Nejprve si však osvětlíme pár věcí, které nám to umožní.

Začneme tím, že si řekneme, jak jsme schopni uložit data do proměnné. Docílíme toho kombinací znaků := aby jste lépe pochopili vypadá to takhle promenna:=hodnota (například číslo, znak, řetězec znaků, atd. záleží jak jsme si proměnnou deklarovali, čili jaký očekává datový typ). Kompletně si to ukážeme se všemi datovými typy na následujícím příkladu. V tomto příkladu nic nevypisujeme pouze přiřazujeme hodnoty nebuďte tedy překvapení pokud po jeho spuštění neuvidíte žádný vystup. Je to čistě pro procvičení a aby jste pochopili užití datových typu a rozdíly mezi nimi.

program dat_typy;

uses crt;
var cele_cislo : integer;
var desetine_cislo : real;
var a : boolean;
var znak : char;
var veta : string;

Begin

       cele_cislo:=5;
       desetine_cislo:=4.5;
       a:=TRUE;
       znak:='A';
       veta:='ahoj toto je muj dalsi program';

end.

Načítání vstupních dat funkce Readln

Dále se naučíme načítat vstupní data od uživatele. Využijeme k tomu funkci Readln. Tato funkce očekává jeden argument, kterým bude název proměnné, do které má načtená data uložit. Syntaxe vypadá takto Readln(promenna);  Za chodu programu to tedy vypadá takto. Blikající kurzor čeká na zadaní dat jakmile k tomu dojde uloží Vámi zadané vstupní data do promenné. Musíme si však dát opět pozor aby jsme zadávali data, která se shodují s datovým typem proměnné do které se bude ukládat tzn. nemohu na vstupu zadat číslo a chtít pro funkci Readln aby ho uložila do proměnné string(textový řetězec) toto by zahlásilo chybu.

Dále pak bude možnost vypsat si v pascalu znak na příslušné pozici v textu. Uděláme to následovně. Předpokládejme, že v proměnné znaky máme uložen text „ahoj“, potom tedy tento řádek Writeln(znaky[1]); by nám vypsal znak ‘a’ jinými slovy vypíše první znak z proměnné „znaky“. Na následujícím příkladu si vše ukážeme praktický i s použitím funkce Readln.

Program znak;
uses crt.

var veta : string;
var pozice : byte;
var vysledek:char;

begin

  Writeln('zadej libovolnou větu');
  Readln(veta);
  Writeln('zadej pozici kterou chceš vypsat');
  Readln(pozice);
  vysledek:=veta[pozice];
  Writeln(vysledek);
repeat until keypressed;
end.

Funkce ord

Další co potřebujeme vědět, jsou funkce ord a chr. Funkce ord očekává jeden argument v podobě jednoho znaku a na svém výstupu vrací jeho hodnotu v ASCII tabulce. Pokud si toto aplikujeme znovu na naši ukázku, vypadalo by to takto:

Writeln(ord(znaky[1])) jelikož první znak našeho textu je písmenko ‚a‘ bude tedy funkce ord převádět tento znak na jeho hodnotu. Hodnota ‚a‘ je 97. Zde naleznete veškeré znaky a jejich hodnoty. http://www.theasciicode.com.ar/

Funkce chr

Funkce chr dělá přesný opak očekává jeden argument v podobě číselné hodnoty a na svém výstupu vrátí znak odpovídající zadané hodnotě. Na příkladu by vypadlo následovně. Writeln(chr(97)) toto by vypsalo na obrazovku ‚a‘.

Délka textového řetězce funkce lenght

Pojďme si ukázat ještě funkci lenght. V překladu by se tato funkce jmenovala ‚délka‘. Jak již tedy název napovídá, funkce bude vracet délku zadaného řetězce. Funkce očekává jediný argument v podobě řetězce znaků. Syntaxe je a:=length(retezec); vysvětlení – do proměnné ‚a‘ se uloží délka řetězce.  Pokud chceme vypsat na obrazovku, použijeme Writeln(length(retezec));

Příklad

Pojďme si to tedy ukázat na příkladu. Uživatel zadá libovolný znak a poté zadá číslo od 1 do 10, o které se posune hodnota znaku. Výsledný znak se poté vypíše. Jedná se tedy o jakýsi super jednoduchý šifrovací prográmek. Lépe to pochopíme při pohledu na zdrojový kód.

program sifra;

 uses crt;
 type cisla = 1..10;
 var posun: cisla;
 var vstup: char;
 vystup: char;
 hodnota:byte;
 begin clrscr;
 write('Vlozte znak k šifrování');
 readln(vstup);
 write('Vlozte posun v rozsahu od 1 do 10: ');
 readln(posun);
 hodnota:=ord(vstup) + posun vystup:= chr(hodnota);
 writeln('Znak ', vstup, ' posunuty o ', posun, ' znaku je ', vystup);
 repeat until keypressed;
 end.

Abychom si kód mohli lépe vysvětlit, předpokládejme, že uživatel zadal znak ‚a‘ a posun nastavil na hodnotu 3. V této chvíli nás tedy čeká řádek hodnota:=ord(vstup) + posun zde funkce ord očekává jeden argument, dostane se mu písmene ‚a‘, které převede na číslo 97, které potom sečte s číslem 3 výsledek tohoto, se uloží do proměnné hodnota.  Na dalším řádku vystup:= chr(hodnota); očekává funkce chr jeden číselný parametr k převedení na znak, dostane se mu číslo 100, které se rovná písmenku d, to celé se uloží do proměnné výstup.

Tyto dva řádky by šly nahradit jedním, který by vypadal takto, vystup:= chr(ord(vstup) + posun);

Avšak pro přehlednost jsem to raději rozepsal do dvou řádků, aby byla jasně vidět posloupnost jednotlivých kroků a bylo to lépe představitelné.

Příklad 2

Pojďme si ukázat další příklad. Tentokrát se bude jednat o primitivní kalkulačku.  Zadáme programu dvě čísla. Jako výsledek nám vypíše jejich součet rozdíl podíl a součin.

program kalkulacka;
uses crt;
var x: byte;
y: byte;
soucet: byte;
rozdil: byte;
soucin: byte;
podil: real;
begin clrscr;
write('Zadejte hodnotu promenne x: ');
readln(x);
write('Zadejte hodnotu promenne y: ');
readln(y);
z1:= x + y;
z2:= x - y;
z3:= x * y;
z4:= x / y;
writeln('Soucet hodnot: ', soucet);
writeln('Rozdil hodnot: ', rozdil);
writeln('Soucet hodnot: ', soucet);
writeln('Podil hodnot: ', podil:5:2); //uprava poctu znaku a desetiných míst
repeat until keypressed;
end.

Zde se jedná o v podstatě jednoduchý příklad. Jediné co si vysvětlíme je výpis proměnné podíl, kde nalezneme tento řádek. writeln(‚Podil hodnot: ‚, podil:5:2); jak si můžete všimnout za proměnnou podíl jsou ještě dvě hodnoty oddělené znakem ‘:‘ jelikož se jedná o typ real,který obsahuje desetinou čárkou tak mu určíme kolik má vypsat čísel celkově to je to první číslo a kolik čísel za desetinou čárkou to je to druhé číslo. Můžete si vyzkoušet, jak by to vypadalo bez tohoto.

Závěr

V této lekci jsme si ukázali začátky práce s textem a čísly. Byla to trochu více praktická lekce také proto, abychom si zažili syntaxi jazyka a vývojové prostředí. Měli by jste tedy s přehledem zvládat zadávání dat od uživatele čili funkci READLN a jejich uložení do proměnné, dále pak funkci ord, str a lenght a v neposlední řadě také vypsat znak na určité pozici v textu. Měli by jste také pochopit princip datových typů tzn. vědět jaké data vstupují a přizpůsobit tomu proměnné.

V sekci ke stažení bude také dostupný ještě jeden program k dalšímu procvičování a ukrácení času při čekání na další lekci, která se bude zabývat tentokrát cykly.