Search
Konzultace možné po předchozí domluvě přes email. Předmět emailu pište ve tvaru - [A7B36ALG] Váš předmět.
Pro získání zápočtu je vyžadováno alespoň 25 bodů, viz. celkové hodnocení předmětu.
Test v semestru se bude psát v týdnu - 11, tedy v týdnu od 28.11. do 4.12. (úterní skupiny 29.11. a páteční skupiny 2.12.).
Test se bude psát u počítače, úkolem bude napsat několik jednoduchých metod. Na test budete mít 45 minut. Nejsou povoleny žádné pomůcky, výjimkou jsou jen poznámky a projekty z minulých cvičení. Použití internetu ani intranetu není dovoleno. Test se bude psát na počítačích nainstalovaných v učebně, nikoliv na noteboocích. Způsob odevzdávání specifikuji při testu.
Opravný test se bude psát na cvičení 13.12.2010 (úterý) a 16.12.2010 (pátek). Získat z něj lze maximálně 15 bodů a po jeho napsání se automaticky použije výsledek z nového testu, tedy body z původního propadnou. Opravný test je dobrovolný.
Pokud si myslíte, že předmět již pro vás nebude přínosem, neboť jazyk Java znáte velice dobře, nemusíte na cvičení chodit. Nutnou podmínkou jsou ale následující kroky:
Při splnění všech podmínek výše vám odpustím docházku a body za domácí úkoly získáte automaticky.
Od 3. týdne budou zadávány domácí úkoly, jejich plnění bude bodově hodnoceno a z nich se určí výsledné body aktivity ke zkoušce. Průběžné hodnocení naleznete v tabulce u svého jména na stránkách pro vaši skupinu.
Domácí úlohy jsou bodovány následovně:
Z tohoto důvodu si funkčnost vašeho kódu vždy ověřte na více instancích (vstupech). Úloha je odevzdána včas, pokud ji odešlete/nahrajete do půlnoci dne předcházejícího dni cvičení, tedy pondělí či čtvrtek dle termínu cvičení.
Napiště metodu, která spočítá správně faktoriál. Kód piště do souboru Du1.java, ke stažení je projekt netbeans se šablonou . Správnost kódu si ověřte pomocí JUnit testu. Kód – tedy soubor Du1.java – mi zašlete ze své školní adresy na mail.
Du1.java
Napište metodu, která spočítá kombinační číslo n nad k. Kód piště do připravené metody v předpřipraveném projektu pro Netbeans. Funkčnost kódu si ověřte na přiloženém JUnit testu (Test Packages → Du2 → Du2Test.java → Run File (z kontextového menu, pravé tlačítko myši)). Výsledný soubor Du2.java nahrajte do systému pro odevzdávání úloh na adrese http://votava.felk.cvut.cz.
Du2.java
Napište metodu, která vypočítá, kolik uběhlo dnů od začátku roku do data, které zadá uživatel. Metoda bude ve tvaru:
public static int pocetDnu(int rok, int mesic, int den){ int pocetDnu = 0; // reseni return pocetDnu; }
Pro jednoduchost počítáme s tím, že datum vybírá uživatel z grafického rozhraní a nemůže vložit nesmyslnou hodnotu, jako např. 33. 3. 3333.
Pro výpočet přestupného roku platí tato pravidla:
K dispozici máte projekt Netbeans s připraveným JUnit testem a třídou Du3.java. Úkol nahrajte na http://votava.felk.cvut.cz do dne předcházejícího dni vašeho cvičení a nezapomeňte, že emailem úlohy nepřijímám.
Du3.java
Možné řešení
public static int pocetDnu(int rok, int mesic, int den){ int pocetDnu = 0; boolean prestupnyRok = ((rok % 4 == 0) && (rok % 100 != 0)) || (rok % 400 == 0); pocetDnu = den; for(int i = 1; i < mesic; i++){ switch(i){ case 1: case 3: case 5: case 7: case 8: case 10: case 12: pocetDnu += 31; break; case 2: if (prestupnyRok) pocetDnu += 29; else pocetDnu += 28; break; case 4: case 6: case 9: case 11: pocetDnu += 30; break; } } return pocetDnu; }
Doplňte kód metody public static boolean jePrvocislo(int a) tak, aby pro prvočísla vracela true a pro ostatní čísla vracela false. Projekt Netbeans i s JUnit testem je opět k dispozici . Stále se odevzdává na http://votava.felk.cvut.cz.
public static boolean jePrvocislo(int a)
true
false
public static boolean jePrvocislo(int a){ if(a < 2) return false; boolean vysledek = true; int limit = (int) Math.sqrt(a) + 1; for (int i = 2; i < limit; i++) { if(a % i == 0){ vysledek = false; break; } } return vysledek; }
Napište metodu, jež provede jednoduchou operaci (součet) se dvěma poli. Metoda bude vracet součet prvků pole v novém poli, velikost nového pole bude určena podle většího z polí. Prvky menšího pole, které již neexistují, považujte za nulové.
Projekt Netbeans se správnou deklarací a JUnit testem je opět k dispozici.
public static int[] soucetPoli(int[] a, int[] b){ int[] vetsi = (a.length > b.length)? a:b; int[] mensi = (vetsi == a) ? b:a; int[] vysledek = new int[vetsi.length]; for(int i = 0; i < mensi.length; i++) vysledek[i] = a[i] + b[i]; for(int i = mensi.length; i < vetsi.length; i++) vysledek[i] = vetsi[i]; return vysledek; }
Napište kód třídy, která bude reprezentovat kružnici. Třída se jmenuje Kruznice a nachází se jako neveřejná třída v souboru Du6.java (omezení plynoucí z odevzdávacího systému). Třída bude podporovat několik základních funkcí. Kromě konstruktoru Kruznice(double polomer) bude nabízet i metodu getPolomer(), setPolomer(double polomer), equals(Object o), getObsah(), getObvod() či metodu toString().
Kruznice
Du6.java
Kruznice(double polomer)
getPolomer()
setPolomer(double polomer)
equals(Object o)
getObsah()
getObvod()
toString()
Projekt se šablonou a testem JUnit je opět k dispozici.
Tip: Pro velice přesnou hodnotu Ludolfova čísla můžete použít statickou proměnnou třídy Math, konkrétně Math.PI .
Math.PI
package du6; public class Du6 {} class Kruznice { private double polomer; public Kruznice(double polomer){ this.polomer = polomer; } @Override public boolean equals(Object o){ if(o instanceof Kruznice){ Kruznice k = (Kruznice) o; if(k.polomer == this.polomer) { return true; } else { return false; } } else { return false; } } public double getObsah(){ return Math.PI * polomer * polomer; } public double getObvod(){ return 2 * Math.PI * polomer; } public double getPolomer() { return polomer; } public void setPolomer(double polomer) { this.polomer = polomer; } @Override public String toString() { return "Kruznice{" + "polomer=" + polomer + '}'; } }
Napište kód třídy Sestiuhelnik, chování je logické z názvu funkcí. K dispozici je šablona projektu s kostrou třídy a metod. Jenom drobnost k chování metody readFile. Tato metoda vrací pole šestiúhelníků. Formát souboru je jednoduchý. Na prvním řádku je informace kolik je v daném souboru šestiúhelníků, na každém dalším řádku je informace o straně šestiúhelníků, tedy co řádek, to šestiúhelník. Metoda toFile zapisuje do souboru 1 šestiúhelník a to ve specifikovaném formátu, takže metoda readFile vrátí pole s jedním šestiúhelníkem.
Sestiuhelnik
readFile
toFile
class Sestiuhelnik { private double strana; public Sestiuhelnik(double strana){ this.strana = strana; } public double getObsah(){ return 3 * strana * strana * Math.sqrt(3.0) / 2; } public double getObvod(){ return 6 * strana; } public static Sestiuhelnik[] readFile(String file){ Sestiuhelnik [] pole = null; try { Scanner s = new Scanner(new FileInputStream(file)); int pocet = s.nextInt(); pole = new Sestiuhelnik[pocet]; for (int i = 0; i < pole.length; i++) { pole[i] = new Sestiuhelnik(Double.parseDouble(s.next())); } } catch (FileNotFoundException ex) { Logger.getLogger(Sestiuhelnik.class.getName()).log(Level.SEVERE, null, ex); } return pole; } public void toFile(String file){ try { FileWriter fw = new FileWriter(file); fw.write("1\n"); fw.write(""+strana); fw.close(); } catch (IOException ex) { Logger.getLogger(Sestiuhelnik.class.getName()).log(Level.SEVERE, null, ex); } } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final Sestiuhelnik other = (Sestiuhelnik) obj; if (Double.doubleToLongBits(this.strana) != Double.doubleToLongBits(other.strana)) { return false; } return true; } @Override public int hashCode() { int hash = 3; hash = 41 * hash + (int) (Double.doubleToLongBits(this.strana) ^ (Double.doubleToLongBits(this.strana) >>> 32)); return hash; } }
Napište třídu Matice, která bude mít neznámou vnitřní strukturu, ale bude nabízet tyto veřejné funkce:
public Matice(int radku, int sloupcu)
public void napln(int od)
od
napl(5)
public String toString()
public void prohodRadky(int prvni, int druhy)
public double getPrvek(int x, int y)
public boolean equals(Object o)
Třída bude deklarována
class Matice
a bude v souboru Du8.java. Jako obvykle máte k dispozici šablonu projektu i s JUnit testem. Tento úkol patří mezi lehčí a doporučuji si jej zkusit naprogramovat. Úlohu podobného typu můžete očekávat i v testu.
package du8; import java.util.Arrays; public class Du8 { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here } } class Matice { private double[][] m; public Matice(int radku, int sloupcu) { m = new double[radku][sloupcu]; } public void napln(int od) { for (int i = 0; i < m.length; i++) { for (int j = 0; j < m[i].length; j++) { m[i][j] = od + i * m[0].length + j; } } } @Override public String toString() { return "Matice{" + "m=" + m + '}'; } public void prohodRadky(int prvni, int druhy) { double[] p = m[prvni]; m[prvni] = m[druhy]; m[druhy] = p; } public double getPrvek(int r, int s) { return m[r][s]; } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final Matice other = (Matice) obj; if (!Arrays.deepEquals(this.m, other.m)) { return false; } return true; } @Override public int hashCode() { int hash = 7; hash = 67 * hash + Arrays.deepHashCode(this.m); return hash; } }
Výraz je správně ozávorkován, má-li ke každé otevírací závorce závorku uzavírací a to ve správném pořadí. Tedy výraz (abc(def)) je ozávorkován správně, stejně tak ()()abc{}[def], výraz {abc(def}gh) už není správně. Vaším úkolem je napsat metodu, který určí, zda je výraz správně ozávorkován. Berte v potaz závorky (), {} a []. Samotnou kontrolu bude dělat metoda
public static boolean spravneOzavorkovan(String vyraz)
přímo ve třídě Du9. K dispozici je šablona projektu s testem.
package du9; public class Du9 { /** * Metoda pro zjisteni, zda je vyraz prvane ozavorkovan. * Uvazujte zavorky (), {} a [] * * @param vyraz retezec, ktery zkoumate * @return true pokud sedi parovani zavorek, false jinak */ public static boolean spravneOzavorkovan(String vyraz){ java.util.LinkedList<Character> z = new java.util.LinkedList<Character>(); for(int i = 0; i < vyraz.length(); i++){ switch(vyraz.charAt(i)){ case '(': z.push(')'); break; case '[': z.push(']'); break; case '{': z.push('}'); break; case ')': if(z.size() == 0) return false; if(z.pop() != ')') return false; break; case ']': if(z.size() == 0) return false; if(z.pop() != ']') return false; break; case '}': if(z.size() == 0) return false; if(z.pop() != '}') return false; break; default: } } if(z.size() != 0) return false; return true; } }
Napište metodu, která spočítá, kolik dní uběhlo od začátku roku, který zadá uživatel. Tento úkol je rozšířením třetího úkolu. Klidně můžete využít kód, který jste již odevzdali/nalezli na této stránce. Tento úkol je na práci s uživatelským vstupem. Vašim úkolem je napsat kód metody pocetDnuUser, která se bude uživatele vždy ptát na 3 údaje, rok, měsíc a den. Pokud uživatel zadá neplatné datum, vše se opakuje až do doby, kdy se mu povede zadat datum správně, viz ukázka níže.
pocetDnuUser
Zadej rok: 2000 Zadej mesic: 5 Zadej den: 1 Pocet dnu od pocatku roku je 122 Zadej rok: 16w5 Zadej mesic: 2 Zadej den: 2 Zadal jste hodnotu, ktera neni celociselna. Zadej rok: 1665 Zadej mesic: 2 Zadej den: 2 Pocet dnu od pocatku roku je 33 Zadej rok: 1 Zadej mesic: 1 Zadej den: 1 Pred rokem 1582 platil jiny kalendar. Zadej rok: 1665 Zadej mesic: 2 Zadej den: 2 Pocet dnu od pocatku roku je 33 Zadej rok: 2010 Zadej mesic: 2 Zadej den: 29 Hodnota pro den je mimo priputny rozsah. Zadej rok: 2010 Zadej mesic: 2 Zadej den: 28 Pocet dnu od pocatku roku je 59
Jako vždy je k dispozici šablona do Netbeans s JUnit testem.
Pozn. implementace testu je založena na prohazování vstupních proudů. Scanner používá bufferování vstupu a proto používejte jedinou instanci Scanneru pro celou metodu. Pokud budete vyrábět více Scannerů, vstup, který běžně zadává uživatel, bude zahozen i s bufferem předchozího Scanneru a metoda, byť napsaná správně, testem neprojde.
package du10; import java.util.Scanner; /** * * @author FIXME */ public class Du10 { /** * Metoda spocita pocet dni od zacatku daneho roku :-) */ public static void pocetDnuUser() { int[] mesice = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; boolean correct = true; Scanner s = new Scanner(System.in); while (true) { correct = true; int mesic = 0; int rok = 0; int den = 0; try { System.out.print("Zadej rok: "); String r = s.next(); System.out.print("Zadej mesic: "); String m = s.next(); System.out.print("Zadej den: "); String d = s.next(); den = Integer.parseInt(d); mesic = Integer.parseInt(m); rok = Integer.parseInt(r); boolean prestupny = (rok % 400 == 0) || (rok % 4 == 0 && rok % 100 != 0); if (mesic < 1 || mesic > 12) { System.out.println("Hodnota pro mesic je mimo pripustny rozsah."); correct = false; } if (rok < 1582) { System.out.println("Pred rokem 1582 platil jiny kalendar."); correct = false; } if ((prestupny && mesic == 2 && den > 29) || (!prestupny && den > mesice[mesic - 1]) || den < 1) { System.out.println("Hodnota pro den je mimo priputny rozsah."); correct = false; } if (correct) { System.out.println("Pocet dnu od pocatku roku je "+pocetDnu(rok, mesic, den)); break; } } catch (NumberFormatException ex) { System.out.println("Zadal jste hodnotu, ktera neni celociselna."); } catch (ArrayIndexOutOfBoundsException ex) { } } } public static int pocetDnu(int rok, int mesic, int den) { int pocetDnu = 0; boolean prestupnyRok = ((rok % 4 == 0) && (rok % 100 != 0)) || (rok % 400 == 0); pocetDnu = den; for (int i = 1; i < mesic; i++) { switch (i) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: pocetDnu += 31; break; case 2: if (prestupnyRok) { pocetDnu += 29; } else { pocetDnu += 28; } break; case 4: case 6: case 9: case 11: pocetDnu += 30; break; } } return pocetDnu; } /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here //pocetDnuUser(); } }
Napište metodu public static double prunikKruhu(Kruh k1, Kruh k2), která spočítá obsah průniku dvou kruhů. Metoda bude vracet následující hodnoty:
public static double prunikKruhu(Kruh k1, Kruh k2)
K dispozici máte projekt Netbeans s JUnit testem , úkol můžete nahrávat do systému na votava.felk.cvut.cz.
Tento úkol je bonusový. Body za něj mohou získat jen ti, kteří mají mezi 20 a 24 body a mají v pořádku docházku. Ti zatím nemají nárok na zápočet, pokud ale vyřeší správně tento úkol, pak mohou získat všechny potřebné body k získání zápočtu (max. ze semestru tedy bude 25). Ostatní se také mohou nad úkolem zamyslet nebo si ho i naprogramovat, odměnou jim může být uspokojení z dobře odvedené práce a malá příprava na programovací část zkoušky.
Semestrální práce je povinná, každý na ní pracuje sám. Do 7. týdne si musí každý zvolit téma své práce (nahlásíte na cvičení v týdnu od 31. 10. do 6. 11. 2011). Práce se odevzdává osobně, kopii práce mi pošlete na mail. Nejzazší termín pro odevzdání bez ztráty bodů je 13. týden (12. - 18. 12. 2011). Funkčnost semestrální práce předvedete osobně na cvičení, vyžaduje se taktéž důkladná znalost kódu a metod, které jste napsali (ověření proti duplikátům).
Důležité Pojmem ztráta bodů se myslí následující. Každý započatý týden po termínu (18.12.) znamená snížení maximální možné hranice zisku bodů (20 v tomto případě) o 20%. Tedy v pondělí 19.12. již můžete získat jen 16 bodů a v pondělí 2.1. již jen 8 bodů.
Termínem odevzdání se myslí:
Semestrální práce by měla mít rozsah 250+ řádků bez komentářů a prázdných řádků. K práci též vypracujte návod a doprovodnou zprávu, v níž popíšete hlavní funkce a strukturu programu a jak tento program využít.
Možné náměty na semestrální práci:
ipcalc