Pascal – #7 Pole

Dnes si vysvětlíme problematiku polí, v programovacím jazyce Pascal. Pole se používají v každém jazyce a je to další z nezbytných součástí programování. Řekněme si tedy co to je. Jedná se o setříděnou množinu prvků stejného datového typu. Teď tedy co si pod touto definicí představit. Do pole můžeme přehledně ukládat data o stejném datovém typu. A proč přehledně? Protože každá informace uložená v poli má svůj index. Index chápej jako určitou ordinální hodnotu většinou celé číslo pod, kterým k datům přistupujeme

Index Hodnoty
1 28
2 59
3 7
4 88
5 22

 

Takhle si lze představit dvojrozměrné pole. Jako tabulku, kde první sloupec jsou indexy a v druhém jsou uložená libovolná data.

Techniku polí využijeme například v příkladu, kdy bychom chtěli uložit 10 čísel. Až do dnešní lekce bychom museli deklarovat deset proměnných a čísla ukládat jednotlivě. Teď však můžeme uložit 10 čísel do jednoho pole s velikosti 10. Z toho vyplývá, že i Indexů bude 10. Úplně laicky řečeno, pole v sobě  ukrývá 10 proměnných.

Obecná syntaxe: deklarace pole

Var pole_cisel : array [1..10] of byte;

Vysvětlení kodu. Tady se jedná o deklaraci, jak naznačuje příkaz Var, za ním následuje název, to zatím není nic nového za dvojtečkou, však uvádíme, že se jedná o pole (klíčové slovo array) hned za tímto musíme uvést velikost, chcete-li počet indexu, který je uveden intervalem. Většinou se udává od 1 do námi požadované velikosti, jako poslední dáme programu vědět, jaká data bude do pole ukládat, v tomto případě of byte.

Obecná syntaxe: uložení

Pole_cisel[1]:=28;
Pole_cisel[2]:=59;

Je třeba si uvědomit, že jakmile chceme pracovat s polem, musíme vždy uvést index. Asi lépe si to představíme, pokud budeme uvažovat pole jako deset proměnných v jedné a ve chvíli kdy chceme cokoliv ukládat nebo číst musíme si „vytáhnout“ tu jednu proměnnou, se kterou chceme pracovat, pomoci indexu. Zde vidíme ukázku uložení čísla do pole. Indexy se píšou v hranatých závorkách. Jakmile uvedeme index, stává se z pole svým způsobem samostatná proměnná, se kterou pracujeme tak, jak jsme již zvyklí.

Obecná syntaxe: vypsání prvku

Writeln(pole_cisel[1]);

Pojďme si ukázat praktický příklad zápisu do pole pomocí cyklu. Příklad bude znít: Zapište do pole 10 čísel, program se následně zeptá, poté uživatel zadá index od 1-10 a vypíše se příslušné číslo, které je pod tímto indexem uložené v poli.

program pole1;
uses crt;
var pole_cisel : array [1..10] of byte;
var i : byte;
var pozice: byte;
begin
      clrscr;
      writeln('zadej 10 čísel');
      for i:=1 to 10 do
      begin
            readln(pole_cisel[i]);
      end;
      writeln('zadej index který chces z pole vypsat');
      readln(pozice);
      writeln(pole_cisel[pozice]);
      repeat until keypressed;
end.

Vysvětlení kódu

zde je třeba si uvědomit, že index pole muže být reprezentován proměnnou stejně tak dobře jako konstantou (číslem), tak jak jsme si to ukazovali ze začátku lekce. V našem případě uvádíme na místě indexu proměnnou i, která v tomto příkladu zastává také funkci počítadla cyklu. Z logiky věci tedy plyne následující. Víme, že počítadlo se při každém průchodu navýší o hodnotu 1. Z toho vyplývá, že při prvním průchodu cyklu bude námi popisovaný řádek vypadat takto:

Program narazí na příkaz readln a ví, že bude načítat data od uživatele, jako parametr požaduje, kam je bude načítat, zde jsme mu nabídli pole s indexem i, který při prvním průchodu má hodnotu 1. Takže na první pozici se zapíšou vstupní data a program pokračuje dál. Skočí na začátek cyklu, navýší počítadlo čili proměnnou i o hodnotu jedna a pokračuje dál vykonávat příkazy, zase narazí na readln a bude požadovat místo kam data uloží, zde se mu nabídne zase pole ale s indexem i ale je důležité si uvědomit, že v této chvíli je již index reprezentován číslem 2. Pokud pořád přemýšlíme o poli jako o 10 proměnných najednou tak si uvědomíme, že nyní již požadujeme v pořadí druhou proměnnou a do ní ukládáme.

Tento příklad je možná trošičku složitější na pochopení nicméně v podstatě se jedná o využití dvou věcí. Za prvé, možnost index reprezentovat proměnnou. Za druhé, využití počítadla do role indexu (zda si nejste jistí funkci počítadla, přečtěte si lekci 5 tam je to probíráno). Pokud si uvědomíme tyto dvě věci samostatně, neměl by být problém představit si to v příkladu.

Po této lekci byste měli být schopni odpovědět na tyto otázky:

  1. Jak vypadá pole, či jak je možné si pole představit
  2. Deklarace polí
  3. Jak přistupujeme (pracujeme) s jednotlivými záznamy v poli
  4. Co je to index, k čemu slouží a čím může být reprezentován

Shrnutí:

Při práci s poli je důležité uvědomit si, s jakým indexem momentálně program pracuje. I přestože v této lekci jsme pracovali s poměrně malým polem velikosti 10, je důležité mít na paměti, že můžeme použít i mnohem větších polí. Nejčastější chyby pak bývají právě s deklarací příliš malého rozsahu polí a program poté může pracovat nestandardně, proto se všeobecně doporučuje deklarovat pole s jistou rezervou.

Víc už si v této lekci neukážeme, příště se podíváme na cykly ukončené podmínkami. Pokud Vám v této lekci nebylo něco jasného, ptejte se v komentářích.

VBA – 5# Lekce – Debug proces

Ještě než se pustíme do slibovaného příkazu „Select Case“ chtěl bych Vám ukázat tzv. Debug v MS Excel. Je to nástroj, který prochází krok po kroku námi napsaný kód. Je to dobré, pokud máme delší kód a někde máme chybu. Nebo také k lepšímu pochopení chodu programu.

Debug

Tak a teď jak na to. Nejdříve si spustíme námi napsaný prográmek třeba z minulé lekce s podmínkami IF. Jak jsme již zvyklí, přepneme se do vývojového prostředí. Debug pustíme tlačítkem F8 nebo také v záložce Debug -> položka Step Into. Aby vše fungovalo, musíme mít kurzor nakliknutý v jakékoliv části námi napsaného programu. Postupným mačkáním F8 debug prochází jednotlivé řádky našeho kódu aktuálně „projížděný“ řádek je podbarven žlutě. Pokud potřebujeme vědět, jaké data se nám aktuálně načetly do proměnné, stačí najet kurzorem na danou proměnnou a zobrazí se nám, co obsahuje. Toto platí pro všechny proměnné v kódu ne jenom na tu podbarvenou.

Závěr

S tímto nástrojem jsem Vás chtěl seznámit zejména kvůli pochopení chodu programu. Aby jste viděli, co se kam kdy načítá a měli tak větší kontakt s napsaným kódem a uměli si vše líp představit. Závěrem si dáme úkol projít všechny námi doposud napsané programy tímto postupem a znovu se zamyslet jak program funguje zejména pak programy z minulé lekce kde jsme se poprvé setkali s IF.

VBA – 4# Lekce – Podmínky IF

V této lekci se podíváme na větvení programu pomoci podmínek IF (do češtiny přeloženo KDYŽ). Podmínky jsou nedílnou součástí každého programu pomáhají nám ošetřovat různé možnosti na základě podmínek. Pomocí těchto příkazu jsme potom schopni větvit program v závislosti na vstupních okolnostech.

Obecná syntaxe podmínky

Syntaxe podmínek if vypadá takto.

IF podmínka Then

Blok příkazů VBA

ElseIf

Blok příkazů

End If

Tento příklad ukazuje jenom samostatný blok podmínek a po zkopírování vám nebude fungovat. Kompletní příklady si ukážeme později v této lekci.

If volba = "a" Then
MsgBox "ahoj", vbOKOnly + vbInformation, "Zpráva" 
ElseIf volba = "b" Then MsgBox "nazdar", vbOKOnly + vbInformation, "Zpráva"
Else MsgBox "končím program", vbOKOnly + vbInformation, "Zpráva"
end
End If

Teď si tento kód rozebereme : První řádek by se dal přečíst takto. Pokud (if)  jakákoliv proměnná ( volba) se rovná ( = )  “a“  potom vykonej (then). Pokud tato podmínka nenastane program přeskočí řádky pod ní a zastaví se u řádku elseif . Elseif je obdoba if ale v podmínce ho můžeme využít kolikrát chceme kdežto if se dává jenom na začátek dané podmínky. Z toho vyplývá že třetí řádek se čte úplně stejně jako první. Else značí něco jako „cokoliv jiného“. Takže pokud se volba bude rovnat cokoliv jiného než „a“ nebo „b“ program vykoná řádky pod else. V Tomto případe vykoná příkaz end, který ukončí celý program. Podmínky nemusí vždy obsahovat else nebo elseif. Každý podmínkový blok ale musí být ukončen řádkem End If. A teď již pár slibovaných kompletních příkladů na procvičení podmínek.

Příklady


Sub cisla()
Dim Cislo As Double
Dim Vysledek As String
Cislo = InputBox("zadej číslo")

If Cislo > 0 Then
        Vysledek = "kadné"
    ElseIf Cislo < 0 Then
        Vysledek = "záporné"
    Else  Vysledek = "nula"
End If
MsgBox "Číslo je " + Vysledek
End Sub

Sub porovnání()
Dim a As Double
Dim b As String
a = InputBox("zadej číslo a")
b = InputBox("zadej číslo b")

If a > b Then
      Vysledek = "a je vetší než b"
   ElseIf b > a Then
      Vysledek = "b je vetší než a"
   Else Vysledek = "a = b"
End If

MsgBox Vysledek
End Sub

U tohoto příkladu je v podmínce použitý textový řetězec proto podmínka vypadá if heslo=“vba“(každý textový řetězec se ohraničuje uvozovkami) kdyby to nebylo v uvozovkách program by to bral jako proměnnou. Zkuste si dát zadat do inputboxu textový řetězec vba a potom cokoliv jiného.


Sub heslo()
Dim heslo As String
heslo = InputBox("zadej heslo")
If heslo = "vba" Then
        MsgBox "Zobrazení přísně tajné zrávy :D", vbOKOnly + vbInformation, "TOP sectret"
    Else
        MsgBox "spatně zadané heslo", vbOKOnly + vbInformation, "Smůla"
End If
End Sub

Toto je jenom obdoba předešlého příkladu. Chybí zde příkaz else. Sami se podívejte na rozdíl mezi oběma příklady


Sub heslo_update()
Dim heslo As String
heslo = InputBox("zadej heslo")
If heslo = "vba" Then
        MsgBox "Zobrazení přísně tajné zrávy :D", vbOKOnly + vbInformation, "TOP sectret"
End If
End Sub

Závěr

Tím naše lekce končí podmínky jsou velmi důležitou součástí programování takže jestli něčemu nerozumíte klidně se ptejte v komentářích pod článkem. V příští lekci se podíváme na další možnosti dělení programu pomocí příkazu Select Case.

Pascal – #6 Podmínky

V této lekci se naučíme podmínkám. Podmínky se v programu používají k rozhodování a větvení programu. Například pokud uživatel zadá číslo, udělej něco, pokud uživatel zadá písmeno, udělej něco, pokud zadá znak, udělej něco jiného atd. Podmínky jsou nedílnou součástí každého programovacího jazyku. Je to jedna z nejdůležitějších věcí. V podstatě nejde napsat žádný větší program bez užití podmínek. Proto je velmi důležité je pochopit. Nemějte však, strach v zásadě se nejedná o nic složitého. Tolik tedy na úvod. Teď si pojďme ukázat, jak to bude vypadat v praxi.

Boolenovský výraz

Řekněme si co to je boolenovský výraz, stručně řečeno, je to takový výraz, na který se dá odpovědět ANO – NE respektive PRAVDA – NEPRAVDA. Příklad takového boolenovského výrazu je například následující  10>6 v tomto případě se jedná o ANO nebo také PRAVDU. Další možný příklad by byl 5=7 tady se však jedná o NEPRAVDU. Místo čísel však můžeme užít také proměnné, které uživatel naplní daty až za chodu programu např. a<b zde nelze na první pohled rozhodnout jedná se však také o boolenovský výraz stejně tak jako například zde x=‘A‘ tady se pro změnu ptáme, zda je v proměnné x načtený znak „A“.

Obecná syntaxe podmínky:

If (boolenovský vyraz) then
Begin

 Vykonávané příkazy;
 Vykonávané příkazy;

End;

Pojďme si to teď popsat slovy. Na začátek si řekneme, že tomuto celému se rozhodovací blok nebo taky podmínkový blok. Teď již na překlad. IF v překladu znamená ‚pokud‘ nebo taky ‚když‘. První řádek by se tedy dal přečíst takto. Pokud boolenovský výraz je pravda potom. Následující řádky jsou již blok příkazů, tak jak jsme již zvyklí například z lekce o cyklech. Pokud boolenovský výraz na začátku není pravda program skočí až na řádek s End;. Toto byla jen velice jednoduchá ukázka pojďme si ukázat něco trochu složitějšího. A tím jsou složené podmínky.

Obecná syntaxe Složené podmínky:

If (boolenovský vyraz) then
Begin

  Vykonávané příkazy;
  Vykonávané příkazy;

End

Else if (boolenovský vyraz) then
Begin

  Vykonávané příkazy;
  Vykonávané příkazy;

End;

Zde dochází k tomu, že program testuje první boolenovský výraz a pokud neplati, tak neskočí hned na konec celého bloku podmínek, ale řeší boolenovský výraz následující za slovem Else If pokud je pravda vykoná jeho příkazový blok, pokud ani ten neplatí tak hledá další boolenovský výraz za Else IF pokud žádný takový nenajde skočí na konec a pokračuje v dalším chodu programu.

Zde si ještě řekneme, že pokud by byl první boolenovský výraz platil tak by se již druhý výraz ani nekontroloval a vykonaly by se pouze příkazy následující po prvním boolenovském výrazu. Dále je důležité vědět, že Počet Else if v podmínce není omezen a můžeme ho tedy využít, kolikrát chceme. Zde si povšimneme ještě jedné zvláštnosti pascalu, že před end, za kterým následuje else se nepíše ‚;‘. Pokud bychom znak napsali, compilator by hlásil chybu.  Aby toho nebylo málo, čeká nás ještě třetí typ struktury. Ten vypadá opět podobně

Obecná syntaxe Podmínka S ELSE na konci:

If (boolenovský vyraz) then
Begin

  Vykonávané příkazy;
  Vykonávané příkazy;

End;

Elseif (boolenovský vyraz) then
Begin

  Vykonávané příkazy;
  Vykonávané příkazy;

End

Else
Begin

  Vykonané příkazy;

End;

Zde nám ke konci přibylo slovo Else, zde si opět povšimneme, že na řádku před else není za end znak ‚;‘. Druhá zvláštnost je, že se neuvádí žádný boolenovský výraz z logiky věci tedy platí, že všechny příkazy napsané za else se vykonají vždy. Else je však volitelné nemusí být v podmínce vůbec obsaženo. Většinou se jedná o koncové řešení, které pouze vypíše zprávu na obrazovku. Else by se dalo přeložit jako, pokud nastane cokoliv jiného než výše uvedené boolenovské vyrazy pak dělej následující příkazy.

Příklad 1

Tak dost bylo teorie, pojďme si ukázat, jak to funguje v praxi. Tím to pochopíte stejně nejlépe. Jako první si ukážeme zcela jednoduchý rozhodovací blok. V nadcházejícím příkladu program rozhodne zda uživatel zadal číslo větší menší než nula a nebo samotnou nulu.

Program IF1;
Uses crt;

Var a : integer;

Begin
Clrscr;
 Readln(a);

 If a > 0 then
 Begin
   Writeln('číslo vetší jak nula');
 End

 Else if a < 0 then
 Begin
   Writeln('číslo mensi jak nula') ;
 End

Else Writeln('zadané číslo je nula');

Repeat until keypressed;

End.

Logické operátory:

V druhé části lekce si ještě řekněme něco o logických operátorech, které můžeme v podmínkách využít.

OR: jedná se o logické nebo.

AND: by se dalo přeložit jako ‚a současně‘

Použití těchto operátoru v podmínkách je pak následující:

If( (boolenovský výraz) OR( boolenovský výraz)) then

taková to podmínka se provede, pokud alespoň jeden boolenovský příkaz bude pravda.

If( (boolenovský výraz) AND ( boolenovský výraz)) then

taková to podmínka se provede jen a pouze pokud budou oba boolenovské výrazy pravda

Komplexní Příklad

Vše si ukážeme hned na dalších dvou příkladech, které budou demonstrovat vše co jsme se dnes naučili. Tentokrát se bude jednat o program, kterému zadáme tři rozměry reprezentující hrany trojúhelníku, a program rozhodne, zda je vůbec možné tento trojúhelník sestavit a poté vypíše, zda se jedná o rovnoramenný rovnostranný nebo obecný trojúhelník. Při rozhodování, zda je možné sestrojit, použijeme pravidla, že součet kterýchkoliv stran musí být větší než strana třetí

Program trojuhelnik;

   uses crt;

   var a : integer;
       b : integer;
       c : integer;

 begin
     clrscr;
     Writeln('načti 3 strany trojúhelníku');
     readln(a,b,c);

              if ((a+b<c) or (b+c<a) or (c+a<b)) then
              begin
                  Writeln('Trojuhelnik nelze sestrojit');
              end
              else if  (a=b) or (b=c) or (c=a) then
              begin
                  Writeln('Rovnoramený');
              end
              else if (a=b) and (a=c) then
              begin
                  Writeln('Rovnostranný');
              end
              else Writeln('Obecný');

           repeat until keypressed;

        end.

Příklad 3

Další program neukazuje nic nového spíše procvičuje použití podmínek a logického operátoru AND.

program IF2;
 uses crt;
 var x : integer;

Begin
 clrscr;
  Writeln('Zadej cislo x od 0 do 100');
  Readln(x);
  If (x>=0) and (x<=50) then
  begin
    writeln('Zadane cislo je v intervalu od 0 do 50 včetně') ;
  end
  else if (x>=51) and (x<=100)then
  begin
    writeln('Zadane cislo je v intervalu 51 a 100');
  end
  else writeln('nezadali jste číslo v rozsahu od 0 do 100 zkuste znova');

  repeat until keypressed;

  end.

Závěr

Z dnešní lekce je to již vše. Měli byste tedy chápat obecnou strukturu podmínek if vědět kdy použít složitější podmínky s else if a else. Dále byste měli vědět, co je to boolenovský výraz. Měli byste chápat spojení boolenovských výrazů pomocí logických operátorů AND a OR. Případně si sami můžete zkusit vymyslet nějaký prográmek či pouze nějakou jinou variantu na to co jsme si dnes ukázali.

V příští lekci se podíváme na opět na cykly, které budou tentokrát ukončovány podmínkou.

#9 Práce s textem

Právě dnes Vám přinášíme další díl našeho kurzu programování v jazyce C. V této lekci se budeme zabývat řetězci, zejména používání vestavěných funkcí pro práci s textem, kterých není málo a proto si ukážeme jen ty nejpoužívanější nebo spíše nejužitečnější pro základní práci s řetězci.

Poprvé jsme se o řetězcích zmínili v 6. lekci, kde jsme si ukázali jejich deklaraci, vstup do programu a následné vypsání. Nyní si informace o řetězcích trochu rozšíříme.

Charakteristika řetězců

Jak jsme si již definovali v předešlé lekci (6. lekce), že řetězec je posloupnost znaků. V jazyce C bývají zapsané jako pole znaků (charů). Každý řetězec je ukončen tzv. Binární nulou. Právě díky ukončovací nule si nemusíme pamatovat velikost pole. Pole znaků procházíme pouze do výskytu ukončovací nuly. Je možné nulu posouvat na nižší úroveň v poli, čímž se řetězec zkracuje. Znaky za ukončovací nulou nejsou zpravidla dostupná, ale při pokusu o jejich vypsání se zobrazí jakési „smetí“ z paměti.

Deklarace řetězce

char string[10]; //9 znaku + ukoncovaci nula

Pokud při deklaraci rovnou přiřadíme i nějaký řetězec, velikost pole se nastaví podle počtu znaků + ukončovací nula.

char string[] = "text"; //velikost pole = 5

Inicializace řetězce

Rozdíl v inicializaci pole a řetězce:

char str1[]="abc"; //inicializace pomoci retezcove konstanty
char str2[]={'a','b','c'}; //inicializace pole znak po znaku

Druhý zápis nevloží nakonec pole ukončovací nulu. Pro správnost musíme přidat i nulu jako 4. prvek pole.

char str2[]={'a','b','c', 0};

Pokud použijeme funkci scanf pro načtení řetězce tak syntaxe vypadá následovně:

scanf("%s", string);

Víme, že u funkce scanf se k proměnné přidává operátor reference, aby fungovala správně, jelikož proměnná typu řetězec obsahuje adresu tak se tento operátor nepřidává.

Operace s řetězci

char string[] = “Lorem ipsum”;

Vypsání určitého znaku v řetězci lze bud pomocí operátoru hranaté závorky, kde se vypíše daný prvek v poli, nebo pomocí ukazatelové aritmetiky nastavíme ukazatel na konkrétní adresu a pomocí operátoru dereference vypíšeme obsah paměti na této adrese.

printf("%c\n", string[6]);
printf("%c\n", *(string+6));

Můžeme část řetězce vložit do nového, opět za pomoci ukazatele.

char* string2 = string + 6; //string2 = "ipsum"

Můžeme řetězec zkrátit vložením ukončovací nuly. Zapsáni nuly je možné dvěma způsoby, je jedno který zvolíte.

string[5] = 0;
string[5] = '\0';

Pole řetězců

Je to pole kde typ jednotlivého prvku pole je ukazatel na řetězec (char*). Nejčastější použití takového pole je pro řadu konstantních řetězců.

char* OnlineKurzy[] = {"Lekce VBA","Lekce Pascalu","Kurz C","Webdesign"};

Funkce pro práci s řetězci

Nejprve si ukážeme pár důležitých funkcí, které se nacházejí v knihovně string.h

Funkce strlen

Je to velice používaná funkce, která vrací počet znaků v řetězci. Na příkladu vidíme rozdíl mezi sizeof a strlen. V příkladu je i test ukončovací nuly, zda se opravdu v řetězci nachází.

#include <stdio.h>
#include <string.h>

int main(void)
{
    char string[] = "Lorem ipsum";
    printf("%s\n", string);
    printf("sizeof: %d\nstrlen: %d\n",sizeof(string),strlen(string));
    string[5] = '\0'; //vlozime ukoncovaci nulu doprostred retezce
    printf("%s\n", string);
    printf("sizeof: %d\nstrlen: %d\n\n",sizeof(string),strlen(string));

    printf("vypisuju ukoncovaci nulu jako znak:%c(vlozi mezeru)\n", string[11]);
    printf("vypisuju ukoncovaci nulu jako cislo:%d(vlozi cislo)\n", string[11]);

    return 0;
}

Pokud chceme nulu vypsat samostatně jako znak tak se na výpisu objeví mezera, při výpisu celého řetězce se tato mezera neobjeví, jelikož se vypisují pouze znaky před ukončovací nulou.

U funkce strlen opravdu vidíme, že řetězec má délku 11, ale funkce sizeof nám vrací číslo o 1 větší a to proto, že funkce ukazuje kolik je potřeba bytů na uchování tohoto řetězce v paměti. Víme, že na uložení jednoho znaku potřebujeme právě 1 byte a ten 12. byte navíc je právě pro ukončovací nulu.

Funkce strcpy

Slouží k překopírování jednoho řetězce do druhého.

strcpy(retezec1,retezec2);

Dle znázornění se zkopíruje retezec2 do retezce1. Důležité pravidlo pro použití této funkce je, že retezec1 musí být dostatečně velký, aby byl schopen uložit do sebe retezec2.

Funkce strcat

Tato funkce umožňuje spojit dva řetězce v jeden.

char str[256] = "Lorem";
printf("%s\n",strcat(str,"Ipsum"));

Výsledek bude vypadat: LoremIpsum.

Pravidlo pro tuto funkci je, že opět první řetězec musí mít dostatečnou velikost a to: (délka prvního řetězce) + (délka druhého řetězce) + 1 (ukončovací nula)

Funkce strcmp

Pro porovnání dvou řetězců se používá tato funkce.

strcmp(retezec1,retezec2);

Funkce vrací celočíselnou hodnotu:

  • hodnota 0 – vrací, jestliže jsou oba řetězce shodné
  • hodnota >0 – vrací, pokud první řetězec je větší než druhý
  • hodnota <0 – vrací, pokud první řetězec je menší než druhý

Výsledky jsou vyhodnoceny na základě uspořádání znaků v ASCII tabulce. Pokud tedy použijeme toto porovnání:

strcmp("A","a");

Hodnota velkých písmen je v ASCII tabulce před malými písmeny, tudíž funkce vyhodnotí výsledek na záporný.

Funkce strchr

Jedná se o vyhledávací funkci, která zjišťuje, zda řetězec obsahuje hledaný znak.

strchr(retezec,znak);

Pokud se hledaný znak v řetězci nachází potom funkce vrací hodnotu v podobě ukazatele na prvně nalezený znak, v opačném případě vrací hodnotu NULL.

Funkce strstr

Obdobná funkce jako předchozí, akorát s tím rozdílem, že funkce vyhledává, zda se v prvních řetězci nachází řetězec druhý. Pokud se takový řetězec najde, funkce vrací ukazatel na první výskyt řetězce.

Znakové funkce

V následující tabulce si ukážeme několik funkcí, které zjišťují charakteristiku znaku, všechny tyto funkce se nacházejí v knihovně ctype.h. Všechny funkce mají jeden parametr a to znak (char). Návratová hodnota pro všechny funkce je stejná, mohou nastat pouze 2 případy:

  • Funkce vrátí číslo různé od nuly pro PRAVDU
  • Funkce vrátí číslo 0 pro NEPRAVDU
Funkce Popis Znaky 1
isalnum(char) Je znak písmeno nebo číslo? A – Z, a – z, 0 – 9
isalpha(char) Je znak písmeno? A – Z, a – z
isblank(char) Je znak prádný? tabulátor (‚\t‘), mezera (‚ ‚)
iscntrl(char) Je znak řídící? znaky s ASCII hodnotu < 32 a znak s hodnoutou 127
isdigit(char) Je znak číslo? 0 – 9
isgraph(char) Má znak grafické znázornění? 0 – 9, A – Z, a – z, všechny speciální znaky
islower(char) Je znak malé písmeno? a – z
isprint(char) Je znak tisknutelný? mezera, 0 – 9, A – Z, a – z, všechny speciální znaky
ispunct(char) Je znak speciální? !“#$%&'()*+,-./:;<=>?@[\]^_`{|}~
isspace(char) Je znak „bílý“? tabulátor (‚\t‘), mezera (‚ ‚), nový řádek (‚\n‘), návrat vozíku (‚\r‘), vertikální tabulátor (‚\v‘), konec stránky (‚\f‘)
isupper(char) Je znak velké písmeno? A – Z
isxdigit(char) Je znak hexadecimalní číslo? 0 – 9, A – F, a – f

1) Tato položka zobrazuje znaky, u kterých daná funkce vyhodnotí znak na pravdivý

V knihovně ctype.h se nacházejí jěště 2 funkce, které převádějí znak buď na velké písmeno nebo naopak na malé. Ještě jednou zdůrazňuji, že převádejí znak nikoliv celé slovo (řetězec), pokud bychom chtěli použít jednu z těchto funkcí na celém řetězci, jednoduše použijeme cyklus, který projde řetězec znak po znaku a upraví jej podle potřeby.

Funkce Popis
tolower(char) převede velké písmeno na malé
toupper(char) převede malé písmeno na velké

 

K dnešní lekci to bude vše, doufám že jste se zase něco dozvěděli, můžete i články sdílet na sociálních sítích a podobně. V následujícím článku se zaměříme na soubory.

#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.

#7 Rozdělení zdrojového kódu

V sedmé lekci kurzu programování v jazyce C si ukážeme, jak a k čemu je dobré rozdělovat zdrojový kód do více části, než právě do jedné velké funkce.

Již v druhé lekci jsme si popsali základní prvky, které funkce může nebo musí obsahovat. Klasická funkce by měla obsahovat návratový typ a také vstupní argumenty, na základě kterých se ve funkci vyhodnotí kód a funkce nám vrací nějaký výstup.

Rozdělení kódu do více funkcí je užitečné zejména proto, že celý kód se stává o mnoho přehlednější a je také snadnější na editaci. Je vhodné pro odstraňování duplicity kódu. Pokud potřebujete použít vícekrát stejný výpočet akorát s jinými parametry, jednoduše tuto část vyjměte jako novou funkci a poté ji spusťte kolikrát bude potřeba.

Deklarace funkce

Jsou dvě možnosti jak funkci deklarovat:

  1. samotná deklarace funkce a její definice se nachází později v kódu
  2. deklarace společně s definicí

Jak tomuto rozumět? Znázorníme si vše na příkladu.

void func1(int, char, double); //deklarace, nemusi obsahovat nazvy parametru
void func2(int number) //deklarace s definici
{
    //prikazy
}

int main(void)
{
    func1(0,'f',5.0);
    func2(0);

    return 0;
}

void func1(int number, char c, double pi) //definice funkce
{
    //prikazy
}

Pokud máte program, který má pouze jednu vlastní funkci, tak použijte deklaraci společně s definicí. Pro více funkcí a komplexnější programy je pro přehlednost vhodnější použít strukturu:

  • deklarace vlastních funkcí
  • funkce main
  • definice vlastních funkcí

Argumenty a proměnné ve funkci

Proměnné deklarované ve funkci jsou lokální, tzn. že po skončení funkce zanikají. Argumenty jsou také lokální proměnné. Při zavolání funkce se tyto proměnné vytvoří a zkopíruje se do nich hodnota, která jim při zavolání byla předána. Existují 2 možnosti předání argumentů:

  1. Předání hodnotou
  2. Předání hodnotou ukazatele

Rozdíly mezi těmito způsoby si ukážeme na příkladu, použijeme oddělené proměnné pro každý způsob.

void Afunc(int a) {a = 50;} //nastavime a na 50
void Bfunc(int* b) {*b = 80;} //nastavime b na 80

int main(void)
{
    int a = 10;
    int b = 20;

    Afunc(a); //predani hodnotou
    Bfunc(&b); //predani hodnotou ukazatele

    printf("%d\n", a); //a je opet 10
    printf("%d\n", b); //b se zmenilo na 80

    return 0;
}

Ještě si ukážeme jak předat funkci celé pole proměnných, aby jej bylo možno upravovat ve funkci.

#define MAX_ARRAY 10

void write(int* array)
{
    for (int i = 0; i < MAX_ARRAY; i++)
        array[i] = i;
}

void print(const int* array)
{
    for (int i = 0; i < MAX_ARRAY; i++)
        printf("%d ", array[i]);
    printf("\n");
}

int main(void)
{
    int array[MAX_ARRAY] = {0};
    print(array);
    write(array);
    print(array);
    return 0;
}

Poznámka

Na příkladu vidíme, jakým způsobem jsou vyhodnocovány výrazy v jazyce C. Jedná se o zkrácené vyhodnocování neboli také líné. Tento způsob využívají i jiné programovací jazyky jako C# nebo Java.

int func()
{
    printf("func\n");
    return 0;
}

int main(void)
{
    if ((6 == 5) && (func() == 0)) {}
    return 0;
}

Volání funkce func se nachází v podmínce. Vidíme, že první část podmínky se vyhodnotí na false, zde líné vyhodnocování způsobí, že se druha část podmínky ani nemusí vyhodnocovat, jelikož bude celý výraz false.

K dnešní lekci o rozdělení zdrojového kódu to bude vše. V následující lekci se podíváme na využití rekurze a také na různé použití datových struktur.

Pascal – #5 Cykly se známým počtem opakování

Dnes se naučíme psát cykly v jazyku pascal. Na úvod si řekněme, co to ty cykly jsou. Cyklus nám umožní opakovat určitou část kódu libovolně dlouho. Dnes si řekneme o tzv. cyklech, u kterých známe počet opakování.

Cykly: Obecná synataxe

FOR i:=zacatek TO konec DO
 BEGIN
 Příkaz, který se bude opakovat;
 Příkaz, který se bude opakovat;; 
END;

Teď si to pojďme rozebrat. For je klíčové slovo, které říká, že se jedná o cyklus. Proměnná ‚i‘ tady má roli počítadla. A na začátku cyklu, je nastavena na hodnotu, která se bude při jednotlivých průchodech cyklu navyšovat až do té doby, než nabyde hodnotu uloženou v proměnné konec. Z tohoto kódu je tedy možné okamžitě vyčíst, kolikrát se bude opakovat, protože v prvním řádku v podstatě vidíme interval. Většinou se udává od 1.

Příklad

Aby nám to bylo jasnější, pojďme si to ukázat na jednoduchém příkladu, který nám ukáže, jak funguje počítadlo a co se vlastně v průběhu toho cyklu stane.

program cykly;
uses crt;
var i:integer;
 
begin
 clrscr;
  for i:=1 to 10 do
   begin
      writeln(i);
   end
 repeat until keypressed;
end.

Rozebrání kódu

Jak je již hned zřejmé ze zadání můžeme vidět, že daný cyklus se bude opakovat 10krát jelikož jsme zadali interval od 1 do 10. V příkazové části dá-li se to tak nazvat poté provádíme příkaz Writeln(i), tedy vypisujeme počítadlo. Tento program v podstatě nic nedělá, pouze vypisuje. Hodnota počítadla se zvedá automaticky při každém průchodu cyklu. V praxi to tedy vypadá takto.

Program narazí na slovo For a tím zjistí, že se jedná o cyklus do proměnné i (počítadla) si uloží spodní hodnotu intervalu, a postupuje na další řádek, kde vykoná příslušné příkazy v našem případě, vypíše proměnnou i. Jakmile dojde na konec, vrátí se zase zpět a proměnná i se navýší o hodnotu jedna, porovná ji s koncovou hodnotou intervalu a pokud se nerovná koncové hodnotě, jde znova na příkazovou část cyklu. Toto se opakuje tak dlouho, dokud se hodnota počítadla nerovná koncové hodnotě v té chvíli program opouští cyklus a věnuje se ostatnímu kódu, v našem případě repeat until keypressed; tedy čeká na vstup z klávesnice.

V dalším příkladu si uživatel sám zadá počet opakování. Jedna se tedy pouze o modifikaci předchozího příkladu.

Příklad 2

program cykly2;
uses crt;
var i : integer;
var pocatek : integer;
var konec : integer;
begin
  clrscr;
  write('Zadej cislo pocatek: ');
  readln(pocatek);
  write('Zadej cislo konec: ');
  readln(konec);
    for i:=pocatek to konec do 
    begin
      writeln(i);
    end;
repeat until keypressed;    
end.

V tomto příkladu vidíte, že počet opakování není zadán konstantami ale proměnnými počátek a konec, do kterých uživatel sám zadá čísla a rozhodne si tak počet opakování.

Další možnosti zápisů

Pojďme si ještě ukázat další možnosti zápisu. Například poslední příklad by šel zapsat takto:

for i:=1 to 10 do writeln(i);

Vidíme tedy, že zde chybí struktura begin – end;  sami si zvolte, co pro vás bude lepší. Ale doporučuji používat více řádkovou strukturu z jednoho prostého důvodu ve chvíli, kdy přijdou složitější cykly a bude potřeba napsat více příkazu, bude to mnohem přehlednější. Tento jedno řádkový zápis tedy slouží pro jednoduché příklady.

Kontrolní otázky

Po této lekci by jste měli být schopni zcela s přehledem odpovědět na tyto otázky.

  1. Co je to cyklus a k čemu slouží.
  2. Co je to počítadlo a k čemu slouží.
  3. Jak vypadá obecná syntaxe.

Kontrolní příklad

Napište příklad, který se uživatele zeptá na číslo (počet opakování) a na zprávu. Danou zprávu vypíše píše tolikrát kolik zadal uživatel opakování př. uživatel zadá číslo 4 zpráva se vypíše 4krát..

Závěr

To je z dnešní lekce vše příště se podíváme na podmínky. Pokud Vám není něco jasné ptejte se přímo zde v komentářích.

VBA – 4# Lekce – Zadání vstupních dat – Inputbox

V této lekci si představíme další příkaz Windows. Jedná se o Inputbox, který se využíváme k tomu abychom mohli číst vstupní data od uživatele. Jelikož nejde o nic těžkého pojďme rovnou na příklad.

Příklad:

Sub scitani ()
Dim a as integer
Dim b as integer
Dim vysledek as integer
a = inputbox(“zadej číslo a “)
b = inputbox(“zadej číslo b “)
vysledek= a +b
MsgBox vysledek, vbOKOnly + vbInformation, "Vysledek"
End sub

Teď vysvětlení kódu jediné s čím jsme se zatím nesetkali, je tento řádek:

a = inputbox(“zadej číslo a “)   

areprezentuje proměnnou kam se zadané data uloží.

inputbox– je zavoláni windows příkazu stejně jako msgbox.

(“zadej číslo a “) – toto je popisek uvedený při zobrazení inputbox okna aby uživatel věděl co má zadávat.

Do inputboxu můžeme samozřejmě načítat i jiná data než čísla. Aby, jsme třeba mohli zadávat textová data, musíme proměnným změnit datový typ na string (Dim b as stringsamozřejmě s nimi pak nejde počítat tak jak jsme si ukázali v minulé lekci. Mohou se pouze sčítat logickým operátorem &.

Dnešní lekce byla poměrně krátká a proto si zadáme domácí úkol. Zkuste si přepsat všechny příklady, se kterými jsme se zatím setkali tak abyste v nich použili funkcionality inputboxu.

Závěr

Další lekce se bude zabývat větvením programu pomocí podmínkových příkazu IF.

#6 Vstupní a výstupní funkce

Po delší době zde máme další pokračování kurzu céčka. V této lekci se podíváme na různé možnosti jak načíst data do programu. Ukážeme si také jak data vypisovat pomocí jiných funkcí než z klasické funkce printf, o které jsme se zmínili hned ve druhé lekci našeho kurzu.

Vstupní a výstupní funkce (I/O)

Hodnota Vstup (input) Výstup (output)
znak getchar putchar
řetězec gets puts
formátovaná data scanf printf

 

Všechny tyto funkce se nacházejí v hlavičkovém souboru, který jsme používali doteď a to stdio.h. Pro vstupní funkce se hodnoty vkládají přímo do konzole a potvrdí se enterem. Jejich výzva by měla být zdůrazněna zprávou pomocí výstupní funkce (např.: „Zadejte své jméno: „). Všechny funkce v tabulce si popíšeme.

Getchar a Putchar

Obě tyto funkce pracují pouze s jedním znakem. Pokud bychom funkci getchar dali na vstup nějaké slovo o 2 a více znacích, popřípadě větu, funkce si uloží pouze první znak a zbytek zahodí. Funkce je deklarovaná takto:

int getchar(void)

Vidíme, že funkce nemá žádné vstupní parametry, ale má návratovou hodnotu.

  • úspěšné vyhodnocení vrací vstupní znak
  • neúspěšné vrací konstantu EOF (end of file), tedy hodnotu -1

Funkce getchar je deklarovaná takto:

int putchar(int c);

Funkce má jeden vstupní parametr c od slova character (znak), parametrem je hodnota která se má vypsat na standardní výstup. Putchar dokáže vypsat pouze znaky ohodnocené číslem 0 až 255 (podle ASCII tabulky). Návratová hodnota je znak, který se vypsal. Při neúspěšném výpisu vrací EOF.

char c;
c = getchar();
putchar(c); //vraci zadany znak funkci getchar
putchar(97); //vraci znak 'a'
putchar(97+256); //take vraci znak 'a'

Gets a Puts

Tyto funkce pracují s celými řetězci. Řetězec je posloupnost znaků, v céčku se zapisuje jako pole znaků. Deklarace proměnné typu řetězec se zapíše takto:

char retezec[delka_retezce];

Deklarace obou funkcí vypadají následovně:

char* gets (char*);
int puts (const char*);

Funkce gets načítá řetězec ze standardního vstupu jejím parametrem je řetězec, který musí být předem deklarovaný na určitou délku. Pokud bychom na vstup funkci dali větší řetězec než jak je deklarovaná samotná proměnná, tak se délka proměnné zvětší na požadovanou velikost. Návratová hodnota je vstupní řetězec při úspěšném provedení. Při neúspěšném načtení vrací EOF.

Funkce puts vypisuje řetězec na standardní výstup. Návratová hodnota je nezáporná hodnota při úspěšném vypsání a EOF při neúspěšném.

char string[16];
gets(string);
puts(string);

Scanf a printf

Doteď jsme mohli načíst pouze znak či řetězec, ale pokud bychom chtěli zaimplementovat vstup čísla do programu, musíme použít funkci scanf. Deklarace této funkce:

int scanf(const char *format,…);

Scanf pracuje na stejném principu jako printf, který známe z předchozích lekcí. Může načíst nekonečně mnoho hodnot. Pokud bychom chtěli načíst číslo ze standardního vstupu, kód bude vypadat následovně:

int cislo;
scanf("%d", &cislo);

Aby funkce scanf načetla číslo ze vstupu a následně jej uložila do proměnné cislo, musíme funkci předat adresu proměnné cislo v paměti, nikoliv jeji hodnotu. Pokud bychom chtěli načíst více hodnot, syntaxe bude vypadat obdobně.

int x,y,z;
scanf("%d %d %d", &x, &y, &z);

Na následujícím příkladu vidíme, co udělá formát ve výpisu znaku:

char c = '0';
printf("%c %d\n", c,c);

Pokud vypíšeme proměnnou c (znak ‚0‘) jako číslo vypíše se jeho ASCII kód.

Funkce Rand

Tato funkce je v podstatě vstupní, neboť vrací náhodně vygenerované číslo. Nachází se v hlavičkovém souboru stdlib.h, proto je nutné tento soubor přidat do programu pomocí direktivy #include. Syntaxe vypadá následovně.

nah_cislo = rand() % (horni_hranice-dolni_hranice+1) + dolni_hranice;

Pokud nevyznačíme hranice, v jakých se vygenerované číslo má vyskytovat, použije se výchozí nastavení těchto hodnot. Rozmezí je mezi 0 a 32767. Zápis je pouze takový:

number = rand(); //0 az 32767

Příklady různých rozmezí:

number = rand() % 10; //0 az 9
number = rand() % 10 + 1; //1 az 10
number = rand() % 113 + 1900; // 1900 az 2012

Pokud si program, který generuje číslo, spustíte vícekrát za sebou a přitom nezměníte syntaxi, zjistíte, že se generují pořád stejné čísla. Aby se při každém spuštění generovaly nové čísla, použijeme příkaz z knihovny time.h.

srand (time(NULL));

Celý program nyní může vypadat takto:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    srand (time(NULL));
    int n = 10;
    int horni, dolni;
    int number;

    printf("Zadej horni mez: ");
    scanf("%d", &horni);
    printf("Zadej dolni mez: ");
    scanf("%d", &dolni);

    printf("%d cisel vygenerovanych v rozmezi %d az %d (vcetne)\n",n, dolni, horni);
    for (int i = 0; i < n; i++)
    {
        number = rand() % (horni-dolni+1) + dolni;
        printf("%d\n", number);
    }

    return 0;
}

Data lze načíst také pomocí souboru, ale kompletní práci se soubory si ukážeme v některé z následujících lekcí. Ke vstupním a výstupním funkcím to bude vše. Příště se podíváme jak rozdělit zdrojový kód do více pod částí.