Najważniejsza teoria w JAVA

Najważniejsza teoria w JAVA
S9
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 8 lat
  • Postów:42
0

Witam,
Jestem studentem i mam mały problem z programowaniem w java. Miałem ten przedmiot na studiach lecz nie udało mi się go zaliczyć w pierwszym terminie. Do poprawki zostało ok. miesiąca i chciałbym się do tego przyłożyć i zaliczyć ten przedmiot. Ze slajdów prowadzącego wypisałem moim zdaniem najważniejsze tematy jakie on poruszał na temat java :
Klasy abstrakcyjne/Interfejsy
Dziedziczenie
Klasa Object
Klonowanie
Kolekcje
Wyjątki
Aplety

I teraz mam pytanie do was drodzy użytkownicy :) Czy byłby ktoś w stanie zadawać w tym dziale pytania dotyczące każdego z tych działów tak aby zobaczyć czy jestem dobrze z tego przygotowany ? Na każdy z działów chciałbym sobie przeznaczyć 1-2 dni.

Z góry dziękuje za pomoc ! :)

0

Kompozycja vs dziedziczenie

S9
To jest jedno z pytań ? Prowadzący raczej nie daje takich pytań tylko programy do napisania.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:42 minuty
  • Lokalizacja:Laska, z Polski
  • Postów:10066
2

Program który potrafi przyjąć funkcję liniową/kwadratową/wielomiad 3ciego stopa w formie y=3+2x+4x^2, sparsować, i obliczyć miejsca zerowe/maxima/minima?

edytowany 1x, ostatnio: Riddle
S9
Dodałem niżej przykładowe zadanie bo w komentarzu się nie mieściło :)
S9
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 8 lat
  • Postów:42
0

Takie było ostatnio jedno z zadań.
Wykonanie programu wymaga użycia stosu, na którym zapisywane sa zmienne oraz ich wartości. Stan stosu zapisujemy jako ciąg list par
odpowiadający metodom na stosie i zmiennym zadeklarowanym i modyfikowanym w czasie ich wykonania.
Lista par odpowiada metodzie na stosie, jest zapisana w nawiasie kwadratowym, a każda para składa się z nazwy zmiennej oraz jej wartości
np: [..., (x,7),(y,true)]main to stan, w których wykonywana jest metoda main, a wartości zmiennych x i y sa odpowiednio równe 7 i true.
Rozważ następujący kod:

Kopiuj
class A {
public static void m(int x){
...;//x
...;//y
 }
}
public static void main(String[] args)
{....;//A
.....;//B
.....;//C
.....;
.....;//D}}
edytowany 1x, ostatnio: bogdans
Riddle
Ciąg list par, czy ciąg par?
S9
ciąg list par
S9
Było też jedno zadanie z przekazywaniem parametrów. Podał dosyć zawiły kod i trzeba było wypisać wyniki i opisać dlaczego tak a nie inaczej.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:42 minuty
  • Lokalizacja:Laska, z Polski
  • Postów:10066
0

Ciąg list par to by było coś takiego

Kopiuj
[
  [(x:true),(x:true),(x:true),(x:true)],
  [(x:true),(x:true),(x:true),(x:true)],
  [(x:true),(x:true),(x:true),(x:true)],
  [(x:true),(x:true),(x:true),(x:true)],
  [(x:true),(x:true),(x:true),(x:true)],
  [(x:true),(x:true),(x:true),(x:true)]
]

co nie?

S9
Tak, chyba o to mu chodziło. Ale ręki sobie nie dam uciąć bo ten koleś jest nieobliczalny :)
ZE
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 5 lat
0

Dlaczego do tworzenia ogólnych klas/interfejsów/metod używamy kolekcji a nie referencji do klasy Object ? Jaki problem rozwiązują kolekcje ?

S9
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:42 minuty
  • Lokalizacja:Laska, z Polski
  • Postów:10066
0

To zadanie jest bardzo zawiłe i nie za bardzo wiadomo o co w nim chodzi. Ja nie potrafię skminić o co chodzi i czego się ode mnie wymaga.

S9
Zadanie przepisałem słowo w słowo z zaliczenia ;/
Riddle
Sorry ale to zadanie to dla mnie jakiś bełkot. Nie potrafię rozszyfrować o co chodzi w zadaniu. Jakieś zapisywanie nazw zmiennych w stosie? Chodzi o stos w sensie kolekcje? Jeżeli tak to jakie zapisywanie czegoś w nawiasie kwadratowym? Nie wiem o co chodzi, sorki no.
S9
Spoko, nie dziwie Ci się i sam niestety nie mogę Ci tego lepiej wytłumaczyć bo też nie wiem o co w tym chodzi.
S9
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 8 lat
  • Postów:42
0

A czy ktoś byłby mi w stanie wytłumaczyć wyniki tego programu ? Niestety nie mam zdjęcia klasy F ;/
http://pokazywarka.pl/qamhk7/

edytowany 1x, ostatnio: siaomi95
Riddle
Ojapier*... Ta metoda n to jakieś czary.
S9
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:42 minuty
  • Lokalizacja:Laska, z Polski
  • Postów:10066
1

Ten kod, wygląda jak g**no:

Kopiuj
class F {
    public int n(int value) {
        return 0;
    }
}

public class G extends F {
static int t = 3;
int f = 13;

public int n(int x) {
    return (--f)*(++x + 2)+ --t;
}

public static void main(String[] args) {
    F o1 = new F();
    G o2 = new G();
    System.out.println("o2.f = " + o2.f);
    int x = 0;

    System.out.println("o1.n(x) = " + o1.n(x));
    System.out.println("o2.n(x) = " + o2.n(x));

    System.out.println("x = " + x);
    System.out.println("o2.f = " + o2.f);
    System.out.println("t = " + t);
    
    
    
}
}

Dużo lepiej wygląda ten

Kopiuj
public class G extends F {
    static int t = 3;
    int f = 13;

    public int n(int x) {
        --f;
        --t;
        return f * (x + 3) + t;
    }

    public static void main(String[] args) {
        F f = new F();
        G g = new G();
        System.out.println("g.f = " + g.f);
        int x = 0;

        System.out.println("f.n(x) = " + f.n(x));
        System.out.println("g.n(x) = " + g.n(x));

        System.out.println("x = " + x);
        System.out.println("g.f = " + g.f);
        System.out.println("t = " + t);
    }
}

Ale niestety bez kodu tej klasy F, nie da się wywróżyć co tam się mogło dziać.

edytowany 1x, ostatnio: Riddle
S9
Popytam się może ktoś zrobił jakąś fotkę i ma klasę F :)
S9
a jeśli podam wyniki to można jakoś małymi krokami dojść do rozwiązania klasy F ? :)
Riddle
Raczej syzyfowa praca, ale możesz próbować.
S9
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 8 lat
  • Postów:42
0

Witam, czy byłby ktoś w stanie wytłumaczyć jak praktycznie podejść do tego zadania ze zdjęcia ?
http://pokazywarka.pl/hx4boo/

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Na początek włącz komputer, potem uruchom ulubione IDE (ewentualnie ulubiony edytor). Dalej to już będzie z górki.

Kopiuj
public class TrippleOccurences extends Exception
{
    private String msg = "";
    public TrippleOccurences(int value)
    {
        msg = "Wartość " + value + " wystąpiła trzykrotnie";
    }
    public String toString()
    {
    	return "TrippleOccurences: " + msg;
    }
    public String getMessage()
    {
        return msg;
    }
}
Kopiuj
import java.util.*;

public class IntegerList
{
    private Vector<Integer> list = new Vector<Integer>();
    public IntegerList(int size)
    {
        Random r = new Random();
        for(int i = 0;i<size;i++)
        {
            list.add(r.nextInt(10));
        }
    }
    public Vector<Integer> findDuplicates() throws TrippleOccurences
    {
        HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
        //pętla po zmiennej list wypełniająca mapę parami (wartość, krotność)
        Vector<Integer> duplicates = new Vector<Integer>();
        for(int value:map.keySet())
        {
            int multiplicity = map.get(value);
            if(multiplicity > 2)
            {
                throw new TrippleOccurences(value);
            }
            else if(multiplicity == 2)
            {
                duplicates.add(value);
            }
        }
        return duplicates;
    }
}

Pominiętą pętlę i kod testujący to już napisz sam.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans
1

Czyżby prowadzący to legenda WATU, Pikej?

S9
Nie wiedziałem, że jest juz on legendą :)
S9
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 8 lat
  • Postów:42
0

Czy umiałby ktoś wytłumaczyć mi dlaczego z poniższego kodu wynik to 15 ?

Kopiuj
public class A 
{
	int a = 2;
	public int m(int x)
	{
		return a*(++x);
	}
}

public class B extends A
{
	int a = 3;
	
	public int m(int x)
	{
		return a*(++x);
	}
	public static void main(String[] args)
	{
		A o = new B();
		int x = 4;
		System.out.println(o.m(x));
	}
}
FI
filemonczyk
to jest na zaliczenie przedmiotu z którego roku (roku studiow)??
S9
takich rzeczy nie ma na zaliczeniu. Po prostu ćwiczę sobie przekazywanie parametrów, Na zaliczeniu pojawiają się rzeczy bardziej skomplikowane. Przykład podałem wyżej w postach.
szweszwe
  • Rejestracja:ponad 11 lat
  • Ostatnio:2 dni
  • Lokalizacja:Kraków
  • Postów:1694
0

Bo 3 * 5 = 15.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Bo 35 = 15? Co to za pytanie? Interesuje cię tylko klasa B. Masz tam metodę m która robi a(++x) czyli a*(x+1) czyli 3*(x+1). A skoro za x podstawiasz 4 to masz 3*(4+1) = 15


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
S9
Pytanie normalne. Nie każdy jest Shalomonem
Pipes
Tu nie chodzi o bycie Shalomem, a czytanie kodu i kojarzenie, że ++x to preinkrementacja czyli dzieje się zanim dostaniesz x.
Gjorni
@Pipes Pozwolę sobie dopisać dwa słowa do Twojego wyjaśnienia. W skrócie, w przypadku preinkrementacji (++x) najpierw jest zwiększana wartość o jeden, a następnie jest ona zwracana. Przez co w linijce int y = ++x; do zmiennej y zostanie przypisana już zwiększona wartość x. Natomiast w przypadku postinkrementacji (x++) najpierw jest zwracana wartość, a dopiero potem jest ona zwiększana o jeden. Przez co w linijce int y = x++; do zmiennej y zostanie przypisana wartość x jeszcze niepowiększona. Java "czyta" wyrażenia od lewej do prawej.
L1
  • Rejestracja:ponad 9 lat
  • Ostatnio:12 dni
  • Postów:14
0

Ja może zadam trochę konkretniej pytanie, ponieważ też nie do końca rozumiem dlaczego wybierana jest metoda z klasy B. W programie mamy tworzony obiekt typu A i referencję do tego obiektu jako o = new B();. Czy w takim wypadku przy wywołaniu o.m(); nie powinna być brana metoda z klasy A? Widząc jaki jest wynik widać, że odpowiedzią na moje pytanie jest "nie" :P, ale może ktoś byłby w stanie to jakoś jasno wyjaśnić, dlaczego wybierana jest metoda obiektu B, a nie metoda obiektu A skoro obiekt jest typu A?

PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:4 miesiące
  • Postów:2787
0

Taki przykład: Załóżmy że masz nadklasę Pracownik, która ma metodę wypłaćPensję() i zwraca ona 1500. Masz też klasę Programista, który dziedziczy po klasie Pracownik, bo w końcu obiekt klasy Programista JEST również obiektem klasy Pracownik. No i w klasie Programista metoda wypłaćPensję() jest overridowana i zwraca 3500 zamiast 1500. Następnie przyjmujesz nowego pracownika i dajesz mu umowę o pracę dla pracownika, taką szablonową. Czyli zadeklarowałeś jako obiekt klasy Pracownik. ALE ten człowiek będzie na stanowisku programisty, wobec czego jest jednocześnie programistą i pracownikiem - Kadry wiedzą, że zatrudniły nowego PRACOWNIKA, który w rzeczywistości jest PROGRAMISTĄ. Wypłacając mu pensję, sprawdzasz, czy jego wyróżniony typ (Programista) ma swoją własną odmianę metody wypłaćPensję(). Jeśli tak, to tyle mu wypłacasz. Jeśli nie, to szukasz tej metody w nadklasie Pracownik.

L1
  • Rejestracja:ponad 9 lat
  • Ostatnio:12 dni
  • Postów:14
0

Niby rozumiem, bo to co napisałeś ma sens, ale czym różni się to od zapisu B o = new B();? lub biorąc twój przykład, dlaczego nie zrobić Programista p = new Programista();, skoro i tak klasa Programista rozszerza klasę Pracownik? W jakich wypadkach jest konieczność robienia tego w taki sposób, że używa się A o = new B(); zamiast tego co napisałem wyżej.

Może mój problem polega właśnie na tym, że nie widzę sensu stosowania takiego zapisu :P?

PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:4 miesiące
  • Postów:2787
0

A pomyśl teraz co jest elastyczniejsze - dla każdego nowego PRACOWNIKA dawać mu tę samą, generyczną umowę o pracę i tylko zmienić nazwę stanowiska i tam zakres obowiązków, CZY dla każdego stanowiska szykować osobne umowy? ;) Albo np opis jakiejś dużej firmy - piszą że pracuje w niej np 1000 pracowników. Nie piszą, że pracuje 200 programistów, 100 kierowników, 100 sekretarek i 600 ślusarzy.

Tak bardziej programistycznie - dobrą praktyką jest deklarować zawsze interfejsami (lub nadklasami). Chodzi o to, że jeśli na sztywno ustawisz obiekt typu B, to jakbyś potem chciał ten obiekt zmienić na klasę C (która też by dziedziczyła po A), to musiałbyś zapewne zmienić trochę w kodzie. A jeśli zostawiłbyś A a = new B(); to potem jedyna zmiana z klasy B na C byłaby taka: A a = new C();

edytowany 1x, ostatnio: Pinek
xfin
  • Rejestracja:ponad 11 lat
  • Ostatnio:9 miesięcy
  • Lokalizacja:Genewa
  • Postów:597
1

@lukasz1988
To ja Ci napiszę ciut praktyczniej niż @Pinek.
Wyobraź sobie, że masz palącą potrzebę posiadania listy obiektów klasy typu A (niech będą to właśnie ci pracownicy). Lecimy dalej - chcesz mieć listę pracowników danej firmy więc tworzysz np. ArrayList, który potrafi trzymać obiekty typu A. Ale masz klase B i C, które również dziedziczą po A (więc są pracownikami - spawaczem czy tam koderem).

No i tutaj takie ArrayList przechowa wszystkie te obiekty. I jak będziesz chciał to możesz np. użyć foreach, żeby sobie tę listę przeiterować i nie robi tu różnicy jaka to klasa, byle by dziedziczyła po A (i były wołane metody z A).

edytowany 1x, ostatnio: xfin
L1
  • Rejestracja:ponad 9 lat
  • Ostatnio:12 dni
  • Postów:14
0

No ale napisałem taki krótki kod:

Kopiuj
package praca;

import java.util.ArrayList;

class Pracownik{
    String imie;
    String nazwisko;
    double zarobki;
    
    Pracownik(String imie, String nazwisko, double zarobki){
        this.imie = imie;
        this.nazwisko = nazwisko;
        this.zarobki = zarobki;
    }
    @Override
    public String toString(){
        return "Imię: " + imie + ", Nazwisko: " + nazwisko + ", Zarobki: " + zarobki;
    }
    
}

class Programista extends Pracownik{
    double premia;
    Programista(String imie, String nazwisko, double zarobki, double premia){
        super(imie, nazwisko, zarobki);
        this.premia = premia;
    }
    @Override
    public String toString(){
        return super.toString() + ", Premia: " + premia + "%";
    }
}

class Technolog extends Pracownik{
    double premia;
    Technolog(String imie, String nazwisko, double zarobki, double premia){
        super(imie, nazwisko, zarobki);
        this.premia = premia;
    }
    public String toString(){
        return super.toString() + ", Premia: " + premia + "%";
    }
}

public class Praca {

    public static void main(String[] args) {
        ArrayList<Pracownik> lista = new ArrayList<>();
        Pracownik p1 = new Pracownik("Lukasz", "Nowak", 2000);
        Programista p2 = new Programista("Krzysztof", "Zapałka", 2500, 0.25);
        Technolog p3 = new Technolog("Janusz", "Bąk", 2500, 0.2);
        lista.add(p1);
        lista.add(p2);
        lista.add(p3);
        for(Pracownik e: lista) System.out.println(e);
    }
}

I kompilator nie wyrzuca mi żadnego błędu, bez problemu mogę dodawać Pracownika, Programistę i Technologa do tablicy Pracowników i później zostaną oni prawidłowo wyświetleni.

Nawet jeżeli fragment kodu:

Kopiuj
        Pracownik p1 = new Pracownik("Lukasz", "Nowak", 2000);
        Programista p2 = new Programista("Krzysztof", "Zapałka", 2500, 0.25);
        Technolog p3 = new Technolog("Janusz", "Bąk", 2500, 0.2);

zamienię na:

Kopiuj
        Pracownik p1 = new Pracownik("Lukasz", "Nowak", 2000);
        Pracownik p2 = new Programista("Krzysztof", "Zapałka", 2500, 0.25);
        Pracownik p3 = new Technolog("Janusz", "Bąk", 2500, 0.2);

Program działa identycznie więc ciągle nie rozumiem dlaczego powinienem tworzyć obiekty tak jak napisałem przy drugim sposobie, a nie tak jak jest to w programie czy też w pierwszym fragmencie.

Może ktoś mógłby zmodyfikować mój program tak żeby było widać różnicę dla której warto definiować obiekty np:

Kopiuj
        Pracownik p = new Programista();
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

@lukasz1988 to akurat dość proste. Napisz mi teraz funkcje która sortuje listę Pracowników po ich pensji. Przy czym twój kod jest bez sensu bo masz niby zdefiniowane dwie klasy, ale one są identyczne. Dodaj do programisty jeszcze np. przychód z przeniesienia prawa własności i dodaj metodę do Pracownika która zwraca roczne zarobki (i odpowiednio overriduj tą metodę w technologu i programiście).


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
L1
  • Rejestracja:ponad 9 lat
  • Ostatnio:12 dni
  • Postów:14
0

Muszę przyznać, że trochę z lenistwa zrobiłem 2 klasy, które jedynie różnią się nazwą, a nie chciało mi się wymyślać pól unikalnych dla danej klasy ponieważ pomyślałem, że nie jest to tak istotne dla zrozumienia tematu :P.

Już prawię godzinę walczę z tym sortowaniem tablicy i coś mi nie idzie ;(, jak tylko nauczę się sortować to napiszę czy przykład coś mi rozjaśnił ^^.

Mógłbyś jeszcze wyjaśnić co miałeś na myśli pisząc "Dodaj do programisty jeszcze np. przychód z przeniesienia prawa własności", nie rozumiem tej części z przeniesieniem prawa własności.

EDIT:
Ok, coś takiego mi wyszło:

Kopiuj
package praca;

import java.util.ArrayList;
import java.util.Collections;

class Pracownik implements Comparable<Pracownik>{
    String imie;
    String nazwisko;
    double zarobki;
    
    Pracownik(String imie, String nazwisko, double zarobki){
        this.imie = imie;
        this.nazwisko = nazwisko;
        this.zarobki = zarobki;
    }
    double roczneZarobki(){
        return this.zarobki * 12;
    }

    @Override
    public String toString(){
        return "Imię: " + imie + ", Nazwisko: " + nazwisko + ", Zarobki: " + zarobki;
    }

    @Override
    public int compareTo(Pracownik t) {
        if (zarobki == t.zarobki) return 0;
        else if (zarobki > t.zarobki) return 1;
        else return -1;
    }
}

class Programista extends Pracownik{
    double premia;
    String specjalizacja;
    Programista(String imie, String nazwisko, double zarobki, double premia, String specjalizacja){
        super(imie, nazwisko, zarobki);
        this.premia = premia;
        this.specjalizacja = specjalizacja;
    }
    
    @Override
    double roczneZarobki(){
        return this.zarobki * premia * 12;
    }
    @Override
    public String toString(){
        return super.toString() + ", Premia: " + premia + "%, Specjalizacja: " + specjalizacja;
    }
}

class Technolog extends Pracownik{
    double premia;
    Technolog(String imie, String nazwisko, double zarobki, double premia){
        super(imie, nazwisko, zarobki);
        this.premia = premia;
    }
    
    @Override
    double roczneZarobki(){
        return this.zarobki * premia * 12;
    }
    @Override
    public String toString(){
        return super.toString() + ", Premia: " + premia + "%";
    }
}

public class Praca {

    public static void main(String[] args) {
        ArrayList<Pracownik> lista = new ArrayList<Pracownik>();
        
        Pracownik p1 = new Pracownik("Lukasz", "Nowak", 2400);
        Programista p2 = new Programista("Krzysztof", "Zapałka", 2200, 0.25, "Java");
        Technolog p3 = new Technolog("Janusz", "Bąk", 2500, 0.2);
        
        lista.add(p1);
        lista.add(p2);
        lista.add(p3);
        
        for(Pracownik e: lista) System.out.println(e);
        
        Collections.sort(lista);
        
        System.out.println("\nPosortowana według zarobków:\n");
        
        for(Pracownik e: lista) System.out.println(e);
    }
}

Nadal wszystko działa, bez względu na to czy wszystkie obiekty definiuję jako klasę "Pracownik", czy każdy jest oddzielnie Pracownikiem, Programistą, Technologiem. W obu przypadkach sortowanie działa tak samo i bez problemów.

Bardzo chciałbym to zrozumieć, bo już wcześniej z tym się spotykałem ale coś chyba za tępy jestem żeby to ogarnąć, a pewnie jak już kiedyś zrozumiem to będę się zastanawiał czego tu można było nie rozumieć xd.

edytowany 1x, ostatnio: lukasz1988
LukeJL
czemu dublujesz w każdej klasie premię i roczne zarobki? Przecież to możesz wyciągnąć równie dobrze do klasy pracownik...
LukeJL
wystarczy, że zrobisz tak, że domyślnie premia wynosi 1 wtedy wzór this.zarobki * premia * 12 (który masz w podklasach) również będzie się stosował do pracowników bez premii (this.zarobki * 12 to to samo co this.zarobki * premia * 12 jeśli premia równa się 1).
L1
Masz rację, dało się zrobić to lepiej, chciałem na szybko prosty kawałek kodu napisać, aby zrozumieć zagadnienie, niestety nie jestem zbyt mocno doświadczonym "programistą" i jak piszę coś na szybko i bez zastanowienia to trafiają się takie byki :). Także nie ma żadnego powodu dla którego akurat tak to napisałem, ale dziękuję za komentarz, na pewno takie pokazywanie , że coś nie jest do końca dobrze zrobione (bez hejtu i złośliwości) odbije się podczas kolejnych programów na bardziej uważnym ich pisaniu :>.
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Ale teraz twoje sortowanie jest bez sensu bo uwzględnia tylko zarobki a permii już nie. Poza tym nie masz racji, bo zauważ że sortujesz już kolekcje obiektów Pracownik, bez rozróżnienia na to jaki to "typ" pracownika. Co wiecej, jakbym dodał teraz nową klasę rozszerzającą Pracownika to nadal kod który operuje na Pracowniku mógły z obiektami tej klasy działać, nawet pomimo faktu że ten kod został napisany zanim w ogóle tą swoją klasę wymyśliłem.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 2x, ostatnio: Shalom
L1
  • Rejestracja:ponad 9 lat
  • Ostatnio:12 dni
  • Postów:14
0

Ale teraz twoje sortowanie jest bez sensu bo uwzględnia tylko zarobki a permii już nie.

To prawda, dopiero jak zwróciłeś na to uwagę to sam to zauważyłem ^^. Jak by ktoś zaglądał do tamtego kodu to należy tam wstawić metody zwracające zarobki pomnożone o premię oraz w metodzie compareTo zamienić porównanie pól na porównanie wartości zwracanych przez metody zwracające zarobki.

Poza tym nie masz racji, bo zauważ że sortujesz już kolekcje obiektów Pracownik, bez rozróżnienia na to jaki to "typ" pracownika. Co wiecej, jakbym dodał teraz nową klasę rozszerzającą Pracownika to nadal kod który operuje na Pracowniku mógły z obiektami tej klasy działać, nawet pomimo faktu że ten kod został napisany zanim w ogóle tą swoją klasę wymyśliłem.

To też niby rozumiem, ale i tak nie wiem dlaczego miało by być zasadne pisanie:

Kopiuj
Pracownik p1 = new Programista();

zamiast:

Kopiuj
Programista p1 = new Programista();

Skoro w przypadku obu definicji wszystko mi działa tak samo (przynajmniej w przypadku mojego programu).

No ale nic to, pewnie jeszcze za mało umiem, muszę jeszcze się trochę pouczyć i minie trochę czasu zanim mi się to w głowie poukłada.

Dzięki za cierpliwość i odpowiedzi :]

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

@lukasz1988 bo używając typu Programista uzależniasz kod od tego konkretnego typu i w trakcie pisania kodu nie będziesz myślał juz czy jakaś metoda pochodzi z Pracownika czy z Programisty. Jeśli użyjesz typu bazowego, albo lepiej: interfejsu, to będziesz od razu widział kiedy "brakuje" co jakiejś metody która powinna być "wspólna". Niemniej oczywiście nie zawsze takie działanie ma sens - czasem chcesz mieć dostęp do tego konkretnego podtypu. Wszystko w granicach zdrowego rozsądku.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
S9
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 8 lat
  • Postów:42
0

Dziękuje wszystkim za wszystkie porady :) Na prawdę mi dużo pomogły ! Czy ma ktoś może jakis pomysł na projekt w którym mógłbym wykorzystać wszystkie te działy, które wcześniej napisałem ? Sam nie mam pomysłu a chciałbym to poćwiczyć i zaliczyć przedmiot we wrześniu :)

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

A te aplety koniecznie? ;] Napisz aplet do grania w karty.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
S9
Nie koniecznie :) a coś bardziej szczegółowo ?
Shalom
A co jeszcze potrzebujesz? Nie wiesz jak sie gra w karty? Napisz choćby grę w oczko z komputerem z ładnym GUI ;]
S9
Bardziej chodziło mi o jakieś małe podpowiedzi od strony programistycznej :)
S9
Bo teraz trochę czuje się tak jakbyś fryzjerowi kazał zbudować dom :P
Shalom
Jestem studentem, Miałem ten przedmiot na studiach
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)