Programovanie makier v LibreOffice: Formátovanie funkcie Asc

LO.png V tomto článku sa budeme venovať len funkcie Asc . Okrem toho vás čaká zaujímavý názorný príklad na funkciu Asc , kde využijeme aj trochu krea tivity.   

Funkcia Asc

Funkcia Asc zoberie prvý znak v reťazci a prevedie ho do číselnej ASCII podoby.

Syntax funkcie Asc: Asc(text ako reťazec)

Takže argumentom funkcie Asc by mal byť reťazec. Pozríme sa na prípad, keď argumenty pekne zmixujeme tak, ako v minulých dieloch.

1. príklad: Testujeme argumenty pre funkciu Asc

Sub macro    REM začiatok makra

On Error Resume Next    REM  ak nastane chyba, tak vykonávanie makra pokračuje

REM deklarácie  premenných 
Dim i As Integer
Dim retazec As String
Dim pole()

REM naplnenie nášho deklarovaného poľa
pole() = Array("agadg", "oslik", 0, 100,254, -10, -255, 10.6, 254.6, "11", "45", "88", 
"-25", "84p", "o78", "87.2", "254,99", "p125,77", "127,45osel", &HA2, &HB7, &HC8)

REM  experimentujeme s funkciou Asc v cykle For
For i = LBound(pole()) To UBound(pole())
        retazec = retazec & i+1 & " Asc(" & pole(i) & ") = "
        retazec = retazec & Asc(pole(i))
        retazec = retazec & Chr(10)
Next 

REM  Vypíšeme na obrazovku
MsgBox retazec

End Sub  REM koniec procedúry

Výsledok makra Výsledok makra

Rozbor makra:

Tak a teraz sa pozrieme, čo nám to dáva funkcia Asc pri rôznych typov argumentov.

1 Asc(agadg) = 97 – znak a má v ASCII tabuľke hodnotu 97
3 Asc(0) = 48 – 0 má v ASCII tabuľke hodnotu 48
6 Asc(-10) = 45 – pamätajte, berie vždy prvý znak, takže áno, znak - má hodnotu 45
18 Asc(p125,77) = 112 – znak p má hodnotu 112 v už viac krát spomínanej tabuľke

 V druhom príklade si ukážeme praktickú ukážku využitia funkcie Asc. 

2. príklad: Praktická ukážka využitia funkcie Asc

Sub macro    REM začiatok makra

On Error Resume Next    REM  ak nastane chyba, tak vykonávanie makra pokračuje

REM deklarácie  premenných 
Dim i As Integer
Dim velkost As Integer
Dim retazec1 As String
Dim retazec2 As String
Dim pole()

REM naplnenie nášho deklarovaného poľa
pole() = Array("Surviving Mars", "World of Warcraft", "Stellaris", 
"Euro Truck Simulator 2", "Cities Skylines", "American Truck Simulator", 
"Counter Strike 1.6", "Crusader Kings 2", 
"Europa Univrsalis IV", "The Sims 4")

REM priradíme prvky pola do reťazca
For i = LBound(pole()) To UBound(pole())
    If i = UBound(pole()) Then
        retazec1 = retazec1 & pole(i)
        Exit For   
    End If
    retazec1 = retazec1 & pole(i) & ", "    
Next


REM nájdeme všetky hry začínajúce na písmeno C
For i = LBound(pole()) To UBound(pole())
    If Asc(pole(i)) = Asc("C") Then
        retazec2 = retazec2 & pole(i) & ", "
    End If
Next

MsgBox "Všetky hry: " & retazec1 & Chr(10) & "Hry začínajúce 
na písmeno C: " & Left(retazec2, 
Len(retazec2)-2)  REM vypíšeme reťazce

End Sub  REM koniec procedúry

Výsledok makra Výsledok makra

Rozbor makra:

Mám tu viacero častí kódu, ktoré vám chcem bližšie vysvetliť. Pozrime sa na prvú diskutabilnú časť makra.

1.ukážka:

For i = LBound(pole()) To UBound(pole())
    If i = UBound(pole()) Then
        retazec1 = retazec1 & pole(i)
        Exit For   
    End If
    retazec1 = retazec1 & pole(i) & ", "    
Next

Takže v našej prvej ukážke máme cyklus, v ktorom prechádzame to naše známe pole. Keďže naším prvým cieľom je transformovať obsah poľa do reťazca, robíme to takto: retazec1 = retazec1 & pole(i) & ", ". Keďže jednotlivé prvky poľa obsahujú naše definované reťazce, konkrétne známe hry, tak pre estetický výpis oddeľujeme reťazce čiarkou a medzerou. Problém je, že bez zásahu by to dopadlo tak, že i na konci by ostala čiarka a medzera (ale tu by sme nevideli, čiže ani oči by neplakali), čo by mohlo byť pre niekoho rušivým elementom. Takto dostávame zaujímavý problém, ktorý môžeme riešiť. Vyriešili sme to tak, že ak bude sa bude vykonávať posledná iterácia cyklu, tak jednoducho skončíme cyklus a čiarka sa nepridá!

Ukážme si druhu ukážku:

2. ukážka:

For i = LBound(pole()) To UBound(pole())
        If Asc(pole(i)) = Asc("C") Then
                retazec2 = retazec2 & pole(i) & ", "
        End If
Next

V druhej ukážke už nasadzujeme funkciu Asc, ktorá sa nám v tomto príklade náramne hodí. Totižto my potrebujeme vypísať len hry, ktoré začínajú so začiatočným písmenom C. Dáme to do podmienky a pekne krásne vyselektujeme jednotlivé hry na tie, ktoré začínajú na písmeno C a ktoré nie. 

Ostáva nám už len vysvetliť, ako si poradíme s nezbednou čiarkou a medzerou na konci tak ako v prvej ukážke. Na pomoc si zavolám funkciu Left, ktorá zobrazí z reťazca len toľko, koľko uznáme za vhodné v našej implementácii. Využijeme aj funkciu Len, ktorá nám vráti počet znakov v reťazci. Ak sa chceme zbaviť medzery a čiarky, tak musíme odpočítať o hodnotu 2! Výsledná podoba riešenia problému je nasledovná: Left(retazec2, Len(retazec2)-2).

(Jako ve škole) Průměr: 1.00 | Hodnotilo: 3
 

Komentáře

user avatar neutr
Odpovědět
Programovanie makier v LibreOffice: Formátovanie funkcie Asc
11. 01. 2018, 17:36:05
Musím upozornit na malý detail ale důležitý. ASC není totéž co ASCII.
Cituji nápovědu a prokládám komenty :

Vrátí ASCII (American Standard Code for Information Interchange) prvního znaku v řetězci.
Syntaxe: Asc(Text As String) : Návratová hodnota : Celé číslo
Parametry:
Text: Platný řetězec. V úvahu se bere jen první znak řetězce.
Pomocí funkce Asc nahradíte klíče hodnotami.
-až sem je to téměř dobře---------------------------------------

Pokud funkce Asc narazí na prázdný řetězec, LibreOffice Basic oznámí chybu [to je vlastně přetečení - empty, ani Null není znak - musí se testovat od hodnoty 1 do hodnoty LEN(text)].

Kromě 7bitových ASCII znaků (kódy 0-127) umí funkce Asc zjistit také netisknutelné znaky ASCII kódu.
- tohle je důležité ale pro neznalého značně nebezpečné-------------
- doporučuji pracovat jen s kódy 32 až 126 - jinak je průšvih.


!!! - Tato funkce zpracuje také -!!- 16bitové Unicode znaky -!!-. Tady je malér jako Brno : umí jen 7bitových ASCII znaků (kódy 0-127) ale nikoliv národní prostředí ANSI (128-255). Vrací hned hodnotu Unicode 16 bitů.

- Totéž v modrém dělá funkce CHR(). Takže při programování Vás nesmí ani napadnout používat ke čtení nebo zápisu funkce ASC a CHR.

- Když uděláte testy tak zjistíte že přímo fungují jen :
UNICHAR == CHR
UNICODE == ASC

- Dá se to obejít emulací funkce CHAR() a CODE(). Nechci narušit kontinuitu výkladu a tak jestli Eda nemá vlastní řešení - poskytnu svoje.
user avatar neutr
Odpovědět
Re:Programovanie makier v LibreOffice: Formátovanie funkcie Asc - doplnění poznámky
11. 01. 2018, 18:11:39
Jde o to, že když načtete ze sešitu například českou dikritiku - funkce CODE vrátí hodnotu v rozmezí 128-255. Když tuto hodnotu dáte jako znak do funkce CHR() vrátí úplně něco jiného.

Dá se pouze načíst vše jako ASC a následně tento řetězec vrátit pomocí CHR(). V praxi to kolegové obchází zápisem, do array jako znaky v uvozovkách. Například "ř" a pak se to z array načte správně.

Problém je v tom, že národní část znakové sady je kódována navíc jako UTF-8. Ale tyto znaky mají "domovské číslo" v Unicode 16 bit a nikoliv mezi znaky 128-255.

Takže přepis jako string v uvozovkách funguje, ale přepis podle čísla ASC (CHR) nikoliv.

V prvním příspěvku jsem zapoměl popsat test v sešitu :
sloupec A CHAR(Row()-1), sloupec B UNICHAR(ROW-1), sloupec C CHR(řádek-1)
CHAR - UNICHAR - CHR
---- zpětný převod na stejném řádku
sloupec D CODE(unichar), sloupec E UNICHAR(Char), sloupec F ASC(char)
CODE(unichar) - UNICODE(char) - ASC(char)
user avatar Eduard Boldižár
Odpovědět
Re:Re:Programovanie makier v LibreOffice: Formátovanie funkcie Asc - doplnění poznámky
11. 01. 2018, 18:52:38
Vďaka za spresnenie a defakto skvalitnenie článku i pre ostatných, vážim si toho.

Přidat názor

 

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích najdete v nápovědě. Diskuzi můžete sledovat pomocí RSS kanálu.

 
Eduard Boldižár

Eduard Boldižár

Som redaktorom stránky astrotech.cz. Mám 24 rokov. Čas trávim v IT škole. Medzi moje záľuby patrí astronómia, sci-fi literatúra a programovanie.

 
 
 
woo jaw demo hz