aktuálne rozcvičky

Cvičenia z Programovania 3 zimný semester 2010/2011


Cvičenie 14.12.2010

Napíšte triedu PoslednaRozcvicka, obsahujúcu statickú metódu boolean najdiIndexy(int[] a, int c), ktorá pre dané pole a[] zistí, či existujú také dva indexy i a j, že súčet čísel od a[i] po a[j] je presne hodnota c. Vymyslite algoritmus s prinajhoršom kvadratickou časovou zložitosťou (teda O(n2)). Za horšiu časovú zložitosť bude primerane menej bodov.

Cvičenie 07.12.2010

V istej krajine majú ortonormálnu súradnicovú sústavu; os x smeruje na východ, os y na sever. Poloha každého mesta je určená dvojicou súradníc. Na rozdiel od súradníc však v krajine úplne chýbajú cesty. Vláda preto rozhodla, že postaví jednu priamu cestu vedúcu zo západu na východ. Polohu tejto cesty treba zvoliť tak, aby súčet vzdialeností jednotlivých miest od tejto cesty (priamky) bol čo najmenší.

Vytvorte triedu Cesta s metódou


                    double najlepsiaCesta(double[] x, double[] y),
                
ktorá dostane ako vstup súradnice všetkých miest v krajine (x[i], y[i] sú súradnice i-tého mesta) a vráti y-ovú súradnicu jednej z možných najlepších ciest.


Cvičenie 30.11.2010

Vo vyskumnom ustave musia do Vianoc stihnut kopu projektov. Kazdy projekt treba riesit istu dobu, pracuje na nom jediny vedec. V jednej chvili moze vedec pracovat len na jednom projekte a pocas celeho obdobia nesmie riesit viac ako dva projekty. Celkovo moze jeden vedec venovat projektom nanajvys 10 dni. Vasou ulohou je zistit, kolko najmenej vedcov treba zamestnat, aby sa vsetky projekty stihli.

Vytvorte v subore Rozcvicka.java triedu Rozcvicka s metodou

    public static int pocetVedcov(String filename).
Tato metoda dostane ako argument nazov suboru. V tomto subore je v prvom riadku prirodzene cislo udavajuce pocet projektov (nanajvys miliarda) a v druhom riadku su uvedene doby trvania jednotlivych projektov udane v dnoch. Tieto doby su reprezentovane realnymi cislami, oddelenymi od seba medzerou. Doby su v danom subore usporiadane od najkratsej po najdlhsiu.

Navratovou hodnotou metody pocetVedcov() je minimalny pocet vedcov, ktorych treba zamestnat. Rozumne osetrite vynimky, ktore mozu vzniknut pri praci so suborom.

Spravne riesenia budu ohodnotene podla casovej zlozitosti pouziteho algoritmu:

Riesenia nesplnajuce poziadavky zadania (chybny nazov triedy, neda sa skompilovat bez chyb atd.) dostanu nanajvys 5 bodov.


Cvičenie 23.11.2010

Uvažujme nasledovnú triedu Factor:
class Faktor {
	private int cislo;
	private int pocetVlakien;
	private String vystupnySubor;
	public Faktor(int cislo, int pocetVlakien, String vystupnySubor) {
		this.cislo = cislo;
		this.pocetVlakien = pocetVlakien;
		this.vystupnySubor = vystupnySubor;
	}
}
Doplňte do triedy Faktor metódy
  1. pridajDelitela(int n) - na koniec vystupneho suboru prida dalsi riadok s cislom n.
  2. spusti() - spusti paralelne vyhladavanie delitelov cisla cislo. Metoda pouzije presne pocVlakien. Kazde vlakno musi byt instanciou tej istej triedy (nazvime ju napr. Pocitadlo). Mozete predpokladat, ze pocetVlakien < cislo. Ak niektoré vlákno nájde deliteľa, zapíše ho do súboru pomocou metódy pridajDelitela.
Nezabudnite zabezpečiť, aby viaceré vlákna nepristupovali k výstupnému súboru naraz. Prémia: Skúste naprogramovať zápis deliteľa do súboru tak, aby vlákno nečakalo na prístup k súboru, ale okamžite pokračovalo vo vyhľadávaní deliteľov a nájdeného deliteľa zapísalo hneď ako je to možné.

Cvičenie 09.11.2010

Napíšte triedu SpajacSuborov, ktora bude obsahovat nasledovne metody: Na testovacie ucely mozete pouzit tieto subory: zdroje2.zip

Cvičenie 26.10.2010

Vytvorte interface PrintableToFile obsahujuci metodu void printToFile(String filename);. Ďalej definujte výnimku CanNotLoadException ako potom triedy Exception a vytvorte interface LoadableFromFile obsahujuci metodu void loadFromFile(String filename) throws CanNotLoadException;. Interface LoadableFromFile nech rozsiruje interface PrintableToFile. Napiste triedu Publikacia, ktora implementuje LoadableFromFile a obsahuje nasledovne atributy a metody:
  1. public atribut String nazov
  2. public atribut int rok
  3. public atribut String[] autori
  4. public atribut String[] text - riadky textu (kazdy riadok je jeden prvok v poli)
  5. printToFile(String filename) - ulozi vsetky atributy do suboru tak, aby ich bolo mozne nacitat metodou loadFromFile
  6. loadFromFile(String filename) - nacita atributy zo suboru
  7. konstruktor Publikacia(String filename) - nacita zo suboru vsetky udaje, nezabudnite osetrit vynimky
Dalej napiste triedu Kniznica, ktora implementuje LoadableFromFile a obsahuje nasledovne atributy a metody:
  1. public atribut String nazovKniznice
  2. public atribut Publikacia[] publikacie
  3. printToFile(String filename) - ulozi vsetky publikacie do samostatnych suborov a tiez vytvori subor so zoznamom tychto suborov a nazvom kniznice
  4. loadFromFile(String filename) - na vstupe dostane subor so zoznamom publikacii a postupne naplni pole publikacie publikaciami z tohto zoznamu

Cvičenie 19.10.2010

Vytvorte triedu Mapa s premennou private char[][] mapa, ktora reprezentuje dvojrozmernu mapu; jednotlive policka mapy su zem 'z' alebo voda 'v'. Tato trieda by mala mat nasledujuce metody:
Mozete sa spolahnut na to, ze konstruktor dostane ako argument korektnu mapu velkosti aspon 1x1 a metoda isReachable() dostane ako argumenty policka s pripustnymi suradnicami.

Cvičenie 12.10.2010

Naprogramujte triedu Automat, ktora bude implementaciou deterministickeho konecneho automatu.
public class Automat {
	public int[] stavy; // pociatocny stav je 0
	public char[] symboly;
	public int akceptacnyStav;
	public String[] pravidla; 
		/*prechodove pravidla automatu - kazdy prvok pola je v tvare 
		 "cislo_stavu;znak;novy_stav" 
		(napr. "1;a;2" znamena ze na symbol a v stave 1 prejde do stavu 2)*/
	
	public int aktStav = 0; 
	
	public Automat(int[] stavy,char[] symboly,int acekptacnyStav,String[] pravidla) {
		//inicializuje globalne premenne podla premennych zo vstupu
		//ak sa v tabulke pravidiel nachadza symbol, ktory nie je 
		//v mnozine symbolov, konstruktor vypise na standardny vystup chybu
	}
	
	public boolean overCiAkceptuje(String slovo) {
		//vrati true ak automat slovo akceptuje, inak false;
		//zaroven na standardny vystup vypisuje priebeh simulacie,
		// t.j. dvojice (aktualny stav a symbol). 
	}
}
Trieda Automat moze obsahovat aj ine neverejne metody. Dalej naprogramujte triedu Rozcvicka1, ktora bude obsahovat metodu public static void main(String args[]) a odsimuluje automat pre jazyk a^nbc^m na slove aaaabccc. Mozete vyuzit triedy Arrays na pracu s polami. Na pracu s tabulkou pravidiel mozete pouzit metodu split() triedy String.

Cvičenie 5.10.2010

Naprogramujte triedu MojePole s nasledujucimi metodami:
	public class MojePole {

		public int[] obsah;
		
		public MojePole(int dlzka) {
			/*konstruktor, ktory vytvori nove pole obsah dlzky "dlzka" 
			s hodnotami od 1 po "dlzka"*/ 
		}
		
		public void pridajPrvky(MojePole a) {
			/*vytvori nove pole obsah, ktore bude obsahovat 
			povodne prvky pola obsah a za nimi prvky obsahu a*/
		} 
		
		public void prenasobPrvky(int x) {
			//prenasobi kazdy prvok pola cislom x
		}
		
		public void vymazPrvky(MojePole a) {
			/*vytvori nove pole obsah, v ktorom budu 
			povodne prvky z pola obsah okrem tych, ktore su v obsahu a*/
		}
		
		public void vypisMa() {
			/*vypise prvky pola obsah oddelene medzerou a ukoncene 
			novym riadkom na standardny vystup*/ 
		}
	}
Dalej vytvorte triedu Rozcvicka2 s metodou public static void main(String[] args), ktora len vyuzitim triedy MojePole (a jej instancii) vypise na standardny vystup "1 3 5 7 9 1 3 5 7 9".

Cvičenie 28.9.2010

Naprogramujte triedu Rozcvicka1, so statickou metodou public static int cifernySucet(int n), ktora vrati ciferny sucet cisla 10^n-2.

Dalej do triedy pridajte metodu public static void main(String[] args), ktora s vyuzitim metody cifernySucet vypise na standardny vystup ciferny sucet cisla 10^(ciferny sucet cisla 10^8443-2)-2.

Prémia: do triedy Rozcvicka1 pridajte metódu public static int cifernySucet2(int n), ktorá vráti ciferný súčet čísla n.