#8 Rekurze a vlastní datové typy

Tato lekce se bude zabývat rekurzivnímu volání funkcí, dále také rozsahu platnosti proměnných. Hlavním bodem tohoto článku budou vlastní datové typy.

Rekurze

Rekurze je proces kde určitý objekt, v případě jazyka C je to funkce, se využívá sebou samým. Funkce obsahuje ve svém těle volání sebe sama a při každém volání jsou upravené předávané hodnoty. Rozlišujeme dva druhy rekurze:

  1. Přímá – uvnitř kódu funkce je volání té samé funkce
  2. Nepřímá – v kódu funkce se nachází volání druhé funkce, která opět zavolá funkci první

Na příkladu si znázorníme použití rekurze a syntaxi kódu, opět použijeme nám již známy výpočet faktoriálu:

#include <stdio.h>

int factorial(int n) {
    if (n > 1) 
        return n * factorial(n - 1);
    else 
        return 1;
}

int main(void)
{
    int number = 0;

    printf("Insert number: ");
    scanf("%d", &number);

    printf("Result: %i\n", factorial(number));

    return 0;
}

Rekurze je určitý druh cyklu, tudíž musí mít ukončovací podmínku, jinak by výpočet rekurze procházel čím dál více do hloubky a mohlo by dojít i k nekonečné hloubce.

Detailnější chování výpočtu rekurze, nám prozradí debugger. Ten obsahuje zajímavou pomůcku, kde si můžeme nastavit podmínku zastavení v rekurzi, jedná se o podmíněný breakpoint.

Vlasnosti breakpointu si zobrazite pravým kliknutím myši na breakpoint a klikněte na Edit breakpoint. Do položky Condition zapíšete podmínku podle které se debugger zastaví na určitém místě.

Rekurzivnímu řešení se raději vyhněte, pokud to samozřejmě není podmínkou příkladu. Jakákoliv rekurze lze zapsat cyklem, nejčastěji while, proto raději preferujte tuto volbu. Rekurze je náročnější vzhledem k výkonu počítače. Při zavolání nové funkce se spouštějí i nové instrukce procesoru a to předání parametru, předání návratové hodnoty a také alokace a dealokace paměti na zásobníku.

Rozsah platnosti proměnné

Deklarace lokální či globální proměnné se nijak neliší. Rozdíl mezi nimi je v rozsahu platnosti v programu.

Lokální proměnná

Pro lokální proměnnou jsou 3 možnosti jak jej deklarovat, myslí se kde, v jaké částí kódu se nachází:

  1. Funkce
  2. Blok
  3. Cyklus

Pří deklaraci proměnné ve funkci, se považuje za platnou až do ukončení funkce. Jedná se pouze o proměnné, které se nacházejí v hlavičce. Pokud bychom deklarovali proměnnou pod hlavičkou, tedy někde uprostřed kódu funkce. Jednalo by se o deklaraci v bloku. Blokem považujeme část kódu, která je ohraničená složenými závorkami. Jako u funkcí i u bloku je to stejné s rozsahem platnosti proměnné, tedy proměnná deklarovaná uvnitř bloku (např.: v podmínce if) zaniká při skončení bloku. Co se týče cyklů, tak proměnná deklarovaná v „hlavičce“ cyklu (platí pouze pro cyklus for) je platná pouze při provádění daného cyklu, po skončení zaniká.

Globální proměnná

Deklarace takovéto proměnné se nachází vně jakékoliv funkce. Platnost proměnné zaniká až při ukončení celého programu.

#include <stdio.h>

int number = 50;

void myFunc()
{
    number += 100;
}

int main(void)
{
    myFunc();
    printf("%d\n", number);
    return 0;
}

Za jakousi globální proměnnou lze považovat i identifikátor vzniklý pomocí direktivy #define. Ačkoliv pojmenování proměnná není správné, jelikož je konstantní a nedá se přepisovat. Rozsah platnosti může být stejný jako u globální proměnné, za předpokladu že se v kódu neprovede direktiva #undef, která by tento identifikátor odstranila.

Překrytí identifikátorů (proměnných)

Existuje možnost překrytí či zastínění proměnné. Například globální identifikátor může být překrytý lokálním identifikátorem (např.: v cyklu), který má sejný název. Používání překrývaní proměnných je nevhodné a zhoršuje se přehlednost kódu.

Vlastní datové typy

Prozatím jsme používali pouze vestavěné datové typy, jako např.: int, double, char. Nyní si však ukážeme jak vytvářet vlastní typy, pomocí kterých lze v jazyce C vytvářet rozsáhlejší konstrukce. Definice všech vlastních typů se zapisují mimo jakoukoliv funkci. Dle konvence se zapisuje ještě před definicí první funkce programu. Existují 4 druhy klíčových slov, bez kterých se vytvoření vlastního datového typu neobejde, jsou to:

  • enum
  • struct
  • union
  • typedef

1. Enum

Nejprve se zaměříme na enum. Pomocí něj lze vyvářet výčtový typ. Jednoduše lze říct, že enum slouží k pojmenování konstant. Obecná deklarace typu enum vypadá takto (zároveň vidíme i deklaraci proměnné, která používá nově definovaný typ):

enum nazev_typu {hodnota1,hodnota2,…}
enum nazev_typu nazev_promenne;

Při deklaraci typu jsou jednotlivé hodnoty ve složených závorkách oddělené čárkou. Při deklaraci proměnné nesmíme zapomínat napsat i zde klíčové slovo enum.

#include <stdio.h>
enum cisla {nula, jedna, dva};

int main(void)
{
    enum cisla cislo;
    cislo = dva;
    //cislo = tri; //error tri neni soucasti vyctoveho typu

    printf("%d\n", cislo);
    return 0;
}

Po spuštění ukázkového programu, ihned zjistíme, že konstrukce enum je vytvořená pomocí celočíselného typu, konkrétněji je to typ int. Dle výchozího nastavení se první položka inicializuje na hodnotu 0, další položka má hodnotu 1, atd.

Tyto hodnoty je možné změnit a to tak, že např.: jedné z položek ve výčtu přiřadíme konkrétní hodnotu.

enum muj_enum {automobil, letadlo = 5, kolo};
// auto = 4, letadlo = 5, kolo = 6

Hodnoty mohou být i stejné.

enum muj_enum {automobil = 7, letadlo = 7, kolo};
// auto = 7, letadlo = 7, kolo = 8

2. Struct

Jak již z pojmenování vyplývá, budou se pomocí slova struct vytvářet datové struktury. Jedná se o množinu proměnných různého datového typu, které jsou navzájem spojené. Každá proměnná má sice své pojmenování, ale celkové spojení musí mít také svůj název.

Obecná deklarace struktury:

struct nazev_typu {
	datovy_typ1 promenna1;
	datovy_typ2 promenna2;
	…
};

Vytvoření proměnné ve funkci:

struct nazev_typu promenna;

Podle obecné definice se nám může zdát, že je to v podstatě to samé co enum, ale není to úplné pravda, struct může mít libovolný datový typ ke každé své proměnné, třeba i další struct.

Ukázkový příklad nám napoví, k čemu vlastně slouží struct.

#include <stdio.h>

struct person_t {
    char name[255];
    unsigned short age;
};

int main(void)
{
    struct person_t person1 = {"Jan", 25};
    printf("%s, %d\n",person1.name,person1.age);

    struct person_t person2 = {.age = 20};
    printf("%s, %d\n",person2.name,person2.age);
    return 0;
}

Struct můžeme použít například k evidenci osob, protože samotná osoba má více položek, které je potřeba uchovat.

V příkladu jsou použity 2 různé deklarace proměnné, které používají stejný datový typ. První přiřazení je klasické, ale u druhého je použitá tečková notace, stejné jako při výpisu jednotlivých proměnných.

Právě pomocí operátoru tečka, přistupujeme k jednotlivým položkám ve structu.

Struct je tedy vhodný na již zmíněnou evidenci osob, ale abychom nemuseli deklarovat každou osobu zvláště, je jednoduší vytvořit pole. Deklaraci pole sice známe, ale pouze pro upřesnění je zde syntaxe:

struct person_t persons[1000];
persons[485].age = 25;

Také jako obyčejnou proměnnou i celé struktury lze kopírovat.

struct person_t person1 = {"Jan", 25};
struct person_t person2;
person2 = person1;

Musíme si však dát pozor, pokud struktura obsahuje datový typ ukazatel. Kopírování totiž způsobí, že 2 proměnné budou ukazovat na stejné místo v paměti a mohlo by docházet k nesprávným výsledkům.

3. Union

Typ union je stejný jako struct, jeho deklarace je totožná, s tím rozdílem, že se zamění klíčové slovo. Union se moc nepoužívá a je vhodnější použít struct. Odlišnost mezi structem a unionem je v tom, že struct zabírá v paměti tolik místa kolik je potřeba pro uchování všech jeho položek, kdežto union zabírá pouze tolik paměti jako jeho největší položka, je tedy jasné, že je možné použít pouze jednu položku v jeden moment. Je tedy možné říct, že všechny položky unionu sdílí jedno místo v paměti.

4. Typedef

Tento nástroj neslouží k vytvoření nějaké struktury různých datových typů jako předešlé 3 případy. Typedef slouží k pojmenovávání různých datových typů, šetří se tím zejména velikost kódu a stává se tím i přehlednější.

Obecný tvar:

typedef datovy_typ nazev_typu;

Pomocí typedef je možné si zkrátit zápis některých deklarací např.:

typedef unsigned short ushort;
typedef int matrix[3][3];

Lze také využít u deklarace structu, poté při deklaraci proměnné typu struct nebude již nutné vepisovat klíčové slovo, ale zapíše se pouze jeho zkrácený zápis vytvořený pomocí typedef:

typedef struct person_t {
    char name[255];
    unsigned short age;
} person;

person person1 = {"Jan", 25};

To bude vše k dnešní lekci, snad jste se zase něco nového dozvěděli a naučili.

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.

Pascal #3 Proměnná a datové typy

Proměnná

Začneme tím, že si vysvětlíme co je to proměnná. Proměnná je v podstatě místo kam si náš program ukládá nějaké data, ať už to jsou mezivýsledky, výsledky nebo hodnoty čekající na zpracování. Chápejme to tedy, jako jistý prostor kam jsme schopni ukládat data, následně k nim přistupovat a dále s nimi pracovat.

Datové typy

již tedy víme, že do proměnných můžeme ukládat nějaké data ale program, potřebuje vědět přesně, jaká data budeme ukládat, a v této chvíli přichází na scénu datové typy. V zásadě rozlišujeme tři hlavní typy

  1. Textové pod tímto si představíme jakýkoliv text nebo jeden znak.
  2. Číselné jakýkoliv údaj, se kterým jsme schopni počítat.
  3. Logické, které nabývají jenom logických hodnot TRUE nebo FALSE

Vše co jsme si doposud řekli, využijeme u deklarace proměnné. Deklaraci chápej jako vyhradit prostor. V pascalu to vypadá následovně: var nazev_promenne : prislušny_datový_typ; Na tomto řádku jsme programu řekli vše, co potřebuje. Slovně by to šlo říci nějak takhle. Vyhraď si prostor pro proměnnou nazev_promenne do které budu ukládat příslušný_datový_typ.

Jinými slovy „var“ je klíčové slovo tak aby kompilátor věděl, že deklarujete (zavádíte) novou proměnnou. Druhé slovo je „nazev“ je název proměnné může byt libovolný (pro pozdější přehlednost programu je doporučeno využívat vždy jednoznačné informativní názvy proměnných) za dvojtečkou poté následuje datový typ zjednodušeně řečeno jaké data se mohou do proměnné uložit více v následující kapitole. Abychom si to mohli napsat víc konkrétněji  pojďme se podívat na jednotlivé datové typy a jejich charakteristiky.

TEXTOVÉ datové typy

Zde se řadí typy, kde zadáváme jakékoliv znaky z ASCII tabulky. Tedy i čísla není možno však s nimi počítat, program je bere jen jako textový řetězec. Textový řetězec se v pascalu ohraničuje apostrofy ‘příklad textového řetězce !! ?? 1234‘

Rozlišujeme zde dva typy

  •     CHAR zde můžeme uložit jen a pouze jeden jediný znak. Příklad ‚A‘
  •     STRING zde můžeme uložit textový řetězec o maximální délce 255 znaků. Příklad ‚příklad textového řetězce !! ?? 1234‘

ČÍSELÉ datové typy

Do těchto datových typů budeme ukládat údaje, se kterými budeme počítat. Dělí se na:

Celočíselné (ukládáme pouze celá čísla)

  •  Byte jeho rozsah je od 0 do 255
  •  Shortint jeho rozsah je od -128 do 127
  •  Word jeho rozsah je od 0 do 65535
  •  Integer jeho rozsah je od -32768 do 32767
  •  Longint jeho rozsah je od -2147483648 do 2147483647
  •  Comp jeho rozsah je od -263+1  do 263-1

Neceločíselné (možno ukládat i čísla s desetinnou čárkou)

  •  Real jeho rozsah je od 2,9*10-39 do 1,7*1038
  •  Single jeho rozsah je od 1,5*10-45 do 3,4*1038
  •  Double jeho rozsah je od 5,0*10-324 do 1,7*10308
  •  Extended jeho rozsah je od 3,4*10-4932 do  1,1*104932

LOGICKÉ datové typy.

Do tohoto typu dat můžeme ukládat hodnoty pouze dvou stavu True a False respektive 1 a 0. Mají pouze jeden typ a tím je BOOLEAN.

Tímto jsme si tedy ukázali všechny dostupné datové typy. Teď malý příklad toho jak by to mohlo vypadat. Samozřejmě by se daly použít i jiné typy u celého čísla například typ byte. Avšak pro ukázku nám postačí:

  •   Proměnná, do které chceme uložit text  var a :string;
  •   Proměnná, do které chceme uložit znak var a :char;
  •   Proměnná, do které chceme uložit celé číslo var a:integer;
  •   Proměnná, do které chceme uložit číslo s desetinou čárkou var a :double;
  •   Proměnná, do které chceme uložit pravdivostní hodnotu var a :boolean;

V pascalu se také můžeme setkat s vlastním datovým typem interval. Proměnná v tomto datovém typu obsahuje námi již nadefinovaná data (tedy buď číslo znak, nebo logický datový typ) avšak pouze v určitém intervalu. Obecný příklad vypadá následovně.

Type x= min..max;

Var a : x;

na prvním řádku jsme si deklarovali vlastní datový typ interval. Na druhém poté deklarujeme novou proměnnou, která bude nabírat hodnot námi vytvořeného datového typu. V praxi to může vypadat takto

Type rozsah = 1..100;

Var cislo : rozsah;

Nebo

Type rozsah = ’a‘ .. ’g‘;

Var znak : rozsah;

Vidíme tedy, že do proměnné číslo můžeme zapsat čísla pouze od 1 do 100 a do proměnné pouze znaky od ‚a‘ do ‚g‘.

Ordinalita

Za zmínku také ještě stojí říct si, jaké datové typy jsou ordinální. Pojďme však od začátku a nejdříve si zaveďme pojem ordinální. Je to ve své podstatě velice jednoduché.

Ordinální prvek je takový, který má svého předchůdce a následovníka. Ordinální jsou tedy celočíselné datové typy, u kterých můžeme z jistou říct, co předchází například před číslem 10 a jaké číslo stojí za ním. Jelikož se jedná o celočíselný datový typ, je jasné, že předchůdce je 9 a následovník je 11.

Kdybychom měli to samé číslo v datovém typu neceločíselném, nemůžeme s určitostí tvrdit jaké má předchůdce a následovníky. Protože po 10 může následovat 10.1 nebo například 10.567. Neceločíselné typy jsou tedy neordinální.  Datový typ Char je také ordinální protože všichni víme, že například před písmenkem ‚B‘ přijde na řadu ‚A‘ a následovník ‚B‘ je zase ‚C‘. Posledním ordinálním typem je typ boolean jelikož nabývá pouze dvou hodnot je to jednoduché. Když nabude 1 je jasné že předchůdce je 0 a naopak.

Příště si projdeme pár příkladu týkajících se právě datových typu a ordinálních hodnot.

 

VBA – #3 Lekce – Proměnné a datové typy

V této lekci se podíváme na proměnné (bez nichž by se neobešel žádný programovací jazyk) a jejich datové typy. Každý program potřebuje své mezi výpočty nebo již hotové výsledky někam ukládat aby s nimi později mohl jakkoliv dál pracovat například vypsat na obrazovku, znovu počítat nebo cokoliv jiného proto byly vymyšleny proměnné.

Proměnná

je dočasný prostor pro ukládání dat při chodu programu. Každá proměnná se musí deklarovat (chápej jako vyhradit prostor) .

Příklad explicitně deklarované proměnné:

Dim a as integer

  1. Dim – je klíčové slovo deklarace
  2. a – je název proměnné
  3. as integer – tímto programu určujeme jaká data se budou do proměnné ukládat (datový typ)

Datové typy

každé data mají svůj typ. Některá jsou celo číselná některá jsou necelo číselná a některé jsou textová. Žádné jiné data neexistují. Každý program potřebuje znát typ dat s jakými bude pracovat a proto je rozlišujeme do několika skupin. A už při deklaraci proměnné musíme uvést jaký typ dat do ní budeme ukládat. Toto je velice důležité.

Celočíselné datové typy

Pokud budeme chtít uložit celočíselná data, použijeme jednu z následujících tří variant:

Byte

  • zabírá v paměti 1 B
  • rozsah je 0 až 255
  • Používá se tam, kde uvedený rozsah stačí.

Integer

  • Zabírá v paměti 2 B
  • rozsah je od -32768 do 32767

Long

  • Zabírá v paměti 4 B
  • Rozsah je od –2 * 109 do –2 * 109
  • tyto datové typy by se daly použít v jednoduchém příkladu
Sub soucet()
 Dim a As Integer
 Dim b As Integer
 Dim c As Integer
 a = 5
 b = 2
 c = a + b
 MsgBox c, vbOKOnly + vbInformation, "Vysledek 
End Sub 

Prvními třemi řádky jsme si deklarovali proměnné a určili jejich datový typ další dva řádky zajistili načtení hodnot (dat) do proměnných další řádek zajistil jejich výpočet a jeho načtení do proměnné c další řádek zajistil jeho vypsání pomocí msgboxu. Msgbox zvládne také vypsání proměnné to se dělá bez uvozovek (MsgBox c).

Neceločíselné datové typy

Tyto datové typy využijeme, pokud budeme vědět, že data budou s desetinou čárkou

Single

  • Reálné celé číslo s plovoucí čárkou zabírající nejvýše čtyři bajty.

Double

  • Reálné kladné číslo s plovoucí čárkou zabírající nejvýše osm bajtů. Nabízí dvojnásobnou přesnost oproti Single a větší rozsah.

Currency

  • Reálné číslo se čtyřmi desetinnými místy zabírající nejvíce osm bajtů.

Zase si je vysvětlíme na jednoduchém příkladu:

Sub Podil() 
Dim a as integer
Dim b as integer
Dim c as double
a=5
b=3
c=a/b
MsgBox c, vbOKOnly + vbInformation, "Vysledek" 
End Sub

Tím, že jsme u třetího řádku nastavili proměnnou jako double si zajistíme, že se výsledek nezaokrouhlí (což by se stalo kdyby jsme použili datový typ integer) ale vypíše se i s desetinou čárkou.

Textové (řetězcové) datové typy

String

Používáme jej k uložení textových řetězců. Řetězec musí být uzavřen do uvozovek. Do textového řetězce můžeme napsat i čísla ale nebude s nimi možno počítat. Budou brány jako znak.

Příklad:

Sub zprava()
Dim zprava as string
zprava=“libovolný textový řetězec sdělující informace uživateli“ 
MsgBox zprava, vbOKOnly + vbInformation, "Zpráva" 
End Sub

Příklad čísla ve stringu:

Sub zajimavost()
Dim a as string
Dim b as string
Dim vysledek as string
a="2"
b="3"
Vysledek=a+b
MsgBox vysledek
End Sub

Sami budete překvapení, jaký bude výsledek. Pokud program pracuje s datovým typem string, nepoužívá plus k matematickým úlohám (3+2=5) ale pouze „postaví“ dva textové řetězce za sebe (slepí je dohromady (2+3=23).

poznámka: čísla v proměnných a , b by se daly zapsat i bez uvozovek ale pro pochopení, že se jedná o datový typ string jsem raději uvedl uvozovky.

Závěr

Toto je konec 2 lekce. Můžete si vyzkoušet různé kombinování s typy proměnných a sledovat změny v chodu programu. V příští lekci se podíváme na využití dalšího windows příkazu inputbox.