Zdrojový kód z prednášky 9.11.2011

Trieda Maticiar (súbor Maticiar.java) rozširujúca triedu Turtle.

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

import sk.upjs.jpaz2.Turtle;

public class Maticiar extends Turtle {

        /*
         * Metóda načíta maticu celých čísiel zo súboru. Na vstupe
         * predpokladá, že v prvom riadku súboru je uložený
         * počet riadkov a počet stĺpcov matice
         */

        public int[][] citajMaticuZoSuboru(File subor) {
                Scanner citacSuboru = null;
                try {
                        citacSuboru = new Scanner(subor);
                        int riadkov = citacSuboru.nextInt();
                        int stplcov = citacSuboru.nextInt();

                        //vytvorím si maticu načítanej veľkosti
                        int[][] matica = new int[riadkov][stplcov];

                        /*
                         *  čítam po riadkoch číslo za číslom a cez for cykly
                         *  generujem pozíciu v matici, určenú riadkom r a stĺpcom s,
                         *  do ktorej mám načítanú hodnotu vložiť
                         */

                        for (int r = 0; r < riadkov; r++) {
                                for (int s = 0; s < stplcov; s++) {
                                        matica[r][s] = citacSuboru.nextInt();
                                }
                        }
                        return matica;
                } catch (FileNotFoundException e) {
                        System.err.println("Subor "+subor+ " neexistuje.");
                } finally {
                        if (citacSuboru!= null) {
                                citacSuboru.close();
                        }
                }
                // ak sa kvôli výnimke nevykonal return v try bloku, vrátime null
                return null;
        }

        /*
         * Metóda načíta maticu celých čísiel zo súboru. Na vstupe
         * predpokladá, že v súbore sú iba dáta matice.
         * Ak má matica v riadkoch rôzny počet stĺpcov, vrátime null.
         */

        public int[][] nacitajLubovolnuMaticu(File subor) {
                Scanner citacSuboru = null;
                try {
                        int minuleStlpce = -1;
                        citacSuboru = new Scanner(subor);
                        int riadkov = 0;
                        int stlpcov = 0;
                        while(citacSuboru.hasNextLine()) {
                                riadkov++;
                                String riadok = citacSuboru.nextLine();
                                stlpcov = 0;
                                Scanner citacRiadka = new Scanner(riadok);
                                while(citacRiadka.hasNextInt()) {
                                        citacRiadka.nextInt();
                                        stlpcov++;
                                }
                                if ((riadkov>1)&&(minuleStlpce!=stlpcov)) {
                                        System.err.println("V súbore nie je matica - " +
                                                        "má rôzny počet stĺpcov v riadkoch");
                                        return null;
                                }
                                minuleStlpce = stlpcov;
                        }
                        // zavrieme súbor lebo scanner je už na konci
                        citacSuboru.close();
                        // otvoreím súboru máme scaner zasa na začiatku súboru
                        citacSuboru = new Scanner(subor);
                        System.out.println("Máme "+stlpcov+" stĺpcov");                              
                        System.out.println("Mame "+riadkov+" riadkov");
                        int[][] matica = new int[riadkov][stlpcov];
                        for (int r = 0; r < riadkov; r++) {
                                for (int s = 0; s < stlpcov; s++) {
                                        matica[r][s] = citacSuboru.nextInt();
                                }
                        }
                        return matica;

                } catch (FileNotFoundException e) {
                        System.err.println("Subor "+subor+ " neexistuje.");
                } finally {
                        if (citacSuboru!= null) {
                                citacSuboru.close();
                        }
                }
                return null;
        }

        /*
         * pomocná metóda na výpis matice do konzoly
         */

        public void vypisMaticu(int[][] matica) {
                int riadkov = matica.length;
                int stlpcov = matica[0].length;
                for (int r = 0; r < riadkov; r++) {
                        for (int s = 0; s < stlpcov; s++) {
                                System.out.print(matica[r][s]+ " ");
                        }
                        System.out.println();
                }
        }
}

Trieda SpustacMatic (súbor SpustacMatic.java).

import java.io.File;

public class SpustacMatic {

        public static void main(String[] args) {
                Maticiar jozko = new Maticiar();
                // ideme čítať maticu zo súboru, kde je v prvom riadku uvedený počet riadkov a stĺpcov
                int[][] matica = jozko.citajMaticuZoSuboru(new File("matica.txt"));
                jozko.vypisMaticu(matica);

                // ideme čítať maticu zo súboru, kde nie je v prvom riadku uvedený počet riadkov a stĺpcov
                matica = jozko.nacitajLubovolnuMaticu(new File("matica2.txt"));
                jozko.vypisMaticu(matica);
        }
}

Príklady matíc.

Súbor matica.txt

3 5
4 -5 394 37 348
3 0 48 27 20
1 1 1 1 1

Súbor matica2.txt

4 -5 394 37 348
3 0 48 27 20
1 1 1 1 1

Trieda PlochaTvarov (súbor PlochaTvarov.java)rozširujúca triedu WinPane, ktorá vie kresliť tvary podľa vstupného súboru.

import java.awt.Color;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

import sk.upjs.jpaz2.Turtle;
import sk.upjs.jpaz2.WinPane;


public class PlochaTvarov extends WinPane {

        /*
         * metóda na nakreslenie obdĺždnika daného súradnicami
         * protiľahlých rohov a farbou
         */

        public void obdlzdnik(double x1, double y1, double x2, double y2, Color farba) {
                Turtle kreslic = new Turtle();
                this.add(kreslic);
                kreslic.setFillColor(farba);
                kreslic.setPosition(x1, y1);
                kreslic.openPolygon();
                kreslic.moveTo(x1, y2);
                kreslic.moveTo(x2, y2);
                kreslic.moveTo(x2, y1);
                kreslic.moveTo(x1, y1);
                kreslic.closePolygon();
                this.remove(kreslic);
        }

        /*
         * metóda na nakreslenie kruhu daného súradnicami
         * stredu, polomerom a farbou
         */

        public void kruh(double x, double y, double r, Color farba) {
                Turtle kreslic = new Turtle();
                this.add(kreslic);
                kreslic.setFillColor(farba);
                kreslic.setPosition(x, y);
                kreslic.dot(r);
                this.remove(kreslic);          
        }

        /*
         * metóda na nakreslenie čiary danej súradnicami
         * krajných bodov, farbou a hrúbkou
         */

        public void ciara(double x1, double y1, double x2, double y2, Color farba, double hrubka) {
                Turtle kreslic = new Turtle();
                this.add(kreslic);
                kreslic.setPenColor(farba);
                kreslic.setPenWidth(hrubka);
                kreslic.setPosition(x1, y1);
                kreslic.moveTo(x2, y2);
                this.remove(kreslic);          
        }

        /*
         * metóda ktorá vráti na základe názvu farby
         * objekt triedy Color danej farby. Ak je na vstupe
         * neznáma farba vráti Color.black.
         */

        public Color dajFarbu(String nazov) {
                if (nazov.equals("red"))
                        return Color.red;
                if (nazov.equals("blue"))
                        return Color.blue;
                if (nazov.equals("yellow"))
                        return Color.yellow;
                if (nazov.equals("green"))
                        return Color.green;
                return Color.black;
        }

        /*
         * Metóda načíta zo súboru riadky v dohodnutom formáte,
         * z ktorých vyextrahuje typ a vlastnosti kresleného tvaru.
         * Po vyextrahovaní sa daný tvar nakreslí.   
         */

        public void vykresliZoSuboru(File subor) {
                Scanner citacSuboru = null;
                try {
                        citacSuboru = new Scanner(subor);
                        while(citacSuboru.hasNextLine()) {
                                String riadok = citacSuboru.nextLine();
                                Scanner citacRiadka = new Scanner(riadok);
                                String tvar = citacRiadka.next();
                                System.out.println(tvar);
                                if (tvar.equals("kruh")) {
                                        double x = citacRiadka.nextDouble();
                                        double y = citacRiadka.nextDouble();
                                        double r = citacRiadka.nextDouble();
                                        Color farba = this.dajFarbu(citacRiadka.next());
                                        kruh(x, y, r, farba);
                                }
                                if (tvar.equals("obdlzdnik")) {
                                        double x1 = citacRiadka.nextDouble();
                                        double y1 = citacRiadka.nextDouble();
                                        double x2 = citacRiadka.nextDouble();
                                        double y2 = citacRiadka.nextDouble();
                                        Color farba = this.dajFarbu(citacRiadka.next());
                                        obdlzdnik(x1, y1, x2, y2, farba);
                                }
                                if (tvar.equals("ciara")) {
                                        double x1 = citacRiadka.nextDouble();
                                        double y1 = citacRiadka.nextDouble();
                                        double x2 = citacRiadka.nextDouble();
                                        double y2 = citacRiadka.nextDouble();
                                        Color farba = this.dajFarbu(citacRiadka.next());
                                        double hrubka = citacRiadka.nextDouble();
                                        ciara(x1, y1, x2, y2, farba, hrubka);
                                }
                        }
                } catch (FileNotFoundException e) {
                        System.err.println("Subor sa nenasiel");
                } finally {
                        if (citacSuboru!=null) {
                                citacSuboru.close();
                        }
                }
        }
}

Trieda SpustacTvarov (súbor SpustacTvarov.java).

public class SpustacTvarov {

        public static void main(String[] args) {
                PlochaTvarov plocha = new PlochaTvarov();
                plocha.vykresliZoSuboru(new File("tvary.txt"));
        }
}

Príklad vstupného súboru: Súbor tvary.txt

kruh 145.0 45.0 41.72 red
obdlzdnik 113.0 87.0 177 194 green
ciara 116.0 197.0 81 261 blue 5
ciara 169.0 197.0 201 263 blue 5
ciara 178.0 109.0 237 95 blue 5
ciara 113.0 110.0 61 89 blue 5
kruh 50.0 85.0 10.77 red
kruh 249.0 91.0 9.84 red
obdlzdnik 54.0 263.0 84 276 black
obdlzdnik 200.0 268.0 228 277 black

Trieda Midtermarka (súbor Midtermarka.java) rozširujúca triedu Turtle.

import sk.upjs.jpaz2.Turtle;


public class Midtermarka extends Turtle {

        public void trojuholnicek(double strana) {
                this.turn(-30);
                for (int i = 0; i < 3; i++) {
                        this.step(strana);
                        this.turn(120);
                }
                this.turn(30);
        }

        public void rad(double strana,int poschodie) {
                this.turn(-30);
                this.step(strana*(poschodie-1));
                this.turn(30);
                //pozeram sa hore pod prvym nenakreslenym trojuholnikom
                this.trojuholnicek(strana);
                for (int i = 0; i < poschodie-1; i++) {
                        this.turn(90);
                        this.step(strana);
                        this.turn(-90);
                        this.trojuholnicek(strana);
                }
                this.turn(30);
                this.step(-strana*(poschodie-1));
                this.turn(-30);
        }

        public void pyramida(int pocetRadov, double strana) {
                for(int i = 1; i <=pocetRadov; i++) {
                        rad(strana,i);
                }
        }

        public void ciary(double strana, int pocetRadov) {
                this.turn(-30);

                for (int i = 1; i <=pocetRadov; i++) {
                this.step(strana);
                this.turn(120);
                this.step(i*strana);
                this.step(-i*strana);
                this.turn(-120);
                }
                this.turn(120+30);
        }
        public void pyramida2(int pocetRadov, double strana) {
                for (int i = 0; i < 3; i++) {
                        ciary(strana,pocetRadov);
                }
        }

        public int exponentRozkladu(int cislo) {
                int pocet = 0;
                while(cislo%2==0) {
                        pocet++;
                        cislo = cislo / 2;
                }
                return pocet;
        }

        public String spolocnyPrefix(String s1, String s2) {
                int pozicia = 0;
                if (s1==null) return null;
                if (s2==null) return null;
                while((s1.length()>pozicia)&&(s2.length()>pozicia)&&
                                (s1.charAt(pozicia)==s2.charAt(pozicia))) {
                        pozicia++;
                }
                return s1.substring(0,pozicia);
        }

}

Trieda MidtermPane (súbor MidtermPane.java) rozširujúca triedu WinPane

import sk.upjs.jpaz2.Turtle;
import sk.upjs.jpaz2.WinPane;


public class MidtermPane extends WinPane {

        Midtermarka[] korytnacky;

        public MidtermPane() {
                korytnacky = new Midtermarka[8];
                for (int i = 0; i < korytnacky.length; i++) {
                        korytnacky[i] = new Midtermarka();
                        this.add(korytnacky[i]);
                        korytnacky[i].setPosition(Math.random()*this.getWidth(),
                                        Math.random()*this.getHeight());
                }
        }

        public boolean vsetkyVKosiari(double x, double y, double s, double v) {
                Turtle kreslic = new Turtle();
                this.add(kreslic);
                kreslic.setPosition(x,y);
                kreslic.moveTo(x+s,y);
                kreslic.moveTo(x+s,y+v);
                kreslic.moveTo(x,y+v);
                kreslic.moveTo(x,y);
                this.remove(kreslic);
                for(int i = 0; i < korytnacky.length; i++) {
                        if (korytnacky[i].getX()<x) {
                                return false;
                        }
                        if (korytnacky[i].getX()>x+s) {
                                return false;
                        }
                        if (korytnacky[i].getY()<y) {
                                return false;
                        }
                        if (korytnacky[i].getY()>y+v) {
                                return false;
                        }
                }
                return true;
        }
}

Trieda SpustacTvarov (súbor SpustacTvarov.java).

//              WinPane plocha = new WinPane();
                Midtermarka jozko = new Midtermarka();
//              plocha.add(jozko);
//              jozko.center();
//              jozko.rad(20, 5);
//              jozko.pyramida(6,20);
//              jozko.ciary(20, 5);
//              jozko.pyramida2(6, 20);
                System.out.println(jozko.exponentRozkladu(-300));
                System.out.println(jozko.spolocnyPrefix("ahoj", "jano"));
                System.out.println(jozko.spolocnyPrefix("ahoj", "ahoj jano"));
                System.out.println(jozko.spolocnyPrefix("ahoj", "ahox jano"));
                MidtermPane plocha2 = new MidtermPane();
                System.out.println(plocha2.vsetkyVKosiari(20, 20, 260, 260));