Zad. Zamówienie

Napisać program do obsługi zamówień. Program powinien składać się z dwóch
klas: Zamowienie oraz Pozycja , przy czym każde zamówienie zawierać może
jedną lub więcej pozycji.
Klasa Pozycja powinna zawierać następujące pola:
• nazwaTowaru (String)
• ileSztuk (int) – liczba zamówionych sztuk
• cena (double) – cena pojedynczej sztuki
oraz metody:
• konstruktor z parametrami umożliwiającymi ustalenie wartości pól klasy,
• metodę double obliczWartosc() zwracającą wartość pozycji zamówienia,
• metodę String toString() zwracającą łańcuch w formacie: nazwa towaru
(20 znaków), cena (10 znaków), liczba sztuk (4 znaki), wartość zamówienia
(10 znaków), przykład:
Cukier 4,00 zł 3 szt. 12,00 zł
Klasa Zamowienie powinna zawierać następujące pola:
• pozycje (tablica obiektów kl. Pozycja) – pozycje składowe zamówienia,
• ileDodanych (int) – liczba pozycji w zamówieniu,
• maksRozmiar (int) – maksymalna liczba pozycji w zamówieniu
oraz metody:
• konstruktor bezparametrowy – maksRozmiar ustalany na wartość 10,
• konstruktor z parametrem określającym maksymalną liczbę pozycji w zamówieniu,
• metodę void dodajPozycje(Pozycja p) , która dodaje podaną pozycję do
zamówienia,
• metodę double obliczWartosc() zwracającą wartość zamówienia,
19
• metodę String toString() , która zwraca łańcuch zawierający spis pozycji
zamówienia oraz łączną wartość zamówienia.
Przykładowa metoda korzystająca z wspomnianych klas:
public static void main(String [] args) throws IOException {
Pozycja p1 = new Pozycja("Chleb", 1, 3.5);
System.out.println(p1);
Pozycja p2 = new Pozycja("Cukier", 3, 4);
System.out.print(p2);
Zamowienie z = new Zamowienie(20);
z.dodajPozycje(p1);
z.dodajPozycje(p2);
System.out.println(z);
}
Przykładowy wynik:
Chleb 3,50 zł 1 szt. 3,50 zł
Cukier 4,00 zł 3 szt. 12,00 zł
Zamówienie:
Chleb 3,50 zł 1 szt. 3,50 zł
Cukier 4,00 zł 3 szt. 12,00 zł
Razem: 15,50 zł
W klasie Zamowienie :
• zaimplementować metodę void usunPozycje(int indeks) , która usuwa
z zamówienia pozycję o podanym indeksie
• zaimplementować metodę void edytujPozycje(int indeks) , która umożliwi edycję wybranej pozycji zamówienia, tj. nazwy towaru, ceny oraz liczby
sztuk
• zmodyfikować metodę void dodajPozycje(Pozycja p) , tak by w stytuacji, gdy dodawany jest ten sam towar nie dodawała kolejnej pozycji, lecz
zwiększała liczbę sztuk w już istniejącej
W klasie Pozycja :
• zaimplementować metodę double obliczWartoscZRabatem , która oblicza
wartość pozycji zamówienia po uwzględnieniu rabatu zależnego od liczby
sztuk:
– 5–10 szt. rabat 5%,
20
– 10–20 szt. rabat 10
– powyżej 20 szt. rabat 15%.
Zmodyfikować metodę obliczWartosc w klasie Zamowienie, tak by również wyświetlała informacje o rabacie i łączny koszt zamówienia po jego uwzględnieniu.
zmodyfikować metodę toString , by wyświetlała również naliczony rabat i wartość z rabatem.
W obu klasach zaimplementować interfejs Serializable umożliwiający zapis i
odczyt danych z pliku realizowany przez metody:
• metodę public static void zapiszZamowienie(Zamowienie z, String nazwaPliku) ,
która zapisze podane w parametrze zamówienie do pliku o nazwie podanej
drugim parametrem.
• metodę public static Zamowienie wczytajZamowienie(String nazwaPliku) ,
która wczyta z pliku o podanej nazwie zamówienie i zwróci je jako wynik.

import java.io.;
import java.util.
;

class Pozycja{

private String nazwaTowaru;
private int ileSztuk;
private double cena;

Pozycja(String nazwaTowaru, int ileSztuk, double cena){
    this.nazwaTowaru = nazwaTowaru;
    this.ileSztuk = ileSztuk;
    this.cena = cena;
}

//sposób z konstruktorem kopiującym
Pozycja(Pozycja p){
    this.nazwaTowaru = p.nazwaTowaru;
    this.ileSztuk = p.ileSztuk;
    this.cena = p.cena;
}

public String getNazwaTowaru(){
    return this.nazwaTowaru;
}

//sposób z akcesorami
/**public int getIleSztuk(){
    return this.ileSztuk;
}

public double getCena(){
    return this.cena;
}*/

public double obliczWartosc(){
    return this.ileSztuk*this.cena;
}

public String toString(){
    return nazwaTowaru + "; " + String.format("%.2f",cena) + " zł; " + ileSztuk + " szt; " + 
    String.format("%.2f",obliczWartosc()) + " zł";
}

}

public class Zamowienie{

Pozycja[] pozycje;
private int ileDanych;
private int maksRozmiar;

Zamowienie(){
    this.maksRozmiar = 10;
    this.ileDanych = 0;
    this.pozycje = new Pozycja[this.maksRozmiar];
}

Zamowienie(int maksRozmiar){
    this.maksRozmiar = maksRozmiar;
}

//sposób z akcesorami
/**public void dodajPozycje(Pozycja p){
    if(this.pozycje[ileDanych] == null){
        this.pozycje[ileDanych] = new Pozycja(p.getNazwaTowaru(), p.getIleSztuk(), p.getCena());
        this.ileDanych++;
    }
}*/

//sposób z konstruktorem kopiującym
public void dodajPozycje(Pozycja p) {
    if(this.pozycje.length <= maksRozmiar){
        this.pozycje[ileDanych] = new Pozycja(p);
        ileDanych++;
    }
}

public double obliczWartosc(){
    double lacznie = 0.0;
    for(int i=0; i<ileDanych; i++){
        lacznie += pozycje[i].obliczWartosc();
    }
    return lacznie;
}

public String toString(){
    String napis = "\nZamówienie:\n";
    for(int i=0; i<ileDanych; i++){
        napis += (pozycje[i].toString()+"\n");
    }
    napis += "Razem: " + String.format("%.2f",obliczWartosc()) + " zł";
    return napis;
}

}