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.

Kod:

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;
}
}