Programovanie (2) v Jave
1-INF-166, LS 2016/17

Úvod · Pravidlá · Prednášky · Projekt · Netbeans · Odovzdávanie · Test a skúška
· Vyučujúcich môžete kontaktovať pomocou e-mailovej adresy E-prg.png (bude odpovedať ten z nás, kto má príslušnú otázku na starosti alebo kto má práve čas).
· Predvádzanie projektov bude v pondelok 5.6. od 9:00 do 12:00 a v utorok 6.6 od 12:00 do 13:30 (po skúške), oboje v miestnosti M217. Na termín sa prihláste v AIS. Ak robíte vo dvojici, prihlási sa iba jeden člen dvojice.
· Body zo záverečného testu sú na testovači. Poradie príkladov: P1: do šírky, P2: topologické, P3: výnimky, P4: iterátor, P5: testy, P6: strom. Bolo potrebné získať aspoň 20 bodov zo 40.
· Opravný test bude 19.6.2017 od 9:00 v miestnosti M-I. Na termín sa prihláste v AISe.
· Zapisovanie známok a osobné stretnutia ku skúške budú v utorok 13.6. 13:30-14:30 v M163 a v stredu 14.6. 14:00-14:30 v M163.


Prednáška 1

Z Programovanie
Prejsť na: navigácia, hľadanie

Pozrite si úvod k predmetu a pravidlá.

Čo je programovanie

Algoritmus

Algoritmus: Postupnosť konečného počtu elementárnych krokov vedúca k vyriešeniu daného typu úlohy

Príklady:

  • Ako sčítať dve celé čísla v desiatkovej sústave
  • Ako nájsť najväčšieho spoločného deliteľa dvoch čísel
  • Ako riešiť Sudoku

Správnosť algoritmu

  • Keď vždy dáva správne výsledky.
  • Keď vždy skončí.

Program

  • Predpis, pomocou ktorého počítač môže vykonávať algoritmus
  • Zapísaný v programovacom jazyku

Programátorské prostredie

  • Na tomto predmete budeme programovať v jazyku C++, budeme však z neho používať len malú časť.
  • Budeme používať programátorské prostredie NetBeans, ktoré spríjemňuje a zjednodušuje prácu.
  • Cvičenia a skúšky budú v operačnom systéme Linux
  • Môžete používať aj iné programátorské prostredia, ale
    • odovzdané programy (DÚ, skúška) musia správne pracovať v prostredí ako na cvičeniach
    • počas skúšky budete mať k dispozícii len to, čo beží v učebniach v Linuxe
    • viac informácií na stránke o alternatívach k Netbeans

Prvý program

  • Tradične sa v učebniciach programovania ako prvý uvádza program, ktorý iba vypíše na obrazovku text "Hello world!". Tu je v jazyku C++:
#include <iostream>
using namespace std;

int main(void) {
    cout << "Hello world!" << endl;
}
  • Samotný text je vypísaný príkazom cout << "Hello world!" << endl;
  • Všimnite si, že text Hello world! sme dali do úvodzoviek, čím poukazujeme na to, že to nie sú príkazy programovacieho jazyka, ale text, s ktorým treba niečo robiť.
  • Za príkazom sme dali bodkočiarku, ktorá ho ukončuje.
  • O vypisovaní si povieme viac neskôr, ale už teraz môžete vypisovať rôzne texty tým, že zmeníte text medzi úvodzovkami.
  • Riadok int main(void) { označuje začiatok programu, program ide až po ukončovaciu zloženú zátvorku }
  • Jazyk C++ sám o sebe neobsahuje príkazy na vypisovanie (cout <<...). Na to potrebujeme použiť knižnicu: súbor príkazov, ktoré niekto už naprogramoval a my ich len používame. Prvé dva riadky programu nám umožnia používať štandardnú knižnicu iostream, ktorá je súčasťou C++ a ktorá obsahuje príkazy na vypisovanie.

Spúšťanie programu

  • Na to, aby sme náš program mohli spustiť na počítači, potrebujeme ho najskôr skompilovať, t.j. preložiť do spustiteľného strojového kódu.
  • Ako na to, nájdete v návode k práci v prostredí Netbeans
  • V prostredí Netbeans vieme program aj spustiť, môžeme si ho však aj skopírovať a spúšťať na iných počítačoch nezávisle od Netbeans.

Prvý grafický program

  • Občas budeme vykresľovať obrázky pomocou knižnice SVGdraw vytvorenej špeciálne pre tento predmet. (Tu je návod na jej používanie)
  • Nasledujúci program vypíše text Hello world! pomocou tejto knižnice.
#include "../SVGdraw.h"

int main(void) {
    /* Vytvor obrázok s rozmermi 150x100 pixelov a 
     * ulož ho do súboru hello.svg*/
    SVGdraw drawing(150, 100, "hello.svg");

    /* Nastav farbu na červenú. */
    drawing.setLineColor("red");

    /* Vypíš text vystredený na súradniciach 75,50. */
    drawing.drawText(75, 50, "Hello world!");

    /* Ukonči vypisovanie obrázka. */
    drawing.finish();
}
Výsledný obrázok
  • Po spustení program vypíše text červenou farbou a uloží ho vo forme obrázku do súboru hello.svg.
  • Prvý riadok programu teraz obsahuje inú knižnicu (SVGdraw). Nie je súčasťou jazyka, preto si ju musíme skopírovať na náš počítač a umiestniť do vhodného adresára. Viac v návode.
  • Medzi int main(void) { a koncovou zátvorkou } máme teraz viacero príkazov, každý ukončený bodkočiarkou. Vykonávajú sa v tom poradí, v akom sú napísané.
  • Text medzi /* a */ bude počítač ignorovať, ide o komentár určený pre čitateľa. V tomto prípade vždy popisuje, čo bude robiť nasledujúci riadok.

Cvičenia

Aj keď sme si nepovedali toho veľa o jednotlivých príkazoch v tomto programe, mali by ste z komentárov vedieť uhádnuť, ako meniť program aby napríklad:

  • mal inú veľkosť obrázku
  • použil na vypisovanie inú farbu
  • vypísal text na iné miesto v rámci obrázku
  • vypísal dva rôzne texty na rôzne miesta obrázku rôznou farbou (napr. červeným Hello world! a pod to modrým Good morning, starshine!)
  • uložil obrázok do súboru s iným menom

Vykreslenie domčeka

Tradičný preškrtnutý domček
Domček so súradnicami
  • Ukážeme si ešte program, ktorý vykreslí tradičný prečiarknutý domček, ako je na obrázku vpravo.
  • Pozor, grafická obrazovka má súradnicu 0,0 v ľavom hornom rohu a smerom nadol y-ová súradnica stúpa, čo je naopak, než je zvykom v matematike.
#include "../SVGdraw.h"

int main(void) {
    /* Vytvor obrázok s rozmermi 200x300 pixelov a 
     * ulož ho do súboru domcek1.svg*/
    SVGdraw drawing(200, 300, "domcek1.svg");

    /* Nakresli obdĺžnik (štvorec) s ľavým horným rohom v 50, 150
     * a šírkou aj dĺžkou 100. */
    drawing.drawRectangle(50, 150, 100, 100);

    /* Prečiarkni štvorec dvomi čiarami po uhlopriečke. */
    drawing.drawLine(50, 250, 150, 150);
    drawing.drawLine(50, 150, 150, 250);

    /* Nakresli strechu ako dve čiary. */
    drawing.drawLine(50, 150, 100, 50);
    drawing.drawLine(150, 150, 100, 50);

    /* Ukonči vypisovanie obrázka. */
    drawing.finish();
}
  • Obmenou týchto dvoch programov by ste mali vedieť vykresliť hocijaký obrazec z rovných čiar a pridať k nim text.
  • Knižnica SVGdraw umožnuje vykresľovať aj kružnice a elipsy, mnohouholníky, meniť farbu čiary, vyfarbovať útvary a podobne. Viac sa dočítate v návode.

Domček korytnačou grafikou

  • Pointa preškrtnutého domčeka je, že sa má kresliť jedným ťahom. To náš program vyššie nerobil.
  • Knižnica SVGdraw obsahuje aj príkazy na korytnačiu grafiku, ktorou môžeme domček nakresliť jedným ťahom.
    • Vytvoríme si virtuálnu korytnačku, ktorá má určitú polohu a natočenie.
    • Môžeme jej povedať, aby sa otočila doľava alebo doprava o určitý počet stupňov (turtle.turnLeft(uhol) a turtle.turnRight(uhol)).
    • Môžeme jej povedať, aby išla o určitú dĺžku dopredu (turtle.forward(dlzka))
    • Keď ide korytnačka dopredu, zanecháva v piesku chvostom čiarku (vykreslí teda čiaru do nášho obrázku).
#include "../SVGdraw.h"
#include <cmath>

int main(void) {
    /* Vytvor korytnačku na súradniciach (50,250) 
     * otočenú doprava na obrázku s rozmermi 200x300 pixelov,
     * ktorý bude uložený do súboru domcek2.svg. */
    Turtle turtle(200, 300, "domcek2.svg", 50, 250, 0);

    /* Nakresli dolnú čiaru a otoč sa smerom hore. */
    turtle.forward(100);
    turtle.turnLeft(90);

    /* Nakresli pravú zvislú čiaru, hornú vodorovnú a ľavú zvislú. */
    turtle.forward(100);
    turtle.turnLeft(90);
    turtle.forward(100);
    turtle.turnLeft(90);
    turtle.forward(100);

    /* Otoč sa smerom na uhlopriečku.
       Dĺžku uhlopriečky vyrátame Pytagorovou vetou. */
    turtle.turnLeft(135);
    turtle.forward(sqrt(100 * 100 + 100 * 100));

    /* Otoč sa smerom na pravú časť strechy.
     * Strecha bude rovnostranný trojuholník so stranou
     * dĺžky 100. */
    turtle.turnLeft(75);
    turtle.forward(100);
    turtle.turnLeft(120);
    turtle.forward(100);

    /* A posledná čiara - uhlopriečne prečiarknutie. */
    turtle.turnLeft(75);
    turtle.forward(sqrt(100 * 100 + 100 * 100));

    /* Ukonči vypisovanie obrázka. */
    turtle.finish();
}
  • Pre jednoduchosť tento domček má trochu nižšiu strechu v tvare rovnostranného trojuholníka s každou stranou dĺžky 100 (a vnútornými uhlami 60 stupňov)
  • Keďže domček je štvorec, uhlupriečka ide pod uhlom 45 stupňov. Jej dĺžku však musíme spočítať. Na sčítavanie používame znamieko +, na násobenie *, a na odmocninu funkciu sqrt (skratka z anglického square root), ktorá je v knižnici cmath
  • Na obrázku sa animuje pohyb korytnačky (pozri tu)

Zhrnutie

  • Programy, ktoré sme doteraz videli, vyzerali takto:
    • Najprv sme zapli používanie niekoľkých knižníc
    • Samotný program začínal int main(void) { a končil zloženou zátvorkou }
    • Program mohol mať niekoľko príkazov ukončených bodkočiarkami, ktoré sa vykonávajú jeden po druhom.
    • Okrem toho môžu byť v programe komentáre medzi /* a */, ktoré počítač ignoruje.
  • Logiku za tým, prečo jednotlivé príkazy píšu tak, ako sa píšu, sme zatiaľ ešte nevysvetľovali, mali by ste však byť schopní modifikovať príklady uvedené v prednáške menením čísel, textov v úvodzovkách, pridávaním ďalších príkazov a podobne.
  • Upozornenia:
    • Je rozdiel medzi malými a veľkými písmenami
    • Všetky čiarky, bodkočiarky, zátvorky a podobne sú dôležité
    • Na väčšine miest v programe môžeme voľne pridávať medzery a konce riadku, snažíme sa tým program spraviť prehľadný
  • Programy, ktoré sme videli doteraz, nie sú veľmi zaujímavé, lebo vždy robia to isté a robia pevný počet krokov, ktoré sme museli ručne všetky vypísať. Ďalej uvidíme
    • príkazy na načítanie vstupu od užívateľa
    • premenné, v ktorých si môžeme uchovávať vstupy a iné hodnoty
    • podmienky, ktoré nám umožnia vykonávať príkazy podľa okolností
    • cykly, ktoré nám umožnia opakovať tie isté príkazy veľa krát

Organizačné poznámky

  • DÚ1 už zverejnená
  • Dnes poobedie prvé cvičenia
    • Budete potrebovať prihlasovacie meno a heslo do AIS2 na prihlásenie na počítač v učebni
    • Skúste odovzdať cvičnú úlohu do testovača (heslo na testovač dostanete na cvičení)
  • Zajtra druhá prednáška
  • Do piatka sa prihlásiť na test pre pokročilých
  • V piatok nebudú doplnkové cvičenia kvôli dekanskému voľnu (imatrikulácie)
  • Budúci pondelok 14:00 test pre pokročilých
  • Budúci týždeň bežný rozvrh, vrátane oboch prednášok, oboch cvičení a prvej rozcvičky (jednoduché vykresľovanie v SVGdraw, môžete použiť ručne písané alebo vytlačené materiály)
  • Do utorka 22:00 odovzdať DÚ1